ralph-starter 0.0.1 → 0.1.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +707 -17
- package/dist/auth/browser.d.ts +10 -0
- package/dist/auth/browser.d.ts.map +1 -0
- package/dist/auth/browser.js +56 -0
- package/dist/auth/browser.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth-server.d.ts +20 -0
- package/dist/auth/oauth-server.d.ts.map +1 -0
- package/dist/auth/oauth-server.js +168 -0
- package/dist/auth/oauth-server.js.map +1 -0
- package/dist/auth/pkce.d.ts +46 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +57 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/providers/base.d.ts +52 -0
- package/dist/auth/providers/base.d.ts.map +1 -0
- package/dist/auth/providers/base.js +70 -0
- package/dist/auth/providers/base.js.map +1 -0
- package/dist/auth/providers/index.d.ts +23 -0
- package/dist/auth/providers/index.d.ts.map +1 -0
- package/dist/auth/providers/index.js +39 -0
- package/dist/auth/providers/index.js.map +1 -0
- package/dist/auth/providers/linear.d.ts +37 -0
- package/dist/auth/providers/linear.d.ts.map +1 -0
- package/dist/auth/providers/linear.js +46 -0
- package/dist/auth/providers/linear.js.map +1 -0
- package/dist/auth/providers/notion.d.ts +36 -0
- package/dist/auth/providers/notion.d.ts.map +1 -0
- package/dist/auth/providers/notion.js +75 -0
- package/dist/auth/providers/notion.js.map +1 -0
- package/dist/auth/providers/todoist.d.ts +29 -0
- package/dist/auth/providers/todoist.d.ts.map +1 -0
- package/dist/auth/providers/todoist.js +40 -0
- package/dist/auth/providers/todoist.js.map +1 -0
- package/dist/automation/git.d.ts +15 -0
- package/dist/automation/git.d.ts.map +1 -0
- package/dist/automation/git.js +73 -0
- package/dist/automation/git.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +192 -19
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +14 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +243 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/check.d.ts +12 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +124 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/config.d.ts +13 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +376 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +31 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +353 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/integrations.d.ts +17 -0
- package/dist/commands/integrations.d.ts.map +1 -0
- package/dist/commands/integrations.js +193 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/plan.d.ts +5 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +80 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/run.d.ts +26 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +351 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scaffold.d.ts +9 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +128 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/setup.d.ts +12 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +27 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/skill.d.ts +6 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +151 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/source.d.ts +17 -0
- package/dist/commands/source.d.ts.map +1 -0
- package/dist/commands/source.js +173 -0
- package/dist/commands/source.js.map +1 -0
- package/dist/config/manager.d.ts +70 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +227 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -2
- package/dist/index.js.map +1 -0
- package/dist/integrations/_template/auth.d.ts +29 -0
- package/dist/integrations/_template/auth.d.ts.map +1 -0
- package/dist/integrations/_template/auth.js +42 -0
- package/dist/integrations/_template/auth.js.map +1 -0
- package/dist/integrations/_template/index.d.ts +8 -0
- package/dist/integrations/_template/index.d.ts.map +1 -0
- package/dist/integrations/_template/index.js +8 -0
- package/dist/integrations/_template/index.js.map +1 -0
- package/dist/integrations/_template/source.d.ts +34 -0
- package/dist/integrations/_template/source.d.ts.map +1 -0
- package/dist/integrations/_template/source.js +124 -0
- package/dist/integrations/_template/source.js.map +1 -0
- package/dist/integrations/base.d.ts +158 -0
- package/dist/integrations/base.d.ts.map +1 -0
- package/dist/integrations/base.js +109 -0
- package/dist/integrations/base.js.map +1 -0
- package/dist/integrations/github/index.d.ts +8 -0
- package/dist/integrations/github/index.d.ts.map +1 -0
- package/dist/integrations/github/index.js +8 -0
- package/dist/integrations/github/index.js.map +1 -0
- package/dist/integrations/github/source.d.ts +26 -0
- package/dist/integrations/github/source.d.ts.map +1 -0
- package/dist/integrations/github/source.js +190 -0
- package/dist/integrations/github/source.js.map +1 -0
- package/dist/integrations/index.d.ts +37 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +71 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/linear/auth.d.ts +37 -0
- package/dist/integrations/linear/auth.d.ts.map +1 -0
- package/dist/integrations/linear/auth.js +45 -0
- package/dist/integrations/linear/auth.js.map +1 -0
- package/dist/integrations/linear/index.d.ts +9 -0
- package/dist/integrations/linear/index.d.ts.map +1 -0
- package/dist/integrations/linear/index.js +9 -0
- package/dist/integrations/linear/index.js.map +1 -0
- package/dist/integrations/linear/source.d.ts +26 -0
- package/dist/integrations/linear/source.d.ts.map +1 -0
- package/dist/integrations/linear/source.js +248 -0
- package/dist/integrations/linear/source.js.map +1 -0
- package/dist/integrations/notion/index.d.ts +8 -0
- package/dist/integrations/notion/index.d.ts.map +1 -0
- package/dist/integrations/notion/index.js +8 -0
- package/dist/integrations/notion/index.js.map +1 -0
- package/dist/integrations/notion/source.d.ts +53 -0
- package/dist/integrations/notion/source.d.ts.map +1 -0
- package/dist/integrations/notion/source.js +463 -0
- package/dist/integrations/notion/source.js.map +1 -0
- package/dist/llm/api.d.ts +29 -0
- package/dist/llm/api.d.ts.map +1 -0
- package/dist/llm/api.js +152 -0
- package/dist/llm/api.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +7 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/providers.d.ts +24 -0
- package/dist/llm/providers.d.ts.map +1 -0
- package/dist/llm/providers.js +51 -0
- package/dist/llm/providers.js.map +1 -0
- package/dist/loop/__tests__/agents.test.d.ts +2 -0
- package/dist/loop/__tests__/agents.test.d.ts.map +1 -0
- package/dist/loop/__tests__/agents.test.js +183 -0
- package/dist/loop/__tests__/agents.test.js.map +1 -0
- package/dist/loop/__tests__/circuit-breaker.test.d.ts +2 -0
- package/dist/loop/__tests__/circuit-breaker.test.d.ts.map +1 -0
- package/dist/loop/__tests__/circuit-breaker.test.js +161 -0
- package/dist/loop/__tests__/circuit-breaker.test.js.map +1 -0
- package/dist/loop/__tests__/cost-tracker.test.d.ts +2 -0
- package/dist/loop/__tests__/cost-tracker.test.d.ts.map +1 -0
- package/dist/loop/__tests__/cost-tracker.test.js +200 -0
- package/dist/loop/__tests__/cost-tracker.test.js.map +1 -0
- package/dist/loop/__tests__/rate-limiter.test.d.ts +2 -0
- package/dist/loop/__tests__/rate-limiter.test.d.ts.map +1 -0
- package/dist/loop/__tests__/rate-limiter.test.js +198 -0
- package/dist/loop/__tests__/rate-limiter.test.js.map +1 -0
- package/dist/loop/__tests__/validation.test.d.ts +2 -0
- package/dist/loop/__tests__/validation.test.d.ts.map +1 -0
- package/dist/loop/__tests__/validation.test.js +234 -0
- package/dist/loop/__tests__/validation.test.js.map +1 -0
- package/dist/loop/agents.d.ts +26 -0
- package/dist/loop/agents.d.ts.map +1 -0
- package/dist/loop/agents.js +188 -0
- package/dist/loop/agents.js.map +1 -0
- package/dist/loop/circuit-breaker.d.ts +61 -0
- package/dist/loop/circuit-breaker.d.ts.map +1 -0
- package/dist/loop/circuit-breaker.js +143 -0
- package/dist/loop/circuit-breaker.js.map +1 -0
- package/dist/loop/cost-tracker.d.ts +90 -0
- package/dist/loop/cost-tracker.d.ts.map +1 -0
- package/dist/loop/cost-tracker.js +229 -0
- package/dist/loop/cost-tracker.js.map +1 -0
- package/dist/loop/estimator.d.ts +20 -0
- package/dist/loop/estimator.d.ts.map +1 -0
- package/dist/loop/estimator.js +123 -0
- package/dist/loop/estimator.js.map +1 -0
- package/dist/loop/executor.d.ts +44 -0
- package/dist/loop/executor.d.ts.map +1 -0
- package/dist/loop/executor.js +646 -0
- package/dist/loop/executor.js.map +1 -0
- package/dist/loop/progress.d.ts +34 -0
- package/dist/loop/progress.d.ts.map +1 -0
- package/dist/loop/progress.js +186 -0
- package/dist/loop/progress.js.map +1 -0
- package/dist/loop/rate-limiter.d.ts +71 -0
- package/dist/loop/rate-limiter.d.ts.map +1 -0
- package/dist/loop/rate-limiter.js +151 -0
- package/dist/loop/rate-limiter.js.map +1 -0
- package/dist/loop/semantic-analyzer.d.ts +33 -0
- package/dist/loop/semantic-analyzer.d.ts.map +1 -0
- package/dist/loop/semantic-analyzer.js +153 -0
- package/dist/loop/semantic-analyzer.js.map +1 -0
- package/dist/loop/skills.d.ts +29 -0
- package/dist/loop/skills.d.ts.map +1 -0
- package/dist/loop/skills.js +174 -0
- package/dist/loop/skills.js.map +1 -0
- package/dist/loop/step-detector.d.ts +17 -0
- package/dist/loop/step-detector.d.ts.map +1 -0
- package/dist/loop/step-detector.js +280 -0
- package/dist/loop/step-detector.js.map +1 -0
- package/dist/loop/task-counter.d.ts +41 -0
- package/dist/loop/task-counter.d.ts.map +1 -0
- package/dist/loop/task-counter.js +99 -0
- package/dist/loop/task-counter.js.map +1 -0
- package/dist/loop/validation.d.ts +28 -0
- package/dist/loop/validation.d.ts.map +1 -0
- package/dist/loop/validation.js +138 -0
- package/dist/loop/validation.js.map +1 -0
- package/dist/mcp/core/init.d.ts +15 -0
- package/dist/mcp/core/init.d.ts.map +1 -0
- package/dist/mcp/core/init.js +272 -0
- package/dist/mcp/core/init.js.map +1 -0
- package/dist/mcp/core/plan.d.ts +15 -0
- package/dist/mcp/core/plan.d.ts.map +1 -0
- package/dist/mcp/core/plan.js +90 -0
- package/dist/mcp/core/plan.js.map +1 -0
- package/dist/mcp/core/run.d.ts +26 -0
- package/dist/mcp/core/run.d.ts.map +1 -0
- package/dist/mcp/core/run.js +114 -0
- package/dist/mcp/core/run.js.map +1 -0
- package/dist/mcp/prompts.d.ts +10 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +163 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +16 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +114 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +73 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +316 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/presets/index.d.ts +36 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +236 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/setup/agent-detector.d.ts +57 -0
- package/dist/setup/agent-detector.d.ts.map +1 -0
- package/dist/setup/agent-detector.js +170 -0
- package/dist/setup/agent-detector.js.map +1 -0
- package/dist/setup/index.d.ts +7 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +7 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/llm-tester.d.ts +33 -0
- package/dist/setup/llm-tester.d.ts.map +1 -0
- package/dist/setup/llm-tester.js +105 -0
- package/dist/setup/llm-tester.js.map +1 -0
- package/dist/setup/wizard.d.ts +19 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +313 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/sources/__tests__/file.test.d.ts +2 -0
- package/dist/sources/__tests__/file.test.d.ts.map +1 -0
- package/dist/sources/__tests__/file.test.js +126 -0
- package/dist/sources/__tests__/file.test.js.map +1 -0
- package/dist/sources/__tests__/github.test.d.ts +2 -0
- package/dist/sources/__tests__/github.test.d.ts.map +1 -0
- package/dist/sources/__tests__/github.test.js +157 -0
- package/dist/sources/__tests__/github.test.js.map +1 -0
- package/dist/sources/base.d.ts +72 -0
- package/dist/sources/base.d.ts.map +1 -0
- package/dist/sources/base.js +127 -0
- package/dist/sources/base.js.map +1 -0
- package/dist/sources/builtin/file.d.ts +21 -0
- package/dist/sources/builtin/file.d.ts.map +1 -0
- package/dist/sources/builtin/file.js +129 -0
- package/dist/sources/builtin/file.js.map +1 -0
- package/dist/sources/builtin/github-scraper.d.ts +65 -0
- package/dist/sources/builtin/github-scraper.d.ts.map +1 -0
- package/dist/sources/builtin/github-scraper.js +324 -0
- package/dist/sources/builtin/github-scraper.js.map +1 -0
- package/dist/sources/builtin/pdf.d.ts +24 -0
- package/dist/sources/builtin/pdf.d.ts.map +1 -0
- package/dist/sources/builtin/pdf.js +174 -0
- package/dist/sources/builtin/pdf.js.map +1 -0
- package/dist/sources/builtin/url.d.ts +47 -0
- package/dist/sources/builtin/url.d.ts.map +1 -0
- package/dist/sources/builtin/url.js +429 -0
- package/dist/sources/builtin/url.js.map +1 -0
- package/dist/sources/config.d.ts +72 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +215 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/index.d.ts +47 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +210 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/integrations/github.d.ts +24 -0
- package/dist/sources/integrations/github.d.ts.map +1 -0
- package/dist/sources/integrations/github.js +193 -0
- package/dist/sources/integrations/github.js.map +1 -0
- package/dist/sources/integrations/linear.d.ts +18 -0
- package/dist/sources/integrations/linear.d.ts.map +1 -0
- package/dist/sources/integrations/linear.js +197 -0
- package/dist/sources/integrations/linear.js.map +1 -0
- package/dist/sources/integrations/notion.d.ts +39 -0
- package/dist/sources/integrations/notion.d.ts.map +1 -0
- package/dist/sources/integrations/notion.js +343 -0
- package/dist/sources/integrations/notion.js.map +1 -0
- package/dist/sources/integrations/todoist.d.ts +18 -0
- package/dist/sources/integrations/todoist.d.ts.map +1 -0
- package/dist/sources/integrations/todoist.js +154 -0
- package/dist/sources/integrations/todoist.js.map +1 -0
- package/dist/sources/types.d.ts +106 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +9 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/progress-renderer.d.ts +54 -0
- package/dist/ui/progress-renderer.d.ts.map +1 -0
- package/dist/ui/progress-renderer.js +118 -0
- package/dist/ui/progress-renderer.js.map +1 -0
- package/dist/ui/shimmer.d.ts +16 -0
- package/dist/ui/shimmer.d.ts.map +1 -0
- package/dist/ui/shimmer.js +31 -0
- package/dist/ui/shimmer.js.map +1 -0
- package/dist/wizard/ascii-art.d.ts +93 -0
- package/dist/wizard/ascii-art.d.ts.map +1 -0
- package/dist/wizard/ascii-art.js +378 -0
- package/dist/wizard/ascii-art.js.map +1 -0
- package/dist/wizard/idea-prompts.d.ts +18 -0
- package/dist/wizard/idea-prompts.d.ts.map +1 -0
- package/dist/wizard/idea-prompts.js +154 -0
- package/dist/wizard/idea-prompts.js.map +1 -0
- package/dist/wizard/idea-ui.d.ts +34 -0
- package/dist/wizard/idea-ui.d.ts.map +1 -0
- package/dist/wizard/idea-ui.js +225 -0
- package/dist/wizard/idea-ui.js.map +1 -0
- package/dist/wizard/ideas.d.ts +27 -0
- package/dist/wizard/ideas.d.ts.map +1 -0
- package/dist/wizard/ideas.js +511 -0
- package/dist/wizard/ideas.js.map +1 -0
- package/dist/wizard/index.d.ts +11 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +472 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/llm.d.ts +14 -0
- package/dist/wizard/llm.d.ts.map +1 -0
- package/dist/wizard/llm.js +420 -0
- package/dist/wizard/llm.js.map +1 -0
- package/dist/wizard/prompts.d.ts +75 -0
- package/dist/wizard/prompts.d.ts.map +1 -0
- package/dist/wizard/prompts.js +455 -0
- package/dist/wizard/prompts.js.map +1 -0
- package/dist/wizard/spec-generator.d.ts +14 -0
- package/dist/wizard/spec-generator.d.ts.map +1 -0
- package/dist/wizard/spec-generator.js +200 -0
- package/dist/wizard/spec-generator.js.map +1 -0
- package/dist/wizard/types.d.ts +53 -0
- package/dist/wizard/types.d.ts.map +1 -0
- package/dist/wizard/types.js +10 -0
- package/dist/wizard/types.js.map +1 -0
- package/dist/wizard/ui.d.ts +57 -0
- package/dist/wizard/ui.d.ts.map +1 -0
- package/dist/wizard/ui.js +211 -0
- package/dist/wizard/ui.js.map +1 -0
- package/package.json +59 -8
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step detector for Claude Code JSONL output
|
|
3
|
+
*
|
|
4
|
+
* Parses the stream-json output from Claude Code CLI and detects
|
|
5
|
+
* what step the agent is currently performing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a file path looks like a test file
|
|
9
|
+
*/
|
|
10
|
+
function isTestFile(filePath) {
|
|
11
|
+
const lower = filePath.toLowerCase();
|
|
12
|
+
return (lower.includes('.test.') ||
|
|
13
|
+
lower.includes('.spec.') ||
|
|
14
|
+
lower.includes('__tests__') ||
|
|
15
|
+
lower.includes('_test.go'));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Extract filename from path
|
|
19
|
+
*/
|
|
20
|
+
function getFilename(filePath) {
|
|
21
|
+
return filePath.split('/').pop() || filePath.split('\\').pop() || 'file';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Detect the current step from a JSON output line
|
|
25
|
+
* Returns human-readable step description or null if not detectable
|
|
26
|
+
*/
|
|
27
|
+
export function detectStepFromOutput(line) {
|
|
28
|
+
const trimmed = line.trim();
|
|
29
|
+
// Fast path: skip non-JSON lines
|
|
30
|
+
if (!trimmed.startsWith('{')) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(trimmed);
|
|
35
|
+
// Extract fields for pattern matching
|
|
36
|
+
const toolName = parsed.tool?.toLowerCase() ||
|
|
37
|
+
parsed.name?.toLowerCase() ||
|
|
38
|
+
parsed.tool_name?.toLowerCase() ||
|
|
39
|
+
'';
|
|
40
|
+
const command = parsed.command?.toLowerCase() || '';
|
|
41
|
+
const filePath = (parsed.file_path || parsed.filePath || parsed.path || '').toLowerCase();
|
|
42
|
+
const description = (parsed.description || '').toLowerCase();
|
|
43
|
+
// Check tool name to determine operation type
|
|
44
|
+
const isReadOperation = ['read', 'glob', 'grep'].includes(toolName);
|
|
45
|
+
const isWriteOperation = ['write', 'edit'].includes(toolName);
|
|
46
|
+
// Reading code - check this early
|
|
47
|
+
if (isReadOperation) {
|
|
48
|
+
return 'Reading code...';
|
|
49
|
+
}
|
|
50
|
+
// Git commit
|
|
51
|
+
if (command.includes('git commit') || description.includes('git commit')) {
|
|
52
|
+
return 'Committing changes...';
|
|
53
|
+
}
|
|
54
|
+
// Git add/staging
|
|
55
|
+
if (command.includes('git add') || description.includes('git add')) {
|
|
56
|
+
return 'Staging files...';
|
|
57
|
+
}
|
|
58
|
+
// Package management
|
|
59
|
+
if (command.includes('npm install') ||
|
|
60
|
+
command.includes('bun install') ||
|
|
61
|
+
command.includes('pnpm install')) {
|
|
62
|
+
return 'Installing dependencies...';
|
|
63
|
+
}
|
|
64
|
+
if (command.includes('npm init') ||
|
|
65
|
+
command.includes('bun init') ||
|
|
66
|
+
command.includes('pnpm init')) {
|
|
67
|
+
return 'Initializing project...';
|
|
68
|
+
}
|
|
69
|
+
// Build commands
|
|
70
|
+
if (command.includes('npm run build') ||
|
|
71
|
+
command.includes('bun run build') ||
|
|
72
|
+
command.includes('build')) {
|
|
73
|
+
return 'Building project...';
|
|
74
|
+
}
|
|
75
|
+
// Linting
|
|
76
|
+
if (command.includes('lint') ||
|
|
77
|
+
command.includes('eslint') ||
|
|
78
|
+
command.includes('biome') ||
|
|
79
|
+
command.includes('prettier')) {
|
|
80
|
+
return 'Linting code...';
|
|
81
|
+
}
|
|
82
|
+
// Testing
|
|
83
|
+
if (command.includes('vitest') ||
|
|
84
|
+
command.includes('jest') ||
|
|
85
|
+
command.includes('bun test') ||
|
|
86
|
+
command.includes('npm test') ||
|
|
87
|
+
command.includes('pytest') ||
|
|
88
|
+
command.includes('go test')) {
|
|
89
|
+
return 'Running tests...';
|
|
90
|
+
}
|
|
91
|
+
// Writing tests - only for write operations to test files
|
|
92
|
+
if (isWriteOperation && isTestFile(filePath)) {
|
|
93
|
+
return 'Writing tests...';
|
|
94
|
+
}
|
|
95
|
+
// Writing/Editing code
|
|
96
|
+
if (isWriteOperation) {
|
|
97
|
+
const filename = getFilename(filePath);
|
|
98
|
+
return `Writing ${filename}...`;
|
|
99
|
+
}
|
|
100
|
+
// Bash commands (generic)
|
|
101
|
+
if (toolName === 'bash' && command) {
|
|
102
|
+
// Try to extract meaningful description from command
|
|
103
|
+
if (command.includes('mkdir'))
|
|
104
|
+
return 'Creating directories...';
|
|
105
|
+
if (command.includes('rm '))
|
|
106
|
+
return 'Removing files...';
|
|
107
|
+
if (command.includes('cp '))
|
|
108
|
+
return 'Copying files...';
|
|
109
|
+
if (command.includes('mv '))
|
|
110
|
+
return 'Moving files...';
|
|
111
|
+
return 'Running command...';
|
|
112
|
+
}
|
|
113
|
+
// Assistant message with tool_use - this is the main format from Claude Code
|
|
114
|
+
if (parsed.type === 'assistant' && parsed.message?.content) {
|
|
115
|
+
const content = parsed.message.content;
|
|
116
|
+
if (Array.isArray(content)) {
|
|
117
|
+
for (const block of content) {
|
|
118
|
+
if (block.type === 'tool_use') {
|
|
119
|
+
const blockToolName = block.name?.toLowerCase() || '';
|
|
120
|
+
const input = block.input || {};
|
|
121
|
+
// Extract file path from tool input
|
|
122
|
+
const blockFilePath = (input.file_path ||
|
|
123
|
+
input.filePath ||
|
|
124
|
+
input.path ||
|
|
125
|
+
'').toLowerCase();
|
|
126
|
+
const blockCommand = (input.command || '').toLowerCase();
|
|
127
|
+
// Read operations
|
|
128
|
+
if (blockToolName === 'read') {
|
|
129
|
+
const filename = getFilename(blockFilePath || 'file');
|
|
130
|
+
return `Reading ${filename}...`;
|
|
131
|
+
}
|
|
132
|
+
if (blockToolName === 'glob') {
|
|
133
|
+
return 'Searching files...';
|
|
134
|
+
}
|
|
135
|
+
if (blockToolName === 'grep') {
|
|
136
|
+
return 'Searching code...';
|
|
137
|
+
}
|
|
138
|
+
// Write/Edit operations - show specific filename
|
|
139
|
+
if (blockToolName === 'write' || blockToolName === 'edit') {
|
|
140
|
+
if (blockFilePath) {
|
|
141
|
+
const filename = getFilename(blockFilePath);
|
|
142
|
+
if (isTestFile(blockFilePath)) {
|
|
143
|
+
return `Writing tests (${filename})...`;
|
|
144
|
+
}
|
|
145
|
+
return `Writing ${filename}...`;
|
|
146
|
+
}
|
|
147
|
+
return 'Writing code...';
|
|
148
|
+
}
|
|
149
|
+
// Bash commands - parse the command for specifics
|
|
150
|
+
if (blockToolName === 'bash') {
|
|
151
|
+
if (blockCommand.includes('npm install') ||
|
|
152
|
+
blockCommand.includes('bun install') ||
|
|
153
|
+
blockCommand.includes('pnpm install')) {
|
|
154
|
+
return 'Installing dependencies...';
|
|
155
|
+
}
|
|
156
|
+
if (blockCommand.includes('npm init') ||
|
|
157
|
+
blockCommand.includes('bun init') ||
|
|
158
|
+
blockCommand.includes('npm create')) {
|
|
159
|
+
return 'Initializing project...';
|
|
160
|
+
}
|
|
161
|
+
if (blockCommand.includes('npm run build') ||
|
|
162
|
+
blockCommand.includes('bun run build') ||
|
|
163
|
+
blockCommand.includes('tsc')) {
|
|
164
|
+
return 'Building project...';
|
|
165
|
+
}
|
|
166
|
+
if (blockCommand.includes('npm test') ||
|
|
167
|
+
blockCommand.includes('vitest') ||
|
|
168
|
+
blockCommand.includes('jest')) {
|
|
169
|
+
return 'Running tests...';
|
|
170
|
+
}
|
|
171
|
+
if (blockCommand.includes('git commit')) {
|
|
172
|
+
return 'Committing changes...';
|
|
173
|
+
}
|
|
174
|
+
if (blockCommand.includes('git add')) {
|
|
175
|
+
return 'Staging files...';
|
|
176
|
+
}
|
|
177
|
+
if (blockCommand.includes('mkdir')) {
|
|
178
|
+
return 'Creating directories...';
|
|
179
|
+
}
|
|
180
|
+
if (blockCommand.includes('npm run dev') || blockCommand.includes('bun run dev')) {
|
|
181
|
+
return 'Starting dev server...';
|
|
182
|
+
}
|
|
183
|
+
// Show description if available
|
|
184
|
+
const desc = (input.description || '').toLowerCase();
|
|
185
|
+
if (desc) {
|
|
186
|
+
return desc.slice(0, 30) + (desc.length > 30 ? '...' : '');
|
|
187
|
+
}
|
|
188
|
+
return 'Running command...';
|
|
189
|
+
}
|
|
190
|
+
// Task tool (subagent)
|
|
191
|
+
if (blockToolName === 'task') {
|
|
192
|
+
return 'Running subagent...';
|
|
193
|
+
}
|
|
194
|
+
// WebFetch
|
|
195
|
+
if (blockToolName === 'webfetch' || blockToolName === 'websearch') {
|
|
196
|
+
return 'Fetching from web...';
|
|
197
|
+
}
|
|
198
|
+
// Generic tool
|
|
199
|
+
return `Using ${block.name}...`;
|
|
200
|
+
}
|
|
201
|
+
// Text content = thinking
|
|
202
|
+
if (block.type === 'text') {
|
|
203
|
+
return 'Thinking...';
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return 'Thinking...';
|
|
208
|
+
}
|
|
209
|
+
// System messages
|
|
210
|
+
if (parsed.type === 'system') {
|
|
211
|
+
if (parsed.subtype === 'init') {
|
|
212
|
+
return 'Starting up...';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// User message (usually tool result) - Claude is processing a result
|
|
216
|
+
if (parsed.type === 'user') {
|
|
217
|
+
return 'Processing...';
|
|
218
|
+
}
|
|
219
|
+
// Result message - task complete
|
|
220
|
+
if (parsed.type === 'result') {
|
|
221
|
+
return 'Finishing up...';
|
|
222
|
+
}
|
|
223
|
+
// Content block start - indicates tool is starting
|
|
224
|
+
if (parsed.type === 'content_block_start' && parsed.content_block) {
|
|
225
|
+
const block = parsed.content_block;
|
|
226
|
+
if (block.type === 'tool_use') {
|
|
227
|
+
const blockToolName = block.name?.toLowerCase() || '';
|
|
228
|
+
if (blockToolName === 'read')
|
|
229
|
+
return 'Reading...';
|
|
230
|
+
if (blockToolName === 'write' || blockToolName === 'edit')
|
|
231
|
+
return 'Writing...';
|
|
232
|
+
if (blockToolName === 'bash')
|
|
233
|
+
return 'Running command...';
|
|
234
|
+
if (blockToolName === 'glob')
|
|
235
|
+
return 'Searching files...';
|
|
236
|
+
if (blockToolName === 'grep')
|
|
237
|
+
return 'Searching code...';
|
|
238
|
+
return `Using ${block.name}...`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// Not valid JSON, ignore
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Extract text content from JSONL output
|
|
250
|
+
* Returns the human-readable text that should be shown to user
|
|
251
|
+
*/
|
|
252
|
+
export function extractTextFromOutput(line) {
|
|
253
|
+
const trimmed = line.trim();
|
|
254
|
+
if (!trimmed.startsWith('{')) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
const parsed = JSON.parse(trimmed);
|
|
259
|
+
// Result message contains final summary
|
|
260
|
+
if (parsed.type === 'result' && parsed.result) {
|
|
261
|
+
return parsed.result;
|
|
262
|
+
}
|
|
263
|
+
// Assistant text content
|
|
264
|
+
if (parsed.type === 'assistant' && parsed.message?.content) {
|
|
265
|
+
const content = parsed.message.content;
|
|
266
|
+
if (Array.isArray(content)) {
|
|
267
|
+
for (const block of content) {
|
|
268
|
+
if (block.type === 'text' && block.text) {
|
|
269
|
+
return block.text;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=step-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-detector.js","sourceRoot":"","sources":["../../src/loop/step-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface PlanTask {
|
|
2
|
+
name: string;
|
|
3
|
+
completed: boolean;
|
|
4
|
+
index: number;
|
|
5
|
+
}
|
|
6
|
+
export interface TaskCount {
|
|
7
|
+
total: number;
|
|
8
|
+
completed: number;
|
|
9
|
+
pending: number;
|
|
10
|
+
tasks: PlanTask[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse tasks from IMPLEMENTATION_PLAN.md
|
|
14
|
+
* Tasks are identified by markdown checkboxes: - [ ] or - [x]
|
|
15
|
+
*/
|
|
16
|
+
export declare function parsePlanTasks(cwd: string): TaskCount;
|
|
17
|
+
/**
|
|
18
|
+
* Get the current task (first uncompleted task)
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCurrentTask(cwd: string): PlanTask | null;
|
|
21
|
+
/**
|
|
22
|
+
* Get task by index (0-based)
|
|
23
|
+
*/
|
|
24
|
+
export declare function getTaskByIndex(cwd: string, index: number): PlanTask | null;
|
|
25
|
+
/**
|
|
26
|
+
* Calculate optimal number of loop iterations based on task count
|
|
27
|
+
*
|
|
28
|
+
* Formula:
|
|
29
|
+
* - If tasks exist: pendingTasks + buffer (for retries/validation fixes)
|
|
30
|
+
* - Buffer = max(2, pendingTasks * 0.3) - at least 2, or 30% extra for retries
|
|
31
|
+
* - Minimum: 3 (even for small tasks)
|
|
32
|
+
* - Maximum: 25 (prevent runaway loops)
|
|
33
|
+
* - If no plan: 10 (sensible default)
|
|
34
|
+
*/
|
|
35
|
+
export declare function calculateOptimalIterations(cwd: string): {
|
|
36
|
+
iterations: number;
|
|
37
|
+
taskCount: TaskCount;
|
|
38
|
+
reason: string;
|
|
39
|
+
};
|
|
40
|
+
export declare const countPlanTasks: typeof parsePlanTasks;
|
|
41
|
+
//# sourceMappingURL=task-counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-counter.d.ts","sourceRoot":"","sources":["../../src/loop/task-counter.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAwCrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAG3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAG1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAoCA;AAGD,eAAO,MAAM,cAAc,uBAAiB,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Parse tasks from IMPLEMENTATION_PLAN.md
|
|
5
|
+
* Tasks are identified by markdown checkboxes: - [ ] or - [x]
|
|
6
|
+
*/
|
|
7
|
+
export function parsePlanTasks(cwd) {
|
|
8
|
+
const planPath = join(cwd, 'IMPLEMENTATION_PLAN.md');
|
|
9
|
+
if (!existsSync(planPath)) {
|
|
10
|
+
return { total: 0, completed: 0, pending: 0, tasks: [] };
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const content = readFileSync(planPath, 'utf-8');
|
|
14
|
+
const tasks = [];
|
|
15
|
+
// Match checkbox items with their text
|
|
16
|
+
// Pattern: - [ ] Task name or - [x] Task name
|
|
17
|
+
const taskRegex = /- \[([xX ])\] (.+)/g;
|
|
18
|
+
let match;
|
|
19
|
+
let index = 0;
|
|
20
|
+
while ((match = taskRegex.exec(content)) !== null) {
|
|
21
|
+
const completed = match[1].toLowerCase() === 'x';
|
|
22
|
+
const name = match[2].trim();
|
|
23
|
+
tasks.push({
|
|
24
|
+
name,
|
|
25
|
+
completed,
|
|
26
|
+
index: index++,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const completed = tasks.filter((t) => t.completed).length;
|
|
30
|
+
const pending = tasks.filter((t) => !t.completed).length;
|
|
31
|
+
return {
|
|
32
|
+
total: tasks.length,
|
|
33
|
+
completed,
|
|
34
|
+
pending,
|
|
35
|
+
tasks,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { total: 0, completed: 0, pending: 0, tasks: [] };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the current task (first uncompleted task)
|
|
44
|
+
*/
|
|
45
|
+
export function getCurrentTask(cwd) {
|
|
46
|
+
const { tasks } = parsePlanTasks(cwd);
|
|
47
|
+
return tasks.find((t) => !t.completed) || null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get task by index (0-based)
|
|
51
|
+
*/
|
|
52
|
+
export function getTaskByIndex(cwd, index) {
|
|
53
|
+
const { tasks } = parsePlanTasks(cwd);
|
|
54
|
+
return tasks[index] || null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Calculate optimal number of loop iterations based on task count
|
|
58
|
+
*
|
|
59
|
+
* Formula:
|
|
60
|
+
* - If tasks exist: pendingTasks + buffer (for retries/validation fixes)
|
|
61
|
+
* - Buffer = max(2, pendingTasks * 0.3) - at least 2, or 30% extra for retries
|
|
62
|
+
* - Minimum: 3 (even for small tasks)
|
|
63
|
+
* - Maximum: 25 (prevent runaway loops)
|
|
64
|
+
* - If no plan: 10 (sensible default)
|
|
65
|
+
*/
|
|
66
|
+
export function calculateOptimalIterations(cwd) {
|
|
67
|
+
const taskCount = parsePlanTasks(cwd);
|
|
68
|
+
// No implementation plan - use default
|
|
69
|
+
if (taskCount.total === 0) {
|
|
70
|
+
return {
|
|
71
|
+
iterations: 10,
|
|
72
|
+
taskCount,
|
|
73
|
+
reason: 'No implementation plan found, using default',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// All tasks already completed
|
|
77
|
+
if (taskCount.pending === 0) {
|
|
78
|
+
return {
|
|
79
|
+
iterations: 3,
|
|
80
|
+
taskCount,
|
|
81
|
+
reason: 'All tasks completed, minimal iterations for verification',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Calculate buffer (at least 2, or 30% of pending tasks for retries)
|
|
85
|
+
const buffer = Math.max(2, Math.ceil(taskCount.pending * 0.3));
|
|
86
|
+
// Calculate iterations: pending tasks + buffer
|
|
87
|
+
let iterations = taskCount.pending + buffer;
|
|
88
|
+
// Apply bounds
|
|
89
|
+
iterations = Math.max(3, iterations); // Minimum 3
|
|
90
|
+
iterations = Math.min(25, iterations); // Maximum 25
|
|
91
|
+
return {
|
|
92
|
+
iterations,
|
|
93
|
+
taskCount,
|
|
94
|
+
reason: `${taskCount.pending} pending tasks + ${buffer} buffer`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Keep backward compatibility
|
|
98
|
+
export const countPlanTasks = parsePlanTasks;
|
|
99
|
+
//# sourceMappingURL=task-counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-counter.js","sourceRoot":"","sources":["../../src/loop/task-counter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ValidationCommand {
|
|
2
|
+
name: string;
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ValidationResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
command: string;
|
|
9
|
+
output: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Detect validation commands from AGENTS.md or package.json
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectValidationCommands(cwd: string): ValidationCommand[];
|
|
16
|
+
/**
|
|
17
|
+
* Run a single validation command
|
|
18
|
+
*/
|
|
19
|
+
export declare function runValidation(cwd: string, command: ValidationCommand): Promise<ValidationResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Run all validation commands
|
|
22
|
+
*/
|
|
23
|
+
export declare function runAllValidations(cwd: string, commands: ValidationCommand[]): Promise<ValidationResult[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Format validation errors for feedback to the agent
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatValidationFeedback(results: ValidationResult[]): string;
|
|
28
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/loop/validation.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAsEzE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAc7B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAmB5E"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
/**
|
|
5
|
+
* Detect validation commands from AGENTS.md or package.json
|
|
6
|
+
*/
|
|
7
|
+
export function detectValidationCommands(cwd) {
|
|
8
|
+
const commands = [];
|
|
9
|
+
// Check AGENTS.md for validation commands
|
|
10
|
+
const agentsPath = join(cwd, 'AGENTS.md');
|
|
11
|
+
if (existsSync(agentsPath)) {
|
|
12
|
+
const content = readFileSync(agentsPath, 'utf-8');
|
|
13
|
+
// Look for test command (must be in backticks after bullet or colon)
|
|
14
|
+
// Matches: "- **Test**: `npm test`" or "- Test: `bun test`" or "* test: `vitest`"
|
|
15
|
+
const testMatch = content.match(/[-*]\s*\*?\*?test\*?\*?[:\s]+`([^`]+)`/i);
|
|
16
|
+
if (testMatch) {
|
|
17
|
+
const parts = testMatch[1].trim().split(/\s+/);
|
|
18
|
+
commands.push({
|
|
19
|
+
name: 'test',
|
|
20
|
+
command: parts[0],
|
|
21
|
+
args: parts.slice(1),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// Look for lint command (must be in backticks after bullet or colon)
|
|
25
|
+
const lintMatch = content.match(/[-*]\s*\*?\*?lint\*?\*?[:\s]+`([^`]+)`/i);
|
|
26
|
+
if (lintMatch) {
|
|
27
|
+
const parts = lintMatch[1].trim().split(/\s+/);
|
|
28
|
+
commands.push({
|
|
29
|
+
name: 'lint',
|
|
30
|
+
command: parts[0],
|
|
31
|
+
args: parts.slice(1),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Look for build command (must be in backticks after bullet or colon)
|
|
35
|
+
const buildMatch = content.match(/[-*]\s*\*?\*?build\*?\*?[:\s]+`([^`]+)`/i);
|
|
36
|
+
if (buildMatch) {
|
|
37
|
+
const parts = buildMatch[1].trim().split(/\s+/);
|
|
38
|
+
commands.push({
|
|
39
|
+
name: 'build',
|
|
40
|
+
command: parts[0],
|
|
41
|
+
args: parts.slice(1),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Fallback to package.json scripts
|
|
46
|
+
if (commands.length === 0) {
|
|
47
|
+
const packagePath = join(cwd, 'package.json');
|
|
48
|
+
if (existsSync(packagePath)) {
|
|
49
|
+
try {
|
|
50
|
+
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
51
|
+
const scripts = pkg.scripts || {};
|
|
52
|
+
if (scripts.test && scripts.test !== 'echo "Error: no test specified" && exit 1') {
|
|
53
|
+
commands.push({ name: 'test', command: 'npm', args: ['run', 'test'] });
|
|
54
|
+
}
|
|
55
|
+
if (scripts.lint) {
|
|
56
|
+
commands.push({ name: 'lint', command: 'npm', args: ['run', 'lint'] });
|
|
57
|
+
}
|
|
58
|
+
if (scripts.build) {
|
|
59
|
+
commands.push({ name: 'build', command: 'npm', args: ['run', 'build'] });
|
|
60
|
+
}
|
|
61
|
+
if (scripts.typecheck) {
|
|
62
|
+
commands.push({ name: 'typecheck', command: 'npm', args: ['run', 'typecheck'] });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Invalid package.json
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return commands;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Run a single validation command
|
|
74
|
+
*/
|
|
75
|
+
export async function runValidation(cwd, command) {
|
|
76
|
+
try {
|
|
77
|
+
const result = await execa(command.command, command.args, {
|
|
78
|
+
cwd,
|
|
79
|
+
timeout: 300000, // 5 minute timeout
|
|
80
|
+
reject: false,
|
|
81
|
+
});
|
|
82
|
+
if (result.exitCode === 0) {
|
|
83
|
+
return {
|
|
84
|
+
success: true,
|
|
85
|
+
command: `${command.command} ${command.args.join(' ')}`,
|
|
86
|
+
output: result.stdout,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
command: `${command.command} ${command.args.join(' ')}`,
|
|
92
|
+
output: result.stdout,
|
|
93
|
+
error: result.stderr || result.stdout,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
command: `${command.command} ${command.args.join(' ')}`,
|
|
100
|
+
output: '',
|
|
101
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Run all validation commands
|
|
107
|
+
*/
|
|
108
|
+
export async function runAllValidations(cwd, commands) {
|
|
109
|
+
const results = [];
|
|
110
|
+
for (const command of commands) {
|
|
111
|
+
const result = await runValidation(cwd, command);
|
|
112
|
+
results.push(result);
|
|
113
|
+
// Stop on first failure
|
|
114
|
+
if (!result.success) {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return results;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Format validation errors for feedback to the agent
|
|
122
|
+
*/
|
|
123
|
+
export function formatValidationFeedback(results) {
|
|
124
|
+
const failedResults = results.filter((r) => !r.success);
|
|
125
|
+
if (failedResults.length === 0) {
|
|
126
|
+
return '';
|
|
127
|
+
}
|
|
128
|
+
const feedback = ['## Validation Failed\n'];
|
|
129
|
+
for (const result of failedResults) {
|
|
130
|
+
feedback.push(`### ${result.command}`);
|
|
131
|
+
feedback.push('```');
|
|
132
|
+
feedback.push(result.error || result.output);
|
|
133
|
+
feedback.push('```\n');
|
|
134
|
+
}
|
|
135
|
+
feedback.push('Please fix the above issues before continuing.');
|
|
136
|
+
return feedback.join('\n');
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/loop/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface InitCoreOptions {
|
|
2
|
+
path: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface InitCoreResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
path: string;
|
|
8
|
+
filesCreated: string[];
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Core initialization logic without CLI dependencies
|
|
13
|
+
*/
|
|
14
|
+
export declare function initCore(options: InitCoreOptions): Promise<InitCoreResult>;
|
|
15
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/mcp/core/init.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmND;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoFhF"}
|