peaks-cli 1.0.12 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/peaks.js +0 -0
- package/dist/src/cli/commands/config-commands.js +1 -17
- package/dist/src/cli/commands/core-artifact-commands.js +48 -0
- package/dist/src/cli/commands/mcp-commands.d.ts +3 -0
- package/dist/src/cli/commands/mcp-commands.js +144 -0
- package/dist/src/cli/commands/openspec-commands.d.ts +3 -0
- package/dist/src/cli/commands/openspec-commands.js +169 -0
- package/dist/src/cli/commands/project-commands.d.ts +3 -0
- package/dist/src/cli/commands/project-commands.js +37 -0
- package/dist/src/cli/commands/request-commands.d.ts +3 -0
- package/dist/src/cli/commands/request-commands.js +140 -0
- package/dist/src/cli/commands/understand-commands.d.ts +3 -0
- package/dist/src/cli/commands/understand-commands.js +78 -0
- package/dist/src/cli/commands/workflow-commands.js +56 -94
- package/dist/src/cli/program.js +10 -0
- package/dist/src/services/artifacts/request-artifact-service.d.ts +58 -0
- package/dist/src/services/artifacts/request-artifact-service.js +432 -0
- package/dist/src/services/codegraph/codegraph-process-runner.d.ts +2 -0
- package/dist/src/services/codegraph/codegraph-process-runner.js +93 -0
- package/dist/src/services/codegraph/codegraph-service.js +13 -128
- package/dist/src/services/config/config-service.js +2 -22
- package/dist/src/services/dashboard/project-dashboard-service.d.ts +64 -0
- package/dist/src/services/dashboard/project-dashboard-service.js +112 -0
- package/dist/src/services/doctor/doctor-service.d.ts +7 -0
- package/dist/src/services/doctor/doctor-service.js +139 -0
- package/dist/src/services/mcp/mcp-apply-service.d.ts +31 -0
- package/dist/src/services/mcp/mcp-apply-service.js +112 -0
- package/dist/src/services/mcp/mcp-call-service.d.ts +17 -0
- package/dist/src/services/mcp/mcp-call-service.js +34 -0
- package/dist/src/services/mcp/mcp-client-service.d.ts +14 -0
- package/dist/src/services/mcp/mcp-client-service.js +49 -0
- package/dist/src/services/mcp/mcp-install-registry.d.ts +11 -0
- package/dist/src/services/mcp/mcp-install-registry.js +38 -0
- package/dist/src/services/mcp/mcp-plan-service.d.ts +29 -0
- package/dist/src/services/mcp/mcp-plan-service.js +109 -0
- package/dist/src/services/mcp/mcp-protocol.d.ts +24 -0
- package/dist/src/services/mcp/mcp-protocol.js +41 -0
- package/dist/src/services/mcp/mcp-scan-service.d.ts +8 -0
- package/dist/src/services/mcp/mcp-scan-service.js +214 -0
- package/dist/src/services/mcp/mcp-stdio-transport.d.ts +10 -0
- package/dist/src/services/mcp/mcp-stdio-transport.js +50 -0
- package/dist/src/services/mcp/mcp-types.d.ts +31 -0
- package/dist/src/services/mcp/mcp-types.js +1 -0
- package/dist/src/services/openspec/openspec-archive-service.d.ts +12 -0
- package/dist/src/services/openspec/openspec-archive-service.js +28 -0
- package/dist/src/services/openspec/openspec-bridge-service.d.ts +16 -0
- package/dist/src/services/openspec/openspec-bridge-service.js +76 -0
- package/dist/src/services/openspec/openspec-render-service.d.ts +38 -0
- package/dist/src/services/openspec/openspec-render-service.js +130 -0
- package/dist/src/services/openspec/openspec-scan-service.d.ts +6 -0
- package/dist/src/services/openspec/openspec-scan-service.js +123 -0
- package/dist/src/services/openspec/openspec-types.d.ts +39 -0
- package/dist/src/services/openspec/openspec-types.js +1 -0
- package/dist/src/services/openspec/openspec-validate-service.d.ts +27 -0
- package/dist/src/services/openspec/openspec-validate-service.js +77 -0
- package/dist/src/services/recommendations/capability-seed-items.js +2 -1
- package/dist/src/services/recommendations/capability-seed-mappings.js +1 -1
- package/dist/src/services/recommendations/capability-seed-sources.js +1 -1
- package/dist/src/services/shadcn/shadcn-service.d.ts +4 -0
- package/dist/src/services/shadcn/shadcn-service.js +15 -30
- package/dist/src/services/skills/skill-presence-service.d.ts +10 -0
- package/dist/src/services/skills/skill-presence-service.js +54 -0
- package/dist/src/services/skills/skill-runbook-service.d.ts +11 -0
- package/dist/src/services/skills/skill-runbook-service.js +60 -0
- package/dist/src/services/standards/project-standards-service.js +4 -9
- package/dist/src/services/understand/understand-scan-service.d.ts +28 -0
- package/dist/src/services/understand/understand-scan-service.js +157 -0
- package/dist/src/services/understand/understand-types.d.ts +24 -0
- package/dist/src/services/understand/understand-types.js +1 -0
- package/dist/src/services/workflow/workflow-autonomous-service.js +7 -13
- package/dist/src/shared/json-schema-mini.d.ts +10 -0
- package/dist/src/shared/json-schema-mini.js +113 -0
- package/dist/src/shared/paths.d.ts +1 -1
- package/dist/src/shared/paths.js +9 -1
- package/dist/src/shared/version.d.ts +1 -1
- package/dist/src/shared/version.js +1 -1
- package/package.json +2 -8
- package/schemas/doctor-report.schema.json +34 -0
- package/schemas/mcp-apply-result.schema.json +46 -0
- package/schemas/mcp-install-plan.schema.json +71 -0
- package/schemas/mcp-install-spec.schema.json +29 -0
- package/schemas/mcp-server.schema.json +29 -0
- package/schemas/openspec-change-summary.schema.json +68 -0
- package/schemas/openspec-render-request.schema.json +61 -0
- package/schemas/openspec-validation-result.schema.json +36 -0
- package/skills/peaks-prd/SKILL.md +61 -8
- package/skills/peaks-prd/references/artifact-per-request.md +78 -0
- package/skills/peaks-prd/references/workflow.md +7 -5
- package/skills/peaks-qa/SKILL.md +76 -8
- package/skills/peaks-qa/references/artifact-contracts.md +2 -2
- package/skills/peaks-qa/references/artifact-per-request.md +83 -0
- package/skills/peaks-qa/references/openspec-validation-gate.md +55 -0
- package/skills/peaks-qa/references/regression-gates.md +2 -2
- package/skills/peaks-rd/SKILL.md +98 -9
- package/skills/peaks-rd/references/artifact-contracts.md +2 -2
- package/skills/peaks-rd/references/artifact-per-request.md +90 -0
- package/skills/peaks-rd/references/openspec-mcp-cli.md +65 -0
- package/skills/peaks-rd/references/refactor-workflow.md +2 -2
- package/skills/peaks-sc/SKILL.md +46 -0
- package/skills/peaks-sc/references/openspec-commit-boundaries.md +33 -0
- package/skills/peaks-solo/SKILL.md +92 -9
- package/skills/peaks-solo/references/artifact-contracts.md +2 -2
- package/skills/peaks-solo/references/browser-workflow.md +114 -0
- package/skills/peaks-solo/references/external-skill-invocation.md +70 -0
- package/skills/peaks-solo/references/openspec-mcp-workflow.md +53 -0
- package/skills/peaks-solo/references/refactor-mode.md +2 -2
- package/skills/peaks-solo/references/workflow.md +1 -1
- package/skills/peaks-txt/SKILL.md +44 -0
- package/skills/peaks-ui/SKILL.md +59 -33
- package/skills/peaks-ui/references/artifact-per-request.md +71 -0
- package/skills/peaks-ui/references/workflow.md +8 -11
- package/scripts/strip-internal-exports.mjs +0 -33
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { InvalidArgumentError } from 'commander';
|
|
2
|
+
import { scanUnderstandAnything, summarizeKnowledgeGraph } from '../../services/understand/understand-scan-service.js';
|
|
3
|
+
import { fail, ok } from '../../shared/result.js';
|
|
4
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
5
|
+
function parsePositiveInteger(value) {
|
|
6
|
+
if (!/^\d+$/.test(value)) {
|
|
7
|
+
throw new InvalidArgumentError('must be a positive integer');
|
|
8
|
+
}
|
|
9
|
+
const parsed = Number(value);
|
|
10
|
+
if (!Number.isSafeInteger(parsed) || parsed < 1) {
|
|
11
|
+
throw new InvalidArgumentError('must be a positive integer');
|
|
12
|
+
}
|
|
13
|
+
return parsed;
|
|
14
|
+
}
|
|
15
|
+
const INSTALL_HINT = 'Install Understand Anything in Claude Code: `/plugin marketplace add Lum1104/Understand-Anything` then `/plugin install understand-anything`, then run `/understand` in the target project to generate .understand-anything/knowledge-graph.json.';
|
|
16
|
+
export function registerUnderstandCommands(program, io) {
|
|
17
|
+
const understand = program.command('understand').description('Inspect Understand Anything artifacts inside a project (read-only)');
|
|
18
|
+
addJsonOption(understand
|
|
19
|
+
.command('status')
|
|
20
|
+
.description('Report whether Understand Anything has produced a knowledge graph in the target project')
|
|
21
|
+
.requiredOption('--project <path>', 'target project root')
|
|
22
|
+
.option('--artifact-dir <path>', 'override the default .understand-anything directory')).action(async (options) => {
|
|
23
|
+
try {
|
|
24
|
+
const scanOptions = { projectRoot: options.project };
|
|
25
|
+
if (options.artifactDir !== undefined) {
|
|
26
|
+
scanOptions.artifactDir = options.artifactDir;
|
|
27
|
+
}
|
|
28
|
+
const report = await scanUnderstandAnything(scanOptions);
|
|
29
|
+
const nextActions = [];
|
|
30
|
+
if (!report.exists) {
|
|
31
|
+
nextActions.push(INSTALL_HINT);
|
|
32
|
+
}
|
|
33
|
+
else if (!report.graph.exists) {
|
|
34
|
+
nextActions.push('Run `/understand` inside Claude Code on this project to generate .understand-anything/knowledge-graph.json.');
|
|
35
|
+
}
|
|
36
|
+
else if (report.graph.parseError !== undefined) {
|
|
37
|
+
nextActions.push('Re-run `/understand` to regenerate the knowledge graph; the current file is not valid JSON.');
|
|
38
|
+
}
|
|
39
|
+
printResult(io, ok('understand.status', report, [], nextActions), options.json);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
printResult(io, fail('understand.status', 'UNDERSTAND_STATUS_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Check the project path and .understand-anything directory before retrying']), options.json);
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
addJsonOption(understand
|
|
47
|
+
.command('show')
|
|
48
|
+
.description('Summarize the Understand Anything knowledge graph (counts, layers, tours, sample nodes) for RD/TXT consumption')
|
|
49
|
+
.requiredOption('--project <path>', 'target project root')
|
|
50
|
+
.option('--artifact-dir <path>', 'override the default .understand-anything directory')
|
|
51
|
+
.option('--sample <n>', 'maximum number of sample node ids to return (default 5)', parsePositiveInteger)).action(async (options) => {
|
|
52
|
+
try {
|
|
53
|
+
const summaryOptions = { projectRoot: options.project };
|
|
54
|
+
if (options.artifactDir !== undefined) {
|
|
55
|
+
summaryOptions.artifactDir = options.artifactDir;
|
|
56
|
+
}
|
|
57
|
+
if (options.sample !== undefined) {
|
|
58
|
+
summaryOptions.sampleSize = options.sample;
|
|
59
|
+
}
|
|
60
|
+
const summary = await summarizeKnowledgeGraph(summaryOptions);
|
|
61
|
+
if (!summary.exists) {
|
|
62
|
+
printResult(io, fail('understand.show', 'UNDERSTAND_GRAPH_MISSING', `No knowledge graph found at ${summary.path}`, summary, [INSTALL_HINT]), options.json);
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (summary.parseError !== undefined) {
|
|
67
|
+
printResult(io, fail('understand.show', 'UNDERSTAND_GRAPH_PARSE_ERROR', `Knowledge graph at ${summary.path} is not valid JSON: ${summary.parseError}`, summary, ['Re-run `/understand` to regenerate the knowledge graph']), options.json);
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
printResult(io, ok('understand.show', summary), options.json);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
printResult(io, fail('understand.show', 'UNDERSTAND_SHOW_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Check the project path and .understand-anything directory before retrying']), options.json);
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -11,20 +11,21 @@ import { getLocalArtifactPath } from '../../services/artifacts/workspace-service
|
|
|
11
11
|
import { fail, ok } from '../../shared/result.js';
|
|
12
12
|
import { addJsonOption, failUnsupportedNonDryRun, getErrorMessage, isRecommendationWorkflow, printResult } from '../cli-helpers.js';
|
|
13
13
|
function getCurrentWorkspaceContext() {
|
|
14
|
-
const workspace =
|
|
14
|
+
const workspace = getCurrentWorkspaceConfig();
|
|
15
15
|
if (!workspace)
|
|
16
16
|
return {};
|
|
17
17
|
return { workspace, artifactWorkspacePath: getLocalArtifactPath(workspace) };
|
|
18
18
|
}
|
|
19
19
|
function getWorkflowWorkspaceContext() {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
try {
|
|
21
|
+
const workspace = ensureWorkspaceConfigForCurrentPath() ?? getCurrentWorkspaceConfig();
|
|
22
|
+
if (!workspace)
|
|
23
|
+
return {};
|
|
24
|
+
return { workspace, artifactWorkspacePath: getLocalArtifactPath(workspace) };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
22
27
|
return {};
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
function failWorkflowWorkspaceContext(io, command, error, asJson) {
|
|
26
|
-
printResult(io, fail(command, 'WORKSPACE_CONTEXT_FAILED', getErrorMessage(error), {}, ['Run peaks config workspace ensure --path <project> --json and resolve the reported workspace issue']), asJson);
|
|
27
|
-
process.exitCode = 1;
|
|
28
|
+
}
|
|
28
29
|
}
|
|
29
30
|
function parseMaxWorkers(io, command, value, asJson) {
|
|
30
31
|
const maxWorkers = Number(value);
|
|
@@ -64,39 +65,24 @@ function runTechPlan(io, options) {
|
|
|
64
65
|
}
|
|
65
66
|
try {
|
|
66
67
|
validatePlanningInput(options.changeId, options.goal);
|
|
68
|
+
const workspaceContext = getCurrentWorkspaceContext();
|
|
69
|
+
const plan = createTechPlan({
|
|
70
|
+
changeId: options.changeId,
|
|
71
|
+
goal: options.goal,
|
|
72
|
+
swarm: options.swarm ?? false,
|
|
73
|
+
dryRun: true,
|
|
74
|
+
...workspaceContext
|
|
75
|
+
});
|
|
76
|
+
printResult(io, ok('tech.plan', plan), options.json);
|
|
67
77
|
}
|
|
68
78
|
catch (error) {
|
|
69
79
|
printResult(io, fail('tech.plan', 'INVALID_CHANGE_ID_OR_GOAL', getErrorMessage(error), {}, ['Use a safe change id and a non-empty goal']), options.json);
|
|
70
80
|
process.exitCode = 1;
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
let workspaceContext;
|
|
74
|
-
try {
|
|
75
|
-
workspaceContext = getCurrentWorkspaceContext();
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
failWorkflowWorkspaceContext(io, 'tech.plan', error, options.json);
|
|
79
|
-
return;
|
|
80
81
|
}
|
|
81
|
-
const plan = createTechPlan({
|
|
82
|
-
changeId: options.changeId,
|
|
83
|
-
goal: options.goal,
|
|
84
|
-
swarm: options.swarm ?? false,
|
|
85
|
-
dryRun: true,
|
|
86
|
-
...workspaceContext
|
|
87
|
-
});
|
|
88
|
-
printResult(io, ok('tech.plan', plan), options.json);
|
|
89
82
|
}
|
|
90
83
|
function runTechStatus(io, options) {
|
|
91
|
-
let workspaceContext;
|
|
92
|
-
try {
|
|
93
|
-
workspaceContext = getCurrentWorkspaceContext();
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
failWorkflowWorkspaceContext(io, 'tech.status', error, options.json);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
84
|
try {
|
|
85
|
+
const workspaceContext = getCurrentWorkspaceContext();
|
|
100
86
|
printResult(io, ok('tech.status', getTechStatus({ changeId: options.changeId, ...workspaceContext })), options.json);
|
|
101
87
|
}
|
|
102
88
|
catch (error) {
|
|
@@ -122,31 +108,23 @@ function runWorkflowRoute(io, options) {
|
|
|
122
108
|
return;
|
|
123
109
|
try {
|
|
124
110
|
validatePlanningInput(options.changeId, options.goal);
|
|
111
|
+
const workspaceContext = getWorkflowWorkspaceContext();
|
|
112
|
+
const plan = createWorkflowRouterPlan({
|
|
113
|
+
changeId: options.changeId,
|
|
114
|
+
goal: options.goal,
|
|
115
|
+
mode: options.mode,
|
|
116
|
+
...(soloMode ? { soloMode } : {}),
|
|
117
|
+
maxWorkers,
|
|
118
|
+
dryRun: true,
|
|
119
|
+
config: readConfig(),
|
|
120
|
+
...workspaceContext
|
|
121
|
+
});
|
|
122
|
+
printResult(io, ok('workflow.route', plan), options.json);
|
|
125
123
|
}
|
|
126
124
|
catch (error) {
|
|
127
125
|
printResult(io, fail('workflow.route', 'INVALID_CHANGE_ID_OR_GOAL', getErrorMessage(error), {}, ['Use a safe change id and a non-empty goal']), options.json);
|
|
128
126
|
process.exitCode = 1;
|
|
129
|
-
return;
|
|
130
127
|
}
|
|
131
|
-
let workspaceContext;
|
|
132
|
-
try {
|
|
133
|
-
workspaceContext = getWorkflowWorkspaceContext();
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
failWorkflowWorkspaceContext(io, 'workflow.route', error, options.json);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
const plan = createWorkflowRouterPlan({
|
|
140
|
-
changeId: options.changeId,
|
|
141
|
-
goal: options.goal,
|
|
142
|
-
mode: options.mode,
|
|
143
|
-
...(soloMode ? { soloMode } : {}),
|
|
144
|
-
maxWorkers,
|
|
145
|
-
dryRun: true,
|
|
146
|
-
config: readConfig(),
|
|
147
|
-
...workspaceContext
|
|
148
|
-
});
|
|
149
|
-
printResult(io, ok('workflow.route', plan), options.json);
|
|
150
128
|
}
|
|
151
129
|
function runAutonomousWorkflow(io, options) {
|
|
152
130
|
if (options.dryRun === false) {
|
|
@@ -166,31 +144,23 @@ function runAutonomousWorkflow(io, options) {
|
|
|
166
144
|
return;
|
|
167
145
|
try {
|
|
168
146
|
validatePlanningInput(options.changeId, options.goal);
|
|
147
|
+
const workspaceContext = getWorkflowWorkspaceContext();
|
|
148
|
+
const plan = createAutonomousWorkflowPlan({
|
|
149
|
+
changeId: options.changeId,
|
|
150
|
+
goal: options.goal,
|
|
151
|
+
mode: options.mode,
|
|
152
|
+
...(soloMode ? { soloMode } : {}),
|
|
153
|
+
maxWorkers,
|
|
154
|
+
dryRun: true,
|
|
155
|
+
config: readConfig(),
|
|
156
|
+
...workspaceContext
|
|
157
|
+
});
|
|
158
|
+
printResult(io, ok('workflow.autonomous', plan), options.json);
|
|
169
159
|
}
|
|
170
160
|
catch (error) {
|
|
171
161
|
printResult(io, fail('workflow.autonomous', 'INVALID_CHANGE_ID_OR_GOAL', getErrorMessage(error), {}, ['Use a safe change id and a non-empty goal']), options.json);
|
|
172
162
|
process.exitCode = 1;
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
let workspaceContext;
|
|
176
|
-
try {
|
|
177
|
-
workspaceContext = getWorkflowWorkspaceContext();
|
|
178
163
|
}
|
|
179
|
-
catch (error) {
|
|
180
|
-
failWorkflowWorkspaceContext(io, 'workflow.autonomous', error, options.json);
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
const plan = createAutonomousWorkflowPlan({
|
|
184
|
-
changeId: options.changeId,
|
|
185
|
-
goal: options.goal,
|
|
186
|
-
mode: options.mode,
|
|
187
|
-
...(soloMode ? { soloMode } : {}),
|
|
188
|
-
maxWorkers,
|
|
189
|
-
dryRun: true,
|
|
190
|
-
config: readConfig(),
|
|
191
|
-
...workspaceContext
|
|
192
|
-
});
|
|
193
|
-
printResult(io, ok('workflow.autonomous', plan), options.json);
|
|
194
164
|
}
|
|
195
165
|
function runSwarmPlan(io, options) {
|
|
196
166
|
if ((options.skill ?? 'rd') !== 'rd') {
|
|
@@ -207,32 +177,24 @@ function runSwarmPlan(io, options) {
|
|
|
207
177
|
return;
|
|
208
178
|
try {
|
|
209
179
|
validatePlanningInput(options.changeId, options.goal);
|
|
180
|
+
const workspaceContext = getWorkflowWorkspaceContext();
|
|
181
|
+
const config = readConfig();
|
|
182
|
+
const plan = createRdSwarmPlan({
|
|
183
|
+
skill: 'rd',
|
|
184
|
+
changeId: options.changeId,
|
|
185
|
+
goal: options.goal,
|
|
186
|
+
maxWorkers,
|
|
187
|
+
dryRun: true,
|
|
188
|
+
swarmMode: config.swarmMode,
|
|
189
|
+
executionModelId: getEconomyAwareExecutionModelId(config),
|
|
190
|
+
...workspaceContext
|
|
191
|
+
});
|
|
192
|
+
printResult(io, ok('swarm.plan', plan), options.json);
|
|
210
193
|
}
|
|
211
194
|
catch (error) {
|
|
212
195
|
printResult(io, fail('swarm.plan', 'INVALID_CHANGE_ID_OR_GOAL', getErrorMessage(error), {}, ['Use a safe change id and a non-empty goal']), options.json);
|
|
213
196
|
process.exitCode = 1;
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
let workspaceContext;
|
|
217
|
-
try {
|
|
218
|
-
workspaceContext = getWorkflowWorkspaceContext();
|
|
219
197
|
}
|
|
220
|
-
catch (error) {
|
|
221
|
-
failWorkflowWorkspaceContext(io, 'swarm.plan', error, options.json);
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
const config = readConfig();
|
|
225
|
-
const plan = createRdSwarmPlan({
|
|
226
|
-
skill: 'rd',
|
|
227
|
-
changeId: options.changeId,
|
|
228
|
-
goal: options.goal,
|
|
229
|
-
maxWorkers,
|
|
230
|
-
dryRun: true,
|
|
231
|
-
swarmMode: config.swarmMode,
|
|
232
|
-
executionModelId: getEconomyAwareExecutionModelId(config),
|
|
233
|
-
...workspaceContext
|
|
234
|
-
});
|
|
235
|
-
printResult(io, ok('swarm.plan', plan), options.json);
|
|
236
198
|
}
|
|
237
199
|
function addTechPlanOptions(command) {
|
|
238
200
|
return addJsonOption(command
|
package/dist/src/cli/program.js
CHANGED
|
@@ -4,7 +4,12 @@ import { registerCoreAndArtifactCommands } from './commands/core-artifact-comman
|
|
|
4
4
|
import { registerWorkflowCommands } from './commands/workflow-commands.js';
|
|
5
5
|
import { registerCapabilityWorkerConfigAndSCCommands } from './commands/capability-worker-config-sc-commands.js';
|
|
6
6
|
import { registerCodegraphCommands } from './commands/codegraph-commands.js';
|
|
7
|
+
import { registerMcpCommands } from './commands/mcp-commands.js';
|
|
8
|
+
import { registerOpenSpecCommands } from './commands/openspec-commands.js';
|
|
9
|
+
import { registerProjectCommands } from './commands/project-commands.js';
|
|
10
|
+
import { registerRequestCommands } from './commands/request-commands.js';
|
|
7
11
|
import { registerShadcnCommands } from './commands/shadcn-commands.js';
|
|
12
|
+
import { registerUnderstandCommands } from './commands/understand-commands.js';
|
|
8
13
|
export { printResult } from './cli-helpers.js';
|
|
9
14
|
export function createProgram(io = { stdout: (text) => console.log(text), stderr: (text) => console.error(text) }) {
|
|
10
15
|
const program = new Command();
|
|
@@ -27,6 +32,11 @@ export function createProgram(io = { stdout: (text) => console.log(text), stderr
|
|
|
27
32
|
registerWorkflowCommands(program, io);
|
|
28
33
|
registerCapabilityWorkerConfigAndSCCommands(program, io);
|
|
29
34
|
registerCodegraphCommands(program, io);
|
|
35
|
+
registerMcpCommands(program, io);
|
|
36
|
+
registerOpenSpecCommands(program, io);
|
|
37
|
+
registerProjectCommands(program, io);
|
|
38
|
+
registerRequestCommands(program, io);
|
|
30
39
|
registerShadcnCommands(program, io);
|
|
40
|
+
registerUnderstandCommands(program, io);
|
|
31
41
|
return program;
|
|
32
42
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type RequestArtifactRole = 'prd' | 'ui' | 'rd' | 'qa';
|
|
2
|
+
export type CreateRequestArtifactOptions = {
|
|
3
|
+
role: RequestArtifactRole;
|
|
4
|
+
requestId: string;
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
apply?: boolean;
|
|
8
|
+
clock?: () => string;
|
|
9
|
+
};
|
|
10
|
+
export type CreateRequestArtifactResult = {
|
|
11
|
+
role: RequestArtifactRole;
|
|
12
|
+
requestId: string;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
path: string;
|
|
15
|
+
content: string;
|
|
16
|
+
applied: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare function createRequestArtifact(options: CreateRequestArtifactOptions): Promise<CreateRequestArtifactResult>;
|
|
19
|
+
export type RequestArtifactSummary = {
|
|
20
|
+
role: RequestArtifactRole;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
requestId: string;
|
|
23
|
+
path: string;
|
|
24
|
+
state: string;
|
|
25
|
+
createdAt?: string;
|
|
26
|
+
};
|
|
27
|
+
export type ListRequestArtifactsOptions = {
|
|
28
|
+
projectRoot: string;
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
role?: RequestArtifactRole;
|
|
31
|
+
};
|
|
32
|
+
export type ShowRequestArtifactOptions = {
|
|
33
|
+
projectRoot: string;
|
|
34
|
+
role: RequestArtifactRole;
|
|
35
|
+
requestId: string;
|
|
36
|
+
sessionId?: string;
|
|
37
|
+
};
|
|
38
|
+
export type ShowRequestArtifactResult = RequestArtifactSummary & {
|
|
39
|
+
content: string;
|
|
40
|
+
};
|
|
41
|
+
export declare function listRequestArtifacts(options: ListRequestArtifactsOptions): Promise<RequestArtifactSummary[]>;
|
|
42
|
+
export declare function showRequestArtifact(options: ShowRequestArtifactOptions): Promise<ShowRequestArtifactResult | null>;
|
|
43
|
+
export type RequestArtifactState = 'draft' | 'confirmed-by-user' | 'direction-locked' | 'spec-locked' | 'implemented' | 'qa-handoff' | 'running' | 'verdict-issued' | 'handed-off' | 'blocked';
|
|
44
|
+
export declare function allowedStatesForRole(role: RequestArtifactRole): ReadonlyArray<RequestArtifactState>;
|
|
45
|
+
export type TransitionRequestArtifactOptions = {
|
|
46
|
+
role: RequestArtifactRole;
|
|
47
|
+
requestId: string;
|
|
48
|
+
projectRoot: string;
|
|
49
|
+
newState: RequestArtifactState;
|
|
50
|
+
sessionId?: string;
|
|
51
|
+
reason?: string;
|
|
52
|
+
clock?: () => string;
|
|
53
|
+
};
|
|
54
|
+
export type TransitionRequestArtifactResult = RequestArtifactSummary & {
|
|
55
|
+
previousState: string;
|
|
56
|
+
content: string;
|
|
57
|
+
};
|
|
58
|
+
export declare function transitionRequestArtifact(options: TransitionRequestArtifactOptions): Promise<TransitionRequestArtifactResult | null>;
|