openplanr 0.8.0 → 1.0.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 +142 -52
- package/dist/agents/index.d.ts +1 -5
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -4
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/task-parser.d.ts +4 -1
- package/dist/agents/task-parser.d.ts.map +1 -1
- package/dist/agents/task-parser.js +6 -3
- package/dist/agents/task-parser.js.map +1 -1
- package/dist/agents/utils.d.ts +0 -4
- package/dist/agents/utils.d.ts.map +1 -1
- package/dist/agents/utils.js +3 -24
- package/dist/agents/utils.js.map +1 -1
- package/dist/ai/codebase/context-builder.d.ts +22 -3
- package/dist/ai/codebase/context-builder.d.ts.map +1 -1
- package/dist/ai/codebase/context-builder.js +202 -14
- package/dist/ai/codebase/context-builder.js.map +1 -1
- package/dist/ai/codebase/file-reader.d.ts.map +1 -1
- package/dist/ai/codebase/file-reader.js +7 -3
- package/dist/ai/codebase/file-reader.js.map +1 -1
- package/dist/ai/codebase/index.d.ts +3 -1
- package/dist/ai/codebase/index.d.ts.map +1 -1
- package/dist/ai/codebase/index.js +3 -1
- package/dist/ai/codebase/index.js.map +1 -1
- package/dist/ai/codebase/pattern-rules.d.ts +28 -0
- package/dist/ai/codebase/pattern-rules.d.ts.map +1 -0
- package/dist/ai/codebase/pattern-rules.js +186 -0
- package/dist/ai/codebase/pattern-rules.js.map +1 -0
- package/dist/ai/codebase/rules-reader.d.ts +14 -0
- package/dist/ai/codebase/rules-reader.d.ts.map +1 -0
- package/dist/ai/codebase/rules-reader.js +25 -0
- package/dist/ai/codebase/rules-reader.js.map +1 -0
- package/dist/ai/codebase/stack-detector.d.ts.map +1 -1
- package/dist/ai/codebase/stack-detector.js +4 -1
- package/dist/ai/codebase/stack-detector.js.map +1 -1
- package/dist/ai/codebase/tree-generator.d.ts.map +1 -1
- package/dist/ai/codebase/tree-generator.js +5 -2
- package/dist/ai/codebase/tree-generator.js.map +1 -1
- package/dist/ai/errors.js +1 -1
- package/dist/ai/errors.js.map +1 -1
- package/dist/ai/prompts/prompt-builder.d.ts +12 -0
- package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
- package/dist/ai/prompts/prompt-builder.js +45 -3
- package/dist/ai/prompts/prompt-builder.js.map +1 -1
- package/dist/ai/prompts/system-prompts.d.ts +5 -3
- package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
- package/dist/ai/prompts/system-prompts.js +74 -13
- package/dist/ai/prompts/system-prompts.js.map +1 -1
- package/dist/ai/schemas/ai-response-schemas.d.ts +48 -2
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
- package/dist/ai/schemas/ai-response-schemas.js +19 -0
- package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
- package/dist/ai/types.d.ts +4 -2
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/types.js +3 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/ai/validation/dependency-chains.d.ts +21 -0
- package/dist/ai/validation/dependency-chains.d.ts.map +1 -0
- package/dist/ai/validation/dependency-chains.js +114 -0
- package/dist/ai/validation/dependency-chains.js.map +1 -0
- package/dist/ai/validation/index.d.ts +3 -0
- package/dist/ai/validation/index.d.ts.map +1 -0
- package/dist/ai/validation/index.js +3 -0
- package/dist/ai/validation/index.js.map +1 -0
- package/dist/ai/validation/task-validator.d.ts +37 -0
- package/dist/ai/validation/task-validator.d.ts.map +1 -0
- package/dist/ai/validation/task-validator.js +89 -0
- package/dist/ai/validation/task-validator.js.map +1 -0
- package/dist/cli/commands/backlog.d.ts +10 -0
- package/dist/cli/commands/backlog.d.ts.map +1 -0
- package/dist/cli/commands/backlog.js +292 -0
- package/dist/cli/commands/backlog.js.map +1 -0
- package/dist/cli/commands/checklist.js +4 -4
- package/dist/cli/commands/checklist.js.map +1 -1
- package/dist/cli/commands/config.js +13 -13
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/epic.d.ts.map +1 -1
- package/dist/cli/commands/epic.js +41 -22
- package/dist/cli/commands/epic.js.map +1 -1
- package/dist/cli/commands/estimate.d.ts.map +1 -1
- package/dist/cli/commands/estimate.js +40 -39
- package/dist/cli/commands/estimate.js.map +1 -1
- package/dist/cli/commands/export.d.ts +8 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +282 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/feature.js +9 -9
- package/dist/cli/commands/feature.js.map +1 -1
- package/dist/cli/commands/github.d.ts +8 -0
- package/dist/cli/commands/github.d.ts.map +1 -0
- package/dist/cli/commands/github.js +415 -0
- package/dist/cli/commands/github.js.map +1 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +104 -50
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/quick.d.ts.map +1 -1
- package/dist/cli/commands/quick.js +37 -107
- package/dist/cli/commands/quick.js.map +1 -1
- package/dist/cli/commands/refine.js +21 -21
- package/dist/cli/commands/refine.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +18 -7
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts +9 -0
- package/dist/cli/commands/sprint.d.ts.map +1 -0
- package/dist/cli/commands/sprint.js +519 -0
- package/dist/cli/commands/sprint.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +77 -32
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/story.js +15 -15
- package/dist/cli/commands/story.js.map +1 -1
- package/dist/cli/commands/sync.js +11 -7
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/task.d.ts +0 -2
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +14 -169
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/template.d.ts +10 -0
- package/dist/cli/commands/template.d.ts.map +1 -0
- package/dist/cli/commands/template.js +269 -0
- package/dist/cli/commands/template.js.map +1 -0
- package/dist/cli/helpers/task-creation.d.ts +89 -0
- package/dist/cli/helpers/task-creation.d.ts.map +1 -0
- package/dist/cli/helpers/task-creation.js +140 -0
- package/dist/cli/helpers/task-creation.js.map +1 -0
- package/dist/cli/index.js +29 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/models/schema.d.ts +2 -0
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +2 -0
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +32 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/artifact-gathering.d.ts +2 -0
- package/dist/services/artifact-gathering.d.ts.map +1 -1
- package/dist/services/artifact-gathering.js +26 -7
- package/dist/services/artifact-gathering.js.map +1 -1
- package/dist/services/artifact-service.d.ts +5 -5
- package/dist/services/artifact-service.d.ts.map +1 -1
- package/dist/services/artifact-service.js +4 -0
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/config-service.d.ts.map +1 -1
- package/dist/services/config-service.js +2 -0
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/credential-backends.d.ts.map +1 -1
- package/dist/services/credential-backends.js +15 -7
- package/dist/services/credential-backends.js.map +1 -1
- package/dist/services/credentials-service.d.ts.map +1 -1
- package/dist/services/credentials-service.js +6 -3
- package/dist/services/credentials-service.js.map +1 -1
- package/dist/services/github-service.d.ts +83 -0
- package/dist/services/github-service.d.ts.map +1 -0
- package/dist/services/github-service.js +440 -0
- package/dist/services/github-service.js.map +1 -0
- package/dist/services/template-service.d.ts +2 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +3 -1
- package/dist/services/template-service.js.map +1 -1
- package/dist/templates/backlog/backlog-item.md.hbs +40 -0
- package/dist/templates/checklists/agile-checklist.md.hbs +1 -1
- package/dist/templates/export/planning-report.html.hbs +230 -0
- package/dist/templates/export/planning-report.md.hbs +136 -0
- package/dist/templates/quick/quick-task.md.hbs +1 -1
- package/dist/templates/rules/claude/CLAUDE.md.hbs +78 -35
- package/dist/templates/rules/codex/AGENTS.md.hbs +73 -17
- package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +66 -14
- package/dist/templates/sprints/sprint.md.hbs +42 -0
- package/dist/templates/task-templates/api-integration.json +45 -0
- package/dist/templates/task-templates/auth-flow.json +48 -0
- package/dist/templates/task-templates/database-migration.json +44 -0
- package/dist/templates/task-templates/react-component.json +45 -0
- package/dist/templates/task-templates/rest-endpoint.json +53 -0
- package/dist/templates/tasks/task-list.md.hbs +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +4 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/logger.d.ts +31 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -9
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown.d.ts +3 -2
- package/dist/utils/markdown.d.ts.map +1 -1
- package/dist/utils/markdown.js +3 -1
- package/dist/utils/markdown.js.map +1 -1
- package/dist/utils/slugify.d.ts +8 -1
- package/dist/utils/slugify.d.ts.map +1 -1
- package/dist/utils/slugify.js +18 -2
- package/dist/utils/slugify.js.map +1 -1
- package/package.json +14 -3
- package/dist/agents/agent-factory.d.ts +0 -7
- package/dist/agents/agent-factory.d.ts.map +0 -1
- package/dist/agents/agent-factory.js +0 -22
- package/dist/agents/agent-factory.js.map +0 -1
- package/dist/agents/claude-agent.d.ts +0 -18
- package/dist/agents/claude-agent.d.ts.map +0 -1
- package/dist/agents/claude-agent.js +0 -183
- package/dist/agents/claude-agent.js.map +0 -1
- package/dist/agents/codex-agent.d.ts +0 -17
- package/dist/agents/codex-agent.d.ts.map +0 -1
- package/dist/agents/codex-agent.js +0 -124
- package/dist/agents/codex-agent.js.map +0 -1
- package/dist/agents/cursor-agent.d.ts +0 -14
- package/dist/agents/cursor-agent.d.ts.map +0 -1
- package/dist/agents/cursor-agent.js +0 -49
- package/dist/agents/cursor-agent.js.map +0 -1
- package/dist/agents/implementation-bridge.d.ts +0 -30
- package/dist/agents/implementation-bridge.d.ts.map +0 -1
- package/dist/agents/implementation-bridge.js +0 -256
- package/dist/agents/implementation-bridge.js.map +0 -1
- package/dist/agents/progress.d.ts +0 -62
- package/dist/agents/progress.d.ts.map +0 -1
- package/dist/agents/progress.js +0 -155
- package/dist/agents/progress.js.map +0 -1
- package/dist/agents/prompt-composer.d.ts +0 -30
- package/dist/agents/prompt-composer.d.ts.map +0 -1
- package/dist/agents/prompt-composer.js +0 -81
- package/dist/agents/prompt-composer.js.map +0 -1
- package/dist/agents/types.d.ts +0 -25
- package/dist/agents/types.d.ts.map +0 -1
- package/dist/agents/types.js +0 -8
- package/dist/agents/types.js.map +0 -1
- package/dist/utils/error-context.d.ts +0 -23
- package/dist/utils/error-context.d.ts.map +0 -1
- package/dist/utils/error-context.js +0 -94
- package/dist/utils/error-context.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAKzD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5F"}
|
package/dist/utils/markdown.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import matter from 'gray-matter';
|
|
2
2
|
export function parseMarkdown(raw) {
|
|
3
|
+
// gray-matter returns Record<string, unknown>; we cast to ArtifactFrontmatter
|
|
4
|
+
// which is safe because the index signature accepts extra fields.
|
|
3
5
|
const { data, content } = matter(raw);
|
|
4
|
-
return { data, content };
|
|
6
|
+
return { data: data, content };
|
|
5
7
|
}
|
|
6
8
|
export function toMarkdownWithFrontmatter(data, content) {
|
|
7
9
|
return matter.stringify(content, data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAQjC,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,IAA2B,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAyB,EAAE,OAAe;IAClF,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/utils/slugify.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Convert text to a URL/filename-safe slug.
|
|
3
|
+
*
|
|
4
|
+
* `maxLength` caps the slug (default 80) so filenames stay well under
|
|
5
|
+
* the OS limit (255 chars) even after the ID prefix and `.md` extension.
|
|
6
|
+
* The slug is trimmed at the last whole word boundary to avoid cut-off words.
|
|
7
|
+
*/
|
|
8
|
+
export declare function slugify(text: string, maxLength?: number): string;
|
|
2
9
|
//# sourceMappingURL=slugify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAmB5D"}
|
package/dist/utils/slugify.js
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Convert text to a URL/filename-safe slug.
|
|
3
|
+
*
|
|
4
|
+
* `maxLength` caps the slug (default 80) so filenames stay well under
|
|
5
|
+
* the OS limit (255 chars) even after the ID prefix and `.md` extension.
|
|
6
|
+
* The slug is trimmed at the last whole word boundary to avoid cut-off words.
|
|
7
|
+
*/
|
|
8
|
+
export function slugify(text, maxLength = 80) {
|
|
9
|
+
let slug = text
|
|
3
10
|
.toLowerCase()
|
|
4
11
|
.trim()
|
|
5
12
|
.replace(/[^\w\s-]/g, '')
|
|
6
13
|
.replace(/[\s_]+/g, '-')
|
|
7
14
|
.replace(/-+/g, '-')
|
|
8
15
|
.replace(/^-+|-+$/g, '');
|
|
16
|
+
if (slug.length > maxLength) {
|
|
17
|
+
slug = slug.slice(0, maxLength);
|
|
18
|
+
// Trim at last whole-word boundary to avoid cut-off words
|
|
19
|
+
const lastDash = slug.lastIndexOf('-');
|
|
20
|
+
if (lastDash > 0) {
|
|
21
|
+
slug = slug.slice(0, lastDash);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return slug;
|
|
9
25
|
}
|
|
10
26
|
//# sourceMappingURL=slugify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,SAAS,GAAG,EAAE;IAClD,IAAI,IAAI,GAAG,IAAI;SACZ,WAAW,EAAE;SACb,IAAI,EAAE;SACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE3B,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAChC,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openplanr",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-powered planning CLI — backlog, sprints, task templates, estimation, GitHub sync, and AI agent rules for Cursor, Claude Code, and Codex",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cli/index.js",
|
|
7
7
|
"types": "./dist/cli/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/cli/index.js",
|
|
11
|
+
"types": "./dist/cli/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
8
14
|
"bin": {
|
|
9
15
|
"planr": "./bin/planr.js",
|
|
10
16
|
"opr": "./bin/planr.js"
|
|
@@ -39,6 +45,11 @@
|
|
|
39
45
|
"claude",
|
|
40
46
|
"codex",
|
|
41
47
|
"ai",
|
|
48
|
+
"backlog",
|
|
49
|
+
"sprint",
|
|
50
|
+
"templates",
|
|
51
|
+
"estimation",
|
|
52
|
+
"github",
|
|
42
53
|
"epic",
|
|
43
54
|
"user-story",
|
|
44
55
|
"scrum"
|
|
@@ -54,7 +65,7 @@
|
|
|
54
65
|
"url": "https://github.com/TechArc-io/OpenPlanr/issues"
|
|
55
66
|
},
|
|
56
67
|
"dependencies": {
|
|
57
|
-
"@anthropic-ai/sdk": "^0.
|
|
68
|
+
"@anthropic-ai/sdk": "^0.81.0",
|
|
58
69
|
"@inquirer/prompts": "^8.3.2",
|
|
59
70
|
"@napi-rs/keyring": "^1.2.0",
|
|
60
71
|
"chalk": "^5.3.0",
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Factory for creating coding agent instances.
|
|
3
|
-
*/
|
|
4
|
-
import type { CodingAgentName } from '../models/types.js';
|
|
5
|
-
import type { CodingAgent } from './types.js';
|
|
6
|
-
export declare function createAgent(name: CodingAgentName): Promise<CodingAgent>;
|
|
7
|
-
//# sourceMappingURL=agent-factory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-factory.d.ts","sourceRoot":"","sources":["../../src/agents/agent-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAiB7E"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Factory for creating coding agent instances.
|
|
3
|
-
*/
|
|
4
|
-
export async function createAgent(name) {
|
|
5
|
-
switch (name) {
|
|
6
|
-
case 'claude': {
|
|
7
|
-
const { ClaudeAgent } = await import('./claude-agent.js');
|
|
8
|
-
return new ClaudeAgent();
|
|
9
|
-
}
|
|
10
|
-
case 'cursor': {
|
|
11
|
-
const { CursorAgent } = await import('./cursor-agent.js');
|
|
12
|
-
return new CursorAgent();
|
|
13
|
-
}
|
|
14
|
-
case 'codex': {
|
|
15
|
-
const { CodexAgent } = await import('./codex-agent.js');
|
|
16
|
-
return new CodexAgent();
|
|
17
|
-
}
|
|
18
|
-
default:
|
|
19
|
-
throw new Error(`Unknown coding agent: ${name}. Supported: claude, cursor, codex.`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=agent-factory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-factory.js","sourceRoot":"","sources":["../../src/agents/agent-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC1D,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC1D,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACxD,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,qCAAqC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code CLI agent adapter.
|
|
3
|
-
*
|
|
4
|
-
* Spawns `claude --print` with stream-json output, showing real-time
|
|
5
|
-
* progress via the shared progress spinner. Includes automatic retry
|
|
6
|
-
* for transient API errors.
|
|
7
|
-
*/
|
|
8
|
-
import type { AgentOptions, AgentResult, CodingAgent } from './types.js';
|
|
9
|
-
export declare class ClaudeAgent implements CodingAgent {
|
|
10
|
-
readonly name = "claude";
|
|
11
|
-
isAvailable(): Promise<boolean>;
|
|
12
|
-
execute(prompt: string, options: AgentOptions): Promise<AgentResult>;
|
|
13
|
-
private spawnClaude;
|
|
14
|
-
private buildArgs;
|
|
15
|
-
private attachListeners;
|
|
16
|
-
private printSummary;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=claude-agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-agent.d.ts","sourceRoot":"","sources":["../../src/agents/claude-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAsCzE,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,YAAY;IAEnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAiC1E,OAAO,CAAC,WAAW;IAyCnB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,eAAe;IA2CvB,OAAO,CAAC,YAAY;CA0BrB"}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code CLI agent adapter.
|
|
3
|
-
*
|
|
4
|
-
* Spawns `claude --print` with stream-json output, showing real-time
|
|
5
|
-
* progress via the shared progress spinner. Includes automatic retry
|
|
6
|
-
* for transient API errors.
|
|
7
|
-
*/
|
|
8
|
-
import { spawn } from 'node:child_process';
|
|
9
|
-
import { createReadStream } from 'node:fs';
|
|
10
|
-
import { unlink, writeFile } from 'node:fs/promises';
|
|
11
|
-
import { tmpdir } from 'node:os';
|
|
12
|
-
import path from 'node:path';
|
|
13
|
-
import chalk from 'chalk';
|
|
14
|
-
import { createProgressSpinner, describeActivity } from './progress.js';
|
|
15
|
-
import { isRetryableError, MAX_RETRIES, RETRY_DELAY_MS, sleep, which } from './utils.js';
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
// Constants
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
/**
|
|
20
|
-
* Default tool set — we use all standard tools. Claude Code already
|
|
21
|
-
* enforces CWD sandboxing and default permission checks. The safety
|
|
22
|
-
* prompt below handles project-scoped constraints.
|
|
23
|
-
*/
|
|
24
|
-
const ALLOWED_TOOLS = ['Bash', 'Edit', 'Write', 'Read', 'Glob', 'Grep'];
|
|
25
|
-
const SAFETY_PROMPT = [
|
|
26
|
-
'IMPORTANT SAFETY RULES:',
|
|
27
|
-
'1. NEVER run system-wide destructive commands: docker system prune, docker volume prune, docker image prune -a, or similar commands that affect resources beyond this project.',
|
|
28
|
-
'2. For docker cleanup, ONLY use project-scoped commands: docker compose down, docker compose rm.',
|
|
29
|
-
'3. NEVER run sudo or any privilege escalation.',
|
|
30
|
-
'4. NEVER run rm -rf on directories you did not create in this session.',
|
|
31
|
-
'5. When unsure if a command is destructive, explain what you would run and ask the user to execute it manually.',
|
|
32
|
-
].join('\n');
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Helpers
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
/** Write prompt to a temp file to avoid ARG_MAX / backpressure issues */
|
|
37
|
-
async function writeTempPrompt(prompt) {
|
|
38
|
-
const tmpFile = path.join(tmpdir(), `planr-prompt-${Date.now()}.txt`);
|
|
39
|
-
await writeFile(tmpFile, prompt, 'utf-8');
|
|
40
|
-
return tmpFile;
|
|
41
|
-
}
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
// Agent
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
export class ClaudeAgent {
|
|
46
|
-
name = 'claude';
|
|
47
|
-
async isAvailable() {
|
|
48
|
-
return (await which('claude')) !== null;
|
|
49
|
-
}
|
|
50
|
-
async execute(prompt, options) {
|
|
51
|
-
const tmpFile = await writeTempPrompt(prompt);
|
|
52
|
-
try {
|
|
53
|
-
let lastExitCode = 1;
|
|
54
|
-
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
55
|
-
if (attempt > 0) {
|
|
56
|
-
const delaySec = (RETRY_DELAY_MS * attempt) / 1000;
|
|
57
|
-
process.stderr.write(`\n⟳ Retrying (attempt ${attempt + 1}/${MAX_RETRIES + 1}) in ${delaySec}s...\n`);
|
|
58
|
-
await sleep(RETRY_DELAY_MS * attempt);
|
|
59
|
-
}
|
|
60
|
-
const result = await this.spawnClaude(tmpFile, options);
|
|
61
|
-
lastExitCode = result.exitCode;
|
|
62
|
-
if (result.exitCode === 0)
|
|
63
|
-
return result;
|
|
64
|
-
if (result.stderr && isRetryableError(result.stderr))
|
|
65
|
-
continue;
|
|
66
|
-
return result;
|
|
67
|
-
}
|
|
68
|
-
return { output: '', exitCode: lastExitCode };
|
|
69
|
-
}
|
|
70
|
-
finally {
|
|
71
|
-
await unlink(tmpFile).catch(() => { });
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// -------------------------------------------------------------------------
|
|
75
|
-
// Private
|
|
76
|
-
// -------------------------------------------------------------------------
|
|
77
|
-
spawnClaude(tmpFile, options) {
|
|
78
|
-
return new Promise((resolve, reject) => {
|
|
79
|
-
const args = this.buildArgs(options);
|
|
80
|
-
const child = spawn('claude', args, {
|
|
81
|
-
cwd: options.cwd,
|
|
82
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
83
|
-
env: { ...process.env },
|
|
84
|
-
});
|
|
85
|
-
const fileStream = createReadStream(tmpFile, 'utf-8');
|
|
86
|
-
fileStream.pipe(child.stdin);
|
|
87
|
-
const { spinner, stderrChunks, resultRef, statsRef } = this.attachListeners(child);
|
|
88
|
-
child.on('error', (err) => {
|
|
89
|
-
spinner.stop();
|
|
90
|
-
reject(new Error(`Failed to launch claude CLI: ${err.message}`));
|
|
91
|
-
});
|
|
92
|
-
child.on('close', (code) => {
|
|
93
|
-
spinner.stop();
|
|
94
|
-
this.printSummary(resultRef.text, statsRef, stderrChunks, code);
|
|
95
|
-
// Combine stderr and stdout for retry detection — Claude sometimes
|
|
96
|
-
// emits API errors (e.g. "tool use concurrency") via stdout stream
|
|
97
|
-
const stderr = stderrChunks.join('');
|
|
98
|
-
const combinedOutput = `${stderr}\n${resultRef.text}`;
|
|
99
|
-
resolve({
|
|
100
|
-
output: resultRef.text,
|
|
101
|
-
exitCode: code ?? 1,
|
|
102
|
-
stderr: combinedOutput,
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
buildArgs(options) {
|
|
108
|
-
const args = [
|
|
109
|
-
'--print',
|
|
110
|
-
'--verbose',
|
|
111
|
-
'--output-format',
|
|
112
|
-
'stream-json',
|
|
113
|
-
'--allowedTools',
|
|
114
|
-
...ALLOWED_TOOLS,
|
|
115
|
-
'--append-system-prompt',
|
|
116
|
-
SAFETY_PROMPT,
|
|
117
|
-
];
|
|
118
|
-
if (options.continueSession) {
|
|
119
|
-
args.push('--continue');
|
|
120
|
-
}
|
|
121
|
-
return args;
|
|
122
|
-
}
|
|
123
|
-
attachListeners(child) {
|
|
124
|
-
const spinner = createProgressSpinner();
|
|
125
|
-
const stderrChunks = [];
|
|
126
|
-
const resultRef = { text: '' };
|
|
127
|
-
const statsRef = { filesCreated: 0, filesEdited: 0 };
|
|
128
|
-
let jsonBuffer = '';
|
|
129
|
-
child.stdout?.on('data', (data) => {
|
|
130
|
-
jsonBuffer += data.toString();
|
|
131
|
-
const lines = jsonBuffer.split('\n');
|
|
132
|
-
jsonBuffer = lines.pop() || '';
|
|
133
|
-
for (const line of lines) {
|
|
134
|
-
const trimmed = line.trim();
|
|
135
|
-
if (!trimmed)
|
|
136
|
-
continue;
|
|
137
|
-
try {
|
|
138
|
-
const event = JSON.parse(trimmed);
|
|
139
|
-
const activity = describeActivity(event);
|
|
140
|
-
if (activity) {
|
|
141
|
-
spinner.setActivity(activity);
|
|
142
|
-
if (activity.startsWith('Creating '))
|
|
143
|
-
statsRef.filesCreated++;
|
|
144
|
-
if (activity.startsWith('Editing '))
|
|
145
|
-
statsRef.filesEdited++;
|
|
146
|
-
process.stderr.write(`\r\x1b[K${chalk.green('✓')} ${chalk.dim(activity)}\n`);
|
|
147
|
-
}
|
|
148
|
-
if (event.type === 'result') {
|
|
149
|
-
resultRef.text = event.result || '';
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// Incomplete JSON line — skip
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
child.stderr?.on('data', (data) => {
|
|
158
|
-
stderrChunks.push(data.toString());
|
|
159
|
-
});
|
|
160
|
-
return { spinner, stderrChunks, resultRef, statsRef };
|
|
161
|
-
}
|
|
162
|
-
printSummary(resultText, stats, stderrChunks, exitCode) {
|
|
163
|
-
if (resultText) {
|
|
164
|
-
console.log(resultText);
|
|
165
|
-
}
|
|
166
|
-
const parts = [];
|
|
167
|
-
if (stats.filesCreated > 0) {
|
|
168
|
-
parts.push(`${stats.filesCreated} file${stats.filesCreated > 1 ? 's' : ''} created`);
|
|
169
|
-
}
|
|
170
|
-
if (stats.filesEdited > 0) {
|
|
171
|
-
parts.push(`${stats.filesEdited} file${stats.filesEdited > 1 ? 's' : ''} edited`);
|
|
172
|
-
}
|
|
173
|
-
if (parts.length > 0) {
|
|
174
|
-
console.log(chalk.dim(`\n📊 ${parts.join(', ')}`));
|
|
175
|
-
}
|
|
176
|
-
if (exitCode !== 0) {
|
|
177
|
-
const stderr = stderrChunks.join('');
|
|
178
|
-
if (stderr)
|
|
179
|
-
process.stderr.write(stderr);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
//# sourceMappingURL=claude-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-agent.js","sourceRoot":"","sources":["../../src/agents/claude-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI Codex CLI agent adapter.
|
|
3
|
-
*
|
|
4
|
-
* Invokes `codex exec --full-auto --json` for non-interactive mode with
|
|
5
|
-
* write access. Parses JSONL events for real-time progress display.
|
|
6
|
-
* Includes retry logic for transient errors.
|
|
7
|
-
*/
|
|
8
|
-
import type { AgentOptions, AgentResult, CodingAgent } from './types.js';
|
|
9
|
-
export declare class CodexAgent implements CodingAgent {
|
|
10
|
-
readonly name = "codex";
|
|
11
|
-
isAvailable(): Promise<boolean>;
|
|
12
|
-
execute(prompt: string, options: AgentOptions): Promise<AgentResult>;
|
|
13
|
-
private spawnCodex;
|
|
14
|
-
private buildArgs;
|
|
15
|
-
private attachListeners;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=codex-agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-agent.d.ts","sourceRoot":"","sources":["../../src/agents/codex-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzE,qBAAa,UAAW,YAAW,WAAW;IAC5C,QAAQ,CAAC,IAAI,WAAW;IAElB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IA8B1E,OAAO,CAAC,UAAU;IA6ClB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,eAAe;CA4CxB"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI Codex CLI agent adapter.
|
|
3
|
-
*
|
|
4
|
-
* Invokes `codex exec --full-auto --json` for non-interactive mode with
|
|
5
|
-
* write access. Parses JSONL events for real-time progress display.
|
|
6
|
-
* Includes retry logic for transient errors.
|
|
7
|
-
*/
|
|
8
|
-
import { spawn } from 'node:child_process';
|
|
9
|
-
import { createReadStream } from 'node:fs';
|
|
10
|
-
import { unlink, writeFile } from 'node:fs/promises';
|
|
11
|
-
import { tmpdir } from 'node:os';
|
|
12
|
-
import path from 'node:path';
|
|
13
|
-
import chalk from 'chalk';
|
|
14
|
-
import { createProgressSpinner, describeCodexActivity } from './progress.js';
|
|
15
|
-
import { isRetryableError, MAX_RETRIES, RETRY_DELAY_MS, sleep, which } from './utils.js';
|
|
16
|
-
export class CodexAgent {
|
|
17
|
-
name = 'codex';
|
|
18
|
-
async isAvailable() {
|
|
19
|
-
return (await which('codex')) !== null;
|
|
20
|
-
}
|
|
21
|
-
async execute(prompt, options) {
|
|
22
|
-
const tmpFile = path.join(tmpdir(), `planr-prompt-${Date.now()}.txt`);
|
|
23
|
-
await writeFile(tmpFile, prompt, 'utf-8');
|
|
24
|
-
try {
|
|
25
|
-
let lastExitCode = 1;
|
|
26
|
-
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
27
|
-
if (attempt > 0) {
|
|
28
|
-
const delaySec = (RETRY_DELAY_MS * attempt) / 1000;
|
|
29
|
-
process.stderr.write(`\n⟳ Retrying (attempt ${attempt + 1}/${MAX_RETRIES + 1}) in ${delaySec}s...\n`);
|
|
30
|
-
await sleep(RETRY_DELAY_MS * attempt);
|
|
31
|
-
}
|
|
32
|
-
const result = await this.spawnCodex(tmpFile, options);
|
|
33
|
-
lastExitCode = result.exitCode;
|
|
34
|
-
if (result.exitCode === 0)
|
|
35
|
-
return result;
|
|
36
|
-
if (result.stderr && isRetryableError(result.stderr))
|
|
37
|
-
continue;
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
return { output: '', exitCode: lastExitCode };
|
|
41
|
-
}
|
|
42
|
-
finally {
|
|
43
|
-
await unlink(tmpFile).catch(() => { });
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
spawnCodex(tmpFile, options) {
|
|
47
|
-
return new Promise((resolve, reject) => {
|
|
48
|
-
const args = this.buildArgs(options);
|
|
49
|
-
const child = spawn('codex', args, {
|
|
50
|
-
cwd: options.cwd,
|
|
51
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
52
|
-
env: { ...process.env },
|
|
53
|
-
});
|
|
54
|
-
// Stream the temp file into stdin
|
|
55
|
-
const fileStream = createReadStream(tmpFile, 'utf-8');
|
|
56
|
-
fileStream.pipe(child.stdin);
|
|
57
|
-
const { spinner, stderrChunks, resultRef } = this.attachListeners(child);
|
|
58
|
-
child.on('error', (err) => {
|
|
59
|
-
spinner.stop();
|
|
60
|
-
reject(new Error(`Failed to launch codex CLI: ${err.message}`));
|
|
61
|
-
});
|
|
62
|
-
child.on('close', (code) => {
|
|
63
|
-
spinner.stop();
|
|
64
|
-
if (resultRef.text) {
|
|
65
|
-
console.log(resultRef.text);
|
|
66
|
-
}
|
|
67
|
-
if (code !== 0) {
|
|
68
|
-
const stderr = stderrChunks.join('');
|
|
69
|
-
if (stderr)
|
|
70
|
-
process.stderr.write(stderr);
|
|
71
|
-
}
|
|
72
|
-
resolve({
|
|
73
|
-
output: resultRef.text,
|
|
74
|
-
exitCode: code ?? 1,
|
|
75
|
-
stderr: stderrChunks.join(''),
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
buildArgs(options) {
|
|
81
|
-
if (options.continueSession) {
|
|
82
|
-
return ['exec', 'resume', '--last'];
|
|
83
|
-
}
|
|
84
|
-
return ['exec', '--full-auto', '--json'];
|
|
85
|
-
}
|
|
86
|
-
attachListeners(child) {
|
|
87
|
-
const spinner = createProgressSpinner();
|
|
88
|
-
const stderrChunks = [];
|
|
89
|
-
const resultRef = { text: '' };
|
|
90
|
-
let jsonBuffer = '';
|
|
91
|
-
child.stdout?.on('data', (data) => {
|
|
92
|
-
jsonBuffer += data.toString();
|
|
93
|
-
const lines = jsonBuffer.split('\n');
|
|
94
|
-
jsonBuffer = lines.pop() || '';
|
|
95
|
-
for (const line of lines) {
|
|
96
|
-
const trimmed = line.trim();
|
|
97
|
-
if (!trimmed)
|
|
98
|
-
continue;
|
|
99
|
-
try {
|
|
100
|
-
const event = JSON.parse(trimmed);
|
|
101
|
-
const activity = describeCodexActivity(event);
|
|
102
|
-
if (activity) {
|
|
103
|
-
spinner.setActivity(activity);
|
|
104
|
-
process.stderr.write(`\r\x1b[K${chalk.green('✓')} ${chalk.dim(activity)}\n`);
|
|
105
|
-
}
|
|
106
|
-
// Capture the last agent message as the result text
|
|
107
|
-
if (event.type === 'item.completed' &&
|
|
108
|
-
event.item?.type === 'agent_message' &&
|
|
109
|
-
event.item.text) {
|
|
110
|
-
resultRef.text = event.item.text;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
// Incomplete JSON line — skip
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
child.stderr?.on('data', (data) => {
|
|
119
|
-
stderrChunks.push(data.toString());
|
|
120
|
-
});
|
|
121
|
-
return { spinner, stderrChunks, resultRef };
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=codex-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-agent.js","sourceRoot":"","sources":["../../src/agents/codex-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor agent adapter.
|
|
3
|
-
*
|
|
4
|
-
* Since Cursor is GUI-based, this agent writes the implementation
|
|
5
|
-
* prompt to a file that Cursor can read from its Composer panel.
|
|
6
|
-
* For follow-up/fix prompts, it appends to the same file.
|
|
7
|
-
*/
|
|
8
|
-
import type { AgentOptions, AgentResult, CodingAgent } from './types.js';
|
|
9
|
-
export declare class CursorAgent implements CodingAgent {
|
|
10
|
-
readonly name = "cursor";
|
|
11
|
-
isAvailable(): Promise<boolean>;
|
|
12
|
-
execute(prompt: string, options: AgentOptions): Promise<AgentResult>;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=cursor-agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-agent.d.ts","sourceRoot":"","sources":["../../src/agents/cursor-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,YAAY;IAEnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAO/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAqC3E"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor agent adapter.
|
|
3
|
-
*
|
|
4
|
-
* Since Cursor is GUI-based, this agent writes the implementation
|
|
5
|
-
* prompt to a file that Cursor can read from its Composer panel.
|
|
6
|
-
* For follow-up/fix prompts, it appends to the same file.
|
|
7
|
-
*/
|
|
8
|
-
import { access } from 'node:fs/promises';
|
|
9
|
-
import path from 'node:path';
|
|
10
|
-
import { ensureDir, writeFile } from '../utils/fs.js';
|
|
11
|
-
import { logger } from '../utils/logger.js';
|
|
12
|
-
export class CursorAgent {
|
|
13
|
-
name = 'cursor';
|
|
14
|
-
async isAvailable() {
|
|
15
|
-
// Cursor is available if the project has a .cursor directory
|
|
16
|
-
return access(path.join(process.cwd(), '.cursor'))
|
|
17
|
-
.then(() => true)
|
|
18
|
-
.catch(() => false);
|
|
19
|
-
}
|
|
20
|
-
async execute(prompt, options) {
|
|
21
|
-
const promptDir = path.join(options.cwd, '.cursor', 'prompts');
|
|
22
|
-
await ensureDir(promptDir);
|
|
23
|
-
// Extract task ID from prompt for a meaningful filename
|
|
24
|
-
const taskMatch = prompt.match(/TASK-\d{3}/);
|
|
25
|
-
const filename = taskMatch ? `${taskMatch[0]}.md` : `implement-${Date.now()}.md`;
|
|
26
|
-
const filePath = path.join(promptDir, filename);
|
|
27
|
-
const header = options.continueSession ? '<!-- Follow-up / Fix prompt -->\n\n' : '';
|
|
28
|
-
await writeFile(filePath, header + prompt);
|
|
29
|
-
const action = options.continueSession ? 'Fix' : 'Implementation';
|
|
30
|
-
const output = [
|
|
31
|
-
`${action} prompt saved to: ${filePath}`,
|
|
32
|
-
'',
|
|
33
|
-
'To use in Cursor:',
|
|
34
|
-
' 1. Open Cursor in this project',
|
|
35
|
-
' 2. Open Composer (Cmd+I / Ctrl+I)',
|
|
36
|
-
` 3. Reference the file: @${path.relative(options.cwd, filePath)}`,
|
|
37
|
-
' 4. Or copy-paste the prompt directly into Composer',
|
|
38
|
-
].join('\n');
|
|
39
|
-
if (options.stream) {
|
|
40
|
-
console.log(output);
|
|
41
|
-
}
|
|
42
|
-
if (options.continueSession) {
|
|
43
|
-
logger.dim('Note: Cursor does not support session continuation.');
|
|
44
|
-
logger.dim('The fix prompt has been saved as a new file — paste it into your existing Composer thread.');
|
|
45
|
-
}
|
|
46
|
-
return { output, exitCode: 0 };
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=cursor-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-agent.js","sourceRoot":"","sources":["../../src/agents/cursor-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,WAAW;QACf,6DAA6D;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;aAC/C,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;aAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAqB;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/D,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QAE3B,wDAAwD;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpF,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAClE,MAAM,MAAM,GAAG;YACb,GAAG,MAAM,qBAAqB,QAAQ,EAAE;YACxC,EAAE;YACF,mBAAmB;YACnB,kCAAkC;YAClC,qCAAqC;YACrC,6BAA6B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE;YACnE,sDAAsD;SACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YAClE,MAAM,CAAC,GAAG,CACR,4FAA4F,CAC7F,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task implementation bridge.
|
|
3
|
-
*
|
|
4
|
-
* Orchestrates the full flow:
|
|
5
|
-
* 1. Read and parse the task artifact
|
|
6
|
-
* 2. Resolve target subtask(s)
|
|
7
|
-
* 3. Gather parent chain context (story → feature → epic)
|
|
8
|
-
* 4. Build codebase context
|
|
9
|
-
* 5. Compose the implementation prompt
|
|
10
|
-
* 6. Dispatch to the configured coding agent
|
|
11
|
-
*/
|
|
12
|
-
import type { OpenPlanrConfig } from '../models/types.js';
|
|
13
|
-
export interface ImplementOptions {
|
|
14
|
-
subtask?: string;
|
|
15
|
-
next?: boolean;
|
|
16
|
-
agent?: string;
|
|
17
|
-
dryRun?: boolean;
|
|
18
|
-
markDone?: boolean;
|
|
19
|
-
}
|
|
20
|
-
export declare function executeImplementation(projectDir: string, config: OpenPlanrConfig, taskId: string, opts: ImplementOptions): Promise<void>;
|
|
21
|
-
export interface FollowUpOptions {
|
|
22
|
-
agent?: string;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Send a follow-up message to the coding agent, continuing the
|
|
26
|
-
* previous session. This is the feedback loop for fixing issues
|
|
27
|
-
* found after implementation.
|
|
28
|
-
*/
|
|
29
|
-
export declare function executeFollowUp(projectDir: string, config: OpenPlanrConfig, message: string, opts: FollowUpOptions): Promise<void>;
|
|
30
|
-
//# sourceMappingURL=implementation-bridge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"implementation-bridge.d.ts","sourceRoot":"","sources":["../../src/agents/implementation-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAiB3E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CA2Kf;AAoCD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|