@nac3/forge-cli 0.2.0-alpha.13 → 0.2.0-alpha.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"yf.d.ts","sourceRoot":"","sources":["../../src/bin/yf.ts"],"names":[],"mappings":";AAUA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,wBAAgB,YAAY,IAAI,OAAO,CA2CtC"}
1
+ {"version":3,"file":"yf.d.ts","sourceRoot":"","sources":["../../src/bin/yf.ts"],"names":[],"mappings":";AAUA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,YAAY,IAAI,OAAO,CA6CtC"}
package/dist/bin/yf.js CHANGED
@@ -39,6 +39,8 @@ import { registerTriageCommand } from '../commands/triage.js';
39
39
  import { registerDiscoverCommand } from '../commands/discover.js';
40
40
  import { registerLegacyAuditCommand } from '../commands/legacy-audit.js';
41
41
  import { registerClarifyCommand } from '../commands/clarify.js';
42
+ import { registerSpecCommand } from '../commands/spec.js';
43
+ import { registerApproveCommand } from '../commands/approve.js';
42
44
  import { VERSION } from '../version.js';
43
45
  export function buildProgram() {
44
46
  const program = new Command();
@@ -80,6 +82,8 @@ export function buildProgram() {
80
82
  registerDiscoverCommand(program);
81
83
  registerLegacyAuditCommand(program);
82
84
  registerClarifyCommand(program);
85
+ registerSpecCommand(program);
86
+ registerApproveCommand(program);
83
87
  return program;
84
88
  }
85
89
  async function main() {
@@ -1 +1 @@
1
- {"version":3,"file":"yf.js","sourceRoot":"","sources":["../../src/bin/yf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yf.js","sourceRoot":"","sources":["../../src/bin/yf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `yf approve <doc...>` -- Phase IV step 13 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * The unbreakable gate. Forge refuses to proceed to Phase V
5
+ * (build) until the user has explicitly approved the 3 spec
6
+ * documents (RFP + arch + design) by their current sha256.
7
+ *
8
+ * Usage:
9
+ * yf approve rfp approve one doc
10
+ * yf approve rfp arch design approve all three (batch)
11
+ * yf approve --list show approval state
12
+ * yf approve --revoke <doc> revoke an approval
13
+ *
14
+ * Approval persists workflow.approvals.<doc> = {
15
+ * approved_at: ISO,
16
+ * version_sha256: sha of the spec file at approval time
17
+ * }
18
+ *
19
+ * If the doc file changes after approval, Forge detects the sha
20
+ * mismatch + treats the approval as stale -- user must re-approve.
21
+ *
22
+ * ASCII-only.
23
+ */
24
+ import type { Command } from 'commander';
25
+ export interface ApproveOptions {
26
+ cwd?: string;
27
+ list?: boolean;
28
+ revoke?: string;
29
+ }
30
+ export declare function runApprove(targets: string[], opts: ApproveOptions): Promise<void>;
31
+ export declare function registerApproveCommand(program: Command): void;
32
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAK,MAAM,CAAC;IAChB,IAAI,CAAC,EAAI,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuGD,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDvF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc7D"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * `yf approve <doc...>` -- Phase IV step 13 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * The unbreakable gate. Forge refuses to proceed to Phase V
5
+ * (build) until the user has explicitly approved the 3 spec
6
+ * documents (RFP + arch + design) by their current sha256.
7
+ *
8
+ * Usage:
9
+ * yf approve rfp approve one doc
10
+ * yf approve rfp arch design approve all three (batch)
11
+ * yf approve --list show approval state
12
+ * yf approve --revoke <doc> revoke an approval
13
+ *
14
+ * Approval persists workflow.approvals.<doc> = {
15
+ * approved_at: ISO,
16
+ * version_sha256: sha of the spec file at approval time
17
+ * }
18
+ *
19
+ * If the doc file changes after approval, Forge detects the sha
20
+ * mismatch + treats the approval as stale -- user must re-approve.
21
+ *
22
+ * ASCII-only.
23
+ */
24
+ import path from 'node:path';
25
+ import { promises as fs } from 'node:fs';
26
+ import { createHash } from 'node:crypto';
27
+ import prompts from 'prompts';
28
+ import { c, header } from '../ui/colors.js';
29
+ import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
30
+ const ALL_DOCS = ['rfp', 'arch', 'design'];
31
+ function sha256(text) {
32
+ return createHash('sha256').update(text, 'utf-8').digest('hex');
33
+ }
34
+ async function listState(projectRoot) {
35
+ const wf = await readWorkflow(projectRoot);
36
+ console.log(c.brand('Approval state:'));
37
+ console.log('');
38
+ for (const k of ALL_DOCS) {
39
+ const spec = wf.specs?.[k];
40
+ const apr = wf.approvals?.[k];
41
+ if (!spec) {
42
+ console.log(' ' + c.dim(k.padEnd(8)) + c.warn(' -- spec not generated yet'));
43
+ continue;
44
+ }
45
+ if (!apr) {
46
+ console.log(' ' + c.brand(k.padEnd(8)) + c.warn(' -- NOT approved (' + spec.doc_path + ', v' + spec.version + ')'));
47
+ continue;
48
+ }
49
+ const stale = apr.version_sha256 !== spec.sha256;
50
+ if (stale) {
51
+ console.log(' ' + c.brand(k.padEnd(8)) + c.warn(' -- STALE (approved sha != current sha, re-approval needed)'));
52
+ }
53
+ else {
54
+ console.log(' ' + c.brand(k.padEnd(8)) + c.success(' -- approved at ' + apr.approved_at));
55
+ }
56
+ }
57
+ console.log('');
58
+ }
59
+ async function approveOne(projectRoot, kind) {
60
+ const wf = await readWorkflow(projectRoot);
61
+ const spec = wf.specs?.[kind];
62
+ if (!spec) {
63
+ console.log(c.error('Spec "' + kind + '" no generado todavia. Corre primero ') + c.code('yf spec ' + kind));
64
+ return false;
65
+ }
66
+ /* Re-read the file to ensure the current sha matches what was
67
+ * stored when the spec ran. If the user edited the file by hand
68
+ * between spec generation and approve, we want them to know. */
69
+ const abs = path.join(projectRoot, spec.doc_path);
70
+ let body;
71
+ try {
72
+ body = await fs.readFile(abs, 'utf-8');
73
+ }
74
+ catch (err) {
75
+ console.log(c.error('No se pudo leer ' + spec.doc_path + ': ' + String(err instanceof Error ? err.message : err)));
76
+ return false;
77
+ }
78
+ const currentSha = sha256(body);
79
+ if (currentSha !== spec.sha256) {
80
+ console.log(c.warn(' ' + kind + ': el archivo cambio desde la generacion.'));
81
+ console.log(c.dim(' Stored sha: ' + spec.sha256.slice(0, 16) + '...'));
82
+ console.log(c.dim(' Current sha: ' + currentSha.slice(0, 16) + '...'));
83
+ const confirm = await prompts({
84
+ type: 'select',
85
+ name: 'choice',
86
+ message: ' Aprobar la version CURRENT (con tus ediciones)?',
87
+ choices: [
88
+ { title: 'Si, aprobar version actual', value: 'yes' },
89
+ { title: 'No, re-generar antes de aprobar', value: 'regenerate' },
90
+ { title: 'Cancelar', value: 'cancel' },
91
+ ],
92
+ });
93
+ if (confirm.choice !== 'yes') {
94
+ if (confirm.choice === 'regenerate') {
95
+ console.log(c.dim(' Corre: ') + c.code('yf spec ' + kind + ' --yes'));
96
+ }
97
+ return false;
98
+ }
99
+ /* Update workflow.specs.<kind>.sha256 to match. */
100
+ await patchWorkflowGroup(projectRoot, 'specs', {
101
+ [kind]: { ...spec, sha256: currentSha, done_at: new Date().toISOString() },
102
+ });
103
+ }
104
+ await patchWorkflowGroup(projectRoot, 'approvals', {
105
+ [kind]: {
106
+ approved_at: new Date().toISOString(),
107
+ version_sha256: currentSha,
108
+ },
109
+ });
110
+ console.log(c.success(' Aprobado: ') + c.brand(kind));
111
+ return true;
112
+ }
113
+ async function revokeOne(projectRoot, kind) {
114
+ const wf = await readWorkflow(projectRoot);
115
+ if (!wf.approvals?.[kind]) {
116
+ console.log(c.warn(kind + ' no estaba aprobado.'));
117
+ return;
118
+ }
119
+ /* Patch with explicit removal -- set to undefined. The
120
+ * patchWorkflowGroup helper preserves siblings; to remove we
121
+ * overwrite the whole approvals object. */
122
+ const next = { ...(wf.approvals ?? {}) };
123
+ delete next[kind];
124
+ await patchWorkflowGroup(projectRoot, 'approvals', next);
125
+ console.log(c.success('Revocado: ') + c.brand(kind));
126
+ }
127
+ export async function runApprove(targets, opts) {
128
+ header('Yujin Forge -- approve');
129
+ console.log('');
130
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
131
+ if (opts.list) {
132
+ await listState(projectRoot);
133
+ return;
134
+ }
135
+ if (opts.revoke) {
136
+ const r = opts.revoke;
137
+ if (!ALL_DOCS.includes(r)) {
138
+ console.log(c.error('Doc invalido: ' + r + '. Valid: ' + ALL_DOCS.join(', ')));
139
+ process.exitCode = 1;
140
+ return;
141
+ }
142
+ await revokeOne(projectRoot, r);
143
+ return;
144
+ }
145
+ if (targets.length === 0) {
146
+ console.log(c.error('Especifica que aprobar: ') + c.code('yf approve rfp arch design'));
147
+ console.log(c.dim('o solo uno: ') + c.code('yf approve rfp'));
148
+ console.log(c.dim('o lista: ') + c.code('yf approve --list'));
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ let allOk = true;
153
+ for (const t of targets) {
154
+ if (!ALL_DOCS.includes(t)) {
155
+ console.log(c.error('Doc invalido: ' + t + '. Valid: ' + ALL_DOCS.join(', ')));
156
+ allOk = false;
157
+ continue;
158
+ }
159
+ const ok = await approveOne(projectRoot, t);
160
+ if (!ok)
161
+ allOk = false;
162
+ }
163
+ console.log('');
164
+ /* Re-check the entire 3-doc set for status. */
165
+ const wf = await readWorkflow(projectRoot);
166
+ const fullApproved = ALL_DOCS.every((k) => {
167
+ const sp = wf.specs?.[k];
168
+ const ap = wf.approvals?.[k];
169
+ return sp && ap && ap.version_sha256 === sp.sha256;
170
+ });
171
+ if (fullApproved) {
172
+ console.log(c.success('Phase IV gate: PASSED. Los 3 docs estan aprobados + sha-locked.'));
173
+ console.log(c.dim('Siguiente paso: ') + c.code('yf bootstrap'));
174
+ }
175
+ else {
176
+ if (allOk) {
177
+ console.log(c.warn('Approbations parciales. Para destrabar Phase V hacen falta los 3 docs aprobados.'));
178
+ console.log(c.dim('Estado: ') + c.code('yf approve --list'));
179
+ }
180
+ }
181
+ }
182
+ export function registerApproveCommand(program) {
183
+ program.command('approve [docs...]')
184
+ .description('Phase IV step 13: explicit approval gate for RFP + arch + design.')
185
+ .option('--cwd <path>', 'project root (default: current directory)')
186
+ .option('--list', 'show approval state for the 3 docs')
187
+ .option('--revoke <doc>', 'revoke approval for a single doc')
188
+ .action(async (docs, opts) => {
189
+ try {
190
+ await runApprove(docs ?? [], opts);
191
+ }
192
+ catch (err) {
193
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
194
+ process.exitCode = 1;
195
+ }
196
+ });
197
+ }
198
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `yf spec rfp|arch|design` -- Phase III of PRODUCT_WORKFLOW.md
3
+ * (steps 10, 11, 12).
4
+ *
5
+ * Generates the three foundational documents that Phase IV gates
6
+ * on:
7
+ *
8
+ * yf spec rfp step 10 -- consolidated RFP / PRD
9
+ * yf spec arch step 11 -- technological architecture
10
+ * yf spec design step 12 -- solution design (per block)
11
+ *
12
+ * Each command:
13
+ * 1. Verifies Phase II is complete (functional + 4 NFR rounds +
14
+ * blocks). For RFP, all 6 are required. For arch + design,
15
+ * RFP must be done too.
16
+ * 2. Reads the markdown clarification docs from
17
+ * docs/clarification/0X_<round>.md.
18
+ * 3. Calls Claude with the document-specific generation prompt.
19
+ * 4. Writes the result to docs/project_<doc>.md.
20
+ * 5. Persists workflow.specs.<doc> with version, doc_path,
21
+ * sha256.
22
+ *
23
+ * Per HITO_4_STRATEGIC_ASSETS.md sec 1, the Tier-1 strategic
24
+ * prompts for these flows are eventually moving server-side to
25
+ * prompts.yujin.app. Today they live client-side as a stub --
26
+ * the system prompt is generic; a follow-up commit replaces it
27
+ * with the curated server-side endpoint when the Yujin server
28
+ * exposes them.
29
+ *
30
+ * ASCII-only.
31
+ */
32
+ import type { Command } from 'commander';
33
+ export interface SpecOptions {
34
+ cwd?: string;
35
+ yes?: boolean;
36
+ }
37
+ export declare function registerSpecCommand(program: Command): void;
38
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AA2ND,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB1D"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * `yf spec rfp|arch|design` -- Phase III of PRODUCT_WORKFLOW.md
3
+ * (steps 10, 11, 12).
4
+ *
5
+ * Generates the three foundational documents that Phase IV gates
6
+ * on:
7
+ *
8
+ * yf spec rfp step 10 -- consolidated RFP / PRD
9
+ * yf spec arch step 11 -- technological architecture
10
+ * yf spec design step 12 -- solution design (per block)
11
+ *
12
+ * Each command:
13
+ * 1. Verifies Phase II is complete (functional + 4 NFR rounds +
14
+ * blocks). For RFP, all 6 are required. For arch + design,
15
+ * RFP must be done too.
16
+ * 2. Reads the markdown clarification docs from
17
+ * docs/clarification/0X_<round>.md.
18
+ * 3. Calls Claude with the document-specific generation prompt.
19
+ * 4. Writes the result to docs/project_<doc>.md.
20
+ * 5. Persists workflow.specs.<doc> with version, doc_path,
21
+ * sha256.
22
+ *
23
+ * Per HITO_4_STRATEGIC_ASSETS.md sec 1, the Tier-1 strategic
24
+ * prompts for these flows are eventually moving server-side to
25
+ * prompts.yujin.app. Today they live client-side as a stub --
26
+ * the system prompt is generic; a follow-up commit replaces it
27
+ * with the curated server-side endpoint when the Yujin server
28
+ * exposes them.
29
+ *
30
+ * ASCII-only.
31
+ */
32
+ import path from 'node:path';
33
+ import { promises as fs } from 'node:fs';
34
+ import { createHash } from 'node:crypto';
35
+ import { c, header } from '../ui/colors.js';
36
+ import { ClaudeClient } from '../chat/claude.js';
37
+ import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
38
+ const DOC_FILENAME = {
39
+ rfp: 'project_rfp.md',
40
+ arch: 'project_architecture.md',
41
+ design: 'project_design.md',
42
+ };
43
+ const DOC_TITLE = {
44
+ rfp: 'RFP / PRD',
45
+ arch: 'Architecture',
46
+ design: 'Solution Design',
47
+ };
48
+ const CLARIFICATION_FILES = [
49
+ '04_functional.md',
50
+ '05_quantitative.md',
51
+ '06_structural.md',
52
+ '07_governance.md',
53
+ '08_operational.md',
54
+ '09_blocks.md',
55
+ ];
56
+ async function readAllClarification(projectRoot) {
57
+ const dir = path.join(projectRoot, 'docs', 'clarification');
58
+ const parts = [];
59
+ for (const name of CLARIFICATION_FILES) {
60
+ try {
61
+ const text = await fs.readFile(path.join(dir, name), 'utf-8');
62
+ parts.push('===== ' + name + ' =====\n' + text);
63
+ }
64
+ catch { /* skip missing files */ }
65
+ }
66
+ return parts.join('\n\n');
67
+ }
68
+ function buildSystemPromptFor(kind) {
69
+ /* TODO(HITO-4): move these to prompts.yujin.app endpoints. */
70
+ const common = [
71
+ 'You are Yujin Forge generating a foundational project document.',
72
+ 'Read the supplied clarification rounds + workflow state and emit',
73
+ 'a single, well-structured markdown document.',
74
+ 'Output ASCII-only. Use sections + lists, NOT free prose.',
75
+ 'Do not invent facts not present in the clarification rounds. If',
76
+ 'something is missing, write "TBD: <what the user must define>".',
77
+ ].join(' ');
78
+ switch (kind) {
79
+ case 'rfp':
80
+ return common + '\n\nDocument type: **RFP / PRD**. Structure:\n'
81
+ + '1. Vision + objetivo del producto\n'
82
+ + '2. Personas + user stories\n'
83
+ + '3. Killer features + MVP slice\n'
84
+ + '4. Bloques + orden\n'
85
+ + '5. NFR cuantitativas (volumetria, paralelismo, complejidad)\n'
86
+ + '6. NFR estructurales (persistencia, middleware, modelo objeto)\n'
87
+ + '7. NFR de gobernanza (compliance, audit, retention)\n'
88
+ + '8. NFR de operacion (i18n, a11y, monitoring, costos)\n'
89
+ + '9. Acceptance criteria por bloque\n';
90
+ case 'arch':
91
+ return common + '\n\nDocument type: **Technological architecture**.\n'
92
+ + 'Structure (driven by NFR decisions from clarification step 5+6+8):\n'
93
+ + '1. Stack elegido + justificacion\n'
94
+ + '2. Layering (frontend / backend / data / async)\n'
95
+ + '3. Topologia de deployment (single instance / multi-region / serverless / edge)\n'
96
+ + '4. Estrategia async (sync only / queue + workers / event bus / saga)\n'
97
+ + '5. Persistence model + ERD inicial textual\n'
98
+ + '6. Middleware stack (concretado del step 6)\n'
99
+ + '7. Security model (auth, authz, encryption, secrets)\n'
100
+ + '8. Observability (logs, metrics, traces, alertas del step 8)\n'
101
+ + '9. Compliance hooks (per step 7 decisions)\n'
102
+ + '10. Costos esperados (modelado de step 8)\n';
103
+ case 'design':
104
+ return common + '\n\nDocument type: **Solution design per block**.\n'
105
+ + 'For each block in workflow.clarification.blocks, write a section with:\n'
106
+ + '1. Data model (tables + relaciones + indices)\n'
107
+ + '2. API contracts (endpoints + payloads + responses + errores)\n'
108
+ + '3. Screens / pages (wireframes ascii o links a figma)\n'
109
+ + '4. State machines (si aplica per step 5)\n'
110
+ + '5. Sequence diagrams (las 2-3 secuencias mas complejas, textuales)\n'
111
+ + '6. Edge cases identificados + estrategia\n'
112
+ + '7. Test cases obligatorios (e2e + structural)\n'
113
+ + '8. NAC-3 attributes (preview del manifest)\n';
114
+ }
115
+ }
116
+ function sha256(text) {
117
+ return createHash('sha256').update(text, 'utf-8').digest('hex');
118
+ }
119
+ async function runSpec(kind, opts) {
120
+ header('Yujin Forge -- spec ' + kind);
121
+ console.log('');
122
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
123
+ const wf = await readWorkflow(projectRoot);
124
+ /* Pre-requisites. */
125
+ const cl = wf.clarification;
126
+ if (!cl?.functional || !cl?.nfr_quantitative || !cl?.nfr_structural
127
+ || !cl?.nfr_governance || !cl?.nfr_operational || !cl?.blocks) {
128
+ console.log(c.error('Clarification (Phase II) incompleta. Falta al menos una ronda.'));
129
+ console.log(c.dim('Corre: ') + c.code('yf clarify functional') + c.dim(' ... seguir hasta blocks.'));
130
+ process.exitCode = 1;
131
+ return;
132
+ }
133
+ if ((kind === 'arch' || kind === 'design') && !wf.specs?.rfp) {
134
+ console.log(c.error('RFP debe estar generado primero.'));
135
+ console.log(c.dim('Corre: ') + c.code('yf spec rfp'));
136
+ process.exitCode = 1;
137
+ return;
138
+ }
139
+ const existing = wf.specs?.[kind];
140
+ if (existing && !opts.yes) {
141
+ console.log(c.warn('Ya existe ') + c.brand(DOC_FILENAME[kind])
142
+ + c.warn(' (version ' + existing.version + ').'));
143
+ console.log(c.dim('Para regenerar, corre con ') + c.code('--yes'));
144
+ return;
145
+ }
146
+ /* Build the context. */
147
+ const clarificationDump = await readAllClarification(projectRoot);
148
+ if (clarificationDump.trim() === '') {
149
+ console.log(c.error('No se encontraron docs en docs/clarification/. Re-corre las rondas.'));
150
+ process.exitCode = 1;
151
+ return;
152
+ }
153
+ /* If generating arch or design, also feed the RFP. */
154
+ let priorDocs = '';
155
+ if (kind === 'arch' || kind === 'design') {
156
+ try {
157
+ const rfpText = await fs.readFile(path.join(projectRoot, 'docs', wf.specs.rfp.doc_path.replace(/^docs\//, '')), 'utf-8');
158
+ priorDocs += '\n\n===== EXISTING RFP =====\n' + rfpText;
159
+ }
160
+ catch { /* may not exist if doc_path was relative differently */ }
161
+ }
162
+ if (kind === 'design' && wf.specs?.arch) {
163
+ try {
164
+ const archText = await fs.readFile(path.join(projectRoot, 'docs', wf.specs.arch.doc_path.replace(/^docs\//, '')), 'utf-8');
165
+ priorDocs += '\n\n===== EXISTING ARCHITECTURE =====\n' + archText;
166
+ }
167
+ catch { /* skip */ }
168
+ }
169
+ const userMessage = [
170
+ 'Project root: ' + projectRoot,
171
+ 'Tier: ' + (wf.tier ?? 'unknown'),
172
+ 'Intent: ' + JSON.stringify(wf.intent ?? {}, null, 2),
173
+ '',
174
+ '===== CLARIFICATION ROUNDS =====',
175
+ clarificationDump,
176
+ priorDocs,
177
+ '',
178
+ 'Generate the document now. Output the FULL markdown body only.',
179
+ 'No preamble, no chatter, no closing remarks. Start with the first',
180
+ 'H2 / heading and end with the last content line.',
181
+ ].join('\n');
182
+ console.log(c.dim('Llamando Claude para generar ' + DOC_FILENAME[kind] + ' ...'));
183
+ console.log(c.dim('(prompt strategic asset; en HITO 4 esto se mueve a prompts.yujin.app)'));
184
+ console.log('');
185
+ const claude = new ClaudeClient();
186
+ let body;
187
+ try {
188
+ const resp = await claude.chat({
189
+ system: buildSystemPromptFor(kind),
190
+ messages: [{ role: 'user', content: userMessage }],
191
+ maxTokens: 8192,
192
+ });
193
+ body = resp.text.trim();
194
+ if (body === '')
195
+ throw new Error('Claude returned empty body');
196
+ }
197
+ catch (err) {
198
+ console.error(c.error('Generacion fallo: ') + String(err instanceof Error ? err.message : err));
199
+ process.exitCode = 1;
200
+ return;
201
+ }
202
+ const docsDir = path.join(projectRoot, 'docs');
203
+ await fs.mkdir(docsDir, { recursive: true });
204
+ const filePath = path.join(docsDir, DOC_FILENAME[kind]);
205
+ const previousVersion = existing?.version ?? 0;
206
+ const newVersion = previousVersion + 1;
207
+ const stamp = new Date().toISOString();
208
+ const header_md = '# ' + DOC_TITLE[kind] + ' -- ' + (wf.intent?.operation ?? 'project') + '\n\n'
209
+ + '*Version ' + newVersion + ' generated by Yujin Forge on ' + stamp + '.*\n'
210
+ + '*Tier: ' + wf.tier + '. To re-generate: `yf spec ' + kind + ' --yes`.*\n\n';
211
+ const full = header_md + body + '\n';
212
+ await fs.writeFile(filePath, full, 'utf-8');
213
+ const sha = sha256(full);
214
+ const relPath = path.relative(projectRoot, filePath);
215
+ await patchWorkflowGroup(projectRoot, 'specs', {
216
+ [kind]: {
217
+ done_at: stamp,
218
+ version: newVersion,
219
+ doc_path: relPath,
220
+ sha256: sha,
221
+ },
222
+ });
223
+ console.log(c.success('Generado: ') + c.brand(relPath) + c.dim(' (' + full.length + ' chars, sha256:' + sha.slice(0, 12) + '...)'));
224
+ console.log('');
225
+ switch (kind) {
226
+ case 'rfp':
227
+ console.log(c.dim('Siguiente: ') + c.code('yf spec arch'));
228
+ break;
229
+ case 'arch':
230
+ console.log(c.dim('Siguiente: ') + c.code('yf spec design'));
231
+ break;
232
+ case 'design':
233
+ console.log(c.dim('Phase III completa. Siguiente: ') + c.code('yf approve rfp arch design'));
234
+ break;
235
+ }
236
+ }
237
+ export function registerSpecCommand(program) {
238
+ const spec = program.command('spec')
239
+ .description('Phase III steps 10-12: generate RFP + Architecture + Solution Design.');
240
+ for (const kind of ['rfp', 'arch', 'design']) {
241
+ spec.command(kind)
242
+ .description('Generate the ' + DOC_TITLE[kind] + ' doc into docs/' + DOC_FILENAME[kind])
243
+ .option('--cwd <path>', 'project root (default: current directory)')
244
+ .option('--yes', 'overwrite existing version')
245
+ .action(async (opts) => {
246
+ try {
247
+ await runSpec(kind, opts);
248
+ }
249
+ catch (err) {
250
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
251
+ process.exitCode = 1;
252
+ }
253
+ });
254
+ }
255
+ }
256
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export declare const VERSION = "0.2.0-alpha.13";
7
+ export declare const VERSION = "0.2.0-alpha.14";
8
8
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export const VERSION = '0.2.0-alpha.13';
7
+ export const VERSION = '0.2.0-alpha.14';
8
8
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "0.2.0-alpha.13",
3
+ "version": "0.2.0-alpha.14",
4
4
  "description": "Yujin Forge -- voice-first NAC-3 React development framework. CLI + chat panel + spec ingest + 10-format document reader + voice loop.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pablo Kuschnirof <pablo@rpaforce.com>",