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:
@@ -37,5 +37,21 @@
|
||||
"@types/node": "^20.19.39",
|
||||
"playwright": "^1.59.1",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://gitea.com/anomalyco/imhotep/issues"
|
||||
},
|
||||
"homepage": "https://docs.imhotep.dev",
|
||||
"keywords": [
|
||||
"testing",
|
||||
"visual-testing",
|
||||
"layout-testing",
|
||||
"relational-testing",
|
||||
"playwright",
|
||||
"geometry",
|
||||
"fol",
|
||||
"first-order-logic",
|
||||
"e2e",
|
||||
"property-testing"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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,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';
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user