@mpfrontend/ftg-cli 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js ADDED
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ import { generate, InputError } from './index.js';
3
+ import { createApplication, createWorkspace, createFeature, createRoute, createPackage } from '@mpfrontend/nx-plugin';
4
+ import { skillCatalog, installSkills, checkSkills, SkillsError } from '@mpfrontend/ai-skills';
5
+ import { readFileSync } from 'node:fs';
6
+ import { designCommand, DesignError } from './design.js';
7
+ import { designSourceCommand } from './design-source.js';
8
+ import { catalogCheck } from './catalog.js';
9
+ const CLI_VERSION = String(JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version);
10
+ const args = process.argv.slice(2);
11
+ function option(name) { const index = args.indexOf(name); if (index < 0)
12
+ return undefined; const value = args[index + 1]; if (!value || value.startsWith('--'))
13
+ throw new InputError('MISSING_OPTION_VALUE'); return value; }
14
+ try {
15
+ if (args.includes('--version')) {
16
+ if (args.length !== 1)
17
+ throw new InputError('VERSION_MUST_BE_STANDALONE');
18
+ console.log(CLI_VERSION);
19
+ }
20
+ else if (args[0] === 'design') {
21
+ const command = args[1];
22
+ if (!command)
23
+ throw new InputError('DESIGN_COMMAND_REQUIRED');
24
+ const profiles = {
25
+ import: ['--binding', '--snapshot', '--dry-run', '--json'], validate: ['--binding', '--candidate', '--json'],
26
+ diff: ['--binding', '--candidate', '--json'], plan: ['--binding', '--candidate', '--dry-run', '--json'],
27
+ apply: ['--plan', '--dry-run', '--json'], accept: ['--plan', '--evidence', '--dry-run', '--json'], check: ['--binding', '--json'],
28
+ attach: ['--directory', '--source', '--binding', '--dry-run', '--json'], status: ['--directory', '--json']
29
+ };
30
+ if (!Object.hasOwn(profiles, command))
31
+ throw new InputError('UNKNOWN_DESIGN_COMMAND');
32
+ const seen = new Set();
33
+ for (let index = 2; index < args.length; index++) {
34
+ const flag = args[index];
35
+ if (!profiles[command].includes(flag))
36
+ throw new InputError('UNKNOWN_DESIGN_OPTION');
37
+ if (seen.has(flag))
38
+ throw new InputError('DUPLICATE_DESIGN_OPTION');
39
+ seen.add(flag);
40
+ if (flag !== '--dry-run' && flag !== '--json') {
41
+ const value = args[++index];
42
+ if (!value || value.startsWith('--'))
43
+ throw new InputError('MISSING_OPTION_VALUE');
44
+ }
45
+ }
46
+ if (command === 'attach' || command === 'status') {
47
+ const directory = option('--directory') ?? process.cwd(), source = option('--source');
48
+ const bindingPath = option('--binding');
49
+ console.log(JSON.stringify(await designSourceCommand({ command, directory, ...(source ? { source } : {}), ...(bindingPath ? { bindingPath } : {}), dryRun: args.includes('--dry-run'), cliVersion: CLI_VERSION })));
50
+ }
51
+ else {
52
+ const inputs = { bindingPath: option('--binding'), snapshotPath: option('--snapshot'), candidate: option('--candidate'), planPath: option('--plan'), evidencePath: option('--evidence') };
53
+ const supplied = Object.fromEntries(Object.entries(inputs).filter(([, value]) => value !== undefined));
54
+ console.log(JSON.stringify(await designCommand({ command, ...supplied, dryRun: args.includes('--dry-run') })));
55
+ }
56
+ }
57
+ else if (args[0] === 'catalog') {
58
+ if (args[1] !== 'check')
59
+ throw new InputError('UNKNOWN_CATALOG_COMMAND');
60
+ const allowed = new Set(['--app', '--json']), seen = new Set();
61
+ for (let index = 2; index < args.length; index++) {
62
+ const flag = args[index];
63
+ if (!allowed.has(flag))
64
+ throw new InputError('UNKNOWN_CATALOG_OPTION');
65
+ if (seen.has(flag))
66
+ throw new InputError('DUPLICATE_CATALOG_OPTION');
67
+ seen.add(flag);
68
+ if (flag === '--app') {
69
+ const value = args[++index];
70
+ if (!value || value.startsWith('--'))
71
+ throw new InputError('MISSING_OPTION_VALUE');
72
+ }
73
+ }
74
+ const app = option('--app');
75
+ if (!app)
76
+ throw new InputError('APP_REQUIRED');
77
+ const result = await catalogCheck(app);
78
+ console.log(JSON.stringify(result));
79
+ if (!result.ok)
80
+ process.exitCode = 3;
81
+ }
82
+ else if (args[0] === 'init') {
83
+ const allowed = new Set(['--name', '--directory', '--design-source', '--dry-run', '--json']), seen = new Set();
84
+ for (let index = 1; index < args.length; index++) {
85
+ const flag = args[index];
86
+ if (!allowed.has(flag))
87
+ throw new InputError('UNKNOWN_INIT_OPTION');
88
+ if (seen.has(flag))
89
+ throw new InputError('DUPLICATE_INIT_OPTION');
90
+ seen.add(flag);
91
+ if (flag !== '--dry-run' && flag !== '--json') {
92
+ const value = args[++index];
93
+ if (!value || value.startsWith('--'))
94
+ throw new InputError('MISSING_OPTION_VALUE');
95
+ }
96
+ }
97
+ const name = option('--name'), directory = option('--directory');
98
+ if (!name || !directory)
99
+ throw new InputError('NAME_AND_DIRECTORY_REQUIRED');
100
+ const designSource = (option('--design-source') ?? 'none');
101
+ console.log(JSON.stringify(await createWorkspace({ name, directory, designSource, dryRun: args.includes('--dry-run') })));
102
+ }
103
+ else if (args[0] === 'skills') {
104
+ const directory = option('--directory') ?? process.cwd();
105
+ if (args[1] === 'list')
106
+ console.log(JSON.stringify(skillCatalog()));
107
+ else if (args[1] === 'check')
108
+ console.log(JSON.stringify(await checkSkills(directory)));
109
+ else if (args[1] === 'install' || args[1] === 'update') {
110
+ const profile = option('--profile'), agent = option('--for');
111
+ console.log(JSON.stringify(await installSkills({ directory, ...(profile ? { profile } : {}), ...(agent ? { agent } : {}), dryRun: args.includes('--dry-run'), update: args[1] === 'update' })));
112
+ }
113
+ else
114
+ throw new InputError('UNKNOWN_SKILLS_COMMAND');
115
+ }
116
+ else if (args[0] === 'generate' || args[0] === 'check') {
117
+ const config = option('--config');
118
+ if (!config)
119
+ throw new InputError('CONFIG_REQUIRED');
120
+ const result = await generate(config, { check: args[0] === 'check', dryRun: args.includes('--dry-run') });
121
+ console.log(JSON.stringify(result));
122
+ }
123
+ else if (args[0] === 'create' && args[1] === 'app') {
124
+ const name = option('--name'), directory = option('--directory');
125
+ if (!name || !directory)
126
+ throw new InputError('NAME_AND_DIRECTORY_REQUIRED');
127
+ console.log(JSON.stringify(await createApplication({ name, directory, dryRun: args.includes('--dry-run') })));
128
+ }
129
+ else if (args[0] === 'create' && (args[1] === 'feature' || args[1] === 'route' || args[1] === 'package')) {
130
+ const profiles = { feature: ['--app', '--name', '--resource'], route: ['--app', '--path', '--feature', '--screen'], package: ['--name', '--directory', '--runtime'] };
131
+ const allowed = new Set([...profiles[args[1]], '--dry-run', '--json']), seen = new Set();
132
+ for (let index = 2; index < args.length; index++) {
133
+ const flag = args[index];
134
+ if (!allowed.has(flag))
135
+ throw new InputError('UNKNOWN_CREATE_OPTION');
136
+ if (seen.has(flag))
137
+ throw new InputError('DUPLICATE_CREATE_OPTION');
138
+ seen.add(flag);
139
+ if (flag !== '--dry-run' && flag !== '--json') {
140
+ const value = args[++index];
141
+ if (!value || value.startsWith('--'))
142
+ throw new InputError('MISSING_OPTION_VALUE');
143
+ }
144
+ }
145
+ const dryRun = args.includes('--dry-run');
146
+ try {
147
+ if (args[1] === 'feature') {
148
+ const app = option('--app'), name = option('--name'), resource = option('--resource');
149
+ if (!app || !name)
150
+ throw new InputError('APP_AND_NAME_REQUIRED');
151
+ console.log(JSON.stringify(await createFeature({ app, name, ...(resource ? { resource } : {}), dryRun })));
152
+ }
153
+ else if (args[1] === 'route') {
154
+ const app = option('--app'), path = option('--path'), feature = option('--feature'), screen = option('--screen');
155
+ if (!app || !path || !feature)
156
+ throw new InputError('APP_PATH_AND_FEATURE_REQUIRED');
157
+ console.log(JSON.stringify(await createRoute({ app, path, feature, ...(screen ? { screen } : {}), dryRun })));
158
+ }
159
+ else {
160
+ const name = option('--name'), directory = option('--directory'), runtime = option('--runtime');
161
+ if (!name)
162
+ throw new InputError('NAME_REQUIRED');
163
+ console.log(JSON.stringify(await createPackage({ name, ...(directory ? { directory } : {}), ...(runtime ? { runtime } : {}), dryRun })));
164
+ }
165
+ }
166
+ catch (error) {
167
+ if (error instanceof InputError)
168
+ throw error;
169
+ throw new InputError(error instanceof Error ? error.message : 'CREATE_FAILED');
170
+ }
171
+ }
172
+ else {
173
+ console.log('ftg generate|check --config <file> [--dry-run] [--json]\nmpfrontend init --name <name> --directory <new-directory> [--design-source none|existing] [--dry-run] [--json]\nmpfrontend design attach --directory <workspace> --source existing --binding <file> [--dry-run] [--json]\nmpfrontend design status --directory <workspace> [--json]\nmpfrontend create app --name <name> --directory <new-directory> [--dry-run]\nmpfrontend create feature --app <app-directory> --name <feature> [--resource <ftg-resource>] [--dry-run] [--json]\nmpfrontend create route --app <app-directory> --path <route> --feature <feature> [--screen <Export>] [--dry-run] [--json]\nmpfrontend create package --name <name> [--directory packages/<name>] [--runtime universal|client|server] [--dry-run] [--json]\nmpfrontend skills list|install|update|check [--directory <repository>] [--for codex|claude|both] [--profile base|design] [--dry-run] [--json]\nmpfrontend catalog check --app <app-directory> [--json]\nftg --version');
174
+ process.exitCode = args.length ? 2 : 0;
175
+ }
176
+ }
177
+ catch (error) {
178
+ const code = error instanceof InputError || error instanceof SkillsError || error instanceof DesignError ? error.exitCode : 2;
179
+ console.error(JSON.stringify({ ok: false, code, error: error instanceof Error ? error.message : 'COMMAND_FAILED' }));
180
+ process.exitCode = code;
181
+ }
182
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ type SourceMode = 'none' | 'existing';
2
+ export type DesignSourceOptions = {
3
+ command: 'attach' | 'status';
4
+ directory: string;
5
+ source?: SourceMode;
6
+ bindingPath?: string;
7
+ dryRun?: boolean;
8
+ cliVersion: string;
9
+ };
10
+ export declare function designSourceCommand(options: DesignSourceOptions): Promise<{
11
+ bindingHash: null;
12
+ releaseVersion: null;
13
+ ok: boolean;
14
+ command: string;
15
+ source: SourceMode;
16
+ status: "disabled" | "pending" | "attached";
17
+ binding: string | null;
18
+ dryRun?: never;
19
+ changed?: never;
20
+ } | {
21
+ bindingHash: string;
22
+ releaseVersion: null;
23
+ ok: boolean;
24
+ command: string;
25
+ source: SourceMode;
26
+ status: "disabled" | "pending" | "attached";
27
+ binding: string | null;
28
+ dryRun?: never;
29
+ changed?: never;
30
+ } | {
31
+ ok: boolean;
32
+ command: string;
33
+ source: "existing";
34
+ status: string;
35
+ binding: string;
36
+ bindingHash: string;
37
+ releaseVersion: null;
38
+ dryRun: boolean;
39
+ changed: string[];
40
+ }>;
41
+ export {};
@@ -0,0 +1,141 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { lstat, mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
3
+ import { isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { DesignError, inspectDesignBinding } from './design.js';
5
+ const configPath = '.mpfrontend/design-source.json', lockPath = '.mpfrontend/design-source.lock';
6
+ const encode = (value) => JSON.stringify(value, null, 2) + '\n';
7
+ function ensure(value, message, code = 2) { if (!value)
8
+ throw new DesignError(message, code); }
9
+ const record = (value, message = 'INVALID_DESIGN_SOURCE_CONFIG') => {
10
+ ensure(value !== null && typeof value === 'object' && !Array.isArray(value), message);
11
+ const result = value;
12
+ ensure(Object.keys(result).every(key => !['__proto__', 'prototype', 'constructor'].includes(key)), 'UNSAFE_DESIGN_SOURCE_KEY', 4);
13
+ return result;
14
+ };
15
+ function exact(value, keys, message) { ensure(Object.keys(value).length === keys.length && keys.every(key => Object.hasOwn(value, key)), message); }
16
+ function safeRelative(value) {
17
+ ensure(!isAbsolute(value) && value.length > 0 && value.length <= 500 && /^[a-zA-Z0-9_./@-]+$/.test(value) &&
18
+ value.split('/').every(part => part && part !== '.' && part !== '..' && !['.git', '.aws', '.codex', '.agents', '.claude', 'node_modules'].includes(part)), 'UNSAFE_DESIGN_SOURCE_PATH', 4);
19
+ }
20
+ async function file(root, path, required = true) {
21
+ safeRelative(path);
22
+ let current = root;
23
+ for (const part of path.split('/')) {
24
+ current = join(current, part);
25
+ try {
26
+ const info = await lstat(current);
27
+ ensure(!info.isSymbolicLink(), 'DESIGN_SOURCE_PATH_SYMLINK', 4);
28
+ ensure(current === join(root, path) ? info.isFile() : info.isDirectory(), 'DESIGN_SOURCE_PATH_KIND', 4);
29
+ if (current === join(root, path))
30
+ ensure(info.size <= 5 * 1024 * 1024, 'DESIGN_SOURCE_FILE_TOO_LARGE', 4);
31
+ }
32
+ catch (error) {
33
+ if (error.code === 'ENOENT') {
34
+ ensure(!required, 'DESIGN_SOURCE_FILE_MISSING');
35
+ return undefined;
36
+ }
37
+ throw error;
38
+ }
39
+ }
40
+ const result = await readFile(current);
41
+ ensure(result.length <= 5 * 1024 * 1024, 'DESIGN_SOURCE_FILE_TOO_LARGE', 4);
42
+ return result;
43
+ }
44
+ function json(bytes, message) { ensure(bytes, message); try {
45
+ return JSON.parse(bytes.toString('utf8'));
46
+ }
47
+ catch {
48
+ throw new DesignError(message);
49
+ } }
50
+ function parseConfig(raw) {
51
+ const value = record(raw);
52
+ exact(value, ['schemaVersion', 'generator', 'cliVersion', 'source', 'status', 'binding', 'bindingHash', 'sourceIdentity', 'release'], 'INVALID_DESIGN_SOURCE_CONFIG');
53
+ ensure(value.schemaVersion === 1 && value.generator === 'MPFrontendDesignSource' && typeof value.cliVersion === 'string' && ['none', 'existing'].includes(String(value.source)) && ['disabled', 'pending', 'attached'].includes(String(value.status)), 'INVALID_DESIGN_SOURCE_CONFIG');
54
+ ensure(value.binding === null || typeof value.binding === 'string', 'INVALID_DESIGN_SOURCE_CONFIG');
55
+ if (typeof value.binding === 'string')
56
+ safeRelative(value.binding);
57
+ ensure(value.bindingHash === null || typeof value.bindingHash === 'string' && /^[a-f0-9]{64}$/.test(value.bindingHash), 'INVALID_DESIGN_SOURCE_CONFIG');
58
+ ensure(value.sourceIdentity === null && value.release === null, 'INVALID_DESIGN_SOURCE_CONFIG');
59
+ return value;
60
+ }
61
+ async function rootFor(directory) {
62
+ const root = resolve(directory), info = await lstat(root).catch(() => undefined);
63
+ ensure(info?.isDirectory() && !info.isSymbolicLink(), 'DESIGN_WORKSPACE_REQUIRED', 4);
64
+ for (const marker of ['package.json', 'nx.json', 'pnpm-workspace.yaml'])
65
+ await file(root, marker);
66
+ return root;
67
+ }
68
+ async function localFile(root, input) {
69
+ ensure(!isAbsolute(input), 'UNSAFE_DESIGN_SOURCE_PATH', 4);
70
+ const path = relative(root, resolve(root, input));
71
+ safeRelative(path);
72
+ await file(root, path);
73
+ return path;
74
+ }
75
+ async function readConfig(root) { const bytes = await file(root, configPath, false); return { bytes, value: bytes ? parseConfig(json(bytes, 'INVALID_DESIGN_SOURCE_CONFIG')) : undefined }; }
76
+ async function verifyAttached(root, value) {
77
+ if (value.source === 'none') {
78
+ ensure(value.status === 'disabled' && value.binding === null && value.bindingHash === null && value.sourceIdentity === null && value.release === null, 'INVALID_DESIGN_SOURCE_CONFIG');
79
+ return { bindingHash: null, releaseVersion: null };
80
+ }
81
+ ensure(value.status === 'attached' && value.binding && value.bindingHash, 'DESIGN_SOURCE_NOT_ATTACHED', 3);
82
+ const binding = await inspectDesignBinding(join(root, value.binding));
83
+ ensure(binding.bindingHash === value.bindingHash, 'DESIGN_BINDING_DRIFT', 3);
84
+ ensure(value.sourceIdentity === null && value.release === null, 'INVALID_DESIGN_SOURCE_CONFIG');
85
+ return { bindingHash: binding.bindingHash, releaseVersion: null };
86
+ }
87
+ async function writeConfig(root, content, expected, dryRun) {
88
+ if (dryRun)
89
+ return expected?.toString('utf8') === content ? [] : [configPath];
90
+ await mkdir(join(root, '.mpfrontend'), { recursive: true });
91
+ const owner = randomUUID();
92
+ let acquired = false, stage = '';
93
+ try {
94
+ await file(root, lockPath, false);
95
+ try {
96
+ await writeFile(join(root, lockPath), owner, { flag: 'wx' });
97
+ acquired = true;
98
+ }
99
+ catch (error) {
100
+ if (error.code === 'EEXIST')
101
+ throw new DesignError('DESIGN_SOURCE_BUSY', 4);
102
+ throw error;
103
+ }
104
+ const current = await file(root, configPath, false);
105
+ ensure((current?.toString('utf8') ?? null) === (expected?.toString('utf8') ?? null), 'CONCURRENT_DESIGN_SOURCE_EDIT', 4);
106
+ if (current?.toString('utf8') === content)
107
+ return [];
108
+ stage = join(root, '.mpfrontend', '.design-source-' + randomUUID());
109
+ await writeFile(stage, content, { flag: 'wx' });
110
+ await rename(stage, join(root, configPath));
111
+ stage = '';
112
+ return [configPath];
113
+ }
114
+ finally {
115
+ if (stage)
116
+ await unlink(stage).catch(() => undefined);
117
+ if (acquired && (await file(root, lockPath, false))?.toString('utf8') === owner)
118
+ await unlink(join(root, lockPath));
119
+ }
120
+ }
121
+ export async function designSourceCommand(options) {
122
+ const root = await rootFor(options.directory), current = await readConfig(root);
123
+ if (options.command === 'status') {
124
+ ensure(current.value, 'DESIGN_SOURCE_NOT_CONFIGURED', 3);
125
+ const verification = current.value.status === 'pending' ? { bindingHash: null, releaseVersion: null } : await verifyAttached(root, current.value);
126
+ return { ok: true, command: 'status', source: current.value.source, status: current.value.status, binding: current.value.binding, ...verification };
127
+ }
128
+ ensure(options.source === 'existing', 'ATTACHABLE_DESIGN_SOURCE_REQUIRED');
129
+ ensure(options.bindingPath, 'DESIGN_BINDING_REQUIRED');
130
+ const bindingPath = await localFile(root, options.bindingPath), binding = await inspectDesignBinding(join(root, bindingPath));
131
+ if (current.value) {
132
+ ensure(current.value.status !== 'attached' || current.value.source === options.source && current.value.binding === bindingPath && current.value.bindingHash === binding.bindingHash, 'DESIGN_SOURCE_ALREADY_ATTACHED', 4);
133
+ ensure(current.value.source === 'none' || current.value.source === options.source, 'DESIGN_SOURCE_MODE_MISMATCH', 4);
134
+ }
135
+ const next = { schemaVersion: 1, generator: 'MPFrontendDesignSource', cliVersion: options.cliVersion, source: options.source, status: 'attached', binding: bindingPath, bindingHash: binding.bindingHash, sourceIdentity: null, release: null };
136
+ const content = encode(next);
137
+ ensure(current.value?.status !== 'attached' || current.bytes?.toString('utf8') === content, 'DESIGN_SOURCE_ALREADY_ATTACHED', 4);
138
+ const changed = await writeConfig(root, content, current.bytes, options.dryRun ?? false);
139
+ return { ok: true, command: 'attach', source: options.source, status: 'attached', binding: bindingPath, bindingHash: binding.bindingHash, releaseVersion: null, dryRun: options.dryRun ?? false, changed };
140
+ }
141
+ //# sourceMappingURL=design-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-source.js","sourceRoot":"","sources":["../src/design-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ export declare class DesignError extends Error {
2
+ readonly exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ type Change = {
6
+ kind: 'token' | 'component' | 'asset';
7
+ id: string;
8
+ action: 'added' | 'removed' | 'changed';
9
+ areas: string[];
10
+ severity: 'additive' | 'visual' | 'breaking';
11
+ };
12
+ type Task = {
13
+ id: string;
14
+ kind: 'component' | 'migration' | 'asset';
15
+ requiredFiles: string[];
16
+ };
17
+ type Plan = {
18
+ schemaVersion: 1;
19
+ generator: 'MPFrontendDesign';
20
+ cliVersion: string;
21
+ bindingFile: string;
22
+ bindingHash: string;
23
+ candidateHash: string;
24
+ baselineHash: string | null;
25
+ ownershipHash: string | null;
26
+ before: Record<string, string | null>;
27
+ after: Record<string, string>;
28
+ changes: Change[];
29
+ tasks: Task[];
30
+ checks: string[];
31
+ diagnostics: string[];
32
+ planId: string;
33
+ };
34
+ export type DesignOptions = {
35
+ command: string;
36
+ bindingPath?: string;
37
+ snapshotPath?: string;
38
+ candidate?: string;
39
+ planPath?: string;
40
+ evidencePath?: string;
41
+ dryRun?: boolean;
42
+ };
43
+ export declare function inspectDesignBinding(bindingPath: string): Promise<{
44
+ bindingFile: string;
45
+ bindingHash: string;
46
+ id: string;
47
+ source: {
48
+ fileKey: string;
49
+ nodeId: string;
50
+ };
51
+ stateDirectory: string;
52
+ outputDirectory: string;
53
+ }>;
54
+ export declare function inspectDesignSnapshot(snapshotPath: string): Promise<{
55
+ snapshotFile: string;
56
+ rawHash: string;
57
+ candidateHash: string;
58
+ source: {
59
+ fileKey: string;
60
+ nodeId: string;
61
+ revision: string | null;
62
+ capturedAt: string | null;
63
+ extractorVersion: string;
64
+ };
65
+ }>;
66
+ export declare function designCommand(options: DesignOptions): Promise<{
67
+ ok: boolean;
68
+ command: string;
69
+ dryRun: boolean;
70
+ changed: never[];
71
+ planId: string;
72
+ unresolvedTasks?: never;
73
+ candidateHash?: never;
74
+ sourceRevision?: never;
75
+ diagnostics?: never;
76
+ scope?: never;
77
+ checked?: never;
78
+ changes?: never;
79
+ plan?: never;
80
+ planPath?: never;
81
+ } | {
82
+ ok: boolean;
83
+ command: string;
84
+ dryRun: boolean;
85
+ planId: string;
86
+ changed: string[];
87
+ unresolvedTasks: Task[];
88
+ candidateHash?: never;
89
+ sourceRevision?: never;
90
+ diagnostics?: never;
91
+ scope?: never;
92
+ checked?: never;
93
+ changes?: never;
94
+ plan?: never;
95
+ planPath?: never;
96
+ } | {
97
+ ok: boolean;
98
+ command: string;
99
+ dryRun: boolean;
100
+ candidateHash: string;
101
+ changed: string[];
102
+ planId?: never;
103
+ unresolvedTasks?: never;
104
+ sourceRevision?: never;
105
+ diagnostics?: never;
106
+ scope?: never;
107
+ checked?: never;
108
+ changes?: never;
109
+ plan?: never;
110
+ planPath?: never;
111
+ } | {
112
+ ok: boolean;
113
+ command: string;
114
+ dryRun: boolean;
115
+ candidateHash: string;
116
+ sourceRevision: string | null;
117
+ diagnostics: string[];
118
+ changed: string[];
119
+ planId?: never;
120
+ unresolvedTasks?: never;
121
+ scope?: never;
122
+ checked?: never;
123
+ changes?: never;
124
+ plan?: never;
125
+ planPath?: never;
126
+ } | {
127
+ ok: boolean;
128
+ command: string;
129
+ scope: string;
130
+ candidateHash: string;
131
+ sourceRevision: string | null;
132
+ checked: number;
133
+ dryRun?: never;
134
+ changed?: never;
135
+ planId?: never;
136
+ unresolvedTasks?: never;
137
+ diagnostics?: never;
138
+ changes?: never;
139
+ plan?: never;
140
+ planPath?: never;
141
+ } | {
142
+ ok: boolean;
143
+ command: string;
144
+ candidateHash: string;
145
+ sourceRevision: string | null;
146
+ dryRun?: never;
147
+ changed?: never;
148
+ planId?: never;
149
+ unresolvedTasks?: never;
150
+ diagnostics?: never;
151
+ scope?: never;
152
+ checked?: never;
153
+ changes?: never;
154
+ plan?: never;
155
+ planPath?: never;
156
+ } | {
157
+ ok: boolean;
158
+ command: string;
159
+ candidateHash: string;
160
+ changes: Change[];
161
+ diagnostics: string[];
162
+ dryRun?: never;
163
+ changed?: never;
164
+ planId?: never;
165
+ unresolvedTasks?: never;
166
+ sourceRevision?: never;
167
+ scope?: never;
168
+ checked?: never;
169
+ plan?: never;
170
+ planPath?: never;
171
+ } | {
172
+ ok: boolean;
173
+ command: string;
174
+ dryRun: boolean;
175
+ plan: Plan;
176
+ planPath: string;
177
+ changed: string[];
178
+ planId?: never;
179
+ unresolvedTasks?: never;
180
+ candidateHash?: never;
181
+ sourceRevision?: never;
182
+ diagnostics?: never;
183
+ scope?: never;
184
+ checked?: never;
185
+ changes?: never;
186
+ }>;
187
+ export {};