chore: polish for FOL contract delivery (CHANGELOG, CLI guardrails, metadata)

- Update CHANGELOG.md for 1.1.0 (date, refactoring, repository fixes)
- Add overwrite guardrails to imhotep-cli init — skips existing files
- Add bugs/homepage/keywords metadata to 5 public packages
- Mark imhotep-bench and imhotep-fixtures as private packages
- Add selector field to SourceReference interface (core types)
- Remove 7  casts from check-all.ts (folAst.position, cardinality results)
- Generate package-lock.json for reproducible installs
This commit is contained in:
John Dvorak
2026-05-21 11:58:31 -07:00
parent 4ceb411028
commit 70f528fbab
15 changed files with 3834 additions and 47 deletions
+8 -1
View File
@@ -50,8 +50,15 @@ function main(): void {
: process.cwd();
try {
initProject({ preset, targetDir });
const result = initProject({ preset, targetDir });
console.log(`✓ Scaffolded ${preset} project in ${targetDir}`);
if (result.created.length > 0) {
console.log(` Created: ${result.created.map(f => f.replace(targetDir, '.')).join(', ')}`);
}
if (result.skipped.length > 0) {
console.warn(` Skipped (already exists): ${result.skipped.map(f => f.replace(targetDir, '.')).join(', ')}`);
}
console.log(` Run: cd ${targetDir} && npm install && npm test`);
} catch (error: any) {
console.error(`Error: ${error.message}`);
+1 -1
View File
@@ -1,3 +1,3 @@
// Public API exports for imhotep-cli
export { initProject, type InitOptions } from './init.js';
export { initProject, type InitOptions, type InitResult } from './init.js';
export { presets, getPresetNames, getPreset, type PresetName } from './presets/index.js';
+36 -26
View File
@@ -1,5 +1,5 @@
// Core init logic for scaffolding Imhotep projects from presets
import { mkdirSync, writeFileSync } from 'node:fs';
import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
import { join } from 'node:path';
import { getPreset } from './presets/index.js';
@@ -8,49 +8,59 @@ export interface InitOptions {
targetDir: string;
}
export function initProject(options: InitOptions): void {
export interface InitResult {
created: string[];
skipped: string[];
}
function safeWrite(filePath: string, content: string, results: { created: string[]; skipped: string[] }): void {
if (existsSync(filePath)) {
results.skipped.push(filePath)
} else {
writeFileSync(filePath, content, 'utf-8')
results.created.push(filePath)
}
}
export function initProject(options: InitOptions): InitResult {
const { preset, targetDir } = options;
// Resolve preset template
const results: InitResult = { created: [], skipped: [] };
const template = getPreset(preset);
// Create directory structure
mkdirSync(targetDir, { recursive: true });
mkdirSync(join(targetDir, 'tests'), { recursive: true });
mkdirSync(join(targetDir, 'fixtures'), { recursive: true });
// Write config file
writeFileSync(
safeWrite(
join(targetDir, 'imhotep.config.js'),
template.configFile,
'utf-8'
results
);
// Write test file
writeFileSync(
safeWrite(
join(targetDir, 'tests', 'example.test.ts'),
template.testFile,
'utf-8'
results
);
// Write fixture file
writeFileSync(
safeWrite(
join(targetDir, 'fixtures', 'example.html'),
template.fixtureFile,
'utf-8'
results
);
// Write package.json
writeFileSync(
safeWrite(
join(targetDir, 'package.json'),
JSON.stringify(template.packageJson, null, 2),
'utf-8'
results
);
// Write README
writeFileSync(
safeWrite(
join(targetDir, 'README.md'),
template.readme,
'utf-8'
results
);
return results
}