mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 22:26:38 +03:00
84 lines
2.9 KiB
JavaScript
84 lines
2.9 KiB
JavaScript
#!/usr/bin/env node
|
|
/** Rebuild a design context in this project from a bundle another one exported.
|
|
*
|
|
* node <scripts_path>/design-context-import.mjs <bundle.json>
|
|
* [--design skip|write] [--force]
|
|
*
|
|
* Refuses a project that already has a design context unless --force, and
|
|
* refuses either way while an edit session is running, because the session is
|
|
* the only writer of the store while it lives.
|
|
*
|
|
* Prints IMPORTED <n> files and DESIGN_MD carried|absent for the agent to
|
|
* branch on. Exit 1 on a bundle this release cannot read.
|
|
*/
|
|
|
|
import { readFile } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import { migrate, paths, pidAlive, readAnswers, readJsonSoft } from './design-context/store.mjs';
|
|
import { importDesignContext, validateBundle } from './design-context/portability.mjs';
|
|
|
|
function printHelp() {
|
|
console.log(`Usage: node design-context-import.mjs <bundle.json> [options]
|
|
|
|
Rebuild this project's design context from an exported bundle.
|
|
|
|
Options:
|
|
--design skip|write Write DESIGN.md when the bundle carries one and this
|
|
project has none (default: skip)
|
|
--force Replace an existing design context
|
|
--help Show this help
|
|
|
|
Output:
|
|
IMPORTED N files
|
|
DESIGN_MD carried|absent
|
|
|
|
See reference/design-context.md for the canonical agent flow.`);
|
|
}
|
|
|
|
const args = process.argv.slice(2);
|
|
if (!args.length || args.includes('--help') || args.includes('-h')) {
|
|
printHelp();
|
|
process.exit(args.length ? 0 : 1);
|
|
}
|
|
|
|
const source = args.find((arg) => !arg.startsWith('--'));
|
|
if (!source) {
|
|
console.error('Name the bundle to import.');
|
|
process.exit(1);
|
|
}
|
|
|
|
const designAt = args.indexOf('--design');
|
|
const design = designAt !== -1 && args[designAt + 1] ? args[designAt + 1] : 'skip';
|
|
if (!['skip', 'write'].includes(design)) {
|
|
console.error('--design must be skip or write');
|
|
process.exit(1);
|
|
}
|
|
|
|
await migrate(process.cwd());
|
|
const target = paths(process.cwd());
|
|
|
|
/* A running session holds the store: importing under it would swap the run out
|
|
from beneath the document someone is reading and the batch it may owe. */
|
|
const session = await readJsonSoft(target.sessionJson);
|
|
if (session && pidAlive(session.pid)) {
|
|
console.error(`A design context document is open on http://127.0.0.1:${session.port}. Close it, then import.`);
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!args.includes('--force') && await readAnswers(process.cwd())) {
|
|
console.error('This project already has a design context. Re-run with --force to replace it.');
|
|
process.exit(1);
|
|
}
|
|
|
|
let bundle;
|
|
try {
|
|
bundle = validateBundle(JSON.parse(await readFile(path.resolve(process.cwd(), source), 'utf8')));
|
|
} catch (error) {
|
|
console.error(error.message);
|
|
process.exit(1);
|
|
}
|
|
|
|
const result = await importDesignContext(process.cwd(), bundle, { design });
|
|
console.log(`IMPORTED ${result.written} files`);
|
|
console.log(`DESIGN_MD ${result.designCarried ? 'carried' : 'absent'}${result.designWritten ? ' written' : ''}`);
|