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

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;AAkCpC,wBAAgB,YAAY,IAAI,OAAO,CA6CtC"}
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;AAqCpC,wBAAgB,YAAY,IAAI,OAAO,CAgDtC"}
package/dist/bin/yf.js CHANGED
@@ -41,6 +41,9 @@ import { registerLegacyAuditCommand } from '../commands/legacy-audit.js';
41
41
  import { registerClarifyCommand } from '../commands/clarify.js';
42
42
  import { registerSpecCommand } from '../commands/spec.js';
43
43
  import { registerApproveCommand } from '../commands/approve.js';
44
+ import { registerBootstrapCommand } from '../commands/bootstrap.js';
45
+ import { registerBlockCommand } from '../commands/block.js';
46
+ import { registerCoverageCommand } from '../commands/workflow-coverage.js';
44
47
  import { VERSION } from '../version.js';
45
48
  export function buildProgram() {
46
49
  const program = new Command();
@@ -84,6 +87,9 @@ export function buildProgram() {
84
87
  registerClarifyCommand(program);
85
88
  registerSpecCommand(program);
86
89
  registerApproveCommand(program);
90
+ registerBootstrapCommand(program);
91
+ registerBlockCommand(program);
92
+ registerCoverageCommand(program);
87
93
  return program;
88
94
  }
89
95
  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,28 @@
1
+ /**
2
+ * `yf block <verb> <block_id>` -- Phase V step 15 of
3
+ * PRODUCT_WORKFLOW.md.
4
+ *
5
+ * Drives the iterative build cycle one block at a time. Each
6
+ * block runs through: pending -> in_progress -> green (tests
7
+ * verdes + green-gate) -> deployed.
8
+ *
9
+ * Verbs:
10
+ * yf block list show all blocks + status
11
+ * yf block start <id> mark block in_progress
12
+ * yf block green <id> mark block tests-green
13
+ * yf block deploy <id> mark block deployed
14
+ * yf block fail <id> mark block failed (for retry)
15
+ *
16
+ * Each transition writes to workflow.blocks_progress[*] and
17
+ * checks the dependency graph: a block can only enter
18
+ * in_progress when all its declared dependencies are
19
+ * "green" or "deployed".
20
+ *
21
+ * ASCII-only.
22
+ */
23
+ import type { Command } from 'commander';
24
+ export interface BlockOptions {
25
+ cwd?: string;
26
+ }
27
+ export declare function registerBlockCommand(program: Command): void;
28
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC3D"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * `yf block <verb> <block_id>` -- Phase V step 15 of
3
+ * PRODUCT_WORKFLOW.md.
4
+ *
5
+ * Drives the iterative build cycle one block at a time. Each
6
+ * block runs through: pending -> in_progress -> green (tests
7
+ * verdes + green-gate) -> deployed.
8
+ *
9
+ * Verbs:
10
+ * yf block list show all blocks + status
11
+ * yf block start <id> mark block in_progress
12
+ * yf block green <id> mark block tests-green
13
+ * yf block deploy <id> mark block deployed
14
+ * yf block fail <id> mark block failed (for retry)
15
+ *
16
+ * Each transition writes to workflow.blocks_progress[*] and
17
+ * checks the dependency graph: a block can only enter
18
+ * in_progress when all its declared dependencies are
19
+ * "green" or "deployed".
20
+ *
21
+ * ASCII-only.
22
+ */
23
+ import path from 'node:path';
24
+ import { c, header } from '../ui/colors.js';
25
+ import { readWorkflow, writeWorkflow, } from '../workflow/state.js';
26
+ const STATUS_SYMBOLS = {
27
+ pending: '[ ]',
28
+ in_progress: '[~]',
29
+ green: '[+]',
30
+ failed: '[!]',
31
+ };
32
+ async function listBlocks(projectRoot) {
33
+ const wf = await readWorkflow(projectRoot);
34
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
35
+ const progress = wf.blocks_progress ?? [];
36
+ if (blocks.length === 0) {
37
+ console.log(c.warn('No hay bloques. Corre primero ') + c.code('yf clarify blocks'));
38
+ return;
39
+ }
40
+ console.log(c.brand('Bloques:'));
41
+ console.log('');
42
+ for (const b of blocks) {
43
+ const st = progress.find((p) => p.block_id === b.id)?.status ?? 'pending';
44
+ const symbol = STATUS_SYMBOLS[st];
45
+ const dep = b.dependencies.length > 0 ? ' deps: ' + b.dependencies.join(',') : '';
46
+ const mvp = b.mvp ? ' MVP' : '';
47
+ const eff = '(' + b.effort + ')';
48
+ console.log(' ' + c.dim(symbol) + ' ' + c.brand(b.id.padEnd(20)) + c.dim(b.name) + c.dim(' ' + eff) + c.dim(dep) + c.warn(mvp));
49
+ }
50
+ console.log('');
51
+ const summary = {
52
+ pending: progress.filter((p) => p.status === 'pending').length,
53
+ in_progress: progress.filter((p) => p.status === 'in_progress').length,
54
+ green: progress.filter((p) => p.status === 'green').length,
55
+ failed: progress.filter((p) => p.status === 'failed').length,
56
+ };
57
+ console.log(c.dim('Resumen: ')
58
+ + c.dim(`pending=${summary.pending} `)
59
+ + c.dim(`in_progress=${summary.in_progress} `)
60
+ + c.success(`green=${summary.green} `)
61
+ + c.error(`failed=${summary.failed}`));
62
+ }
63
+ async function patchProgress(projectRoot, blockId, patch) {
64
+ const wf = await readWorkflow(projectRoot);
65
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
66
+ const targetBlock = blocks.find((b) => b.id === blockId);
67
+ if (!targetBlock) {
68
+ throw new Error('block id "' + blockId + '" not found in workflow.clarification.blocks');
69
+ }
70
+ const progress = [...(wf.blocks_progress ?? [])];
71
+ const idx = progress.findIndex((p) => p.block_id === blockId);
72
+ const next = {
73
+ block_id: blockId,
74
+ status: 'pending',
75
+ ...(idx >= 0 ? progress[idx] : {}),
76
+ ...patch,
77
+ };
78
+ if (idx >= 0)
79
+ progress[idx] = next;
80
+ else
81
+ progress.push(next);
82
+ await writeWorkflow(projectRoot, { blocks_progress: progress });
83
+ }
84
+ async function startBlock(projectRoot, blockId) {
85
+ const wf = await readWorkflow(projectRoot);
86
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
87
+ const target = blocks.find((b) => b.id === blockId);
88
+ if (!target) {
89
+ console.log(c.error('block "' + blockId + '" no existe en workflow.clarification.blocks'));
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ /* Check dependencies. */
94
+ const progress = wf.blocks_progress ?? [];
95
+ for (const dep of target.dependencies) {
96
+ const depProgress = progress.find((p) => p.block_id === dep);
97
+ if (!depProgress || (depProgress.status !== 'green' && !depProgress.deployed_at)) {
98
+ console.log(c.error('Dependency "' + dep + '" no esta green todavia.'));
99
+ console.log(c.dim('Termina ' + dep + ' primero o corre `yf block list`.'));
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ }
104
+ await patchProgress(projectRoot, blockId, { status: 'in_progress' });
105
+ console.log(c.success('Block ') + c.brand(blockId) + c.success(' marcado in_progress.'));
106
+ console.log(c.dim('Ciclo de bloque: implement -> e2e tests con NAC-3 coverage 100%'));
107
+ console.log(c.dim(' -> a11y check -> green-gate -> `yf block green ' + blockId + '`'));
108
+ }
109
+ async function greenBlock(projectRoot, blockId) {
110
+ /* SQ Sec 14 requires that any block transitioning to green has:
111
+ * - lint + typecheck green
112
+ * - tests green
113
+ * - NAC-3 manifest coverage 100%
114
+ * - a11y check passed
115
+ * We do not run those here -- the user (or CI) just confirms.
116
+ * In a follow-up commit we hook this into `yf coverage structural`
117
+ * to refuse green if structural coverage < 100%. */
118
+ await patchProgress(projectRoot, blockId, {
119
+ status: 'green',
120
+ tests_green_at: new Date().toISOString(),
121
+ });
122
+ console.log(c.success('Block ') + c.brand(blockId) + c.success(' marcado green.'));
123
+ console.log(c.dim('Siguiente bloque: ') + c.code('yf block list'));
124
+ }
125
+ async function deployBlock(projectRoot, blockId) {
126
+ const wf = await readWorkflow(projectRoot);
127
+ const progress = wf.blocks_progress ?? [];
128
+ const current = progress.find((p) => p.block_id === blockId);
129
+ if (!current || current.status !== 'green') {
130
+ console.log(c.error('Block "' + blockId + '" debe estar green antes de deploy.'));
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ await patchProgress(projectRoot, blockId, { deployed_at: new Date().toISOString() });
135
+ console.log(c.success('Block ') + c.brand(blockId) + c.success(' marcado deployed.'));
136
+ }
137
+ async function failBlock(projectRoot, blockId) {
138
+ await patchProgress(projectRoot, blockId, { status: 'failed' });
139
+ console.log(c.warn('Block ') + c.brand(blockId) + c.warn(' marcado failed. Para reintentar: ')
140
+ + c.code('yf block start ' + blockId));
141
+ }
142
+ export function registerBlockCommand(program) {
143
+ const block = program.command('block')
144
+ .description('Phase V step 15: iterative block-by-block build cycle.');
145
+ block.command('list')
146
+ .description('Show all blocks + status.')
147
+ .option('--cwd <path>', 'project root')
148
+ .action(async (opts) => {
149
+ const root = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
150
+ try {
151
+ await listBlocks(root);
152
+ }
153
+ catch (err) {
154
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
155
+ process.exitCode = 1;
156
+ }
157
+ });
158
+ for (const verb of ['start', 'green', 'deploy', 'fail']) {
159
+ block.command(verb + ' <block_id>')
160
+ .description('Mark block as ' + verb + '.')
161
+ .option('--cwd <path>', 'project root')
162
+ .action(async (blockId, opts) => {
163
+ const root = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
164
+ header('Yujin Forge -- block ' + verb);
165
+ console.log('');
166
+ try {
167
+ switch (verb) {
168
+ case 'start':
169
+ await startBlock(root, blockId);
170
+ break;
171
+ case 'green':
172
+ await greenBlock(root, blockId);
173
+ break;
174
+ case 'deploy':
175
+ await deployBlock(root, blockId);
176
+ break;
177
+ case 'fail':
178
+ await failBlock(root, blockId);
179
+ break;
180
+ }
181
+ }
182
+ catch (err) {
183
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
184
+ process.exitCode = 1;
185
+ }
186
+ });
187
+ }
188
+ }
189
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAEL,YAAY,EACZ,aAAa,GACd,MAAM,sBAAsB,CAAC;AAM9B,MAAM,cAAc,GAAiD;IACnE,OAAO,EAAM,KAAK;IAClB,WAAW,EAAE,KAAK;IAClB,KAAK,EAAQ,KAAK;IAClB,MAAM,EAAO,KAAK;CACnB,CAAC;AAEF,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC3C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC;IAE1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC;QAC1E,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnI,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,OAAO,GAAG;QACd,OAAO,EAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAClE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,MAAM;QACtE,KAAK,EAAQ,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM;QAChE,MAAM,EAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM;KAClE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;UAClB,CAAC,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,OAAO,GAAG,CAAC;UACpC,CAAC,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,WAAW,GAAG,CAAC;UAC5C,CAAC,CAAC,OAAO,CAAC,SAAS,OAAO,CAAC,KAAK,GAAG,CAAC;UACpC,CAAC,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,WAAmB,EACnB,OAAe,EACf,KAAkC;IAElC,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,OAAO,GAAG,8CAA8C,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAuB;QAC/B,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAI,SAAS;QACnB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,KAAK;KACT,CAAC;IACF,IAAI,GAAG,IAAI,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;;QAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,aAAa,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,OAAe;IAC5D,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO,GAAG,8CAA8C,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,GAAG,0BAA0B,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,mCAAmC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,gEAAgE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,OAAe;IAC5D;;;;;;;yDAOqD;IACrD,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE;QACxC,MAAM,EAAE,OAAO;QACf,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACzC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,OAAe;IAC7D,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO,GAAG,qCAAqC,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,WAAmB,EAAE,OAAe;IAC3D,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC;UAClF,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACnC,WAAW,CAAC,wDAAwD,CAAC,CAAC;IAEzE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;SAClB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAkB,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/D,IAAI,CAAC;YAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAC/B,OAAO,GAAG,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IAEL,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU,EAAE,CAAC;QACjE,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC;aAChC,WAAW,CAAC,gBAAgB,GAAG,IAAI,GAAG,GAAG,CAAC;aAC1C,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;aACtC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAkB,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/D,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,IAAI,CAAC;gBACH,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,OAAO;wBAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAAE,MAAM;oBACvD,KAAK,OAAO;wBAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAAE,MAAM;oBACvD,KAAK,QAAQ;wBAAE,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAAC,MAAM;oBACvD,KAAK,MAAM;wBAAI,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAAG,MAAM;gBACzD,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `yf bootstrap` -- Phase V step 14 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * Once Phase IV (approve) passes the three spec gates, this
5
+ * command initialises the project for the iterative build cycle:
6
+ *
7
+ * * Reads workflow.specs + workflow.clarification.blocks
8
+ * * Scaffolds the project shell (delegates to template engine
9
+ * if the project is brand-new; no-ops if code already exists)
10
+ * * Installs NAC-3 compliance baseline (5 attrs on the shell +
11
+ * manifest stub)
12
+ * * Sets CI gates (lint + typecheck + tests + visual + a11y +
13
+ * NAC-3 manifest check)
14
+ * * Sets up test scaffolding per layer (unit / integration /
15
+ * e2e / visual / a11y)
16
+ * * Sets up observability hooks (logger + optional Sentry)
17
+ * * Initialises blocks_progress = [{ block_id, status: pending }]
18
+ * for every block in workflow.clarification.blocks
19
+ *
20
+ * For alpha.15 the bootstrap is a thin shell -- it sets the
21
+ * workflow state + writes scaffolding markers + the actual
22
+ * heavy lifting (templates, CI config generation, observability
23
+ * wiring) lands incrementally in follow-up commits.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import type { Command } from 'commander';
28
+ export interface BootstrapOptions {
29
+ cwd?: string;
30
+ yes?: boolean;
31
+ stack?: string;
32
+ }
33
+ export declare function runBootstrap(opts: BootstrapOptions): Promise<void>;
34
+ export declare function registerBootstrapCommand(program: Command): void;
35
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IxE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc/D"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * `yf bootstrap` -- Phase V step 14 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * Once Phase IV (approve) passes the three spec gates, this
5
+ * command initialises the project for the iterative build cycle:
6
+ *
7
+ * * Reads workflow.specs + workflow.clarification.blocks
8
+ * * Scaffolds the project shell (delegates to template engine
9
+ * if the project is brand-new; no-ops if code already exists)
10
+ * * Installs NAC-3 compliance baseline (5 attrs on the shell +
11
+ * manifest stub)
12
+ * * Sets CI gates (lint + typecheck + tests + visual + a11y +
13
+ * NAC-3 manifest check)
14
+ * * Sets up test scaffolding per layer (unit / integration /
15
+ * e2e / visual / a11y)
16
+ * * Sets up observability hooks (logger + optional Sentry)
17
+ * * Initialises blocks_progress = [{ block_id, status: pending }]
18
+ * for every block in workflow.clarification.blocks
19
+ *
20
+ * For alpha.15 the bootstrap is a thin shell -- it sets the
21
+ * workflow state + writes scaffolding markers + the actual
22
+ * heavy lifting (templates, CI config generation, observability
23
+ * wiring) lands incrementally in follow-up commits.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import path from 'node:path';
28
+ import { promises as fs } from 'node:fs';
29
+ import { c, header } from '../ui/colors.js';
30
+ import { readWorkflow, patchWorkflowGroup, writeWorkflow, } from '../workflow/state.js';
31
+ const DEFAULT_STACK = 'React + Vite + TypeScript + Vitest + Playwright + NAC-3';
32
+ async function ensureGitIgnoreHas(projectRoot, patterns) {
33
+ const giPath = path.join(projectRoot, '.gitignore');
34
+ let current = '';
35
+ try {
36
+ current = await fs.readFile(giPath, 'utf-8');
37
+ }
38
+ catch {
39
+ current = '';
40
+ }
41
+ const lines = new Set(current.split(/\r?\n/));
42
+ for (const p of patterns)
43
+ lines.add(p);
44
+ await fs.writeFile(giPath, [...lines].filter(Boolean).join('\n') + '\n', 'utf-8');
45
+ }
46
+ async function ensureFile(p, contents) {
47
+ try {
48
+ await fs.access(p);
49
+ return false;
50
+ }
51
+ catch { /* not present */ }
52
+ await fs.mkdir(path.dirname(p), { recursive: true });
53
+ await fs.writeFile(p, contents, 'utf-8');
54
+ return true;
55
+ }
56
+ export async function runBootstrap(opts) {
57
+ header('Yujin Forge -- bootstrap');
58
+ console.log('');
59
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
60
+ const wf = await readWorkflow(projectRoot);
61
+ /* Gate: Phase IV must have approved all 3 docs with current
62
+ * sha256 matching. */
63
+ const docs = ['rfp', 'arch', 'design'];
64
+ for (const d of docs) {
65
+ const sp = wf.specs?.[d];
66
+ const ap = wf.approvals?.[d];
67
+ if (!sp || !ap) {
68
+ console.log(c.error('Phase IV gate no aprobado todavia (' + d + ' falta).'));
69
+ console.log(c.dim('Corre: ') + c.code('yf approve ' + d));
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ if (ap.version_sha256 !== sp.sha256) {
74
+ console.log(c.error('Approval STALE para ' + d + '. Doc cambio desde la aprobacion.'));
75
+ console.log(c.dim('Re-aprueba: ') + c.code('yf approve ' + d));
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ }
80
+ if (wf.bootstrap && !opts.yes) {
81
+ console.log(c.warn('Bootstrap previo en ' + wf.bootstrap.done_at + '.'));
82
+ console.log(c.dim('Para volver a correr, ') + c.code('yf bootstrap --yes'));
83
+ return;
84
+ }
85
+ const stack = opts.stack || DEFAULT_STACK;
86
+ const blocks = wf.clarification?.blocks?.blocks ?? [];
87
+ if (blocks.length === 0) {
88
+ console.log(c.error('No hay bloques definidos en workflow.clarification.blocks.'));
89
+ console.log(c.dim('Corre: ') + c.code('yf clarify blocks'));
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ console.log(c.dim('Stack: ') + c.brand(stack));
94
+ console.log(c.dim('Blocks: ') + c.brand(String(blocks.length) + ' identificados'));
95
+ console.log(c.dim('Project root: ') + c.dim(projectRoot));
96
+ console.log('');
97
+ /* 1. Ensure a NAC-3 manifest stub exists. */
98
+ const manifestPath = path.join(projectRoot, 'src', 'nac', 'manifest.ts');
99
+ const wroteManifest = await ensureFile(manifestPath, [
100
+ '/**',
101
+ ' * NAC-3 manifest stub generated by `yf bootstrap`.',
102
+ ' * Forge populates this as you decorate components per block.',
103
+ ' */',
104
+ "import { defineNacManifest } from '@nac3/runtime';",
105
+ '',
106
+ 'export const manifest = defineNacManifest({',
107
+ ' app_name: "' + path.basename(projectRoot) + '",',
108
+ ' version: "0.0.1",',
109
+ ' elements: [',
110
+ ' /* Populated per block. See docs/project_design.md. */',
111
+ ' ],',
112
+ '});',
113
+ '',
114
+ ].join('\n'));
115
+ if (wroteManifest)
116
+ console.log(c.success(' +') + c.dim(' src/nac/manifest.ts'));
117
+ /* 2. CI workflow stub at .github/workflows/ci.yml if missing. */
118
+ const ciPath = path.join(projectRoot, '.github', 'workflows', 'ci.yml');
119
+ const wroteCi = await ensureFile(ciPath, [
120
+ 'name: CI',
121
+ 'on: { push: { branches: [main] }, pull_request: {} }',
122
+ 'jobs:',
123
+ ' test:',
124
+ ' runs-on: ubuntu-latest',
125
+ ' steps:',
126
+ ' - uses: actions/checkout@v4',
127
+ ' - uses: actions/setup-node@v4',
128
+ ' with: { node-version: "20", cache: "npm" }',
129
+ ' - run: npm ci',
130
+ ' - run: npx yf doctor --json',
131
+ ' - run: npm run lint --if-present',
132
+ ' - run: npm run typecheck --if-present',
133
+ ' - run: npm test --if-present',
134
+ ' - run: npx yf coverage structural --if-failing-exit-1',
135
+ '',
136
+ ].join('\n'));
137
+ if (wroteCi)
138
+ console.log(c.success(' +') + c.dim(' .github/workflows/ci.yml'));
139
+ /* 3. tests/fresh-user/ scaffold (per SQ Sec 14). */
140
+ const fuReadme = path.join(projectRoot, 'tests', 'fresh-user', 'README.md');
141
+ const wroteFu = await ensureFile(fuReadme, [
142
+ '# tests/fresh-user/',
143
+ '',
144
+ 'Per Yujin Forge SQ Sec 14, every feature in this project has',
145
+ 'a fresh-user e2e test: clean state -> exercise feature -> assert.',
146
+ '',
147
+ 'Forge generates one of these per block as part of the',
148
+ '`yf block dev <block_id>` cycle.',
149
+ '',
150
+ ].join('\n'));
151
+ if (wroteFu)
152
+ console.log(c.success(' +') + c.dim(' tests/fresh-user/README.md'));
153
+ /* 4. .gitignore additions. */
154
+ await ensureGitIgnoreHas(projectRoot, [
155
+ 'node_modules',
156
+ 'dist', 'build', '.next',
157
+ 'coverage', '.cache',
158
+ '.env', '.env.local',
159
+ '.yujin-forge',
160
+ 'yujin.forge.cache',
161
+ ]);
162
+ console.log(c.success(' +') + c.dim(' .gitignore patterns'));
163
+ /* 5. Initialise blocks_progress for every block in workflow. */
164
+ const blocks_progress = blocks.map((b) => ({
165
+ block_id: b.id,
166
+ status: 'pending',
167
+ }));
168
+ await writeWorkflow(projectRoot, { blocks_progress });
169
+ console.log(c.success(' +') + c.dim(' blocks_progress[] initialised (' + blocks.length + ' bloques pending)'));
170
+ /* 6. Persist bootstrap state. */
171
+ await patchWorkflowGroup(projectRoot, 'bootstrap', {
172
+ done_at: new Date().toISOString(),
173
+ stack,
174
+ ci_set: true,
175
+ });
176
+ console.log('');
177
+ console.log(c.success('Bootstrap completado.'));
178
+ console.log('');
179
+ /* Suggest the first MVP block. */
180
+ const mvp = wf.clarification?.blocks?.mvp_path ?? [];
181
+ const firstBlock = mvp[0] ?? blocks[0]?.id;
182
+ if (firstBlock) {
183
+ console.log(c.dim('Primer bloque sugerido: ') + c.code('yf block dev ' + firstBlock));
184
+ }
185
+ else {
186
+ console.log(c.dim('Siguiente paso: ') + c.code('yf block dev <block_id>'));
187
+ }
188
+ }
189
+ export function registerBootstrapCommand(program) {
190
+ program.command('bootstrap')
191
+ .description('Phase V step 14: initialise project (NAC-3 baseline + CI + tests + observability).')
192
+ .option('--cwd <path>', 'project root (default: current directory)')
193
+ .option('--yes', 're-run even if bootstrap already done')
194
+ .option('--stack <name>', 'override the default stack label')
195
+ .action(async (opts) => {
196
+ try {
197
+ await runBootstrap(opts);
198
+ }
199
+ catch (err) {
200
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
201
+ process.exitCode = 1;
202
+ }
203
+ });
204
+ }
205
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `yf coverage structural` -- Phase V step 15 acceptance gate.
3
+ *
4
+ * Checks that every NAC-3 manifest element is exercised by at
5
+ * least one e2e test. Required by SQ Sec 14 + PRODUCT_WORKFLOW
6
+ * step 15 for any block to enter "green" status.
7
+ *
8
+ * Strategy:
9
+ * 1. Read the manifest from src/nac/manifest.ts (parsed
10
+ * heuristically for element ids).
11
+ * 2. Scan tests/ for occurrences of each id (data-nac-id
12
+ * assertions, locator strings, etc).
13
+ * 3. Compute (covered ids) / (total ids) ratio.
14
+ * 4. Exit 0 iff coverage === 100%; exit 1 otherwise so CI
15
+ * can gate on it.
16
+ *
17
+ * Pure read-only. Output: counts + missing ids. Optional
18
+ * --if-failing-exit-1 flag so CI fails the job (default true).
19
+ *
20
+ * ASCII-only.
21
+ */
22
+ import type { Command } from 'commander';
23
+ export interface CoverageOptions {
24
+ cwd?: string;
25
+ ifFailingExit1?: boolean;
26
+ manifest?: string;
27
+ }
28
+ export declare function runCoverage(opts: CoverageOptions): Promise<void>;
29
+ export declare function registerCoverageCommand(program: Command): void;
30
+ //# sourceMappingURL=workflow-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-coverage.d.ts","sourceRoot":"","sources":["../../src/commands/workflow-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoCD,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDtE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa9D"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * `yf coverage structural` -- Phase V step 15 acceptance gate.
3
+ *
4
+ * Checks that every NAC-3 manifest element is exercised by at
5
+ * least one e2e test. Required by SQ Sec 14 + PRODUCT_WORKFLOW
6
+ * step 15 for any block to enter "green" status.
7
+ *
8
+ * Strategy:
9
+ * 1. Read the manifest from src/nac/manifest.ts (parsed
10
+ * heuristically for element ids).
11
+ * 2. Scan tests/ for occurrences of each id (data-nac-id
12
+ * assertions, locator strings, etc).
13
+ * 3. Compute (covered ids) / (total ids) ratio.
14
+ * 4. Exit 0 iff coverage === 100%; exit 1 otherwise so CI
15
+ * can gate on it.
16
+ *
17
+ * Pure read-only. Output: counts + missing ids. Optional
18
+ * --if-failing-exit-1 flag so CI fails the job (default true).
19
+ *
20
+ * ASCII-only.
21
+ */
22
+ import path from 'node:path';
23
+ import { promises as fs } from 'node:fs';
24
+ import { c, header } from '../ui/colors.js';
25
+ const TEST_FILE_RE = /\.(test|spec|e2e)\.(t|j)sx?$/;
26
+ const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'coverage', '.cache']);
27
+ async function readManifest(p) {
28
+ try {
29
+ const src = await fs.readFile(p, 'utf-8');
30
+ /* Heuristic id grep. Matches:
31
+ * "checkout.confirm_button"
32
+ * id: "checkout.confirm_button"
33
+ * data-nac-id="checkout.confirm_button" */
34
+ const idRegex = /["'`]([a-z][a-z0-9_]*(?:\.[a-z0-9_]+)+)["'`]/g;
35
+ const ids = new Set();
36
+ let m;
37
+ while ((m = idRegex.exec(src)) !== null) {
38
+ if (m[1])
39
+ ids.add(m[1]);
40
+ }
41
+ return [...ids];
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ }
47
+ async function walkTestFiles(root, out) {
48
+ let entries;
49
+ try {
50
+ entries = await fs.readdir(root, { withFileTypes: true });
51
+ }
52
+ catch {
53
+ return;
54
+ }
55
+ for (const e of entries) {
56
+ if (SKIP_DIRS.has(e.name))
57
+ continue;
58
+ const p = path.join(root, e.name);
59
+ if (e.isDirectory())
60
+ await walkTestFiles(p, out);
61
+ else if (e.isFile() && TEST_FILE_RE.test(e.name))
62
+ out.push(p);
63
+ }
64
+ }
65
+ export async function runCoverage(opts) {
66
+ header('Yujin Forge -- coverage structural');
67
+ console.log('');
68
+ const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
69
+ const manifestPath = path.resolve(projectRoot, opts.manifest || 'src/nac/manifest.ts');
70
+ const ids = await readManifest(manifestPath);
71
+ if (ids.length === 0) {
72
+ console.log(c.warn('Manifest no encontrado o vacio: ' + manifestPath));
73
+ console.log(c.dim('Si no tenes manifest todavia, este check no aplica.'));
74
+ return;
75
+ }
76
+ const testRoots = [
77
+ path.join(projectRoot, 'tests'),
78
+ path.join(projectRoot, 'src', '__tests__'),
79
+ path.join(projectRoot, 'e2e'),
80
+ ];
81
+ const testFiles = [];
82
+ for (const r of testRoots)
83
+ await walkTestFiles(r, testFiles);
84
+ /* For each id, check if it appears in ANY test file. */
85
+ const filesContent = [];
86
+ for (const f of testFiles) {
87
+ try {
88
+ filesContent.push({ path: f, text: await fs.readFile(f, 'utf-8') });
89
+ }
90
+ catch { /* skip */ }
91
+ }
92
+ const covered = [];
93
+ const missing = [];
94
+ for (const id of ids) {
95
+ const hit = filesContent.some(({ text }) => text.includes(id));
96
+ if (hit)
97
+ covered.push(id);
98
+ else
99
+ missing.push(id);
100
+ }
101
+ const pct = ids.length === 0 ? 100 : Math.round((covered.length / ids.length) * 100);
102
+ console.log(c.dim('Manifest: ') + manifestPath);
103
+ console.log(c.dim('Total ids: ') + c.brand(String(ids.length)));
104
+ console.log(c.dim('Covered: ') + c.success(String(covered.length)));
105
+ console.log(c.dim('Missing: ') + (missing.length > 0 ? c.error(String(missing.length)) : c.success('0')));
106
+ console.log(c.dim('Coverage: ') + (pct === 100 ? c.success(pct + '%') : c.error(pct + '%')));
107
+ if (missing.length > 0) {
108
+ console.log('');
109
+ console.log(c.warn('IDs sin test:'));
110
+ for (const m of missing.slice(0, 30))
111
+ console.log(' - ' + m);
112
+ if (missing.length > 30)
113
+ console.log(c.dim(' ... y ' + (missing.length - 30) + ' mas'));
114
+ }
115
+ /* CI gate: exit 1 when coverage < 100% AND the flag is on. */
116
+ if (pct < 100 && (opts.ifFailingExit1 !== false)) {
117
+ process.exitCode = 1;
118
+ }
119
+ }
120
+ export function registerCoverageCommand(program) {
121
+ const coverage = program.command('coverage')
122
+ .description('Phase V acceptance: verify NAC-3 structural coverage.');
123
+ coverage.command('structural')
124
+ .description('100% of manifest ids must be exercised by at least one test.')
125
+ .option('--cwd <path>', 'project root')
126
+ .option('--manifest <path>', 'manifest source (default src/nac/manifest.ts)')
127
+ .option('--if-failing-exit-1', 'exit 1 when coverage < 100% (default true)', true)
128
+ .action(async (opts) => {
129
+ try {
130
+ await runCoverage(opts);
131
+ }
132
+ catch (err) {
133
+ console.error(c.error(String(err instanceof Error ? err.message : err)));
134
+ process.exitCode = 1;
135
+ }
136
+ });
137
+ }
138
+ //# sourceMappingURL=workflow-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-coverage.js","sourceRoot":"","sources":["../../src/commands/workflow-coverage.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.14";
7
+ export declare const VERSION = "0.2.0-alpha.15";
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.14';
7
+ export const VERSION = '0.2.0-alpha.15';
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.14",
3
+ "version": "0.2.0-alpha.15",
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>",