@nac3/forge-cli 0.2.0-alpha.10 → 0.2.0-alpha.12
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/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +7 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/commands/discover.d.ts +30 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +178 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/legacy-audit.d.ts +34 -0
- package/dist/commands/legacy-audit.d.ts.map +1 -0
- package/dist/commands/legacy-audit.js +270 -0
- package/dist/commands/legacy-audit.js.map +1 -0
- package/dist/commands/triage.d.ts +34 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +228 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/vault-inventory.d.ts +30 -0
- package/dist/commands/vault-inventory.d.ts.map +1 -0
- package/dist/commands/vault-inventory.js +214 -0
- package/dist/commands/vault-inventory.js.map +1 -0
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -0
- package/dist/commands/vault.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/state.d.ts +190 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +119 -0
- package/dist/workflow/state.js.map +1 -0
- package/package.json +1 -1
package/dist/bin/yf.d.ts.map
CHANGED
|
@@ -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;
|
|
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;AA+BpC,wBAAgB,YAAY,IAAI,OAAO,CA0CtC"}
|
package/dist/bin/yf.js
CHANGED
|
@@ -35,6 +35,9 @@ import { registerKeysSetupCommand } from '../commands/keys_setup.js';
|
|
|
35
35
|
import { registerRepoCommand } from '../commands/repo.js';
|
|
36
36
|
import { registerMobileCommand } from '../commands/mobile.js';
|
|
37
37
|
import { registerLogCommand } from '../commands/log.js';
|
|
38
|
+
import { registerTriageCommand } from '../commands/triage.js';
|
|
39
|
+
import { registerDiscoverCommand } from '../commands/discover.js';
|
|
40
|
+
import { registerLegacyAuditCommand } from '../commands/legacy-audit.js';
|
|
38
41
|
import { VERSION } from '../version.js';
|
|
39
42
|
export function buildProgram() {
|
|
40
43
|
const program = new Command();
|
|
@@ -71,6 +74,10 @@ export function buildProgram() {
|
|
|
71
74
|
registerRepoCommand(program);
|
|
72
75
|
registerMobileCommand(program);
|
|
73
76
|
registerLogCommand(program);
|
|
77
|
+
/* PRODUCT_WORKFLOW.md commands (Phase I onwards). */
|
|
78
|
+
registerTriageCommand(program);
|
|
79
|
+
registerDiscoverCommand(program);
|
|
80
|
+
registerLegacyAuditCommand(program);
|
|
74
81
|
return program;
|
|
75
82
|
}
|
|
76
83
|
async function main() {
|
package/dist/bin/yf.js.map
CHANGED
|
@@ -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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf discover` -- Phase I step 3 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user what they actually want to build + how they
|
|
5
|
+
* want to talk to Forge while doing it. Output is a structured
|
|
6
|
+
* intent object persisted to yujin.forge.json::workflow.intent.
|
|
7
|
+
*
|
|
8
|
+
* Questions:
|
|
9
|
+
* 1. Operation type (migrate legacy / create new / modify existing)
|
|
10
|
+
* 2. Target devices (desktop / mobile / responsive / both native)
|
|
11
|
+
* 3. Input channel (chat-text / voice / document-paste)
|
|
12
|
+
* 4. Project state (no-code / local-repo / remote-repo / deployed)
|
|
13
|
+
* 5. Legacy framework (if migrating) -- text input
|
|
14
|
+
* 6. Preferred stack (if creating new) -- text input
|
|
15
|
+
* 7. Use case (hobby / POC / internal / commercial)
|
|
16
|
+
*
|
|
17
|
+
* Pre-requisite: yf triage must have been run (workflow.tier set).
|
|
18
|
+
* The triage tier influences which subsequent steps Forge will
|
|
19
|
+
* recommend after discover completes.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import type { Command } from 'commander';
|
|
24
|
+
export interface DiscoverOptions {
|
|
25
|
+
cwd?: string;
|
|
26
|
+
yes?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function runDiscover(opts: DiscoverOptions): Promise<void>;
|
|
29
|
+
export declare function registerDiscoverCommand(program: Command): void;
|
|
30
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ItE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc9D"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf discover` -- Phase I step 3 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user what they actually want to build + how they
|
|
5
|
+
* want to talk to Forge while doing it. Output is a structured
|
|
6
|
+
* intent object persisted to yujin.forge.json::workflow.intent.
|
|
7
|
+
*
|
|
8
|
+
* Questions:
|
|
9
|
+
* 1. Operation type (migrate legacy / create new / modify existing)
|
|
10
|
+
* 2. Target devices (desktop / mobile / responsive / both native)
|
|
11
|
+
* 3. Input channel (chat-text / voice / document-paste)
|
|
12
|
+
* 4. Project state (no-code / local-repo / remote-repo / deployed)
|
|
13
|
+
* 5. Legacy framework (if migrating) -- text input
|
|
14
|
+
* 6. Preferred stack (if creating new) -- text input
|
|
15
|
+
* 7. Use case (hobby / POC / internal / commercial)
|
|
16
|
+
*
|
|
17
|
+
* Pre-requisite: yf triage must have been run (workflow.tier set).
|
|
18
|
+
* The triage tier influences which subsequent steps Forge will
|
|
19
|
+
* recommend after discover completes.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import prompts from 'prompts';
|
|
25
|
+
import { c, header } from '../ui/colors.js';
|
|
26
|
+
import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
|
|
27
|
+
export async function runDiscover(opts) {
|
|
28
|
+
header('Yujin Forge -- discover intent');
|
|
29
|
+
console.log('');
|
|
30
|
+
const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
31
|
+
const wf = await readWorkflow(projectRoot);
|
|
32
|
+
if (!wf.tier) {
|
|
33
|
+
console.log(c.error('No hay triage previo. Corre primero ') + c.code('yf triage'));
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (wf.intent && !opts.yes) {
|
|
38
|
+
console.log(c.dim('Intent previo: ') + c.brand(wf.intent.operation ?? '?')
|
|
39
|
+
+ c.dim(' / target ') + c.brand(wf.intent.target ?? '?')
|
|
40
|
+
+ c.dim(' / use case ') + c.brand(wf.intent.use_case ?? '?'));
|
|
41
|
+
console.log(c.dim('Para volver a registrar, corre `yf discover --yes`.'));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
console.log(c.dim('Tier: ') + c.brand(wf.tier));
|
|
45
|
+
console.log(c.dim('7 preguntas para registrar QUE estamos construyendo.'));
|
|
46
|
+
console.log('');
|
|
47
|
+
/* Operation type first -- conditional questions depend on it. */
|
|
48
|
+
const opAns = await prompts({
|
|
49
|
+
type: 'select',
|
|
50
|
+
name: 'operation',
|
|
51
|
+
message: 'Tipo de operacion:',
|
|
52
|
+
choices: [
|
|
53
|
+
{ title: 'Migrar proyecto legacy a NAC-3', value: 'migrate' },
|
|
54
|
+
{ title: 'Crear proyecto NUEVO desde cero', value: 'new' },
|
|
55
|
+
{ title: 'Modificar proyecto existente', value: 'modify' },
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
if (!opAns.operation) {
|
|
59
|
+
console.log(c.warn('Discover abortado.'));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const rest = await prompts([
|
|
63
|
+
{
|
|
64
|
+
type: 'select',
|
|
65
|
+
name: 'target',
|
|
66
|
+
message: 'Target devices:',
|
|
67
|
+
choices: [
|
|
68
|
+
{ title: 'Desktop only', value: 'desktop' },
|
|
69
|
+
{ title: 'Mobile only', value: 'mobile' },
|
|
70
|
+
{ title: 'Responsive web (desktop + mobile)', value: 'responsive' },
|
|
71
|
+
{ title: 'Web nativo + Mobile nativo', value: 'web-and-mobile' },
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
type: 'select',
|
|
76
|
+
name: 'input_channel',
|
|
77
|
+
message: 'Canal preferido para hablar con Forge:',
|
|
78
|
+
choices: [
|
|
79
|
+
{ title: 'Chat texto', value: 'chat-text' },
|
|
80
|
+
{ title: 'Voz (push-to-talk)', value: 'voice' },
|
|
81
|
+
{ title: 'Pegar documento (PDF / DOCX / etc)', value: 'document-paste' },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
type: 'select',
|
|
86
|
+
name: 'project_state',
|
|
87
|
+
message: 'Estado actual del proyecto:',
|
|
88
|
+
choices: [
|
|
89
|
+
{ title: 'Cero codigo', value: 'no-code' },
|
|
90
|
+
{ title: 'Tengo repo local sin push', value: 'local-repo' },
|
|
91
|
+
{ title: 'Repo remoto (GitHub / GitLab / Bitbucket)', value: 'remote-repo' },
|
|
92
|
+
{ title: 'Ya esta deployed en algun lado', value: 'deployed' },
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
type: opAns.operation === 'migrate' || opAns.operation === 'modify' ? 'text' : null,
|
|
97
|
+
name: 'legacy_framework',
|
|
98
|
+
message: 'Framework actual + version (ej: "React 16.14", "Angular 12", "Vue 2", "jQuery"):',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: opAns.operation === 'new' ? 'text' : null,
|
|
102
|
+
name: 'preferred_stack',
|
|
103
|
+
message: 'Stack preferido (vacio = default Forge: React + Vite + NAC-3 + Expo mobile):',
|
|
104
|
+
initial: '',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'select',
|
|
108
|
+
name: 'use_case',
|
|
109
|
+
message: 'Caso de uso real:',
|
|
110
|
+
choices: [
|
|
111
|
+
{ title: 'Hobby / aprender', value: 'hobby' },
|
|
112
|
+
{ title: 'POC / prototype', value: 'poc' },
|
|
113
|
+
{ title: 'Herramienta interna de una empresa', value: 'internal' },
|
|
114
|
+
{ title: 'Producto comercial publico', value: 'commercial' },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
]);
|
|
118
|
+
if (!rest.target || !rest.input_channel || !rest.project_state || !rest.use_case) {
|
|
119
|
+
console.log(c.warn('Discover abortado (faltan respuestas).'));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const intent = {
|
|
123
|
+
operation: opAns.operation,
|
|
124
|
+
target: rest.target,
|
|
125
|
+
input_channel: rest.input_channel,
|
|
126
|
+
project_state: rest.project_state,
|
|
127
|
+
legacy_framework: rest.legacy_framework ?? null,
|
|
128
|
+
preferred_stack: rest.preferred_stack || null,
|
|
129
|
+
use_case: rest.use_case,
|
|
130
|
+
decided_at: new Date().toISOString(),
|
|
131
|
+
};
|
|
132
|
+
await patchWorkflowGroup(projectRoot, 'intent', intent);
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(c.success('Intent registrado:'));
|
|
135
|
+
console.log(c.dim(' Operacion: ') + c.brand(intent.operation));
|
|
136
|
+
console.log(c.dim(' Target: ') + c.brand(intent.target));
|
|
137
|
+
console.log(c.dim(' Canal: ') + c.brand(intent.input_channel));
|
|
138
|
+
console.log(c.dim(' Estado: ') + c.brand(intent.project_state));
|
|
139
|
+
if (intent.legacy_framework) {
|
|
140
|
+
console.log(c.dim(' Legacy: ') + c.brand(intent.legacy_framework));
|
|
141
|
+
}
|
|
142
|
+
if (intent.preferred_stack) {
|
|
143
|
+
console.log(c.dim(' Stack: ') + c.brand(intent.preferred_stack));
|
|
144
|
+
}
|
|
145
|
+
console.log(c.dim(' Caso de uso: ') + c.brand(intent.use_case));
|
|
146
|
+
console.log('');
|
|
147
|
+
/* Next-step hint based on what we now know. */
|
|
148
|
+
const tier = wf.tier;
|
|
149
|
+
if (intent.operation === 'migrate' || intent.operation === 'modify') {
|
|
150
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf legacy audit')
|
|
151
|
+
+ c.dim(' (escanea el proyecto existente)'));
|
|
152
|
+
}
|
|
153
|
+
else if (tier === 'simple') {
|
|
154
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf bootstrap')
|
|
155
|
+
+ c.dim(' (scaffolding directo, tier=simple salta clarification)'));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf clarify functional')
|
|
159
|
+
+ c.dim(' (primera ronda de NFR)'));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export function registerDiscoverCommand(program) {
|
|
163
|
+
program
|
|
164
|
+
.command('discover')
|
|
165
|
+
.description('Phase I step 3: discover user intent (migrate / new / modify + target + channel).')
|
|
166
|
+
.option('--cwd <path>', 'project root (default: current directory)')
|
|
167
|
+
.option('--yes', 'overwrite a prior discover decision without prompting')
|
|
168
|
+
.action(async (opts) => {
|
|
169
|
+
try {
|
|
170
|
+
await runDiscover(opts);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
174
|
+
process.exitCode = 1;
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf legacy audit` -- Phase I step 3.5 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Pure inspection of an existing project. Detects framework +
|
|
5
|
+
* version + dependencies + tests + NAC-3 readiness, and writes
|
|
6
|
+
* a workflow.legacy_audit summary to yujin.forge.json so the
|
|
7
|
+
* subsequent clarification rounds + architecture doc have data
|
|
8
|
+
* to ground on.
|
|
9
|
+
*
|
|
10
|
+
* Never mutates. Safe to run on production projects. Output is
|
|
11
|
+
* a JSON report (write-only to yujin.forge.json) + a human
|
|
12
|
+
* summary in the terminal.
|
|
13
|
+
*
|
|
14
|
+
* Heuristics:
|
|
15
|
+
* - framework = React / Angular / Vue / Svelte / Vanilla
|
|
16
|
+
* based on dependencies in package.json
|
|
17
|
+
* - framework_version = the exact installed version (we read
|
|
18
|
+
* dependencies[<framework-pkg>], stripping caret/tilde)
|
|
19
|
+
* - nac3_readiness = % of "decoratable" elements that already
|
|
20
|
+
* have a data-nac-id (computed by greppng src/ for JSX
|
|
21
|
+
* interactive elements + counting matches)
|
|
22
|
+
* - tech_debt_signals = framework < N versions behind latest,
|
|
23
|
+
* known-deprecated deps, missing test directory, package-lock
|
|
24
|
+
* out of sync with package.json
|
|
25
|
+
*
|
|
26
|
+
* ASCII-only.
|
|
27
|
+
*/
|
|
28
|
+
import type { Command } from 'commander';
|
|
29
|
+
export interface LegacyAuditOptions {
|
|
30
|
+
cwd?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function runLegacyAudit(opts: LegacyAuditOptions): Promise<void>;
|
|
33
|
+
export declare function registerLegacyAuditCommand(program: Command): void;
|
|
34
|
+
//# sourceMappingURL=legacy-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-audit.d.ts","sourceRoot":"","sources":["../../src/commands/legacy-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+GD,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqH5E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAcjE"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf legacy audit` -- Phase I step 3.5 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Pure inspection of an existing project. Detects framework +
|
|
5
|
+
* version + dependencies + tests + NAC-3 readiness, and writes
|
|
6
|
+
* a workflow.legacy_audit summary to yujin.forge.json so the
|
|
7
|
+
* subsequent clarification rounds + architecture doc have data
|
|
8
|
+
* to ground on.
|
|
9
|
+
*
|
|
10
|
+
* Never mutates. Safe to run on production projects. Output is
|
|
11
|
+
* a JSON report (write-only to yujin.forge.json) + a human
|
|
12
|
+
* summary in the terminal.
|
|
13
|
+
*
|
|
14
|
+
* Heuristics:
|
|
15
|
+
* - framework = React / Angular / Vue / Svelte / Vanilla
|
|
16
|
+
* based on dependencies in package.json
|
|
17
|
+
* - framework_version = the exact installed version (we read
|
|
18
|
+
* dependencies[<framework-pkg>], stripping caret/tilde)
|
|
19
|
+
* - nac3_readiness = % of "decoratable" elements that already
|
|
20
|
+
* have a data-nac-id (computed by greppng src/ for JSX
|
|
21
|
+
* interactive elements + counting matches)
|
|
22
|
+
* - tech_debt_signals = framework < N versions behind latest,
|
|
23
|
+
* known-deprecated deps, missing test directory, package-lock
|
|
24
|
+
* out of sync with package.json
|
|
25
|
+
*
|
|
26
|
+
* ASCII-only.
|
|
27
|
+
*/
|
|
28
|
+
import path from 'node:path';
|
|
29
|
+
import { promises as fs } from 'node:fs';
|
|
30
|
+
import { c, header } from '../ui/colors.js';
|
|
31
|
+
import { readWorkflow, patchWorkflowGroup, } from '../workflow/state.js';
|
|
32
|
+
const FRAMEWORK_DETECTORS = [
|
|
33
|
+
{ pkg: 'react', name: 'React' },
|
|
34
|
+
{ pkg: '@angular/core', name: 'Angular' },
|
|
35
|
+
{ pkg: 'vue', name: 'Vue' },
|
|
36
|
+
{ pkg: 'svelte', name: 'Svelte' },
|
|
37
|
+
{ pkg: 'solid-js', name: 'SolidJS' },
|
|
38
|
+
{ pkg: 'preact', name: 'Preact' },
|
|
39
|
+
];
|
|
40
|
+
const DEPRECATED_PACKAGES = [
|
|
41
|
+
'request',
|
|
42
|
+
'gulp',
|
|
43
|
+
'bower',
|
|
44
|
+
'phantomjs',
|
|
45
|
+
'node-sass',
|
|
46
|
+
'tslint',
|
|
47
|
+
'create-react-app',
|
|
48
|
+
'jquery',
|
|
49
|
+
'underscore',
|
|
50
|
+
];
|
|
51
|
+
function stripVersionRange(v) {
|
|
52
|
+
return v.replace(/^[\^~>=<]+/, '').trim();
|
|
53
|
+
}
|
|
54
|
+
async function readPackageJson(projectRoot) {
|
|
55
|
+
try {
|
|
56
|
+
const raw = await fs.readFile(path.join(projectRoot, 'package.json'), 'utf-8');
|
|
57
|
+
return JSON.parse(raw);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function countFiles(root, rel, predicate, skip) {
|
|
64
|
+
let count = 0;
|
|
65
|
+
let entries;
|
|
66
|
+
try {
|
|
67
|
+
entries = await fs.readdir(root, { withFileTypes: true });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
for (const e of entries) {
|
|
73
|
+
if (skip.has(e.name))
|
|
74
|
+
continue;
|
|
75
|
+
if (e.isDirectory()) {
|
|
76
|
+
count += await countFiles(path.join(root, e.name), rel ? `${rel}/${e.name}` : e.name, predicate, skip);
|
|
77
|
+
}
|
|
78
|
+
else if (e.isFile() && predicate(e.name)) {
|
|
79
|
+
count++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return count;
|
|
83
|
+
}
|
|
84
|
+
async function scanForNacIds(root, skip) {
|
|
85
|
+
let count = 0;
|
|
86
|
+
let entries;
|
|
87
|
+
try {
|
|
88
|
+
entries = await fs.readdir(root, { withFileTypes: true });
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
for (const e of entries) {
|
|
94
|
+
if (skip.has(e.name))
|
|
95
|
+
continue;
|
|
96
|
+
const p = path.join(root, e.name);
|
|
97
|
+
if (e.isDirectory()) {
|
|
98
|
+
count += await scanForNacIds(p, skip);
|
|
99
|
+
}
|
|
100
|
+
else if (e.isFile() && /\.(tsx?|jsx?|html)$/.test(e.name)) {
|
|
101
|
+
try {
|
|
102
|
+
const text = await fs.readFile(p, 'utf-8');
|
|
103
|
+
const m = text.match(/data-nac-id/g);
|
|
104
|
+
if (m)
|
|
105
|
+
count += m.length;
|
|
106
|
+
}
|
|
107
|
+
catch { /* skip */ }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return count;
|
|
111
|
+
}
|
|
112
|
+
async function scanForInteractiveElements(root, skip) {
|
|
113
|
+
let count = 0;
|
|
114
|
+
let entries;
|
|
115
|
+
try {
|
|
116
|
+
entries = await fs.readdir(root, { withFileTypes: true });
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
for (const e of entries) {
|
|
122
|
+
if (skip.has(e.name))
|
|
123
|
+
continue;
|
|
124
|
+
const p = path.join(root, e.name);
|
|
125
|
+
if (e.isDirectory()) {
|
|
126
|
+
count += await scanForInteractiveElements(p, skip);
|
|
127
|
+
}
|
|
128
|
+
else if (e.isFile() && /\.(tsx?|jsx?|html)$/.test(e.name)) {
|
|
129
|
+
try {
|
|
130
|
+
const text = await fs.readFile(p, 'utf-8');
|
|
131
|
+
/* Rough count of clickable / form-input elements that
|
|
132
|
+
* would benefit from NAC-3 marking. */
|
|
133
|
+
const buttons = (text.match(/<button\b/g) || []).length;
|
|
134
|
+
const inputs = (text.match(/<input\b/g) || []).length;
|
|
135
|
+
const forms = (text.match(/<form\b/g) || []).length;
|
|
136
|
+
const links = (text.match(/<a\s+[^>]*href=/g) || []).length;
|
|
137
|
+
const selects = (text.match(/<select\b/g) || []).length;
|
|
138
|
+
const textareas = (text.match(/<textarea\b/g) || []).length;
|
|
139
|
+
count += buttons + inputs + forms + links + selects + textareas;
|
|
140
|
+
}
|
|
141
|
+
catch { /* skip */ }
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return count;
|
|
145
|
+
}
|
|
146
|
+
export async function runLegacyAudit(opts) {
|
|
147
|
+
header('Yujin Forge -- legacy audit');
|
|
148
|
+
console.log('');
|
|
149
|
+
const projectRoot = opts.cwd ? path.resolve(opts.cwd) : process.cwd();
|
|
150
|
+
const wf = await readWorkflow(projectRoot);
|
|
151
|
+
if (!wf.intent) {
|
|
152
|
+
console.log(c.warn('No hay intent registrado. Sugerido correr `yf discover` primero,'));
|
|
153
|
+
console.log(c.warn('pero `yf legacy audit` corre solo igual.'));
|
|
154
|
+
console.log('');
|
|
155
|
+
}
|
|
156
|
+
else if (wf.intent.operation === 'new') {
|
|
157
|
+
console.log(c.warn('Intent registrado como "new" (proyecto desde cero). El legacy audit'));
|
|
158
|
+
console.log(c.warn('no aplica. Si tu proyecto YA tiene codigo, corre `yf discover --yes`'));
|
|
159
|
+
console.log(c.warn('y elige "modify" o "migrate".'));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const skip = new Set(['node_modules', '.git', 'dist', 'build', '.next',
|
|
163
|
+
'.expo', '.wrangler', 'coverage', '.cache']);
|
|
164
|
+
console.log(c.dim('Escaneando ' + projectRoot + ' ...'));
|
|
165
|
+
console.log('');
|
|
166
|
+
const pkg = await readPackageJson(projectRoot);
|
|
167
|
+
let framework = 'unknown';
|
|
168
|
+
let frameworkVersion = 'unknown';
|
|
169
|
+
if (pkg) {
|
|
170
|
+
const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
171
|
+
for (const det of FRAMEWORK_DETECTORS) {
|
|
172
|
+
const dep = deps[det.pkg];
|
|
173
|
+
if (dep) {
|
|
174
|
+
framework = det.name;
|
|
175
|
+
frameworkVersion = stripVersionRange(dep);
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const totalFiles = await countFiles(projectRoot, '', () => true, skip);
|
|
181
|
+
const tsxFiles = await countFiles(projectRoot, '', (n) => /\.tsx$/.test(n), skip);
|
|
182
|
+
const jsxFiles = await countFiles(projectRoot, '', (n) => /\.jsx$/.test(n), skip);
|
|
183
|
+
const testFiles = await countFiles(projectRoot, '', (n) => /\.(test|spec)\.[tj]sx?$/.test(n), skip);
|
|
184
|
+
const nacIds = await scanForNacIds(projectRoot, skip);
|
|
185
|
+
const interactives = await scanForInteractiveElements(projectRoot, skip);
|
|
186
|
+
/* NAC-3 readiness = % of interactive elements with a data-nac-id.
|
|
187
|
+
* Ceiling at 100%. If no interactive elements, treat as 100%
|
|
188
|
+
* (nothing to mark). */
|
|
189
|
+
const readiness = interactives === 0 ? 100
|
|
190
|
+
: Math.min(100, Math.round((nacIds / interactives) * 100));
|
|
191
|
+
/* Tech debt signals. */
|
|
192
|
+
const signals = [];
|
|
193
|
+
if (framework === 'React' && /^16\.|^15\./.test(frameworkVersion)) {
|
|
194
|
+
signals.push('React major version >= 2 behind (current is 18+)');
|
|
195
|
+
}
|
|
196
|
+
if (framework === 'Angular' && parseInt((frameworkVersion.split('.')[0] ?? '0') || '0', 10) < 15) {
|
|
197
|
+
signals.push('Angular major version >= 3 behind');
|
|
198
|
+
}
|
|
199
|
+
if (testFiles === 0)
|
|
200
|
+
signals.push('no test files found');
|
|
201
|
+
if (pkg && !pkg.dependencies)
|
|
202
|
+
signals.push('no production dependencies declared');
|
|
203
|
+
const deprecated = [];
|
|
204
|
+
if (pkg) {
|
|
205
|
+
const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
206
|
+
for (const dep of DEPRECATED_PACKAGES) {
|
|
207
|
+
if (allDeps[dep])
|
|
208
|
+
deprecated.push(dep);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (deprecated.length > 0) {
|
|
212
|
+
signals.push('deprecated packages present: ' + deprecated.join(', '));
|
|
213
|
+
}
|
|
214
|
+
const audit = {
|
|
215
|
+
ran_at: new Date().toISOString(),
|
|
216
|
+
framework,
|
|
217
|
+
framework_version: frameworkVersion,
|
|
218
|
+
total_files: totalFiles,
|
|
219
|
+
tsx_files: tsxFiles + jsxFiles,
|
|
220
|
+
has_tests: testFiles > 0,
|
|
221
|
+
nac3_readiness: readiness,
|
|
222
|
+
tech_debt_signals: signals,
|
|
223
|
+
deprecated_deps: deprecated,
|
|
224
|
+
};
|
|
225
|
+
await patchWorkflowGroup(projectRoot, 'legacy_audit', audit);
|
|
226
|
+
console.log(c.success('Audit completado:'));
|
|
227
|
+
console.log(c.dim(' Framework: ') + c.brand(framework + ' ' + frameworkVersion));
|
|
228
|
+
console.log(c.dim(' Files total: ') + c.brand(String(totalFiles)));
|
|
229
|
+
console.log(c.dim(' TSX/JSX files: ') + c.brand(String(tsxFiles + jsxFiles)));
|
|
230
|
+
console.log(c.dim(' Test files: ') + c.brand(String(testFiles)));
|
|
231
|
+
console.log(c.dim(' Interactivos: ') + c.brand(String(interactives)));
|
|
232
|
+
console.log(c.dim(' Con NAC-3 id: ') + c.brand(String(nacIds)));
|
|
233
|
+
console.log(c.dim(' Readiness: ') + c.brand(readiness + '%'));
|
|
234
|
+
if (signals.length > 0) {
|
|
235
|
+
console.log('');
|
|
236
|
+
console.log(c.warn('Senales de deuda tecnica:'));
|
|
237
|
+
for (const s of signals)
|
|
238
|
+
console.log(' - ' + s);
|
|
239
|
+
}
|
|
240
|
+
console.log('');
|
|
241
|
+
/* Suggest next step based on readiness + tier. */
|
|
242
|
+
if (readiness < 30) {
|
|
243
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf clarify functional'));
|
|
244
|
+
console.log(c.dim(' Bajo readiness -- mejor relevamos requisitos completos antes de migrar.'));
|
|
245
|
+
}
|
|
246
|
+
else if (readiness > 80) {
|
|
247
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf migrate ' + projectRoot + ' --audit'));
|
|
248
|
+
console.log(c.dim(' Alto readiness -- el migrate audit puede arrancar directo.'));
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
console.log(c.dim('Siguiente paso: ') + c.code('yf clarify functional'));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export function registerLegacyAuditCommand(program) {
|
|
255
|
+
const legacy = program.command('legacy')
|
|
256
|
+
.description('Phase I step 3.5 helpers (audit existing projects).');
|
|
257
|
+
legacy.command('audit')
|
|
258
|
+
.description('Scan the existing project for framework + deps + tests + NAC-3 readiness.')
|
|
259
|
+
.option('--cwd <path>', 'project root (default: current directory)')
|
|
260
|
+
.action(async (opts) => {
|
|
261
|
+
try {
|
|
262
|
+
await runLegacyAudit(opts);
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
266
|
+
process.exitCode = 1;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=legacy-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-audit.js","sourceRoot":"","sources":["../../src/commands/legacy-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAW9B,MAAM,mBAAmB,GAAyC;IAChE,EAAE,GAAG,EAAE,OAAO,EAAa,IAAI,EAAE,OAAO,EAAM;IAC9C,EAAE,GAAG,EAAE,eAAe,EAAK,IAAI,EAAE,SAAS,EAAI;IAC9C,EAAE,GAAG,EAAE,KAAK,EAAe,IAAI,EAAE,KAAK,EAAQ;IAC9C,EAAE,GAAG,EAAE,QAAQ,EAAY,IAAI,EAAE,QAAQ,EAAK;IAC9C,EAAE,GAAG,EAAE,UAAU,EAAU,IAAI,EAAE,SAAS,EAAI;IAC9C,EAAE,GAAG,EAAE,QAAQ,EAAY,IAAI,EAAE,QAAQ,EAAK;CAC/C,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC1B,SAAS;IACT,MAAM;IACN,OAAO;IACP,WAAW;IACX,WAAW;IACX,QAAQ;IACR,kBAAkB;IAClB,QAAQ;IACR,YAAY;CACb,CAAC;AAEF,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,IAAY,EACZ,GAAW,EACX,SAAyC,EACzC,IAAiB;IAEjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QAAC,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAClE,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,KAAK,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACzG,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAiB;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QAAC,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAClE,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,KAAK,IAAI,MAAM,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACrC,IAAI,CAAC;oBAAE,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,IAAY,EAAE,IAAiB;IACvE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QAAC,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAClE,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,KAAK,IAAI,MAAM,0BAA0B,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3C;uDACuC;gBACvC,MAAM,OAAO,GAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACzD,MAAM,MAAM,GAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACxD,MAAM,KAAK,GAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACvD,MAAM,KAAK,GAAM,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC/D,MAAM,OAAO,GAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACzD,MAAM,SAAS,GAAE,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC3D,KAAK,IAAI,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACtE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;QAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,SAAS,GAAG,SAAS,CAAC;IAC1B,IAAI,gBAAgB,GAAG,SAAS,CAAC;IAEjC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,GAAG,EAAE,CAAC;gBACR,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;gBACrB,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAI,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAM,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAM,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrF,MAAM,SAAS,GAAK,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,EAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAErE,MAAM,MAAM,GAAS,MAAM,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,MAAM,0BAA0B,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAEzE;;4BAEwB;IACxB,MAAM,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;QAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAE3E,wBAAwB;IACxB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,SAAS,KAAK,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACzD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAElF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;QAChF,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,GAAG,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,MAAM,EAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1C,SAAS;QACT,iBAAiB,EAAC,gBAAgB;QAClC,WAAW,EAAO,UAAU;QAC5B,SAAS,EAAS,QAAQ,GAAG,QAAQ;QACrC,SAAS,EAAS,SAAS,GAAG,CAAC;QAC/B,cAAc,EAAI,SAAS;QAC3B,iBAAiB,EAAC,OAAO;QACzB,eAAe,EAAG,UAAU;KAC7B,CAAC;IAEF,MAAM,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,KAA2C,CAAC,CAAC;IAEnG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,kDAAkD;IAClD,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC,CAAC;IAClG,CAAC;SAAM,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;SACrC,WAAW,CAAC,qDAAqD,CAAC,CAAC;IACtE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACpB,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,cAAc,EAAE,2CAA2C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf triage` -- Phase I step 1 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user 5 questions, classifies the project into one of
|
|
5
|
+
* three complexity tiers (Simple / Medium / Full), and persists
|
|
6
|
+
* the decision to yujin.forge.json::workflow. The result drives
|
|
7
|
+
* which subsequent phases apply (see PRODUCT_WORKFLOW.md sec 1).
|
|
8
|
+
*
|
|
9
|
+
* Questions:
|
|
10
|
+
* 1. Output type (landing / blog / CRUD app / SaaS / regulated system)
|
|
11
|
+
* 2. Volumetria 12m (numeric: expected concurrent users at 12 months)
|
|
12
|
+
* 3. Industry context (general / health / finance / education / government)
|
|
13
|
+
* 4. Region (LATAM / US / EU / global)
|
|
14
|
+
* 5. Team maintaining (solo / pair / team)
|
|
15
|
+
*
|
|
16
|
+
* Classification rules:
|
|
17
|
+
* Simple = output in {landing, blog, demo} OR volumetria < 50 AND
|
|
18
|
+
* industry = general AND team = solo
|
|
19
|
+
* Full = industry in {health, finance, government} OR volumetria > 5000
|
|
20
|
+
* OR output = regulated_system OR (region = EU AND volumetria > 100)
|
|
21
|
+
* Medium = everything else
|
|
22
|
+
*
|
|
23
|
+
* User can override the auto-tier in the final confirmation.
|
|
24
|
+
*
|
|
25
|
+
* ASCII-only.
|
|
26
|
+
*/
|
|
27
|
+
import type { Command } from 'commander';
|
|
28
|
+
export interface TriageOptions {
|
|
29
|
+
cwd?: string;
|
|
30
|
+
yes?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function runTriage(opts: TriageOptions): Promise<void>;
|
|
33
|
+
export declare function registerTriageCommand(program: Command): void;
|
|
34
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HlE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc5D"}
|