@mknightzzz/stw 0.1.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.
Files changed (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +277 -0
  3. package/dist/agentic-fallback.d.ts +3 -0
  4. package/dist/agentic-fallback.js +32 -0
  5. package/dist/agentic-fallback.js.map +1 -0
  6. package/dist/agentic-prompt.d.ts +2 -0
  7. package/dist/agentic-prompt.js +68 -0
  8. package/dist/agentic-prompt.js.map +1 -0
  9. package/dist/agentic-runtime.d.ts +48 -0
  10. package/dist/agentic-runtime.js +149 -0
  11. package/dist/agentic-runtime.js.map +1 -0
  12. package/dist/agentic-types.d.ts +37 -0
  13. package/dist/agentic-types.js +2 -0
  14. package/dist/agentic-types.js.map +1 -0
  15. package/dist/agents.d.ts +7 -0
  16. package/dist/agents.js +2 -0
  17. package/dist/agents.js.map +1 -0
  18. package/dist/assignments.d.ts +7 -0
  19. package/dist/assignments.js +125 -0
  20. package/dist/assignments.js.map +1 -0
  21. package/dist/checkpoint.d.ts +35 -0
  22. package/dist/checkpoint.js +78 -0
  23. package/dist/checkpoint.js.map +1 -0
  24. package/dist/circuit-breaker.d.ts +17 -0
  25. package/dist/circuit-breaker.js +65 -0
  26. package/dist/circuit-breaker.js.map +1 -0
  27. package/dist/claim.d.ts +6 -0
  28. package/dist/claim.js +135 -0
  29. package/dist/claim.js.map +1 -0
  30. package/dist/clarity-gate.d.ts +12 -0
  31. package/dist/clarity-gate.js +83 -0
  32. package/dist/clarity-gate.js.map +1 -0
  33. package/dist/cli.d.ts +2 -0
  34. package/dist/cli.js +38 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/command-dispatch.d.ts +45 -0
  37. package/dist/command-dispatch.js +206 -0
  38. package/dist/command-dispatch.js.map +1 -0
  39. package/dist/command-parser.d.ts +11 -0
  40. package/dist/command-parser.js +101 -0
  41. package/dist/command-parser.js.map +1 -0
  42. package/dist/commands/clean.d.ts +10 -0
  43. package/dist/commands/clean.js +133 -0
  44. package/dist/commands/clean.js.map +1 -0
  45. package/dist/commands/execution.d.ts +2 -0
  46. package/dist/commands/execution.js +327 -0
  47. package/dist/commands/execution.js.map +1 -0
  48. package/dist/commands/go.d.ts +2 -0
  49. package/dist/commands/go.js +197 -0
  50. package/dist/commands/go.js.map +1 -0
  51. package/dist/commands/helpers.d.ts +44 -0
  52. package/dist/commands/helpers.js +231 -0
  53. package/dist/commands/helpers.js.map +1 -0
  54. package/dist/commands/idea.d.ts +2 -0
  55. package/dist/commands/idea.js +89 -0
  56. package/dist/commands/idea.js.map +1 -0
  57. package/dist/commands/init.d.ts +2 -0
  58. package/dist/commands/init.js +94 -0
  59. package/dist/commands/init.js.map +1 -0
  60. package/dist/commands/integration.d.ts +7 -0
  61. package/dist/commands/integration.js +139 -0
  62. package/dist/commands/integration.js.map +1 -0
  63. package/dist/commands/maintenance.d.ts +2 -0
  64. package/dist/commands/maintenance.js +301 -0
  65. package/dist/commands/maintenance.js.map +1 -0
  66. package/dist/commands/run.d.ts +2 -0
  67. package/dist/commands/run.js +356 -0
  68. package/dist/commands/run.js.map +1 -0
  69. package/dist/commands/setup.d.ts +2 -0
  70. package/dist/commands/setup.js +198 -0
  71. package/dist/commands/setup.js.map +1 -0
  72. package/dist/commands/spec.d.ts +2 -0
  73. package/dist/commands/spec.js +35 -0
  74. package/dist/commands/spec.js.map +1 -0
  75. package/dist/commands/stats.d.ts +2 -0
  76. package/dist/commands/stats.js +80 -0
  77. package/dist/commands/stats.js.map +1 -0
  78. package/dist/commands/task-ops.d.ts +2 -0
  79. package/dist/commands/task-ops.js +406 -0
  80. package/dist/commands/task-ops.js.map +1 -0
  81. package/dist/config.d.ts +18 -0
  82. package/dist/config.js +338 -0
  83. package/dist/config.js.map +1 -0
  84. package/dist/cost.d.ts +30 -0
  85. package/dist/cost.js +167 -0
  86. package/dist/cost.js.map +1 -0
  87. package/dist/crash-recovery.d.ts +9 -0
  88. package/dist/crash-recovery.js +42 -0
  89. package/dist/crash-recovery.js.map +1 -0
  90. package/dist/diagnostic.d.ts +48 -0
  91. package/dist/diagnostic.js +328 -0
  92. package/dist/diagnostic.js.map +1 -0
  93. package/dist/doctor.d.ts +31 -0
  94. package/dist/doctor.js +225 -0
  95. package/dist/doctor.js.map +1 -0
  96. package/dist/drift.d.ts +11 -0
  97. package/dist/drift.js +57 -0
  98. package/dist/drift.js.map +1 -0
  99. package/dist/git-utils.d.ts +20 -0
  100. package/dist/git-utils.js +206 -0
  101. package/dist/git-utils.js.map +1 -0
  102. package/dist/gitlab.d.ts +54 -0
  103. package/dist/gitlab.js +101 -0
  104. package/dist/gitlab.js.map +1 -0
  105. package/dist/idea.d.ts +35 -0
  106. package/dist/idea.js +251 -0
  107. package/dist/idea.js.map +1 -0
  108. package/dist/import-resolution.d.ts +13 -0
  109. package/dist/import-resolution.js +111 -0
  110. package/dist/import-resolution.js.map +1 -0
  111. package/dist/inbox-renderer.d.ts +2 -0
  112. package/dist/inbox-renderer.js +67 -0
  113. package/dist/inbox-renderer.js.map +1 -0
  114. package/dist/init.d.ts +105 -0
  115. package/dist/init.js +235 -0
  116. package/dist/init.js.map +1 -0
  117. package/dist/llm-reviewer.d.ts +14 -0
  118. package/dist/llm-reviewer.js +109 -0
  119. package/dist/llm-reviewer.js.map +1 -0
  120. package/dist/lock.d.ts +26 -0
  121. package/dist/lock.js +76 -0
  122. package/dist/lock.js.map +1 -0
  123. package/dist/logger.d.ts +24 -0
  124. package/dist/logger.js +40 -0
  125. package/dist/logger.js.map +1 -0
  126. package/dist/math-utils.d.ts +2 -0
  127. package/dist/math-utils.js +7 -0
  128. package/dist/math-utils.js.map +1 -0
  129. package/dist/mechanical-review.d.ts +30 -0
  130. package/dist/mechanical-review.js +76 -0
  131. package/dist/mechanical-review.js.map +1 -0
  132. package/dist/merge.d.ts +83 -0
  133. package/dist/merge.js +363 -0
  134. package/dist/merge.js.map +1 -0
  135. package/dist/parallel.d.ts +35 -0
  136. package/dist/parallel.js +214 -0
  137. package/dist/parallel.js.map +1 -0
  138. package/dist/plan-validation.d.ts +19 -0
  139. package/dist/plan-validation.js +253 -0
  140. package/dist/plan-validation.js.map +1 -0
  141. package/dist/planner-prompt.d.ts +33 -0
  142. package/dist/planner-prompt.js +244 -0
  143. package/dist/planner-prompt.js.map +1 -0
  144. package/dist/planner.d.ts +29 -0
  145. package/dist/planner.js +511 -0
  146. package/dist/planner.js.map +1 -0
  147. package/dist/poller.d.ts +34 -0
  148. package/dist/poller.js +91 -0
  149. package/dist/poller.js.map +1 -0
  150. package/dist/progress.d.ts +34 -0
  151. package/dist/progress.js +122 -0
  152. package/dist/progress.js.map +1 -0
  153. package/dist/prompt-builder.d.ts +51 -0
  154. package/dist/prompt-builder.js +481 -0
  155. package/dist/prompt-builder.js.map +1 -0
  156. package/dist/provider.d.ts +14 -0
  157. package/dist/provider.js +278 -0
  158. package/dist/provider.js.map +1 -0
  159. package/dist/question-handler.d.ts +18 -0
  160. package/dist/question-handler.js +154 -0
  161. package/dist/question-handler.js.map +1 -0
  162. package/dist/question-triage.d.ts +31 -0
  163. package/dist/question-triage.js +175 -0
  164. package/dist/question-triage.js.map +1 -0
  165. package/dist/repo-detection.d.ts +8 -0
  166. package/dist/repo-detection.js +18 -0
  167. package/dist/repo-detection.js.map +1 -0
  168. package/dist/retry-context.d.ts +2 -0
  169. package/dist/retry-context.js +196 -0
  170. package/dist/retry-context.js.map +1 -0
  171. package/dist/router.d.ts +18 -0
  172. package/dist/router.js +137 -0
  173. package/dist/router.js.map +1 -0
  174. package/dist/run-artifact-types.d.ts +43 -0
  175. package/dist/run-artifact-types.js +2 -0
  176. package/dist/run-artifact-types.js.map +1 -0
  177. package/dist/run-summary.d.ts +14 -0
  178. package/dist/run-summary.js +347 -0
  179. package/dist/run-summary.js.map +1 -0
  180. package/dist/run-sync.d.ts +11 -0
  181. package/dist/run-sync.js +110 -0
  182. package/dist/run-sync.js.map +1 -0
  183. package/dist/run.d.ts +26 -0
  184. package/dist/run.js +150 -0
  185. package/dist/run.js.map +1 -0
  186. package/dist/scope-expansion.d.ts +10 -0
  187. package/dist/scope-expansion.js +117 -0
  188. package/dist/scope-expansion.js.map +1 -0
  189. package/dist/scope.d.ts +4 -0
  190. package/dist/scope.js +37 -0
  191. package/dist/scope.js.map +1 -0
  192. package/dist/scorecard.d.ts +18 -0
  193. package/dist/scorecard.js +128 -0
  194. package/dist/scorecard.js.map +1 -0
  195. package/dist/spec-templates.d.ts +2 -0
  196. package/dist/spec-templates.js +285 -0
  197. package/dist/spec-templates.js.map +1 -0
  198. package/dist/spec-validator.d.ts +8 -0
  199. package/dist/spec-validator.js +144 -0
  200. package/dist/spec-validator.js.map +1 -0
  201. package/dist/status.d.ts +68 -0
  202. package/dist/status.js +261 -0
  203. package/dist/status.js.map +1 -0
  204. package/dist/storage.d.ts +9 -0
  205. package/dist/storage.js +35 -0
  206. package/dist/storage.js.map +1 -0
  207. package/dist/task-executor-completion.d.ts +12 -0
  208. package/dist/task-executor-completion.js +67 -0
  209. package/dist/task-executor-completion.js.map +1 -0
  210. package/dist/task-executor-fallback.d.ts +20 -0
  211. package/dist/task-executor-fallback.js +12 -0
  212. package/dist/task-executor-fallback.js.map +1 -0
  213. package/dist/task-executor.d.ts +34 -0
  214. package/dist/task-executor.js +521 -0
  215. package/dist/task-executor.js.map +1 -0
  216. package/dist/task-graph.d.ts +11 -0
  217. package/dist/task-graph.js +226 -0
  218. package/dist/task-graph.js.map +1 -0
  219. package/dist/task-pipeline-helpers.d.ts +45 -0
  220. package/dist/task-pipeline-helpers.js +160 -0
  221. package/dist/task-pipeline-helpers.js.map +1 -0
  222. package/dist/task-review.d.ts +51 -0
  223. package/dist/task-review.js +410 -0
  224. package/dist/task-review.js.map +1 -0
  225. package/dist/transitions.d.ts +13 -0
  226. package/dist/transitions.js +104 -0
  227. package/dist/transitions.js.map +1 -0
  228. package/dist/types.d.ts +405 -0
  229. package/dist/types.js +101 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/utils.d.ts +1 -0
  232. package/dist/utils.js +23 -0
  233. package/dist/utils.js.map +1 -0
  234. package/dist/validation.d.ts +19 -0
  235. package/dist/validation.js +73 -0
  236. package/dist/validation.js.map +1 -0
  237. package/dist/worker-response.d.ts +12 -0
  238. package/dist/worker-response.js +60 -0
  239. package/dist/worker-response.js.map +1 -0
  240. package/dist/worker-runner.d.ts +19 -0
  241. package/dist/worker-runner.js +347 -0
  242. package/dist/worker-runner.js.map +1 -0
  243. package/dist/worktree-cleanup.d.ts +44 -0
  244. package/dist/worktree-cleanup.js +325 -0
  245. package/dist/worktree-cleanup.js.map +1 -0
  246. package/dist/worktree.d.ts +22 -0
  247. package/dist/worktree.js +213 -0
  248. package/dist/worktree.js.map +1 -0
  249. package/examples/spec.md +58 -0
  250. package/package.json +66 -0
@@ -0,0 +1,481 @@
1
+ /* eslint-disable max-lines */
2
+ import { isAbsolute, join, normalize, relative, resolve } from 'node:path';
3
+ import { readdirSync } from 'node:fs';
4
+ import { fileExists, readText, writeAtomic, writeJson } from './storage.js';
5
+ import { buildRetryContext } from './retry-context.js';
6
+ export { buildRetryContext } from './retry-context.js';
7
+ import { IMPORT_PATTERN, isInsideRepo, isRelativeImport, resolveImportPath } from './import-resolution.js';
8
+ const CONTEXT_SEPARATOR = '\n\n';
9
+ const WORKER_RESPONSE_SCHEMA = `Worker response schema:
10
+ {
11
+ "schema_version": 1,
12
+ "task_id": "${'${options.task.id}'}",
13
+ "files": [
14
+ { "path": "src/example.ts", "content": "full file contents with trailing newline" }
15
+ ]
16
+ }`;
17
+ export function estimateTokens(text) {
18
+ const words = text.split(/\s+/).filter((word) => word.length > 0).length;
19
+ return Math.ceil(words * 1.3);
20
+ }
21
+ export function buildWorkerPrompt(options) {
22
+ const resolvedOptions = withResolvedQuestionAnswers(options);
23
+ const contextFiles = gatherTaskContext(resolvedOptions.repoRoot, resolvedOptions.task.scope.files);
24
+ const prompt = renderWorkerPrompt(resolvedOptions, contextFiles, true);
25
+ writeWorkerPrompt(resolvedOptions.taskDir, prompt);
26
+ return prompt;
27
+ }
28
+ export function buildWorkerPromptWithBudget(options, maxTokens) {
29
+ const resolvedOptions = withResolvedQuestionAnswers(options);
30
+ const originalContextFiles = gatherTaskContext(resolvedOptions.repoRoot, resolvedOptions.task.scope.files);
31
+ const trimLog = [];
32
+ const effectiveMaxTokens = Math.floor(maxTokens * 0.9);
33
+ let contextFiles = [...originalContextFiles];
34
+ let includeSpecContext = true;
35
+ let prompt = renderWorkerPrompt(resolvedOptions, contextFiles, includeSpecContext);
36
+ let estimatedTokens = estimateTokens(prompt);
37
+ trimLog.push({
38
+ step: 'initial',
39
+ estimated_tokens: estimatedTokens,
40
+ context_file_count: contextFiles.length,
41
+ });
42
+ if (estimatedTokens > effectiveMaxTokens) {
43
+ const promptWithoutSpec = renderWorkerPrompt(resolvedOptions, contextFiles, false);
44
+ const tokensWithoutSpec = estimateTokens(promptWithoutSpec);
45
+ if (tokensWithoutSpec < estimatedTokens) {
46
+ prompt = promptWithoutSpec;
47
+ estimatedTokens = tokensWithoutSpec;
48
+ includeSpecContext = false;
49
+ trimLog.push({
50
+ step: 'drop_spec_context',
51
+ estimated_tokens: estimatedTokens,
52
+ context_file_count: contextFiles.length,
53
+ notes: 'Dropped Spec Context section (lowest priority)',
54
+ });
55
+ }
56
+ }
57
+ if (estimatedTokens > effectiveMaxTokens) {
58
+ const withoutLocalImports = contextFiles.filter((file) => file.source !== 'local_import');
59
+ contextFiles = withoutLocalImports;
60
+ prompt = renderWorkerPrompt(resolvedOptions, contextFiles, includeSpecContext);
61
+ estimatedTokens = estimateTokens(prompt);
62
+ trimLog.push({
63
+ step: 'drop_local_imports',
64
+ estimated_tokens: estimatedTokens,
65
+ context_file_count: contextFiles.length,
66
+ notes: 'Removed read-only local import context files first',
67
+ });
68
+ }
69
+ if (estimatedTokens > effectiveMaxTokens && contextFiles.length > 0) {
70
+ contextFiles = truncateContextFilesToBudget(resolvedOptions, contextFiles, effectiveMaxTokens, includeSpecContext);
71
+ prompt = renderWorkerPrompt(resolvedOptions, contextFiles, includeSpecContext);
72
+ estimatedTokens = estimateTokens(prompt);
73
+ trimLog.push({
74
+ step: 'truncate_context_files',
75
+ estimated_tokens: estimatedTokens,
76
+ context_file_count: contextFiles.length,
77
+ notes: 'Truncated remaining context file contents to fit budget where possible',
78
+ });
79
+ console.warn(`[stw] Prompt budget: truncated context files to fit budget (${estimatedTokens} tokens)`);
80
+ }
81
+ if (estimatedTokens > effectiveMaxTokens) {
82
+ contextFiles = [];
83
+ prompt = renderWorkerPrompt(resolvedOptions, contextFiles, includeSpecContext);
84
+ estimatedTokens = estimateTokens(prompt);
85
+ trimLog.push({
86
+ step: 'drop_scope_context',
87
+ estimated_tokens: estimatedTokens,
88
+ context_file_count: 0,
89
+ notes: 'Dropped all repository context as last resort',
90
+ });
91
+ console.warn(`[stw] Prompt budget: dropped all repository context as last resort (${estimatedTokens} tokens)`);
92
+ }
93
+ trimLog.push({
94
+ step: 'final',
95
+ estimated_tokens: estimatedTokens,
96
+ context_file_count: contextFiles.length,
97
+ notes: estimatedTokens <= effectiveMaxTokens
98
+ ? 'Prompt fits within budget'
99
+ : 'Prompt still exceeds budget after trimming',
100
+ });
101
+ if (estimatedTokens > effectiveMaxTokens) {
102
+ console.warn(`[stw] Prompt budget: prompt still exceeds budget after all trimming (${estimatedTokens} tokens, budget: ${effectiveMaxTokens})`);
103
+ }
104
+ writeWorkerPrompt(resolvedOptions.taskDir, prompt);
105
+ writeJson(join(resolvedOptions.taskDir, 'trim-log.json'), trimLog);
106
+ return {
107
+ prompt,
108
+ estimatedTokens,
109
+ maxTokens,
110
+ trimmed: trimLog.length > 2,
111
+ fits: estimatedTokens <= effectiveMaxTokens,
112
+ trimLog,
113
+ };
114
+ }
115
+ export function buildReviewerPrompt(options) {
116
+ const contextFiles = gatherTaskContext(options.repoRoot, options.task.scope.files);
117
+ const prompt = [
118
+ 'You are the reviewer for one Spec-to-Workers task.',
119
+ `Task ID: ${options.task.id}`,
120
+ `Task intent: ${options.task.description}`,
121
+ '',
122
+ 'Declared scope:',
123
+ renderList(options.task.scope.files),
124
+ options.task.scope.allow_shared_files ? '' : 'Are all modified files within the declared scope?',
125
+ '',
126
+ 'Validation results:',
127
+ '```json',
128
+ JSON.stringify(options.validationResult, null, 2),
129
+ '```',
130
+ '',
131
+ 'Diff:',
132
+ '```diff',
133
+ options.diff || '(no diff)',
134
+ '```',
135
+ '',
136
+ 'Reference context:',
137
+ renderContextFiles(contextFiles),
138
+ '',
139
+ 'Return strict JSON only with one decision: complete, revise, reject, or escalate.',
140
+ 'Reviewer response schema:',
141
+ '{',
142
+ ' "decision": "complete | revise | reject | escalate",',
143
+ ' "reasons": ["short explanation"]',
144
+ '}',
145
+ ].join('\n');
146
+ writeReviewerPrompt(options.taskDir, prompt);
147
+ return prompt;
148
+ }
149
+ export function gatherTaskContext(repoRoot, scopeFiles) {
150
+ const seen = new Set();
151
+ const contextFiles = [];
152
+ for (const scopeFile of scopeFiles) {
153
+ const absolutePath = isAbsolute(scopeFile) ? scopeFile : resolve(repoRoot, scopeFile);
154
+ if (!fileExists(absolutePath)) {
155
+ continue;
156
+ }
157
+ if (!isInsideRepo(repoRoot, absolutePath)) {
158
+ throw new Error(`Context file is outside repo root: ${scopeFile}`);
159
+ }
160
+ pushContextFile(contextFiles, seen, repoRoot, absolutePath, 'scope', true);
161
+ const content = readText(absolutePath);
162
+ for (const importedPath of findLocalImports(repoRoot, absolutePath, content)) {
163
+ if (seen.has(importedPath)) {
164
+ continue;
165
+ }
166
+ pushContextFile(contextFiles, seen, repoRoot, importedPath, 'local_import', false);
167
+ }
168
+ }
169
+ return contextFiles;
170
+ }
171
+ export function extractSpecSections(content, taskId) {
172
+ const lines = content.split('\n');
173
+ const allowedSections = new Set(['Objective', 'Requirements', 'Constraints']);
174
+ const output = [];
175
+ let currentSection = null;
176
+ let inCodeBlock = false;
177
+ const requirementsLines = [];
178
+ let inRequirements = false;
179
+ let requirementsStartIdx = -1;
180
+ for (let i = 0; i < lines.length; i++) {
181
+ const line = lines[i];
182
+ if (line.trim().startsWith('```')) {
183
+ inCodeBlock = !inCodeBlock;
184
+ if (currentSection)
185
+ output.push(line);
186
+ continue;
187
+ }
188
+ if (inCodeBlock) {
189
+ if (currentSection)
190
+ output.push(line);
191
+ continue;
192
+ }
193
+ const match = line.match(/^##\s+(.+)$/);
194
+ if (match) {
195
+ if (currentSection) {
196
+ output.push('');
197
+ }
198
+ const title = match[1].trim();
199
+ if (allowedSections.has(title)) {
200
+ currentSection = title;
201
+ output.push(`## ${title}`);
202
+ output.push('');
203
+ if (title === 'Requirements') {
204
+ inRequirements = true;
205
+ requirementsStartIdx = output.length;
206
+ }
207
+ else {
208
+ inRequirements = false;
209
+ }
210
+ }
211
+ else {
212
+ currentSection = null;
213
+ inRequirements = false;
214
+ }
215
+ }
216
+ else if (currentSection) {
217
+ if (inRequirements) {
218
+ requirementsLines.push(line);
219
+ }
220
+ output.push(line);
221
+ }
222
+ }
223
+ if (taskId && requirementsLines.length > 0) {
224
+ const subsectionPattern = /^###\s+(T\d+)[\s:—\-]/;
225
+ const subsections = [];
226
+ let currentSubsectionId = null;
227
+ let currentSubsectionLines = [];
228
+ for (const line of requirementsLines) {
229
+ const subsectionMatch = line.match(subsectionPattern);
230
+ if (subsectionMatch) {
231
+ if (currentSubsectionId !== null) {
232
+ subsections.push({ id: currentSubsectionId, lines: currentSubsectionLines });
233
+ }
234
+ currentSubsectionId = subsectionMatch[1];
235
+ currentSubsectionLines = [line];
236
+ }
237
+ else if (currentSubsectionId !== null) {
238
+ currentSubsectionLines.push(line);
239
+ }
240
+ }
241
+ if (currentSubsectionId !== null) {
242
+ subsections.push({ id: currentSubsectionId, lines: currentSubsectionLines });
243
+ }
244
+ if (subsections.length > 0) {
245
+ const matching = subsections.find((s) => s.id === taskId);
246
+ if (matching) {
247
+ const beforeRequirements = output.slice(0, requirementsStartIdx);
248
+ const afterRequirements = [];
249
+ let inRequirementsContent = true;
250
+ for (let i = requirementsStartIdx; i < output.length; i++) {
251
+ const line = output[i];
252
+ if (inRequirementsContent && line.match(/^##\s+/)) {
253
+ inRequirementsContent = false;
254
+ }
255
+ if (!inRequirementsContent) {
256
+ afterRequirements.push(line);
257
+ }
258
+ }
259
+ const filteredOutput = [...beforeRequirements, ...matching.lines, '', ...afterRequirements];
260
+ return filteredOutput.length > 0 ? filteredOutput.join('\n').trim() + '\n' : null;
261
+ }
262
+ }
263
+ }
264
+ return output.length > 0 ? output.join('\n') : null;
265
+ }
266
+ export function getSpecContext(repoRoot, specPath, taskId) {
267
+ if (!specPath) {
268
+ return null;
269
+ }
270
+ const absolutePath = isAbsolute(specPath) ? specPath : resolve(repoRoot, specPath);
271
+ if (!fileExists(absolutePath)) {
272
+ return null;
273
+ }
274
+ const content = readText(absolutePath);
275
+ return extractSpecSections(content, taskId);
276
+ }
277
+ function renderWorkerPrompt(options, contextFiles, includeSpecContext = true) {
278
+ const workerSchema = WORKER_RESPONSE_SCHEMA.replace('${options.task.id}', options.task.id);
279
+ const questionGuidance = [
280
+ '',
281
+ '## Worker Guidance: Question Status',
282
+ 'If you need clarification on any aspect of this task, you may respond with a question status instead of implementing files.',
283
+ 'When using question status, your response must include the question you need answered.',
284
+ 'Questions should be specific and directly related to completing this task.',
285
+ 'For question status responses, return strict JSON only and set the status to "question".',
286
+ 'Include the exact question that needs a human answer so it can be persisted and provided back to you later.',
287
+ 'Question response schema:',
288
+ '{',
289
+ ' "status": "question",',
290
+ ' "question": "specific clarification needed"',
291
+ '}',
292
+ ].join('\n');
293
+ const questionAnswers = options.questionAnswers
294
+ ? Object.entries(options.questionAnswers)
295
+ .map(([questionNumber, answer]) => [Number(questionNumber), answer])
296
+ .sort((left, right) => left[0] - right[0])
297
+ : [];
298
+ const persistedAnswers = questionAnswers.length > 0
299
+ ? [
300
+ '',
301
+ '## Persisted Human Answers',
302
+ 'The following answers have been provided to previous questions:',
303
+ ...questionAnswers.map(([num, answer]) => `- Question ${num}: ${answer}`),
304
+ ]
305
+ : [];
306
+ const retryContext = options.retryReason
307
+ ? ['', buildRetryContext(options.taskDir, options.retryReason, options.retryContextLevel ?? 'full')]
308
+ : [];
309
+ const specContext = includeSpecContext
310
+ ? getSpecContext(options.repoRoot, options.task.spec_path, options.task.id)
311
+ : null;
312
+ const specSection = specContext ? ['', '## Spec Context', '', specContext] : [];
313
+ return [
314
+ 'You are the worker for one Spec-to-Workers task.',
315
+ `Task ID: ${options.task.id}`,
316
+ `Task Description: ${options.task.description}`,
317
+ ...specSection,
318
+ '',
319
+ 'Allowed file scope:',
320
+ renderList(options.task.scope.files),
321
+ '',
322
+ 'Prohibited areas:',
323
+ '- Any file not explicitly listed in the allowed file scope',
324
+ '- Supporting context files included below are read-only unless they are also in scope',
325
+ '',
326
+ 'Code conventions:',
327
+ '- TypeScript with ESM modules: use .js extensions in relative imports (e.g., import { foo } from "./bar.js")',
328
+ '- Follow the patterns shown in the repository context files below',
329
+ '',
330
+ 'Acceptance checks:',
331
+ renderList(options.task.acceptance_checks),
332
+ ...retryContext,
333
+ ...persistedAnswers,
334
+ '',
335
+ 'Return strict JSON only. Do not include markdown fences or prose.',
336
+ workerSchema,
337
+ questionGuidance,
338
+ '',
339
+ 'Repository context:',
340
+ renderContextFiles(contextFiles),
341
+ '',
342
+ 'Return strict JSON only. Do not include markdown fences or prose.',
343
+ workerSchema,
344
+ ]
345
+ .flat()
346
+ .join('\n');
347
+ }
348
+ function truncateContextFilesToBudget(options, contextFiles, maxTokens, includeSpecContext = true) {
349
+ const minimalContextFiles = contextFiles.map((file) => ({ ...file, content: summarizeContent(file.content, 1200) }));
350
+ const minimalPrompt = renderWorkerPrompt(options, minimalContextFiles, includeSpecContext);
351
+ if (estimateTokens(minimalPrompt) <= maxTokens) {
352
+ return minimalContextFiles;
353
+ }
354
+ const progressivelyReduced = contextFiles.map((file) => ({ ...file, content: summarizeContent(file.content, 400) }));
355
+ const reducedPrompt = renderWorkerPrompt(options, progressivelyReduced, includeSpecContext);
356
+ if (estimateTokens(reducedPrompt) <= maxTokens) {
357
+ return progressivelyReduced;
358
+ }
359
+ return progressivelyReduced;
360
+ }
361
+ function summarizeContent(content, maxChars) {
362
+ if (content.length <= maxChars) {
363
+ return content;
364
+ }
365
+ const head = Math.max(0, Math.floor(maxChars * 0.7));
366
+ const tail = Math.max(0, maxChars - head);
367
+ return [
368
+ content.slice(0, head),
369
+ '',
370
+ `... (trimmed ${content.length - maxChars} chars for prompt budget) ...`,
371
+ '',
372
+ content.slice(Math.max(0, content.length - tail)),
373
+ ].join('\n');
374
+ }
375
+ function pushContextFile(contextFiles, seen, repoRoot, absolutePath, source, editable) {
376
+ const relativePath = normalize(relative(repoRoot, absolutePath));
377
+ seen.add(absolutePath);
378
+ contextFiles.push({
379
+ path: relativePath,
380
+ content: readText(absolutePath),
381
+ source,
382
+ editable,
383
+ });
384
+ }
385
+ function findLocalImports(repoRoot, sourcePath, content) {
386
+ const imports = [];
387
+ for (const match of content.matchAll(IMPORT_PATTERN)) {
388
+ const specifier = match[1] ?? match[2];
389
+ if (!specifier || !isRelativeImport(specifier)) {
390
+ continue;
391
+ }
392
+ const resolvedPath = resolveImportPath(repoRoot, sourcePath, specifier);
393
+ if (resolvedPath && !imports.includes(resolvedPath)) {
394
+ imports.push(resolvedPath);
395
+ }
396
+ }
397
+ return imports;
398
+ }
399
+ export function renderList(items) {
400
+ if (items.length === 0) {
401
+ return '- None';
402
+ }
403
+ return items.map((item) => `- ${item}`).join('\n');
404
+ }
405
+ export function renderContextFiles(contextFiles) {
406
+ if (contextFiles.length === 0) {
407
+ return '- No context files available';
408
+ }
409
+ return contextFiles
410
+ .map((file) => {
411
+ const header = `### ${file.editable ? 'Editable scope file' : 'Read-only supporting file'}: ${file.path}`;
412
+ const fence = inferCodeFence(file.path);
413
+ return [header, '```' + fence, file.content, '```'].join('\n');
414
+ })
415
+ .join(CONTEXT_SEPARATOR);
416
+ }
417
+ export function inferCodeFence(filePath) {
418
+ if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
419
+ return 'ts';
420
+ }
421
+ if (filePath.endsWith('.json')) {
422
+ return 'json';
423
+ }
424
+ if (filePath.endsWith('.md')) {
425
+ return 'md';
426
+ }
427
+ return 'text';
428
+ }
429
+ function writeWorkerPrompt(taskDir, prompt) {
430
+ writeAtomic(join(taskDir, 'worker_prompt.md'), prompt + '\n');
431
+ }
432
+ function writeReviewerPrompt(taskDir, prompt) {
433
+ writeAtomic(join(taskDir, 'reviewer_prompt.md'), prompt + '\n');
434
+ }
435
+ export function withResolvedQuestionAnswers(options) {
436
+ if (options.questionAnswers && Object.keys(options.questionAnswers).length > 0) {
437
+ return options;
438
+ }
439
+ const loadedAnswers = loadPersistedQuestionAnswers(options.taskDir);
440
+ if (Object.keys(loadedAnswers).length === 0) {
441
+ return options;
442
+ }
443
+ return {
444
+ ...options,
445
+ questionAnswers: loadedAnswers,
446
+ };
447
+ }
448
+ function loadPersistedQuestionAnswers(taskDir) {
449
+ try {
450
+ const entries = readdirSync(taskDir, { withFileTypes: true });
451
+ const answers = {};
452
+ for (const entry of entries) {
453
+ if (!entry.isFile()) {
454
+ continue;
455
+ }
456
+ const match = entry.name.match(/^answer-(\d+)\.json$/);
457
+ if (!match) {
458
+ continue;
459
+ }
460
+ const questionNumber = Number(match[1]);
461
+ const answerPath = join(taskDir, entry.name);
462
+ if (!fileExists(answerPath)) {
463
+ continue;
464
+ }
465
+ try {
466
+ const artifact = JSON.parse(readText(answerPath));
467
+ if (typeof artifact.answer === 'string' && artifact.answer.trim().length > 0) {
468
+ answers[questionNumber] = artifact.answer.trim();
469
+ }
470
+ }
471
+ catch {
472
+ continue;
473
+ }
474
+ }
475
+ return answers;
476
+ }
477
+ catch {
478
+ return {};
479
+ }
480
+ }
481
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ModelTier, ModelRequest, ModelResponse, ProviderConfig, StwConfig } from './types.js';
2
+ declare function getTierTimeoutMs(tier: ModelTier, config: StwConfig): number;
3
+ export { getTierTimeoutMs };
4
+ export declare function normalizeModelName(rawName: string, configuredModels: string[]): string;
5
+ export declare function isProviderCircuitAvailable(provider: string, tier: ModelTier): boolean;
6
+ export declare function recordProviderCircuitSuccess(provider: string, tier: ModelTier): void;
7
+ export declare function recordProviderCircuitFailure(provider: string, tier: ModelTier): void;
8
+ export declare function createCircuitsOpenPause(run: {
9
+ status: string;
10
+ }): {
11
+ status: 'paused';
12
+ pause_reason: 'circuits_open';
13
+ } & typeof run;
14
+ export declare function callProvider(request: ModelRequest, config: ProviderConfig, defaults: StwConfig['defaults'], tier?: ModelTier, fullConfig?: StwConfig): Promise<ModelResponse>;