@caiqueoak/flow 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -43
- package/dist/artifacts/backlog.d.mts +16 -0
- package/dist/artifacts/backlog.d.mts.map +1 -0
- package/dist/artifacts/backlog.mjs +193 -0
- package/dist/artifacts/backlog.mjs.map +1 -0
- package/dist/artifacts/document.d.mts +6 -0
- package/dist/artifacts/document.d.mts.map +1 -0
- package/dist/artifacts/document.mjs +39 -0
- package/dist/artifacts/document.mjs.map +1 -0
- package/dist/artifacts/engineering.d.mts +5 -0
- package/dist/artifacts/engineering.d.mts.map +1 -0
- package/dist/artifacts/engineering.mjs +27 -0
- package/dist/artifacts/engineering.mjs.map +1 -0
- package/dist/artifacts/gates.d.mts +7 -0
- package/dist/artifacts/gates.d.mts.map +1 -0
- package/dist/artifacts/gates.mjs +42 -0
- package/dist/artifacts/gates.mjs.map +1 -0
- package/dist/artifacts/implementation-plan.d.mts +11 -0
- package/dist/artifacts/implementation-plan.d.mts.map +1 -0
- package/dist/artifacts/implementation-plan.mjs +30 -0
- package/dist/artifacts/implementation-plan.mjs.map +1 -0
- package/dist/artifacts/prd.d.mts +4 -0
- package/dist/artifacts/prd.d.mts.map +1 -0
- package/dist/artifacts/prd.mjs +13 -0
- package/dist/artifacts/prd.mjs.map +1 -0
- package/dist/artifacts/review.d.mts +11 -0
- package/dist/artifacts/review.d.mts.map +1 -0
- package/dist/artifacts/review.mjs +27 -0
- package/dist/artifacts/review.mjs.map +1 -0
- package/dist/artifacts/spec.d.mts +14 -0
- package/dist/artifacts/spec.d.mts.map +1 -0
- package/dist/artifacts/spec.mjs +50 -0
- package/dist/artifacts/spec.mjs.map +1 -0
- package/dist/artifacts/state.d.mts +44 -0
- package/dist/artifacts/state.d.mts.map +1 -0
- package/dist/artifacts/state.mjs +60 -0
- package/dist/artifacts/state.mjs.map +1 -0
- package/dist/artifacts/tasks.d.mts +10 -0
- package/dist/artifacts/tasks.d.mts.map +1 -0
- package/dist/artifacts/tasks.mjs +107 -0
- package/dist/artifacts/tasks.mjs.map +1 -0
- package/dist/artifacts/work-items.d.mts +21 -0
- package/dist/artifacts/work-items.d.mts.map +1 -0
- package/dist/artifacts/work-items.mjs +81 -0
- package/dist/artifacts/work-items.mjs.map +1 -0
- package/dist/cli/command-registry.d.mts +498 -0
- package/dist/cli/command-registry.d.mts.map +1 -0
- package/dist/cli/command-registry.mjs +230 -0
- package/dist/cli/command-registry.mjs.map +1 -0
- package/dist/cli.d.mts +3 -0
- package/dist/cli.d.mts.map +1 -0
- package/dist/cli.mjs +48 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/commands/doctor.d.mts +21 -0
- package/dist/commands/doctor.d.mts.map +1 -0
- package/dist/commands/doctor.mjs +79 -0
- package/dist/commands/doctor.mjs.map +1 -0
- package/dist/commands/gates.d.mts +14 -0
- package/dist/commands/gates.d.mts.map +1 -0
- package/dist/commands/gates.mjs +136 -0
- package/dist/commands/gates.mjs.map +1 -0
- package/dist/commands/graph.d.mts +11 -0
- package/dist/commands/graph.d.mts.map +1 -0
- package/dist/commands/graph.mjs +78 -0
- package/dist/commands/graph.mjs.map +1 -0
- package/dist/commands/init.d.mts +6 -0
- package/dist/commands/init.d.mts.map +1 -0
- package/dist/commands/init.mjs +126 -0
- package/dist/commands/init.mjs.map +1 -0
- package/dist/commands/migrate.d.mts +27 -0
- package/dist/commands/migrate.d.mts.map +1 -0
- package/dist/commands/migrate.mjs +379 -0
- package/dist/commands/migrate.mjs.map +1 -0
- package/dist/commands/operations.d.mts +13 -0
- package/dist/commands/operations.d.mts.map +1 -0
- package/dist/commands/operations.mjs +340 -0
- package/dist/commands/operations.mjs.map +1 -0
- package/dist/commands/route.d.mts +12 -0
- package/dist/commands/route.d.mts.map +1 -0
- package/dist/commands/route.mjs +45 -0
- package/dist/commands/route.mjs.map +1 -0
- package/dist/commands/schemas.d.mts +5 -0
- package/dist/commands/schemas.d.mts.map +1 -0
- package/dist/commands/schemas.mjs +14 -0
- package/dist/commands/schemas.mjs.map +1 -0
- package/dist/commands/status.d.mts +4 -0
- package/dist/commands/status.d.mts.map +1 -0
- package/dist/commands/status.mjs +18 -0
- package/dist/commands/status.mjs.map +1 -0
- package/dist/commands/sync.d.mts +18 -0
- package/dist/commands/sync.d.mts.map +1 -0
- package/dist/commands/sync.mjs +29 -0
- package/dist/commands/sync.mjs.map +1 -0
- package/dist/commands/trace.d.mts +30 -0
- package/dist/commands/trace.d.mts.map +1 -0
- package/dist/commands/trace.mjs +111 -0
- package/dist/commands/trace.mjs.map +1 -0
- package/dist/commands/validate.d.mts +8 -0
- package/dist/commands/validate.d.mts.map +1 -0
- package/dist/commands/validate.mjs +82 -0
- package/dist/commands/validate.mjs.map +1 -0
- package/dist/domain/contracts.d.mts +203 -0
- package/dist/domain/contracts.d.mts.map +1 -0
- package/dist/domain/contracts.mjs +126 -0
- package/dist/domain/contracts.mjs.map +1 -0
- package/dist/domain/types.d.ts +45 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/entry.d.ts +3 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +4 -0
- package/dist/entry.js.map +1 -0
- package/dist/shared/cli-io.d.mts +15 -0
- package/dist/shared/cli-io.d.mts.map +1 -0
- package/dist/shared/cli-io.mjs +83 -0
- package/dist/shared/cli-io.mjs.map +1 -0
- package/dist/shared/profiles.d.mts +17 -0
- package/dist/shared/profiles.d.mts.map +1 -0
- package/dist/shared/profiles.mjs +25 -0
- package/dist/shared/profiles.mjs.map +1 -0
- package/dist/shared/project-config.d.mts +21 -0
- package/dist/shared/project-config.d.mts.map +1 -0
- package/dist/shared/project-config.mjs +41 -0
- package/dist/shared/project-config.mjs.map +1 -0
- package/dist/shared/project-path.d.mts +3 -0
- package/dist/shared/project-path.d.mts.map +1 -0
- package/dist/shared/project-path.mjs +9 -0
- package/dist/shared/project-path.mjs.map +1 -0
- package/dist/shared/skill-installer.d.mts +2 -0
- package/dist/shared/skill-installer.d.mts.map +1 -0
- package/dist/shared/skill-installer.mjs +33 -0
- package/dist/shared/skill-installer.mjs.map +1 -0
- package/package.json +16 -8
- package/schemas/backlog.schema.json +85 -0
- package/schemas/config.schema.json +29 -0
- package/schemas/gates.schema.json +17 -0
- package/schemas/review.schema.json +28 -0
- package/schemas/tasks.schema.json +66 -0
- package/skills/flow/SKILL.md +10 -11
- package/skills/flow/build/step-01-execute-task.md +2 -2
- package/skills/flow/discovery/bmad-comparison.md +5 -0
- package/skills/flow/discovery/step-01-project.md +8 -3
- package/skills/flow/engineering/profiles/readability-first.md +1 -0
- package/skills/flow/engineering/step-02-synthesize.md +1 -1
- package/skills/flow/invariants.md +4 -4
- package/skills/flow/planning/step-01-create-tasks.md +3 -0
- package/skills/flow/planning/step-01-plan-work-item.md +2 -2
- package/skills/flow/review/step-01-review-work-item.md +1 -1
- package/skills/flow/specification/step-01-deepen-spec.md +7 -0
- package/src/artifacts/backlog.mjs +0 -157
- package/src/artifacts/document.mjs +0 -30
- package/src/artifacts/engineering.mjs +0 -26
- package/src/artifacts/gates.mjs +0 -28
- package/src/artifacts/implementation-plan.mjs +0 -27
- package/src/artifacts/prd.mjs +0 -12
- package/src/artifacts/state.mjs +0 -63
- package/src/artifacts/tasks.mjs +0 -90
- package/src/cli.mjs +0 -62
- package/src/commands/gates.mjs +0 -71
- package/src/commands/graph.mjs +0 -92
- package/src/commands/init.mjs +0 -111
- package/src/commands/migrate.mjs +0 -224
- package/src/commands/route.mjs +0 -140
- package/src/commands/status.mjs +0 -35
- package/src/commands/trace.mjs +0 -58
- package/src/commands/validate.mjs +0 -197
- package/src/shared/cli-io.mjs +0 -86
- package/src/shared/profiles.mjs +0 -27
- package/src/shared/project-config.mjs +0 -39
- package/src/shared/project-path.mjs +0 -10
- package/src/shared/skill-installer.mjs +0 -34
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
const common = [{ name: '--path', value: '<project>', description: 'Project root (default: current directory).' }];
|
|
2
|
+
export const COMMANDS = Object.freeze([
|
|
3
|
+
{
|
|
4
|
+
name: 'init',
|
|
5
|
+
description: 'Initialize Flow or refresh runtime integrations.',
|
|
6
|
+
usage: 'flow init [options]',
|
|
7
|
+
flags: [
|
|
8
|
+
...common,
|
|
9
|
+
{ name: '--runtime', value: '<list>' },
|
|
10
|
+
{ name: '--profile', value: '<id>', default: 'readability-first' },
|
|
11
|
+
{ name: '--existing-code', value: '<policy>', values: ['improve', 'preserve'] }
|
|
12
|
+
],
|
|
13
|
+
effects: 'Writes config and runtime skills.',
|
|
14
|
+
when: 'Once per project and after an explicit package update.',
|
|
15
|
+
load: () => import('../commands/init.mjs'),
|
|
16
|
+
run: 'runInit'
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'doctor',
|
|
20
|
+
description: 'Diagnose versions, artifacts, schemas and integrations without writing.',
|
|
21
|
+
usage: 'flow doctor [--quick] [--json]',
|
|
22
|
+
flags: [...common, { name: '--quick' }, { name: '--json' }],
|
|
23
|
+
effects: 'Read-only.',
|
|
24
|
+
when: 'At every /flow start with --quick --json, or before migration.',
|
|
25
|
+
load: () => import('../commands/doctor.mjs'),
|
|
26
|
+
run: 'runDoctor'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'migrate',
|
|
30
|
+
description: 'Plan or apply deterministic, recoverable structural migrations.',
|
|
31
|
+
usage: 'flow migrate --plan|--apply [--json]',
|
|
32
|
+
flags: [...common, { name: '--plan' }, { name: '--apply' }, { name: '--json' }],
|
|
33
|
+
effects: '--plan is read-only; --apply uses validated staging and a recoverable backup.',
|
|
34
|
+
when: 'After doctor reports an artifact version mismatch.',
|
|
35
|
+
load: () => import('../commands/migrate.mjs'),
|
|
36
|
+
run: 'runMigrate'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'status',
|
|
40
|
+
description: 'Show persisted progress and derived eligibility/blocking.',
|
|
41
|
+
usage: 'flow status [--json]',
|
|
42
|
+
flags: [...common, { name: '--json' }],
|
|
43
|
+
effects: 'Read-only.',
|
|
44
|
+
when: 'To inspect progress.',
|
|
45
|
+
load: () => import('../commands/status.mjs'),
|
|
46
|
+
run: 'runStatus'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'validate',
|
|
50
|
+
description: 'Run fast structural validation; gates are opt-in.',
|
|
51
|
+
usage: 'flow validate [--work-item W###] [--gates] [--json]',
|
|
52
|
+
flags: [
|
|
53
|
+
...common,
|
|
54
|
+
{ name: '--work-item', value: '<W###>' },
|
|
55
|
+
{ name: '--gates' },
|
|
56
|
+
{ name: '--pre-commit', value: '<W###-T###>' },
|
|
57
|
+
{ name: '--skip-trace' },
|
|
58
|
+
{ name: '--json' }
|
|
59
|
+
],
|
|
60
|
+
effects: 'Read-only; --gates may execute configured processes.',
|
|
61
|
+
when: 'After structured changes and before commits.',
|
|
62
|
+
load: () => import('../commands/validate.mjs'),
|
|
63
|
+
run: 'runValidate'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'route',
|
|
67
|
+
description: 'Resolve the next legal workflow step and safe validation scope.',
|
|
68
|
+
usage: 'flow route [--json]',
|
|
69
|
+
flags: [...common, { name: '--json' }],
|
|
70
|
+
effects: 'Read-only.',
|
|
71
|
+
when: 'After doctor and every completed workflow step.',
|
|
72
|
+
load: () => import('../commands/route.mjs'),
|
|
73
|
+
run: 'runRoute'
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'sync',
|
|
77
|
+
description: 'Materialize disposable projections from canonical work-items.',
|
|
78
|
+
usage: 'flow sync',
|
|
79
|
+
flags: common,
|
|
80
|
+
effects: 'Reads only canonical work-items; writes _flow/generated/ only.',
|
|
81
|
+
when: 'After canonical work-item changes.',
|
|
82
|
+
load: () => import('../commands/sync.mjs'),
|
|
83
|
+
run: 'runSync'
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'trace',
|
|
87
|
+
description: 'Resolve a permanent task ID against reachable Git history.',
|
|
88
|
+
usage: 'flow trace W###[-T###] [--json]',
|
|
89
|
+
arguments: [{ name: 'identity', required: true, description: 'Task W###-T### or aggregate work-item W###.' }],
|
|
90
|
+
flags: [...common, { name: '--json' }],
|
|
91
|
+
effects: 'Read-only Git inspection.',
|
|
92
|
+
when: 'After task completion and during review.',
|
|
93
|
+
load: () => import('../commands/trace.mjs'),
|
|
94
|
+
run: 'runTrace'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'gates',
|
|
98
|
+
description: 'List or selectively run deterministic project gates.',
|
|
99
|
+
usage: 'flow gates list|run [filters]',
|
|
100
|
+
arguments: [{ name: 'action', required: true }],
|
|
101
|
+
flags: [
|
|
102
|
+
...common,
|
|
103
|
+
{ name: '--id', value: '<gate-id>' },
|
|
104
|
+
{ name: '--task', value: '<W###-T###>' },
|
|
105
|
+
{ name: '--work-item', value: '<W###>' },
|
|
106
|
+
{ name: '--stage', value: '<stage>', values: ['task', 'work-item-review', 'full'] },
|
|
107
|
+
{ name: '--all' },
|
|
108
|
+
{ name: '--json' }
|
|
109
|
+
],
|
|
110
|
+
effects: 'list is read-only; run executes selected commands.',
|
|
111
|
+
when: 'For the smallest safe verification scope.',
|
|
112
|
+
load: () => import('../commands/gates.mjs'),
|
|
113
|
+
run: 'runGates'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'work-item',
|
|
117
|
+
description: 'Create or deterministically update backlog work-items.',
|
|
118
|
+
usage: 'flow work-item <create|set|priority|dependencies|blocker-add|blocker-resolve|promote|review-complete> ...',
|
|
119
|
+
arguments: [{ name: 'operation', required: true }],
|
|
120
|
+
flags: [
|
|
121
|
+
...common,
|
|
122
|
+
{ name: '--title', value: '<text>' },
|
|
123
|
+
{ name: '--kind', value: '<kind>', values: ['feature', 'technical', 'maintenance'] },
|
|
124
|
+
{ name: '--priority', value: '<integer>' },
|
|
125
|
+
{ name: '--depends-on', value: '<W###,...>' },
|
|
126
|
+
{ name: '--id', value: '<blocker-id>' },
|
|
127
|
+
{ name: '--type', value: '<type>', values: ['external_action', 'consequential_decision'] },
|
|
128
|
+
{ name: '--description', value: '<text>' },
|
|
129
|
+
{ name: '--domain', value: '<domain>' }
|
|
130
|
+
],
|
|
131
|
+
effects: 'Writes only artifacts in the target work-item folder.',
|
|
132
|
+
when: 'For deterministic backlog mutations.',
|
|
133
|
+
load: () => import('../commands/operations.mjs'),
|
|
134
|
+
run: 'runWorkItem'
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'task',
|
|
138
|
+
description: 'Create, update, start or commit tasks.',
|
|
139
|
+
usage: 'flow task <create|set|start|commit> W###[-T###] [options]',
|
|
140
|
+
arguments: [{ name: 'operation', required: true }],
|
|
141
|
+
flags: [
|
|
142
|
+
...common,
|
|
143
|
+
{ name: '--title', value: '<text>' },
|
|
144
|
+
{ name: '--depends-on', value: '<T###,...>' },
|
|
145
|
+
{ name: '--message', value: '<objective commit title>' },
|
|
146
|
+
{ name: '--files', value: '<path,...>' }
|
|
147
|
+
],
|
|
148
|
+
effects: 'Task commit creates the one canonical implementation commit.',
|
|
149
|
+
when: 'Only after spec maturity is ready.',
|
|
150
|
+
load: () => import('../commands/operations.mjs'),
|
|
151
|
+
run: 'runTask'
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'approval',
|
|
155
|
+
description: 'Persist an explicit human approval for a document revision.',
|
|
156
|
+
usage: 'flow approval record <path> [--at <ISO timestamp>]',
|
|
157
|
+
arguments: [{ name: 'operation', required: true }],
|
|
158
|
+
flags: [...common, { name: '--at', value: '<timestamp>' }],
|
|
159
|
+
effects: 'Updates approved frontmatter.',
|
|
160
|
+
when: 'Only after explicit approval of the exact document.',
|
|
161
|
+
load: () => import('../commands/operations.mjs'),
|
|
162
|
+
run: 'runApproval'
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'scope',
|
|
166
|
+
description: 'Validate the staged scope for one task before its implementation commit.',
|
|
167
|
+
usage: 'flow scope validate W###-T### --files <path,...> [--json]',
|
|
168
|
+
arguments: [{ name: 'operation', required: true }],
|
|
169
|
+
flags: [...common, { name: '--files', value: '<path,...>' }, { name: '--json' }],
|
|
170
|
+
effects: 'Read-only staged Git inspection and structural validation.',
|
|
171
|
+
when: 'Immediately before a task implementation commit.',
|
|
172
|
+
load: () => import('../commands/operations.mjs'),
|
|
173
|
+
run: 'runScope'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'schemas',
|
|
177
|
+
description: 'Generate JSON Schemas from central contracts.',
|
|
178
|
+
usage: 'flow schemas',
|
|
179
|
+
flags: [],
|
|
180
|
+
effects: 'Writes package schemas.',
|
|
181
|
+
when: 'Build/release.',
|
|
182
|
+
load: () => import('../commands/schemas.mjs'),
|
|
183
|
+
run: 'runSchemas',
|
|
184
|
+
hidden: true
|
|
185
|
+
}
|
|
186
|
+
]);
|
|
187
|
+
export const commandByName = (name) => COMMANDS.find((command) => command.name === name);
|
|
188
|
+
export function renderGlobalHelp(version) {
|
|
189
|
+
const rows = COMMANDS.filter((command) => !command.hidden).map((command) => ` ${command.name.padEnd(11)} ${command.description}`);
|
|
190
|
+
return `Flow ${version}\n\nUsage: npx --no-install flow <command> [options]\nEngineering baseline: Readability First.\n\nGlobal parameters:\n --help, -h Show help.\n --version, -v Show package version.\n --path <project> Select project root (default: current directory).\n\nCommands:\n${rows.join('\n')}\n\nRun flow <command> --help for syntax, values, effects and usage guidance.`;
|
|
191
|
+
}
|
|
192
|
+
export function renderCommandHelp(command) {
|
|
193
|
+
const argumentsText = command.arguments?.length
|
|
194
|
+
? command.arguments
|
|
195
|
+
.map((argument) => ` ${argument.name}${argument.required ? ' (required)' : ''} — ${argument.description ?? 'Command argument.'}`)
|
|
196
|
+
.join('\n')
|
|
197
|
+
: ' (none)';
|
|
198
|
+
const flags = command.flags?.length
|
|
199
|
+
? command.flags
|
|
200
|
+
.map((flag) => ` ${flag.name}${flag.value ? ` ${flag.value}` : ''}${flag.values ? ` (${flag.values.join('|')})` : ''}${flag.default ? ` [default: ${flag.default}]` : ''} — ${flag.description ?? 'Command option.'}`)
|
|
201
|
+
.join('\n')
|
|
202
|
+
: ' (none)';
|
|
203
|
+
return `${command.description}\n\nSyntax:\n ${command.usage}\n\nArguments:\n${argumentsText}\n\nOptions:\n${flags}\n\nEffects:\n ${command.effects}\n\nUse when:\n ${command.when}`;
|
|
204
|
+
}
|
|
205
|
+
export function validateCommandArguments(command, args) {
|
|
206
|
+
const allowed = new Map((command.flags ?? []).map((flag) => [flag.name, flag]));
|
|
207
|
+
const positional = [];
|
|
208
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
209
|
+
const value = args[index];
|
|
210
|
+
if (!value.startsWith('-')) {
|
|
211
|
+
positional.push(value);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const flag = allowed.get(value);
|
|
215
|
+
if (!flag)
|
|
216
|
+
throw new Error(`unknown option '${value}' for flow ${command.name}.`);
|
|
217
|
+
if (flag.value) {
|
|
218
|
+
const next = args[++index];
|
|
219
|
+
if (!next || next.startsWith('-'))
|
|
220
|
+
throw new Error(`${value} requires ${flag.value}.`);
|
|
221
|
+
if (flag.values && !flag.values.includes(next))
|
|
222
|
+
throw new Error(`${value} must be one of: ${flag.values.join(', ')}.`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (command.name === 'migrate' && args.includes('--plan') === args.includes('--apply'))
|
|
226
|
+
throw new Error('flow migrate requires exactly one of --plan or --apply.');
|
|
227
|
+
if (command.arguments?.some((argument) => argument.required) && !positional.length)
|
|
228
|
+
throw new Error(`flow ${command.name} requires ${command.arguments[0].name}.`);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=command-registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-registry.mjs","sourceRoot":"","sources":["../../src/cli/command-registry.mjs"],"names":[],"mappings":"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"}
|
package/dist/cli.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.mts","sourceRoot":"","sources":["../src/cli.mjs"],"names":[],"mappings":";AAgBA,wBAAsB,MAAM,CAAC,IAAI,MAAwB,gBAkBxD"}
|
package/dist/cli.mjs
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { CliError, info } from './shared/cli-io.mjs';
|
|
6
|
+
import { commandByName, renderCommandHelp, renderGlobalHelp, validateCommandArguments } from './cli/command-registry.mjs';
|
|
7
|
+
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
8
|
+
const packageManifest = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
9
|
+
export async function runCli(args = process.argv.slice(2)) {
|
|
10
|
+
if (!args.length || ['--help', '-h'].includes(args[0]))
|
|
11
|
+
return info(renderGlobalHelp(packageManifest.version));
|
|
12
|
+
if (['--version', '-v'].includes(args[0]))
|
|
13
|
+
return info(packageManifest.version);
|
|
14
|
+
const command = commandByName(args[0]);
|
|
15
|
+
if (!command)
|
|
16
|
+
throw new CliError(`unknown command '${args[0]}'. Run flow --help.`);
|
|
17
|
+
if (args.slice(1).some((arg) => ['--help', '-h'].includes(arg)))
|
|
18
|
+
return info(renderCommandHelp(command));
|
|
19
|
+
try {
|
|
20
|
+
validateCommandArguments(command, args.slice(1));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
throw new CliError(error.message);
|
|
24
|
+
}
|
|
25
|
+
const module = await command.load();
|
|
26
|
+
return module[command.run]({
|
|
27
|
+
args: args.slice(1),
|
|
28
|
+
packageRoot,
|
|
29
|
+
packageName: packageManifest.name,
|
|
30
|
+
version: packageManifest.version
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
await runCli();
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error?.code === 'ABORT_ERR') {
|
|
38
|
+
info('\nFlow command canceled.');
|
|
39
|
+
process.exitCode = 130;
|
|
40
|
+
}
|
|
41
|
+
else if (error instanceof CliError) {
|
|
42
|
+
console.error(`flow: ${error.message}`);
|
|
43
|
+
process.exitCode = error.exitCode || 1;
|
|
44
|
+
}
|
|
45
|
+
else
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.mjs","sourceRoot":"","sources":["../src/cli.mjs"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare function diagnoseProject(root: any, { quick, version, packageRoot }?: {
|
|
2
|
+
quick?: boolean | undefined;
|
|
3
|
+
}): {
|
|
4
|
+
healthy: boolean;
|
|
5
|
+
mode: string;
|
|
6
|
+
checks: any[];
|
|
7
|
+
configured_version?: never;
|
|
8
|
+
executed_version?: never;
|
|
9
|
+
} | {
|
|
10
|
+
healthy: boolean;
|
|
11
|
+
mode: string;
|
|
12
|
+
configured_version: string | null;
|
|
13
|
+
executed_version: any;
|
|
14
|
+
checks: any[];
|
|
15
|
+
};
|
|
16
|
+
export declare function runDoctor({ args, version, packageRoot }: {
|
|
17
|
+
args: any;
|
|
18
|
+
packageRoot: any;
|
|
19
|
+
version: any;
|
|
20
|
+
}): void;
|
|
21
|
+
//# sourceMappingURL=doctor.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.mts","sourceRoot":"","sources":["../../src/commands/doctor.mjs"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,IAAI,KAAA,EAAE,EAAE,KAAa,EAAE,OAAO,EAAE,WAAW,EAAE;;CAAK;;;;;;;;;;;;EAwFjF;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;;;;CAAA,QASvD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { info } from '../shared/cli-io.mjs';
|
|
5
|
+
import { projectRoot } from '../shared/project-path.mjs';
|
|
6
|
+
import { readConfig } from '../shared/project-config.mjs';
|
|
7
|
+
import { validateProject } from './validate.mjs';
|
|
8
|
+
export function diagnoseProject(root, { quick = false, version, packageRoot } = {}) {
|
|
9
|
+
const checks = [];
|
|
10
|
+
const add = (id, ok, message, recovery) => checks.push({ id, status: ok ? 'pass' : 'fail', message, ...(recovery ? { recovery } : {}) });
|
|
11
|
+
const flow = path.join(root, '_flow');
|
|
12
|
+
const legacyFlow = path.join(root, '.flow');
|
|
13
|
+
if (!fs.existsSync(flow) && fs.existsSync(legacyFlow)) {
|
|
14
|
+
add('flow-directory', false, 'Legacy .flow directory requires explicit migration to _flow.', 'Run flow migrate --plan.');
|
|
15
|
+
return {
|
|
16
|
+
healthy: false,
|
|
17
|
+
mode: quick ? 'quick' : 'full',
|
|
18
|
+
configured_version: null,
|
|
19
|
+
executed_version: version,
|
|
20
|
+
checks
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
add('flow-directory', fs.existsSync(flow), '_flow directory is present.', 'Run flow init.');
|
|
24
|
+
if (!fs.existsSync(flow))
|
|
25
|
+
return { healthy: false, mode: quick ? 'quick' : 'full', checks };
|
|
26
|
+
let config;
|
|
27
|
+
try {
|
|
28
|
+
config = readConfig(root);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
add('config', false, error.message, 'Repair config.yaml or run migration.');
|
|
32
|
+
}
|
|
33
|
+
add('config', Boolean(config), 'config.yaml is readable.', 'Run flow init.');
|
|
34
|
+
if (config) {
|
|
35
|
+
add('version', config.flow_version === version, `Project uses ${config.flow_version ?? 'an unversioned legacy release'}; CLI is ${version}.`, 'Update deliberately, then run flow migrate --plan.');
|
|
36
|
+
const skillCompatible = (config.runtimes ?? []).every((runtime) => fs.existsSync(path.join(root, runtime.skills_path, 'flow', 'SKILL.md')));
|
|
37
|
+
add('integrations', skillCompatible, 'Configured Flow skills are installed.', 'Run flow init to refresh configured integrations.');
|
|
38
|
+
}
|
|
39
|
+
for (const required of ['config.yaml', 'gates.yaml', 'work-items'])
|
|
40
|
+
add(`artifact:${required}`, fs.existsSync(path.join(flow, required)), `${required} is present.`, 'Restore it or run flow init.');
|
|
41
|
+
for (const schema of ['config', 'backlog', 'tasks', 'review', 'gates'])
|
|
42
|
+
add(`schema:${schema}`, fs.existsSync(path.join(packageRoot, 'schemas', `${schema}.schema.json`)), `${schema} schema is packaged.`, 'Reinstall the Flow package.');
|
|
43
|
+
if (!quick) {
|
|
44
|
+
const findings = validateProject(root, { skipTrace: false });
|
|
45
|
+
add('invariants', findings.length === 0, findings.length ? `${findings.length} validation finding(s).` : 'All structural invariants pass.', 'Run flow validate for details.');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
for (const file of ['gates.yaml']) {
|
|
49
|
+
const target = path.join(flow, file);
|
|
50
|
+
if (!fs.existsSync(target))
|
|
51
|
+
continue;
|
|
52
|
+
try {
|
|
53
|
+
parse(fs.readFileSync(target, 'utf8'));
|
|
54
|
+
add(`yaml:${file}`, true, `${file} parses.`);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
add(`yaml:${file}`, false, error.message, 'Repair or migrate the artifact.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
healthy: checks.every((check) => check.status === 'pass'),
|
|
63
|
+
mode: quick ? 'quick' : 'full',
|
|
64
|
+
configured_version: config?.flow_version ?? null,
|
|
65
|
+
executed_version: version,
|
|
66
|
+
checks
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function runDoctor({ args, version, packageRoot }) {
|
|
70
|
+
const result = diagnoseProject(projectRoot(args), { quick: args.includes('--quick'), version, packageRoot });
|
|
71
|
+
if (args.includes('--json'))
|
|
72
|
+
info(JSON.stringify(result, null, 2));
|
|
73
|
+
else
|
|
74
|
+
for (const check of result.checks)
|
|
75
|
+
info(`${check.status === 'pass' ? 'PASS' : 'FAIL'} ${check.id}: ${check.message}${check.recovery && check.status === 'fail' ? ` ${check.recovery}` : ''}`);
|
|
76
|
+
if (!result.healthy)
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=doctor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.mjs","sourceRoot":"","sources":["../../src/commands/doctor.mjs"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function selectGates(gates: any, { ids, task, workItem, stage, all }?: {
|
|
2
|
+
all?: boolean | undefined;
|
|
3
|
+
ids?: never[] | undefined;
|
|
4
|
+
stage?: null | undefined;
|
|
5
|
+
task?: null | undefined;
|
|
6
|
+
workItem?: null | undefined;
|
|
7
|
+
}): any;
|
|
8
|
+
export declare function evaluateGates(root: any, filters?: {
|
|
9
|
+
all: boolean;
|
|
10
|
+
}): any;
|
|
11
|
+
export declare function runGates({ args }: {
|
|
12
|
+
args: any;
|
|
13
|
+
}): void;
|
|
14
|
+
//# sourceMappingURL=gates.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates.d.mts","sourceRoot":"","sources":["../../src/commands/gates.mjs"],"names":[],"mappings":"AA0DA,wBAAgB,WAAW,CAAC,KAAK,KAAA,EAAE,EAAE,GAAQ,EAAE,IAAW,EAAE,QAAe,EAAE,KAAY,EAAE,GAAW,EAAE;;;;;;CAAK,OAkB5G;AAED,wBAAgB,aAAa,CAAC,IAAI,KAAA,EAAE,OAAO;IAAK,GAAG;CAAQ,OAY1D;AAOD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE;;CAAA,QA6BhC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { fail } from '../shared/cli-io.mjs';
|
|
5
|
+
import { parseGates } from '../artifacts/gates.mjs';
|
|
6
|
+
function runCommandGate(root, gate) {
|
|
7
|
+
const shell = process.platform === 'win32' ? process.env.ComSpec || 'cmd.exe' : '/bin/sh';
|
|
8
|
+
const args = process.platform === 'win32' ? ['/d', '/s', '/c', gate.command] : ['-lc', gate.command];
|
|
9
|
+
const result = spawnSync(shell, args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
10
|
+
return {
|
|
11
|
+
id: gate.id,
|
|
12
|
+
kind: gate.kind,
|
|
13
|
+
blocking: gate.blocking,
|
|
14
|
+
status: result.status === 0 ? 'passed' : 'failed',
|
|
15
|
+
exit_code: result.status,
|
|
16
|
+
stdout: result.stdout,
|
|
17
|
+
stderr: result.stderr
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function runBuiltinGate(root, gate) {
|
|
21
|
+
if (gate.rule !== 'kebab-case-files')
|
|
22
|
+
return {
|
|
23
|
+
id: gate.id,
|
|
24
|
+
kind: gate.kind,
|
|
25
|
+
blocking: gate.blocking,
|
|
26
|
+
status: 'unsupported',
|
|
27
|
+
message: `Unknown builtin rule '${gate.rule}'.`
|
|
28
|
+
};
|
|
29
|
+
const excluded = new Set(['.git', '_flow', 'node_modules']);
|
|
30
|
+
const violations = [];
|
|
31
|
+
function walk(directory) {
|
|
32
|
+
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
|
|
33
|
+
if (excluded.has(entry.name))
|
|
34
|
+
continue;
|
|
35
|
+
const full = path.join(directory, entry.name);
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
walk(full);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (entry.name.startsWith('.'))
|
|
41
|
+
continue;
|
|
42
|
+
const ext = path.extname(entry.name);
|
|
43
|
+
const stem = ext ? entry.name.slice(0, -ext.length) : entry.name;
|
|
44
|
+
if (/^[A-Z0-9_.-]+$/.test(entry.name))
|
|
45
|
+
continue;
|
|
46
|
+
const valid = stem.split('.').every((segment) => /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(segment));
|
|
47
|
+
if (!valid)
|
|
48
|
+
violations.push(path.relative(root, full));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
walk(root);
|
|
52
|
+
return {
|
|
53
|
+
id: gate.id,
|
|
54
|
+
kind: gate.kind,
|
|
55
|
+
blocking: gate.blocking,
|
|
56
|
+
status: violations.length ? 'failed' : 'passed',
|
|
57
|
+
violations
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function selectGates(gates, { ids = [], task = null, workItem = null, stage = null, all = false } = {}) {
|
|
61
|
+
return gates.filter((gate) => {
|
|
62
|
+
if (ids.length && !ids.includes(gate.id))
|
|
63
|
+
return false;
|
|
64
|
+
if (stage && gate.stage !== stage)
|
|
65
|
+
return false;
|
|
66
|
+
if (all)
|
|
67
|
+
return true;
|
|
68
|
+
if (task)
|
|
69
|
+
return ((gate.scope.tasks ?? []).includes(task) ||
|
|
70
|
+
(gate.scope.work_items ?? []).includes(task.split('-T')[0]) ||
|
|
71
|
+
(gate.stage === 'task' && !Object.keys(gate.scope).length));
|
|
72
|
+
if (workItem)
|
|
73
|
+
return ((gate.scope.work_items ?? []).includes(workItem) ||
|
|
74
|
+
(gate.stage === 'work-item-review' && !Object.keys(gate.scope).length));
|
|
75
|
+
return ids.length > 0 || Boolean(stage);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export function evaluateGates(root, filters = { all: true }) {
|
|
79
|
+
const file = path.join(root, '_flow', 'gates.yaml');
|
|
80
|
+
if (!fs.existsSync(file))
|
|
81
|
+
fail('gates.yaml does not exist.');
|
|
82
|
+
const { gates } = parseGates(fs.readFileSync(file, 'utf8'));
|
|
83
|
+
return selectGates(gates, filters).map((gate) => {
|
|
84
|
+
const startedAt = performance.now();
|
|
85
|
+
let result;
|
|
86
|
+
if (gate.kind === 'command')
|
|
87
|
+
result = runCommandGate(root, gate);
|
|
88
|
+
else if (gate.kind === 'builtin')
|
|
89
|
+
result = runBuiltinGate(root, gate);
|
|
90
|
+
else
|
|
91
|
+
throw new Error(`Unsupported gate kind '${gate.kind}'.`);
|
|
92
|
+
return { ...result, duration_ms: Math.round(performance.now() - startedAt) };
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function option(args, name) {
|
|
96
|
+
const index = args.indexOf(name);
|
|
97
|
+
return index < 0 ? null : args[index + 1];
|
|
98
|
+
}
|
|
99
|
+
export function runGates({ args }) {
|
|
100
|
+
const root = path.resolve(option(args, '--path') ?? process.cwd());
|
|
101
|
+
const action = args.find((arg) => !arg.startsWith('-'));
|
|
102
|
+
const file = path.join(root, '_flow', 'gates.yaml');
|
|
103
|
+
if (!fs.existsSync(file))
|
|
104
|
+
fail('gates.yaml does not exist.');
|
|
105
|
+
const parsed = parseGates(fs.readFileSync(file, 'utf8'));
|
|
106
|
+
const filters = {
|
|
107
|
+
ids: option(args, '--id')?.split(',') ?? [],
|
|
108
|
+
task: option(args, '--task'),
|
|
109
|
+
workItem: option(args, '--work-item'),
|
|
110
|
+
stage: option(args, '--stage'),
|
|
111
|
+
all: args.includes('--all')
|
|
112
|
+
};
|
|
113
|
+
const hasFilter = filters.ids.length || filters.task || filters.workItem || filters.stage || filters.all;
|
|
114
|
+
if (action === 'list' && !hasFilter)
|
|
115
|
+
filters.all = true;
|
|
116
|
+
const selected = selectGates(parsed.gates, filters);
|
|
117
|
+
if (action === 'list') {
|
|
118
|
+
const output = args.includes('--json')
|
|
119
|
+
? JSON.stringify(selected, null, 2)
|
|
120
|
+
: selected.map((gate) => `${gate.id}\t${gate.stage}\t${gate.cost}\t${gate.command ?? gate.rule}`).join('\n');
|
|
121
|
+
return console.log(output);
|
|
122
|
+
}
|
|
123
|
+
if (action !== 'run')
|
|
124
|
+
fail("flow gates requires 'list' or 'run'.");
|
|
125
|
+
if (!selected.length)
|
|
126
|
+
fail('No gates matched; use --all or a scope filter.');
|
|
127
|
+
const results = evaluateGates(root, filters);
|
|
128
|
+
if (args.includes('--json'))
|
|
129
|
+
console.log(JSON.stringify(results, null, 2));
|
|
130
|
+
else
|
|
131
|
+
for (const result of results)
|
|
132
|
+
console.log(`${result.status.toUpperCase()} ${result.id} (${result.duration_ms}ms)`);
|
|
133
|
+
if (results.some((result) => result.blocking && result.status !== 'passed'))
|
|
134
|
+
process.exitCode = 1;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=gates.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates.mjs","sourceRoot":"","sources":["../../src/commands/gates.mjs"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1G,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QACjD,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI;IAChC,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;QAClC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,yBAAyB,IAAI,CAAC,IAAI,IAAI;SAChD,CAAC;IACJ,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,SAAS,IAAI,CAAC,SAAS;QACrB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACvE,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACjE,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,KAAK;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QAC/C,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE;IAC3G,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAChD,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC;QACrB,IAAI,IAAI;YACN,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACvC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAC3D,CAAC;QACJ,IAAI,QAAQ;YACV,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAChD,CAAC,IAAI,CAAC,KAAK,KAAK,kBAAkB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CACvE,CAAC;QACJ,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;aAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;YACjE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9D,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,IAAI,EAAE,IAAI;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;QAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;KAC5B,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC;IACzG,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/G,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM,KAAK,KAAK;QAAE,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;QAEzE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC;IACrH,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ArtifactValidationError } from '../artifacts/backlog.mjs';
|
|
2
|
+
export { ArtifactValidationError as GraphValidationError };
|
|
3
|
+
export declare function generateGraphMarkdown(backlogText: any): string;
|
|
4
|
+
export declare function writeGraph(root: any): {
|
|
5
|
+
graphPath: any;
|
|
6
|
+
markdown: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function runGraph({ args }: {
|
|
9
|
+
args: any;
|
|
10
|
+
}): void;
|
|
11
|
+
//# sourceMappingURL=graph.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.mts","sourceRoot":"","sources":["../../src/commands/graph.mjs"],"names":[],"mappings":"AAIA,OAAO,EACL,uBAAuB,EAIxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,CAAC;AAoB3D,wBAAgB,qBAAqB,CAAC,WAAW,KAAA,UA2ChD;AAED,wBAAgB,UAAU,CAAC,IAAI,KAAA;;;EAU9B;AAED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE;;CAAA,QAGhC"}
|