@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
package/dist/idea.js ADDED
@@ -0,0 +1,251 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { callProvider } from './provider.js';
3
+ import { routeTask } from './router.js';
4
+ import { getTemplate, listTemplates } from './spec-templates.js';
5
+ import { buildImportGraph, selectImportGraphEdgesForPrompt } from './planner-prompt.js';
6
+ import { listSeedFiles } from './worktree.js';
7
+ import { checkIdeaClarity } from './clarity-gate.js';
8
+ const MAX_REPO_FILES = 200;
9
+ const TEMPLATE_KEYWORDS = {
10
+ bugfix: ['bug', 'fix', 'broken', 'crash', 'error', 'regression', 'failing'],
11
+ refactor: ['refactor', 'restructure', 'reorganize', 'extract', 'decouple'],
12
+ cleanup: ['clean', 'cleanup', 'remove', 'delete', 'dead code', 'unused', 'deprecate'],
13
+ };
14
+ export const KNOWN_STACK_PRESETS = ['node-ts', 'python-fastapi', 'react-ts', 'go'];
15
+ const STACK_PRESET_DETAILS = {
16
+ 'node-ts': 'Language: TypeScript, Runtime: Node.js, Package Manager: npm, Test Runner: vitest, Type Checker: tsc',
17
+ 'python-fastapi': 'Language: Python, Framework: FastAPI, Package Manager: pip, Test Runner: pytest, Linter: ruff',
18
+ 'react-ts': 'Language: TypeScript, Framework: React, Package Manager: npm, Test Runner: vitest, Type Checker: tsc',
19
+ go: 'Language: Go, Build Tool: go, Test Runner: go test, Linter: go vet',
20
+ };
21
+ export class ClarityGateError extends Error {
22
+ feedback;
23
+ suggestedIdea;
24
+ constructor(feedback, suggestedIdea) {
25
+ super(`Idea rejected: ${feedback}`);
26
+ this.name = 'ClarityGateError';
27
+ this.feedback = feedback;
28
+ this.suggestedIdea = suggestedIdea;
29
+ }
30
+ }
31
+ export function detectTemplate(idea) {
32
+ const lowerIdea = idea.toLowerCase();
33
+ for (const [template, keywords] of Object.entries(TEMPLATE_KEYWORDS)) {
34
+ if (keywords.some((kw) => lowerIdea.includes(kw))) {
35
+ return template;
36
+ }
37
+ }
38
+ return 'feature';
39
+ }
40
+ export function buildIdeaPrompt(options) {
41
+ if (options.stack && !KNOWN_STACK_PRESETS.includes(options.stack)) {
42
+ throw new Error(`Unknown stack preset "${options.stack}". Available: ${KNOWN_STACK_PRESETS.join(', ')}`);
43
+ }
44
+ const isGreenfield = options.isGreenfield || !!options.stack;
45
+ const templateName = isGreenfield ? 'greenfield' : (options.templateOverride ?? detectTemplate(options.idea));
46
+ const template = getTemplate(templateName);
47
+ if (!template) {
48
+ const available = listTemplates().join(', ');
49
+ throw new Error(`Unknown template "${templateName}". Available: ${available}`);
50
+ }
51
+ const stackBlock = options.stack
52
+ ? `
53
+ ## Mandated Tech Stack
54
+
55
+ You MUST use the following tech stack — do not choose or suggest an alternative:
56
+ ${STACK_PRESET_DETAILS[options.stack]}
57
+
58
+ Do NOT override or deviate from this stack. All acceptance checks and validation commands must match this stack.
59
+ `
60
+ : '';
61
+ if (isGreenfield) {
62
+ let seedBlock = '';
63
+ if (options.seedDir) {
64
+ const { files, totalCount } = listSeedFiles(options.seedDir);
65
+ if (files.length > 0) {
66
+ const listing = files
67
+ .map((f) => `- ${f.relativePath} (${f.sizeHuman}${f.isBinary ? ', binary' : ''})`)
68
+ .join('\n');
69
+ const truncation = totalCount > files.length ? `\n... and ${totalCount - files.length} more files (${files.length} shown)` : '';
70
+ seedBlock = `
71
+ ## Seed Files
72
+
73
+ The following files are provided by the user and will be available in the worktree:
74
+
75
+ ${listing}${truncation}
76
+
77
+ Build your project around these files. Reference them in your task descriptions and acceptance criteria.
78
+ `;
79
+ }
80
+ }
81
+ const prompt = `You are a spec writer creating a brand-new project from scratch. There is no existing codebase. Your job is to take a rough idea and produce a complete, well-structured spec that follows the provided template exactly.
82
+
83
+ ## The Idea
84
+
85
+ ${options.idea}
86
+ ${stackBlock}${seedBlock}
87
+ ## Greenfield Context
88
+
89
+ This is a new project — there are no existing files, no import graph, no existing tests. You must:
90
+ ${options.stack ? '- Use the mandated tech stack specified above — do NOT choose or suggest an alternative' : '- Choose an appropriate tech stack (language, framework, package manager, test runner) and justify your choice briefly'}
91
+ - Define a minimal project skeleton (directory structure and initial files)
92
+ - Make T1 a scaffolding task: create the project, install deps, verify it builds and tests run
93
+ - Decompose remaining tasks as features on top of the skeleton
94
+ - Use validation commands that match the ${options.stack ? 'mandated' : 'chosen'} stack (do NOT hardcode vitest/tsc unless you ${options.stack ? 'are using the mandated TypeScript stack' : 'chose TypeScript'})
95
+
96
+ ## Template to Use: ${templateName}
97
+
98
+ Fill in the following template. Replace ALL comment placeholders (<!-- ... -->) with concrete content. Include:
99
+ - Concrete task decomposition with clear boundaries
100
+ - Acceptance criteria that reference runnable commands for the chosen stack
101
+ - Realistic risk assessment
102
+
103
+ The spec title line MUST start with "# Spec:" (e.g., "# Spec: Scaffold expense tracker dashboard").
104
+ Every section heading from the template MUST appear in your output.
105
+ Do NOT leave any placeholder comments — replace them all with real content.
106
+
107
+ ## Template
108
+
109
+ ${template}
110
+
111
+ ## Output
112
+
113
+ Return ONLY the filled-in spec as markdown. No preamble, no explanation, just the spec.`;
114
+ return { prompt, templateName };
115
+ }
116
+ const repoFiles = listTrackedFiles(options.repoRoot);
117
+ const importGraph = buildImportGraph(options.repoRoot, repoFiles);
118
+ const promptGraph = selectImportGraphEdgesForPrompt(importGraph);
119
+ const fileListing = repoFiles.map((f) => `- ${f}`).join('\n');
120
+ const importSummary = formatImportGraph(promptGraph);
121
+ const prompt = `You are a spec writer for a software project. Your job is to take a rough idea and produce a complete, well-structured spec that follows the provided template exactly.
122
+
123
+ ## The Idea
124
+
125
+ ${options.idea}
126
+ ${stackBlock}
127
+ ## Repository Files (${repoFiles.length} files)
128
+
129
+ ${fileListing}
130
+
131
+ ## Import Graph
132
+
133
+ ${importSummary}
134
+
135
+ ## Template to Use: ${templateName}
136
+
137
+ Fill in the following template. Replace ALL comment placeholders (<!-- ... -->) with concrete content. Include:
138
+ - Specific file paths from the repository listing above
139
+ - Concrete task decomposition with clear boundaries
140
+ - Acceptance criteria that reference runnable commands
141
+ - Realistic risk assessment
142
+
143
+ The spec title line MUST start with "# Spec:" (e.g., "# Spec: Add dark mode to the dashboard").
144
+ Every section heading from the template MUST appear in your output.
145
+ Do NOT leave any placeholder comments — replace them all with real content.
146
+
147
+ ## Template
148
+
149
+ ${template}
150
+
151
+ ## Output
152
+
153
+ Return ONLY the filled-in spec as markdown. No preamble, no explanation, just the spec.`;
154
+ return { prompt, templateName };
155
+ }
156
+ export async function generateSpec(options) {
157
+ const route = routeTask({
158
+ risk: 'high',
159
+ task_type: 'planning',
160
+ model_tier: 'strong',
161
+ execution_mode: 'conservative',
162
+ planner_eligible: true,
163
+ }, options.config);
164
+ const providerConfig = options.config.providers[route.provider];
165
+ if (!providerConfig) {
166
+ throw new Error(`No provider configured for strong tier. Configure a provider in .stw/config.yml`);
167
+ }
168
+ // Clarity gate: reject vague ideas before burning strong-tier tokens
169
+ if (!options.skipClarityCheck) {
170
+ const seedFiles = options.seedDir ? listSeedFiles(options.seedDir).files : undefined;
171
+ const clarity = await checkIdeaClarity({ idea: options.idea, seedFiles, config: options.config });
172
+ if (!clarity.clear) {
173
+ throw new ClarityGateError(clarity.feedback ?? 'Idea is too vague', clarity.suggestedIdea);
174
+ }
175
+ }
176
+ const { prompt, templateName } = buildIdeaPrompt(options);
177
+ const response = await callProvider({
178
+ model: route.model,
179
+ messages: [{ role: 'user', content: prompt }],
180
+ max_tokens: 4096,
181
+ temperature: 0.3,
182
+ timeout_ms: 600000,
183
+ response_format: 'text',
184
+ }, providerConfig, options.config.defaults, 'strong', options.config);
185
+ const spec = cleanSpecOutput(response.content);
186
+ return {
187
+ spec,
188
+ templateUsed: templateName,
189
+ usage: response.usage,
190
+ model: response.model,
191
+ latency_ms: response.latency_ms,
192
+ };
193
+ }
194
+ function cleanSpecOutput(content) {
195
+ let cleaned = (content ?? '').trim();
196
+ // Strip markdown code fences if the model wrapped the output
197
+ if (cleaned.startsWith('```markdown')) {
198
+ cleaned = cleaned.slice('```markdown'.length);
199
+ }
200
+ else if (cleaned.startsWith('```md')) {
201
+ cleaned = cleaned.slice('```md'.length);
202
+ }
203
+ else if (cleaned.startsWith('```')) {
204
+ cleaned = cleaned.slice(3);
205
+ }
206
+ if (cleaned.endsWith('```')) {
207
+ cleaned = cleaned.slice(0, -3);
208
+ }
209
+ return cleaned.trim() + '\n';
210
+ }
211
+ function listTrackedFiles(repoRoot) {
212
+ const output = execFileSync('git', ['ls-files'], {
213
+ cwd: repoRoot,
214
+ encoding: 'utf-8',
215
+ stdio: ['ignore', 'pipe', 'pipe'],
216
+ });
217
+ return output
218
+ .split('\n')
219
+ .map((line) => line.trim())
220
+ .filter((line) => line.length > 0)
221
+ .slice(0, MAX_REPO_FILES);
222
+ }
223
+ function formatImportGraph(graph) {
224
+ const lines = [];
225
+ if (graph.resolvedEdges.length > 0) {
226
+ lines.push('Resolved imports:');
227
+ for (const edge of graph.resolvedEdges) {
228
+ lines.push(` ${edge.importer} → ${edge.resolved}`);
229
+ }
230
+ }
231
+ if (graph.unresolvedEdges.length > 0) {
232
+ lines.push('Unresolved imports:');
233
+ for (const edge of graph.unresolvedEdges) {
234
+ lines.push(` ${edge.importer} → ${edge.specifier} (external)`);
235
+ }
236
+ }
237
+ if (lines.length === 0) {
238
+ return 'No import relationships detected.';
239
+ }
240
+ return lines.join('\n');
241
+ }
242
+ export function slugify(text) {
243
+ return text
244
+ .toLowerCase()
245
+ .replace(/[^a-z0-9\s-]/g, '')
246
+ .replace(/\s+/g, '-')
247
+ .replace(/-+/g, '-')
248
+ .replace(/^-|-$/g, '')
249
+ .slice(0, 60);
250
+ }
251
+ //# sourceMappingURL=idea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.js","sourceRoot":"","sources":["../src/idea.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,iBAAiB,GAA6B;IAClD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC;IAC3E,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC;IAC1E,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC;CACtF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAU,CAAC;AAG5F,MAAM,oBAAoB,GAAgC;IACxD,SAAS,EAAE,sGAAsG;IACjH,gBAAgB,EAAE,+FAA+F;IACjH,UAAU,EAAE,sGAAsG;IAClH,EAAE,EAAE,oEAAoE;CACzE,CAAC;AAaF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAS;IACjB,aAAa,CAAU;IACvB,YAAY,QAAgB,EAAE,aAAsB;QAClD,KAAK,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAaD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAErC,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAoB,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,KAAK,iBAAiB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7D,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK;QAC9B,CAAC,CAAC;;;;EAIJ,oBAAoB,CAAC,OAAO,CAAC,KAAoB,CAAC;;;CAGnD;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,KAAK;qBAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;qBACjF,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,UAAU,GACd,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,UAAU,GAAG,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/G,SAAS,GAAG;;;;;EAKlB,OAAO,GAAG,UAAU;;;CAGrB,CAAC;YACI,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG;;;;EAIjB,OAAO,CAAC,IAAI;EACZ,UAAU,GAAG,SAAS;;;;EAItB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,yFAAyF,CAAC,CAAC,CAAC,wHAAwH;;;;2CAI3L,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,iDAAiD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,kBAAkB;;sBAEzL,YAAY;;;;;;;;;;;;;EAahC,QAAQ;;;;wFAI8E,CAAC;QAErF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9D,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG;;;;EAIf,OAAO,CAAC,IAAI;EACZ,UAAU;uBACW,SAAS,CAAC,MAAM;;EAErC,WAAW;;;;EAIX,aAAa;;sBAEO,YAAY;;;;;;;;;;;;;;EAchC,QAAQ;;;;wFAI8E,CAAC;IAEvF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAoB;IACrD,MAAM,KAAK,GAAG,SAAS,CACrB;QACE,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,UAAU;QACrB,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,cAAc;QAC9B,gBAAgB,EAAE,IAAI;KACvB,EACD,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACrG,CAAC;IAED,qEAAqE;IACrE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAClG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,IAAI,mBAAmB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAkB,MAAM,YAAY,CAChD;QACE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7C,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,GAAG;QAChB,UAAU,EAAE,MAAM;QAClB,eAAe,EAAE,MAAM;KACxB,EACD,cAAc,EACd,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,QAAQ,EACR,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,YAAY;QAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAErC,6DAA6D;IAC7D,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACtC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE;QAC/C,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IAEH,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAClC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACzC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,SAAS,aAAa,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const IMPORT_PATTERN_JS: RegExp;
2
+ export declare const IMPORT_PATTERN_PYTHON: RegExp;
3
+ export declare const IMPORT_PATTERN_GO: RegExp;
4
+ /** @deprecated Use IMPORT_PATTERN_JS instead */
5
+ export declare const IMPORT_PATTERN: RegExp;
6
+ export type RepoLanguage = 'typescript' | 'javascript' | 'python' | 'go' | 'rust' | 'unknown';
7
+ export declare function detectRepoLanguage(repoFiles: string[]): RepoLanguage;
8
+ export declare function isImportGraphSourceFile(filePath: string, language?: RepoLanguage): boolean;
9
+ export declare function getImportPattern(language: RepoLanguage): RegExp;
10
+ export declare function isRelativeImport(specifier: string, language?: RepoLanguage): boolean;
11
+ export declare function resolveImportPath(repoRoot: string, sourcePath: string, specifier: string): string | null;
12
+ export declare function resolvePythonImportPath(repoRoot: string, sourcePath: string, specifier: string): string | null;
13
+ export declare function isInsideRepo(repoRoot: string, filePath: string): boolean;
@@ -0,0 +1,111 @@
1
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
2
+ import { fileExists } from './storage.js';
3
+ export const IMPORT_PATTERN_JS = /(?:import|export)\s+(?:[^'"\n]+?\s+from\s+)?['"]([^'"]+)['"]|require\(\s*['"]([^'"]+)['"]\s*\)/g;
4
+ export const IMPORT_PATTERN_PYTHON = /^(?:from\s+(\.[\w.]*)\s+import|import\s+(\.[\w.]*))/gm;
5
+ export const IMPORT_PATTERN_GO = /^import\s+(?:\(\s*\n([\s\S]*?)\)|"([^"]+)")/gm;
6
+ /** @deprecated Use IMPORT_PATTERN_JS instead */
7
+ export const IMPORT_PATTERN = IMPORT_PATTERN_JS;
8
+ export function detectRepoLanguage(repoFiles) {
9
+ const exts = new Map();
10
+ for (const f of repoFiles) {
11
+ const ext = f.match(/\.[^./]+$/)?.[0] ?? '';
12
+ exts.set(ext, (exts.get(ext) ?? 0) + 1);
13
+ }
14
+ if ((exts.get('.ts') ?? 0) + (exts.get('.tsx') ?? 0) > 0)
15
+ return 'typescript';
16
+ if ((exts.get('.py') ?? 0) > 0)
17
+ return 'python';
18
+ if ((exts.get('.go') ?? 0) > 0)
19
+ return 'go';
20
+ if ((exts.get('.rs') ?? 0) > 0)
21
+ return 'rust';
22
+ if ((exts.get('.js') ?? 0) + (exts.get('.mjs') ?? 0) > 0)
23
+ return 'javascript';
24
+ return 'unknown';
25
+ }
26
+ export function isImportGraphSourceFile(filePath, language) {
27
+ const ext = filePath.match(/\.[^./]+$/)?.[0] ?? '';
28
+ switch (language) {
29
+ case 'python':
30
+ return ext === '.py';
31
+ case 'go':
32
+ return ext === '.go';
33
+ case 'rust':
34
+ return ext === '.rs';
35
+ case 'typescript':
36
+ case 'javascript':
37
+ return ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.mjs';
38
+ default:
39
+ return ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.mjs' || ext === '.py' || ext === '.go';
40
+ }
41
+ }
42
+ export function getImportPattern(language) {
43
+ switch (language) {
44
+ case 'python':
45
+ return new RegExp(IMPORT_PATTERN_PYTHON.source, IMPORT_PATTERN_PYTHON.flags);
46
+ case 'go':
47
+ return new RegExp(IMPORT_PATTERN_GO.source, IMPORT_PATTERN_GO.flags);
48
+ default:
49
+ return new RegExp(IMPORT_PATTERN_JS.source, IMPORT_PATTERN_JS.flags);
50
+ }
51
+ }
52
+ export function isRelativeImport(specifier, language) {
53
+ if (language === 'python') {
54
+ return specifier.startsWith('.');
55
+ }
56
+ return specifier.startsWith('./') || specifier.startsWith('../');
57
+ }
58
+ export function resolveImportPath(repoRoot, sourcePath, specifier) {
59
+ const basePath = resolve(dirname(sourcePath), specifier);
60
+ const candidates = buildImportCandidates(basePath, specifier);
61
+ for (const candidate of candidates) {
62
+ if (!isInsideRepo(repoRoot, candidate) || !fileExists(candidate)) {
63
+ continue;
64
+ }
65
+ return candidate;
66
+ }
67
+ return null;
68
+ }
69
+ export function resolvePythonImportPath(repoRoot, sourcePath, specifier) {
70
+ // Convert Python relative import dots to path (e.g., ".foo" -> "./foo", "..bar" -> "../bar")
71
+ const dots = specifier.match(/^(\.+)/)?.[1] ?? '.';
72
+ const modulePart = specifier.slice(dots.length);
73
+ const levels = dots.length - 1;
74
+ let base = dirname(sourcePath);
75
+ for (let i = 0; i < levels; i++) {
76
+ base = dirname(base);
77
+ }
78
+ const modulePath = modulePart.replace(/\./g, '/');
79
+ const candidates = modulePath
80
+ ? [join(base, `${modulePath}.py`), join(base, modulePath, '__init__.py')]
81
+ : [join(base, '__init__.py')];
82
+ for (const candidate of candidates) {
83
+ if (isInsideRepo(repoRoot, candidate) && fileExists(candidate)) {
84
+ return candidate;
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ function buildImportCandidates(basePath, specifier) {
90
+ const ext = specifier.match(/\.[^./]+$/)?.[0] ?? '';
91
+ const candidates = new Set([
92
+ basePath,
93
+ `${basePath}.ts`,
94
+ `${basePath}.tsx`,
95
+ `${basePath}.js`,
96
+ `${basePath}.mjs`,
97
+ join(basePath, 'index.ts'),
98
+ join(basePath, 'index.tsx'),
99
+ join(basePath, 'index.js'),
100
+ ]);
101
+ if (ext === '.js' || ext === '.mjs' || ext === '.cjs') {
102
+ candidates.add(basePath.slice(0, -ext.length) + '.ts');
103
+ candidates.add(basePath.slice(0, -ext.length) + '.tsx');
104
+ }
105
+ return [...candidates];
106
+ }
107
+ export function isInsideRepo(repoRoot, filePath) {
108
+ const relativePath = relative(repoRoot, filePath);
109
+ return relativePath !== '' && !relativePath.startsWith('..') && !isAbsolute(relativePath);
110
+ }
111
+ //# sourceMappingURL=import-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-resolution.js","sourceRoot":"","sources":["../src/import-resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { AssignmentsFile, TaskGraph } from './types.js';
2
+ export declare function renderInboxes(assignments: AssignmentsFile, graph: TaskGraph): Record<string, string>;
@@ -0,0 +1,67 @@
1
+ export function renderInboxes(assignments, graph) {
2
+ const taskById = new Map(graph.tasks.map((task) => [task.id, task]));
3
+ const taskOrder = new Map(graph.tasks.map((task, index) => [task.id, index]));
4
+ const grouped = new Map();
5
+ for (const assignment of assignments.assignments) {
6
+ const existing = grouped.get(assignment.agent_id);
7
+ if (existing) {
8
+ existing.push(assignment);
9
+ continue;
10
+ }
11
+ grouped.set(assignment.agent_id, [assignment]);
12
+ }
13
+ const result = {};
14
+ for (const [agentId, agentAssignments] of grouped) {
15
+ agentAssignments.sort((left, right) => {
16
+ return ((taskOrder.get(left.task_id) ?? Number.MAX_SAFE_INTEGER) -
17
+ (taskOrder.get(right.task_id) ?? Number.MAX_SAFE_INTEGER));
18
+ });
19
+ const firstAssignment = agentAssignments[0];
20
+ const lines = [
21
+ `# Inbox: ${agentId}`,
22
+ '',
23
+ '## Run',
24
+ `- Run ID: ${assignments.run_id}`,
25
+ `- Agent ID: ${agentId}`,
26
+ `- Tool: ${firstAssignment.tool}`,
27
+ `- Model: ${firstAssignment.model}`,
28
+ '',
29
+ '## Assigned Tasks',
30
+ ];
31
+ for (const assignment of agentAssignments) {
32
+ const task = taskById.get(assignment.task_id);
33
+ const description = task?.description ?? 'Unknown task';
34
+ lines.push(`- **${assignment.task_id}**: ${description}`);
35
+ if (task) {
36
+ lines.push(` - Tier: ${assignment.tier}`);
37
+ if (task.dependencies.length > 0) {
38
+ lines.push(` - Dependencies: ${task.dependencies.join(', ')}`);
39
+ }
40
+ if (task.scope.files.length > 0) {
41
+ lines.push(` - Scope: ${task.scope.files.join(', ')}`);
42
+ }
43
+ if (task.acceptance_checks.length > 0) {
44
+ lines.push(` - Checks: ${task.acceptance_checks.join(', ')}`);
45
+ }
46
+ }
47
+ lines.push(` - Routing: ${assignment.reason}`);
48
+ }
49
+ lines.push('', '## Rules');
50
+ lines.push('- Only work on tasks listed here.');
51
+ lines.push('- Do not modify files outside declared scope.');
52
+ lines.push('- If a dependency is incomplete, stop and report it.');
53
+ lines.push('- If you need clarification, you may report status `question` with a specific question for a human to answer.');
54
+ lines.push('', '## Completion Signaling');
55
+ for (const assignment of agentAssignments) {
56
+ lines.push('- Write `.stw/runs/' +
57
+ assignments.run_id +
58
+ '/tasks/' +
59
+ assignment.task_id +
60
+ '/status.json` when done or blocked');
61
+ }
62
+ lines.push('- Use `complete`, `blocked`, `failed`, `escalated`, or `question`');
63
+ result[agentId] = lines.join('\n') + '\n';
64
+ }
65
+ return result;
66
+ }
67
+ //# sourceMappingURL=inbox-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-renderer.js","sourceRoot":"","sources":["../src/inbox-renderer.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,105 @@
1
+ import type { StwConfig } from './types.js';
2
+ export type RepoType = 'nodejs' | 'rust' | 'go' | 'python' | 'unknown';
3
+ export interface RepoProfile {
4
+ type: RepoType;
5
+ testCommand: string | null;
6
+ lintCommand: string | null;
7
+ detectedFiles: string[];
8
+ }
9
+ declare const GLM_5_MODELS: {
10
+ strong: string;
11
+ medium: string;
12
+ cheap: string;
13
+ reader: string;
14
+ };
15
+ declare const GLM_5_PRICING: {
16
+ 'z-ai/glm-5': {
17
+ model: string;
18
+ input_cost_per_mtok: number;
19
+ output_cost_per_mtok: number;
20
+ };
21
+ };
22
+ declare const MINIMAX_MODELS: {
23
+ strong: string;
24
+ medium: string;
25
+ cheap: string;
26
+ reader: string;
27
+ };
28
+ declare const MINIMAX_PRICING: {
29
+ 'minimax/minimax-m2.5': {
30
+ model: string;
31
+ input_cost_per_mtok: number;
32
+ output_cost_per_mtok: number;
33
+ };
34
+ };
35
+ declare const ANTHROPIC_MODELS: {
36
+ strong: string;
37
+ medium: string;
38
+ cheap: string;
39
+ reader: string;
40
+ };
41
+ declare const ANTHROPIC_PRICING: {
42
+ 'anthropic/claude-sonnet-4-6': {
43
+ model: string;
44
+ input_cost_per_mtok: number;
45
+ output_cost_per_mtok: number;
46
+ };
47
+ 'anthropic/claude-haiku-4-5': {
48
+ model: string;
49
+ input_cost_per_mtok: number;
50
+ output_cost_per_mtok: number;
51
+ };
52
+ };
53
+ declare const MIXED_MODELS: {
54
+ strong: string;
55
+ medium: string;
56
+ cheap: string;
57
+ reader: string;
58
+ };
59
+ declare const MIXED_PRICING: {
60
+ 'anthropic/claude-sonnet-4-6': {
61
+ model: string;
62
+ input_cost_per_mtok: number;
63
+ output_cost_per_mtok: number;
64
+ };
65
+ 'anthropic/claude-haiku-4-5': {
66
+ model: string;
67
+ input_cost_per_mtok: number;
68
+ output_cost_per_mtok: number;
69
+ };
70
+ 'minimax/minimax-m2.5': {
71
+ model: string;
72
+ input_cost_per_mtok: number;
73
+ output_cost_per_mtok: number;
74
+ };
75
+ 'z-ai/glm-5': {
76
+ model: string;
77
+ input_cost_per_mtok: number;
78
+ output_cost_per_mtok: number;
79
+ };
80
+ };
81
+ export type PresetName = 'glm5' | 'glm51' | 'minimax' | 'anthropic' | 'mixed';
82
+ export interface PricingEntry {
83
+ model: string;
84
+ input_cost_per_mtok: number;
85
+ output_cost_per_mtok: number;
86
+ }
87
+ export interface PresetConfig {
88
+ models: Record<string, string>;
89
+ pricing: Record<string, PricingEntry>;
90
+ }
91
+ export declare const PRESETS: Record<PresetName, PresetConfig>;
92
+ export interface BackendDetection {
93
+ opencode: boolean;
94
+ claude: boolean;
95
+ }
96
+ export declare function detectBackends(): BackendDetection;
97
+ export declare function detectRepo(repoRoot: string): RepoProfile;
98
+ export declare function generateConfig(repoRoot: string, options?: {
99
+ provider?: string;
100
+ models?: Record<string, string>;
101
+ backend?: string;
102
+ maxRunUsd?: number;
103
+ preset?: PresetName;
104
+ }): StwConfig;
105
+ export { GLM_5_MODELS, GLM_5_PRICING, MINIMAX_MODELS, MINIMAX_PRICING, ANTHROPIC_MODELS, ANTHROPIC_PRICING, MIXED_MODELS, MIXED_PRICING, };