peaks-cli 1.0.12 → 1.0.13

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.
Files changed (107) hide show
  1. package/bin/peaks.js +0 -0
  2. package/dist/src/cli/commands/config-commands.js +1 -17
  3. package/dist/src/cli/commands/core-artifact-commands.js +23 -0
  4. package/dist/src/cli/commands/mcp-commands.d.ts +3 -0
  5. package/dist/src/cli/commands/mcp-commands.js +144 -0
  6. package/dist/src/cli/commands/openspec-commands.d.ts +3 -0
  7. package/dist/src/cli/commands/openspec-commands.js +169 -0
  8. package/dist/src/cli/commands/project-commands.d.ts +3 -0
  9. package/dist/src/cli/commands/project-commands.js +37 -0
  10. package/dist/src/cli/commands/request-commands.d.ts +3 -0
  11. package/dist/src/cli/commands/request-commands.js +140 -0
  12. package/dist/src/cli/commands/understand-commands.d.ts +3 -0
  13. package/dist/src/cli/commands/understand-commands.js +78 -0
  14. package/dist/src/cli/commands/workflow-commands.js +56 -94
  15. package/dist/src/cli/program.js +10 -0
  16. package/dist/src/services/artifacts/request-artifact-service.d.ts +58 -0
  17. package/dist/src/services/artifacts/request-artifact-service.js +432 -0
  18. package/dist/src/services/codegraph/codegraph-service.js +26 -45
  19. package/dist/src/services/config/config-service.js +2 -22
  20. package/dist/src/services/dashboard/project-dashboard-service.d.ts +64 -0
  21. package/dist/src/services/dashboard/project-dashboard-service.js +112 -0
  22. package/dist/src/services/doctor/doctor-service.d.ts +7 -0
  23. package/dist/src/services/doctor/doctor-service.js +139 -0
  24. package/dist/src/services/mcp/mcp-apply-service.d.ts +31 -0
  25. package/dist/src/services/mcp/mcp-apply-service.js +112 -0
  26. package/dist/src/services/mcp/mcp-call-service.d.ts +17 -0
  27. package/dist/src/services/mcp/mcp-call-service.js +34 -0
  28. package/dist/src/services/mcp/mcp-client-service.d.ts +14 -0
  29. package/dist/src/services/mcp/mcp-client-service.js +49 -0
  30. package/dist/src/services/mcp/mcp-install-registry.d.ts +11 -0
  31. package/dist/src/services/mcp/mcp-install-registry.js +38 -0
  32. package/dist/src/services/mcp/mcp-plan-service.d.ts +29 -0
  33. package/dist/src/services/mcp/mcp-plan-service.js +109 -0
  34. package/dist/src/services/mcp/mcp-protocol.d.ts +24 -0
  35. package/dist/src/services/mcp/mcp-protocol.js +41 -0
  36. package/dist/src/services/mcp/mcp-scan-service.d.ts +8 -0
  37. package/dist/src/services/mcp/mcp-scan-service.js +214 -0
  38. package/dist/src/services/mcp/mcp-stdio-transport.d.ts +10 -0
  39. package/dist/src/services/mcp/mcp-stdio-transport.js +50 -0
  40. package/dist/src/services/mcp/mcp-types.d.ts +31 -0
  41. package/dist/src/services/mcp/mcp-types.js +1 -0
  42. package/dist/src/services/openspec/openspec-archive-service.d.ts +12 -0
  43. package/dist/src/services/openspec/openspec-archive-service.js +28 -0
  44. package/dist/src/services/openspec/openspec-bridge-service.d.ts +16 -0
  45. package/dist/src/services/openspec/openspec-bridge-service.js +76 -0
  46. package/dist/src/services/openspec/openspec-render-service.d.ts +38 -0
  47. package/dist/src/services/openspec/openspec-render-service.js +130 -0
  48. package/dist/src/services/openspec/openspec-scan-service.d.ts +6 -0
  49. package/dist/src/services/openspec/openspec-scan-service.js +123 -0
  50. package/dist/src/services/openspec/openspec-types.d.ts +39 -0
  51. package/dist/src/services/openspec/openspec-types.js +1 -0
  52. package/dist/src/services/openspec/openspec-validate-service.d.ts +27 -0
  53. package/dist/src/services/openspec/openspec-validate-service.js +77 -0
  54. package/dist/src/services/recommendations/capability-seed-items.js +2 -1
  55. package/dist/src/services/recommendations/capability-seed-mappings.js +1 -1
  56. package/dist/src/services/recommendations/capability-seed-sources.js +1 -1
  57. package/dist/src/services/shadcn/shadcn-service.d.ts +4 -0
  58. package/dist/src/services/shadcn/shadcn-service.js +15 -30
  59. package/dist/src/services/skills/skill-runbook-service.d.ts +11 -0
  60. package/dist/src/services/skills/skill-runbook-service.js +60 -0
  61. package/dist/src/services/standards/project-standards-service.js +4 -9
  62. package/dist/src/services/understand/understand-scan-service.d.ts +28 -0
  63. package/dist/src/services/understand/understand-scan-service.js +157 -0
  64. package/dist/src/services/understand/understand-types.d.ts +24 -0
  65. package/dist/src/services/understand/understand-types.js +1 -0
  66. package/dist/src/shared/json-schema-mini.d.ts +10 -0
  67. package/dist/src/shared/json-schema-mini.js +113 -0
  68. package/dist/src/shared/paths.d.ts +1 -1
  69. package/dist/src/shared/paths.js +9 -1
  70. package/dist/src/shared/version.d.ts +1 -1
  71. package/dist/src/shared/version.js +1 -1
  72. package/package.json +2 -8
  73. package/schemas/doctor-report.schema.json +34 -0
  74. package/schemas/mcp-apply-result.schema.json +46 -0
  75. package/schemas/mcp-install-plan.schema.json +71 -0
  76. package/schemas/mcp-install-spec.schema.json +29 -0
  77. package/schemas/mcp-server.schema.json +29 -0
  78. package/schemas/openspec-change-summary.schema.json +68 -0
  79. package/schemas/openspec-render-request.schema.json +61 -0
  80. package/schemas/openspec-validation-result.schema.json +36 -0
  81. package/skills/peaks-prd/SKILL.md +59 -8
  82. package/skills/peaks-prd/references/artifact-per-request.md +78 -0
  83. package/skills/peaks-prd/references/workflow.md +7 -5
  84. package/skills/peaks-qa/SKILL.md +74 -8
  85. package/skills/peaks-qa/references/artifact-contracts.md +2 -2
  86. package/skills/peaks-qa/references/artifact-per-request.md +83 -0
  87. package/skills/peaks-qa/references/openspec-validation-gate.md +55 -0
  88. package/skills/peaks-qa/references/regression-gates.md +2 -2
  89. package/skills/peaks-rd/SKILL.md +96 -9
  90. package/skills/peaks-rd/references/artifact-contracts.md +2 -2
  91. package/skills/peaks-rd/references/artifact-per-request.md +90 -0
  92. package/skills/peaks-rd/references/openspec-mcp-cli.md +65 -0
  93. package/skills/peaks-rd/references/refactor-workflow.md +2 -2
  94. package/skills/peaks-sc/SKILL.md +44 -0
  95. package/skills/peaks-sc/references/openspec-commit-boundaries.md +33 -0
  96. package/skills/peaks-solo/SKILL.md +90 -9
  97. package/skills/peaks-solo/references/artifact-contracts.md +2 -2
  98. package/skills/peaks-solo/references/browser-workflow.md +114 -0
  99. package/skills/peaks-solo/references/external-skill-invocation.md +70 -0
  100. package/skills/peaks-solo/references/openspec-mcp-workflow.md +53 -0
  101. package/skills/peaks-solo/references/refactor-mode.md +2 -2
  102. package/skills/peaks-solo/references/workflow.md +1 -1
  103. package/skills/peaks-txt/SKILL.md +42 -0
  104. package/skills/peaks-ui/SKILL.md +57 -33
  105. package/skills/peaks-ui/references/artifact-per-request.md +71 -0
  106. package/skills/peaks-ui/references/workflow.md +8 -11
  107. 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 = ensureWorkspaceConfigForCurrentPath() ?? getCurrentWorkspaceConfig();
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
- const workspace = ensureWorkspaceConfigForCurrentPath() ?? getCurrentWorkspaceConfig();
21
- if (!workspace)
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
- return { workspace, artifactWorkspacePath: getLocalArtifactPath(workspace) };
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
@@ -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>;