openplanr 0.1.0 → 0.3.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 (209) hide show
  1. package/README.md +23 -5
  2. package/dist/agents/agent-factory.d.ts +7 -0
  3. package/dist/agents/agent-factory.d.ts.map +1 -0
  4. package/dist/agents/agent-factory.js +22 -0
  5. package/dist/agents/agent-factory.js.map +1 -0
  6. package/dist/agents/claude-agent.d.ts +13 -0
  7. package/dist/agents/claude-agent.d.ts.map +1 -0
  8. package/dist/agents/claude-agent.js +48 -0
  9. package/dist/agents/claude-agent.js.map +1 -0
  10. package/dist/agents/codex-agent.d.ts +13 -0
  11. package/dist/agents/codex-agent.d.ts.map +1 -0
  12. package/dist/agents/codex-agent.js +47 -0
  13. package/dist/agents/codex-agent.js.map +1 -0
  14. package/dist/agents/cursor-agent.d.ts +13 -0
  15. package/dist/agents/cursor-agent.d.ts.map +1 -0
  16. package/dist/agents/cursor-agent.js +40 -0
  17. package/dist/agents/cursor-agent.js.map +1 -0
  18. package/dist/agents/implementation-bridge.d.ts +21 -0
  19. package/dist/agents/implementation-bridge.d.ts.map +1 -0
  20. package/dist/agents/implementation-bridge.js +173 -0
  21. package/dist/agents/implementation-bridge.js.map +1 -0
  22. package/dist/agents/index.d.ts +6 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +5 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/prompt-composer.d.ts +30 -0
  27. package/dist/agents/prompt-composer.d.ts.map +1 -0
  28. package/dist/agents/prompt-composer.js +81 -0
  29. package/dist/agents/prompt-composer.js.map +1 -0
  30. package/dist/agents/task-parser.d.ts +38 -0
  31. package/dist/agents/task-parser.d.ts.map +1 -0
  32. package/dist/agents/task-parser.js +83 -0
  33. package/dist/agents/task-parser.js.map +1 -0
  34. package/dist/agents/types.d.ts +23 -0
  35. package/dist/agents/types.d.ts.map +1 -0
  36. package/dist/agents/types.js +8 -0
  37. package/dist/agents/types.js.map +1 -0
  38. package/dist/agents/utils.d.ts +9 -0
  39. package/dist/agents/utils.d.ts.map +1 -0
  40. package/dist/agents/utils.js +21 -0
  41. package/dist/agents/utils.js.map +1 -0
  42. package/dist/ai/codebase/context-builder.d.ts +31 -0
  43. package/dist/ai/codebase/context-builder.d.ts.map +1 -0
  44. package/dist/ai/codebase/context-builder.js +93 -0
  45. package/dist/ai/codebase/context-builder.js.map +1 -0
  46. package/dist/ai/codebase/file-reader.d.ts +22 -0
  47. package/dist/ai/codebase/file-reader.d.ts.map +1 -0
  48. package/dist/ai/codebase/file-reader.js +111 -0
  49. package/dist/ai/codebase/file-reader.js.map +1 -0
  50. package/dist/ai/codebase/index.d.ts +5 -0
  51. package/dist/ai/codebase/index.d.ts.map +1 -0
  52. package/dist/ai/codebase/index.js +5 -0
  53. package/dist/ai/codebase/index.js.map +1 -0
  54. package/dist/ai/codebase/stack-detector.d.ts +18 -0
  55. package/dist/ai/codebase/stack-detector.d.ts.map +1 -0
  56. package/dist/ai/codebase/stack-detector.js +147 -0
  57. package/dist/ai/codebase/stack-detector.js.map +1 -0
  58. package/dist/ai/codebase/tree-generator.d.ts +8 -0
  59. package/dist/ai/codebase/tree-generator.d.ts.map +1 -0
  60. package/dist/ai/codebase/tree-generator.js +85 -0
  61. package/dist/ai/codebase/tree-generator.js.map +1 -0
  62. package/dist/ai/errors.d.ts +22 -0
  63. package/dist/ai/errors.d.ts.map +1 -0
  64. package/dist/ai/errors.js +70 -0
  65. package/dist/ai/errors.js.map +1 -0
  66. package/dist/ai/index.d.ts +11 -0
  67. package/dist/ai/index.d.ts.map +1 -0
  68. package/dist/ai/index.js +10 -0
  69. package/dist/ai/index.js.map +1 -0
  70. package/dist/ai/prompts/prompt-builder.d.ts +42 -0
  71. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -0
  72. package/dist/ai/prompts/prompt-builder.js +96 -0
  73. package/dist/ai/prompts/prompt-builder.js.map +1 -0
  74. package/dist/ai/prompts/system-prompts.d.ts +13 -0
  75. package/dist/ai/prompts/system-prompts.d.ts.map +1 -0
  76. package/dist/ai/prompts/system-prompts.js +124 -0
  77. package/dist/ai/prompts/system-prompts.js.map +1 -0
  78. package/dist/ai/provider-factory.d.ts +10 -0
  79. package/dist/ai/provider-factory.d.ts.map +1 -0
  80. package/dist/ai/provider-factory.js +33 -0
  81. package/dist/ai/provider-factory.js.map +1 -0
  82. package/dist/ai/providers/anthropic-provider.d.ts +22 -0
  83. package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
  84. package/dist/ai/providers/anthropic-provider.js +82 -0
  85. package/dist/ai/providers/anthropic-provider.js.map +1 -0
  86. package/dist/ai/providers/ollama-provider.d.ts +13 -0
  87. package/dist/ai/providers/ollama-provider.d.ts.map +1 -0
  88. package/dist/ai/providers/ollama-provider.js +16 -0
  89. package/dist/ai/providers/ollama-provider.js.map +1 -0
  90. package/dist/ai/providers/openai-provider.d.ts +17 -0
  91. package/dist/ai/providers/openai-provider.d.ts.map +1 -0
  92. package/dist/ai/providers/openai-provider.js +58 -0
  93. package/dist/ai/providers/openai-provider.js.map +1 -0
  94. package/dist/ai/schemas/ai-response-schemas.d.ts +425 -0
  95. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -0
  96. package/dist/ai/schemas/ai-response-schemas.js +87 -0
  97. package/dist/ai/schemas/ai-response-schemas.js.map +1 -0
  98. package/dist/ai/types.d.ts +40 -0
  99. package/dist/ai/types.d.ts.map +1 -0
  100. package/dist/ai/types.js +16 -0
  101. package/dist/ai/types.js.map +1 -0
  102. package/dist/cli/commands/checklist.d.ts.map +1 -1
  103. package/dist/cli/commands/checklist.js +60 -1
  104. package/dist/cli/commands/checklist.js.map +1 -1
  105. package/dist/cli/commands/config.d.ts +8 -0
  106. package/dist/cli/commands/config.d.ts.map +1 -0
  107. package/dist/cli/commands/config.js +112 -0
  108. package/dist/cli/commands/config.js.map +1 -0
  109. package/dist/cli/commands/epic.d.ts +7 -0
  110. package/dist/cli/commands/epic.d.ts.map +1 -1
  111. package/dist/cli/commands/epic.js +161 -31
  112. package/dist/cli/commands/epic.js.map +1 -1
  113. package/dist/cli/commands/feature.d.ts +6 -0
  114. package/dist/cli/commands/feature.d.ts.map +1 -1
  115. package/dist/cli/commands/feature.js +143 -30
  116. package/dist/cli/commands/feature.js.map +1 -1
  117. package/dist/cli/commands/init.d.ts +6 -0
  118. package/dist/cli/commands/init.d.ts.map +1 -1
  119. package/dist/cli/commands/init.js +48 -6
  120. package/dist/cli/commands/init.js.map +1 -1
  121. package/dist/cli/commands/plan.d.ts +15 -0
  122. package/dist/cli/commands/plan.d.ts.map +1 -0
  123. package/dist/cli/commands/plan.js +259 -0
  124. package/dist/cli/commands/plan.js.map +1 -0
  125. package/dist/cli/commands/refine.d.ts +9 -0
  126. package/dist/cli/commands/refine.d.ts.map +1 -0
  127. package/dist/cli/commands/refine.js +101 -0
  128. package/dist/cli/commands/refine.js.map +1 -0
  129. package/dist/cli/commands/status.d.ts.map +1 -1
  130. package/dist/cli/commands/status.js +150 -18
  131. package/dist/cli/commands/status.js.map +1 -1
  132. package/dist/cli/commands/story.d.ts +6 -0
  133. package/dist/cli/commands/story.d.ts.map +1 -1
  134. package/dist/cli/commands/story.js +259 -45
  135. package/dist/cli/commands/story.js.map +1 -1
  136. package/dist/cli/commands/sync.d.ts +12 -0
  137. package/dist/cli/commands/sync.d.ts.map +1 -0
  138. package/dist/cli/commands/sync.js +227 -0
  139. package/dist/cli/commands/sync.js.map +1 -0
  140. package/dist/cli/commands/task.d.ts +9 -0
  141. package/dist/cli/commands/task.d.ts.map +1 -1
  142. package/dist/cli/commands/task.js +350 -35
  143. package/dist/cli/commands/task.js.map +1 -1
  144. package/dist/cli/index.js +16 -2
  145. package/dist/cli/index.js.map +1 -1
  146. package/dist/models/schema.d.ts +41 -0
  147. package/dist/models/schema.d.ts.map +1 -1
  148. package/dist/models/schema.js +9 -0
  149. package/dist/models/schema.js.map +1 -1
  150. package/dist/models/types.d.ts +9 -0
  151. package/dist/models/types.d.ts.map +1 -1
  152. package/dist/services/ai-service.d.ts +40 -0
  153. package/dist/services/ai-service.d.ts.map +1 -0
  154. package/dist/services/ai-service.js +150 -0
  155. package/dist/services/ai-service.js.map +1 -0
  156. package/dist/services/artifact-gathering.d.ts +49 -0
  157. package/dist/services/artifact-gathering.d.ts.map +1 -0
  158. package/dist/services/artifact-gathering.js +128 -0
  159. package/dist/services/artifact-gathering.js.map +1 -0
  160. package/dist/services/artifact-service.d.ts +47 -0
  161. package/dist/services/artifact-service.d.ts.map +1 -1
  162. package/dist/services/artifact-service.js +169 -0
  163. package/dist/services/artifact-service.js.map +1 -1
  164. package/dist/services/checklist-service.d.ts +23 -0
  165. package/dist/services/checklist-service.d.ts.map +1 -1
  166. package/dist/services/checklist-service.js +44 -0
  167. package/dist/services/checklist-service.js.map +1 -1
  168. package/dist/services/credentials-service.d.ts +22 -0
  169. package/dist/services/credentials-service.d.ts.map +1 -0
  170. package/dist/services/credentials-service.js +58 -0
  171. package/dist/services/credentials-service.js.map +1 -0
  172. package/dist/services/id-service.d.ts.map +1 -1
  173. package/dist/services/id-service.js +8 -5
  174. package/dist/services/id-service.js.map +1 -1
  175. package/dist/services/prompt-service.d.ts +6 -0
  176. package/dist/services/prompt-service.d.ts.map +1 -1
  177. package/dist/services/prompt-service.js +7 -1
  178. package/dist/services/prompt-service.js.map +1 -1
  179. package/dist/services/template-service.d.ts.map +1 -1
  180. package/dist/services/template-service.js +6 -0
  181. package/dist/services/template-service.js.map +1 -1
  182. package/dist/templates/checklists/agile-checklist.md.hbs +8 -8
  183. package/dist/templates/epics/epic.md.hbs +8 -2
  184. package/dist/templates/features/feature.md.hbs +3 -3
  185. package/dist/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +1 -1
  186. package/dist/templates/rules/cursor/2002-agile-create-features.mdc.hbs +1 -1
  187. package/dist/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +1 -1
  188. package/dist/templates/stories/user-story.md.hbs +2 -2
  189. package/dist/templates/tasks/task-list.md.hbs +26 -3
  190. package/dist/utils/logger.d.ts +3 -0
  191. package/dist/utils/logger.d.ts.map +1 -1
  192. package/dist/utils/logger.js +12 -0
  193. package/dist/utils/logger.js.map +1 -1
  194. package/package.json +12 -5
  195. package/dist/templates/templates/adrs/adr-general.md.hbs +0 -46
  196. package/dist/templates/templates/checklists/agile-checklist.md.hbs +0 -49
  197. package/dist/templates/templates/epics/epic.md.hbs +0 -46
  198. package/dist/templates/templates/features/feature.md.hbs +0 -42
  199. package/dist/templates/templates/rules/claude/CLAUDE.md.hbs +0 -63
  200. package/dist/templates/templates/rules/codex/AGENTS.md.hbs +0 -28
  201. package/dist/templates/templates/rules/cursor/2000-agile-checklist.mdc.hbs +0 -33
  202. package/dist/templates/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +0 -35
  203. package/dist/templates/templates/rules/cursor/2002-agile-create-features.mdc.hbs +0 -35
  204. package/dist/templates/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +0 -31
  205. package/dist/templates/templates/rules/cursor/2100-create-task-list.mdc.hbs +0 -36
  206. package/dist/templates/templates/rules/cursor/2101-implement-task-list.mdc.hbs +0 -28
  207. package/dist/templates/templates/stories/gherkin.feature.hbs +0 -13
  208. package/dist/templates/templates/stories/user-story.md.hbs +0 -28
  209. package/dist/templates/templates/tasks/task-list.md.hbs +0 -24
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Detects the tech stack of a project by reading manifest files.
3
+ *
4
+ * Looks for package.json (Node.js), go.mod (Go), requirements.txt / pyproject.toml
5
+ * (Python), Cargo.toml (Rust), and more. Returns a structured TechStack object
6
+ * used to enrich AI prompts with codebase awareness.
7
+ */
8
+ import path from 'node:path';
9
+ import { fileExists, readFile } from '../../utils/fs.js';
10
+ const DETECTORS = [
11
+ {
12
+ file: 'package.json',
13
+ detect: async (content) => {
14
+ const pkg = JSON.parse(content);
15
+ const deps = Object.keys(pkg.dependencies || {});
16
+ const devDeps = Object.keys(pkg.devDependencies || {});
17
+ const allDeps = [...deps, ...devDeps];
18
+ let framework;
19
+ if (allDeps.includes('next'))
20
+ framework = 'Next.js';
21
+ else if (allDeps.includes('nuxt'))
22
+ framework = 'Nuxt';
23
+ else if (allDeps.includes('react'))
24
+ framework = 'React';
25
+ else if (allDeps.includes('vue'))
26
+ framework = 'Vue';
27
+ else if (allDeps.includes('svelte'))
28
+ framework = 'Svelte';
29
+ else if (allDeps.includes('@angular/core'))
30
+ framework = 'Angular';
31
+ else if (allDeps.includes('express'))
32
+ framework = 'Express';
33
+ else if (allDeps.includes('fastify'))
34
+ framework = 'Fastify';
35
+ else if (allDeps.includes('hono'))
36
+ framework = 'Hono';
37
+ else if (allDeps.includes('nestjs'))
38
+ framework = 'NestJS';
39
+ const hasTS = allDeps.includes('typescript');
40
+ const language = hasTS ? 'TypeScript' : 'JavaScript';
41
+ let packageManager = 'npm';
42
+ if (pkg.packageManager?.startsWith('pnpm'))
43
+ packageManager = 'pnpm';
44
+ else if (pkg.packageManager?.startsWith('yarn'))
45
+ packageManager = 'yarn';
46
+ else if (pkg.packageManager?.startsWith('bun'))
47
+ packageManager = 'bun';
48
+ return {
49
+ language,
50
+ framework,
51
+ packageManager,
52
+ dependencies: deps.slice(0, 20),
53
+ devDependencies: devDeps.slice(0, 10),
54
+ };
55
+ },
56
+ },
57
+ {
58
+ file: 'go.mod',
59
+ detect: async (content) => {
60
+ const moduleMatch = content.match(/^module\s+(.+)$/m);
61
+ const deps = [...content.matchAll(/^\t(\S+)\s/gm)].map((m) => m[1]).slice(0, 20);
62
+ return {
63
+ language: 'Go',
64
+ framework: deps.find((d) => d.includes('gin')) ? 'Gin' :
65
+ deps.find((d) => d.includes('fiber')) ? 'Fiber' :
66
+ deps.find((d) => d.includes('echo')) ? 'Echo' : undefined,
67
+ packageManager: 'go modules',
68
+ dependencies: deps,
69
+ devDependencies: [],
70
+ };
71
+ },
72
+ },
73
+ {
74
+ file: 'requirements.txt',
75
+ detect: async (content) => {
76
+ const deps = content.split('\n').filter((l) => l.trim() && !l.startsWith('#')).map((l) => l.split('==')[0].split('>=')[0].trim()).slice(0, 20);
77
+ return {
78
+ language: 'Python',
79
+ framework: deps.find((d) => d === 'django') ? 'Django' :
80
+ deps.find((d) => d === 'flask') ? 'Flask' :
81
+ deps.find((d) => d === 'fastapi') ? 'FastAPI' : undefined,
82
+ packageManager: 'pip',
83
+ dependencies: deps,
84
+ devDependencies: [],
85
+ };
86
+ },
87
+ },
88
+ {
89
+ file: 'pyproject.toml',
90
+ detect: async (content) => {
91
+ const deps = [...content.matchAll(/"([a-zA-Z][\w-]*)(?:[><=!]|")/g)].map((m) => m[1]).slice(0, 20);
92
+ return {
93
+ language: 'Python',
94
+ framework: deps.find((d) => d === 'django') ? 'Django' :
95
+ deps.find((d) => d === 'flask') ? 'Flask' :
96
+ deps.find((d) => d === 'fastapi') ? 'FastAPI' : undefined,
97
+ packageManager: content.includes('[tool.poetry]') ? 'poetry' : 'pip',
98
+ dependencies: deps,
99
+ devDependencies: [],
100
+ };
101
+ },
102
+ },
103
+ {
104
+ file: 'Cargo.toml',
105
+ detect: async (content) => {
106
+ const deps = [...content.matchAll(/^(\w[\w-]*)\s*=/gm)].map((m) => m[1]).filter((d) => d !== 'name' && d !== 'version' && d !== 'edition').slice(0, 20);
107
+ return {
108
+ language: 'Rust',
109
+ framework: deps.find((d) => d === 'actix-web') ? 'Actix' :
110
+ deps.find((d) => d === 'axum') ? 'Axum' :
111
+ deps.find((d) => d === 'rocket') ? 'Rocket' : undefined,
112
+ packageManager: 'cargo',
113
+ dependencies: deps,
114
+ devDependencies: [],
115
+ };
116
+ },
117
+ },
118
+ ];
119
+ export async function detectTechStack(projectDir) {
120
+ for (const detector of DETECTORS) {
121
+ const filePath = path.join(projectDir, detector.file);
122
+ if (await fileExists(filePath)) {
123
+ try {
124
+ const content = await readFile(filePath);
125
+ return await detector.detect(content, projectDir);
126
+ }
127
+ catch {
128
+ continue;
129
+ }
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ /** Format tech stack as a human-readable string for prompt injection. */
135
+ export function formatTechStack(stack) {
136
+ const parts = [];
137
+ parts.push(`Language: ${stack.language}`);
138
+ if (stack.framework)
139
+ parts.push(`Framework: ${stack.framework}`);
140
+ if (stack.packageManager)
141
+ parts.push(`Package Manager: ${stack.packageManager}`);
142
+ if (stack.dependencies.length > 0) {
143
+ parts.push(`Key Dependencies: ${stack.dependencies.join(', ')}`);
144
+ }
145
+ return parts.join('\n');
146
+ }
147
+ //# sourceMappingURL=stack-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-detector.js","sourceRoot":"","sources":["../../../src/ai/codebase/stack-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Generates an ASCII folder tree of a project.
3
+ *
4
+ * Used to give the AI a quick overview of the project structure
5
+ * without reading every file. Ignores common non-source directories.
6
+ */
7
+ export declare function generateFolderTree(projectDir: string, maxDepth?: number): Promise<string>;
8
+ //# sourceMappingURL=tree-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-generator.d.ts","sourceRoot":"","sources":["../../../src/ai/codebase/tree-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Generates an ASCII folder tree of a project.
3
+ *
4
+ * Used to give the AI a quick overview of the project structure
5
+ * without reading every file. Ignores common non-source directories.
6
+ */
7
+ import path from 'node:path';
8
+ import fse from 'fs-extra';
9
+ const IGNORED_DIRS = new Set([
10
+ 'node_modules',
11
+ '.git',
12
+ 'dist',
13
+ 'build',
14
+ 'out',
15
+ '.next',
16
+ '.nuxt',
17
+ '.svelte-kit',
18
+ '__pycache__',
19
+ '.pytest_cache',
20
+ 'vendor',
21
+ 'target',
22
+ '.venv',
23
+ 'venv',
24
+ '.tox',
25
+ 'coverage',
26
+ '.nyc_output',
27
+ '.cache',
28
+ '.turbo',
29
+ '.vercel',
30
+ '.output',
31
+ ]);
32
+ const IGNORED_FILES = new Set([
33
+ '.DS_Store',
34
+ 'Thumbs.db',
35
+ '.gitkeep',
36
+ ]);
37
+ export async function generateFolderTree(projectDir, maxDepth = 3) {
38
+ const lines = [];
39
+ const rootName = path.basename(projectDir);
40
+ lines.push(rootName + '/');
41
+ await walkDir(projectDir, '', maxDepth, 0, lines);
42
+ return lines.join('\n');
43
+ }
44
+ async function walkDir(dirPath, prefix, maxDepth, currentDepth, lines) {
45
+ if (currentDepth >= maxDepth)
46
+ return;
47
+ let entries;
48
+ try {
49
+ entries = await fse.readdir(dirPath);
50
+ }
51
+ catch {
52
+ return;
53
+ }
54
+ // Filter and sort: directories first, then files
55
+ const filtered = entries.filter((e) => !IGNORED_DIRS.has(e) && !IGNORED_FILES.has(e) && !e.startsWith('.'));
56
+ const dirs = [];
57
+ const files = [];
58
+ for (const entry of filtered) {
59
+ const fullPath = path.join(dirPath, entry);
60
+ try {
61
+ const stat = await fse.stat(fullPath);
62
+ if (stat.isDirectory())
63
+ dirs.push(entry);
64
+ else
65
+ files.push(entry);
66
+ }
67
+ catch {
68
+ // Skip inaccessible entries
69
+ }
70
+ }
71
+ const sorted = [...dirs.sort(), ...files.sort()];
72
+ const total = sorted.length;
73
+ for (let i = 0; i < total; i++) {
74
+ const entry = sorted[i];
75
+ const isLast = i === total - 1;
76
+ const connector = isLast ? '└── ' : '├── ';
77
+ const childPrefix = isLast ? ' ' : '│ ';
78
+ const isDir = dirs.includes(entry);
79
+ lines.push(`${prefix}${connector}${entry}${isDir ? '/' : ''}`);
80
+ if (isDir) {
81
+ await walkDir(path.join(dirPath, entry), prefix + childPrefix, maxDepth, currentDepth + 1, lines);
82
+ }
83
+ }
84
+ }
85
+ //# sourceMappingURL=tree-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-generator.js","sourceRoot":"","sources":["../../../src/ai/codebase/tree-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,aAAa;IACb,aAAa;IACb,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,WAAW;IACX,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,WAAmB,CAAC;IAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAE3B,MAAM,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAe,EACf,MAAc,EACd,QAAgB,EAChB,YAAoB,EACpB,KAAe;IAEf,IAAI,YAAY,IAAI,QAAQ;QAAE,OAAO;IAErC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,iDAAiD;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAC3E,CAAC;IAEF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEnC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EACzB,MAAM,GAAG,WAAW,EACpB,QAAQ,EACR,YAAY,GAAG,CAAC,EAChB,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Unified error class for AI provider failures.
3
+ *
4
+ * Normalizes provider-specific errors (Anthropic 429, OpenAI 401, Ollama ECONNREFUSED)
5
+ * into a consistent format the rest of the application can handle.
6
+ */
7
+ export type AIErrorCode = 'auth' | 'rate_limit' | 'overloaded' | 'connection' | 'invalid_response' | 'unknown';
8
+ export declare class AIError extends Error {
9
+ readonly code: AIErrorCode;
10
+ readonly retryable: boolean;
11
+ readonly retryAfterMs?: number | undefined;
12
+ readonly cause?: unknown | undefined;
13
+ constructor(message: string, code: AIErrorCode, retryable?: boolean, retryAfterMs?: number | undefined, cause?: unknown | undefined);
14
+ /** User-friendly description with actionable guidance. */
15
+ get userMessage(): string;
16
+ }
17
+ /**
18
+ * Wrap any provider-specific error into a normalized AIError.
19
+ * Each provider adapter calls this to unify error handling.
20
+ */
21
+ export declare function wrapProviderError(err: unknown, provider: string): AIError;
22
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ai/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,kBAAkB,GAClB,SAAS,CAAC;AAEd,qBAAa,OAAQ,SAAQ,KAAK;aAGd,IAAI,EAAE,WAAW;aACjB,SAAS,EAAE,OAAO;aAClB,YAAY,CAAC,EAAE,MAAM;aACrB,KAAK,CAAC,EAAE,OAAO;gBAJ/B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,WAAW,EACjB,SAAS,GAAE,OAAe,EAC1B,YAAY,CAAC,EAAE,MAAM,YAAA,EACrB,KAAK,CAAC,EAAE,OAAO,YAAA;IAMjC,0DAA0D;IAC1D,IAAI,WAAW,IAAI,MAAM,CAexB;CACF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA8BzE"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Unified error class for AI provider failures.
3
+ *
4
+ * Normalizes provider-specific errors (Anthropic 429, OpenAI 401, Ollama ECONNREFUSED)
5
+ * into a consistent format the rest of the application can handle.
6
+ */
7
+ export class AIError extends Error {
8
+ code;
9
+ retryable;
10
+ retryAfterMs;
11
+ cause;
12
+ constructor(message, code, retryable = false, retryAfterMs, cause) {
13
+ super(message);
14
+ this.code = code;
15
+ this.retryable = retryable;
16
+ this.retryAfterMs = retryAfterMs;
17
+ this.cause = cause;
18
+ this.name = 'AIError';
19
+ }
20
+ /** User-friendly description with actionable guidance. */
21
+ get userMessage() {
22
+ switch (this.code) {
23
+ case 'auth':
24
+ return 'Invalid API key. Run `planr config set-key <provider>` to update.';
25
+ case 'rate_limit':
26
+ return 'Rate limited. Please wait a moment and try again.';
27
+ case 'overloaded':
28
+ return 'AI provider is overloaded. Please try again in a few seconds.';
29
+ case 'connection':
30
+ return 'Cannot connect to AI provider. Check your network or if Ollama is running.';
31
+ case 'invalid_response':
32
+ return 'AI returned an invalid response. Try again or use --manual mode.';
33
+ default:
34
+ return this.message;
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Wrap any provider-specific error into a normalized AIError.
40
+ * Each provider adapter calls this to unify error handling.
41
+ */
42
+ export function wrapProviderError(err, provider) {
43
+ if (err instanceof AIError)
44
+ return err;
45
+ const error = err;
46
+ const status = error?.status;
47
+ const code = error?.code;
48
+ const message = error?.message || String(err);
49
+ // Connection errors (Ollama not running, network down)
50
+ if (code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'ETIMEDOUT') {
51
+ const hint = provider === 'ollama'
52
+ ? 'Is Ollama running? Start with `ollama serve`.'
53
+ : 'Check your internet connection.';
54
+ return new AIError(`Connection failed: ${hint}`, 'connection', true, 5000, err);
55
+ }
56
+ // HTTP status-based errors
57
+ if (status === 401 || status === 403) {
58
+ return new AIError(`Authentication failed for ${provider}.`, 'auth', false, undefined, err);
59
+ }
60
+ if (status === 429) {
61
+ const retryAfter = error?.headers?.['retry-after'];
62
+ const retryMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 2000;
63
+ return new AIError('Rate limited by AI provider.', 'rate_limit', true, retryMs, err);
64
+ }
65
+ if (status === 529 || status === 503) {
66
+ return new AIError('AI provider is overloaded.', 'overloaded', true, 3000, err);
67
+ }
68
+ return new AIError(message, 'unknown', false, undefined, err);
69
+ }
70
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/ai/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAGd;IACA;IACA;IACA;IALlB,YACE,OAAe,EACC,IAAiB,EACjB,YAAqB,KAAK,EAC1B,YAAqB,EACrB,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,SAAI,GAAJ,IAAI,CAAa;QACjB,cAAS,GAAT,SAAS,CAAiB;QAC1B,iBAAY,GAAZ,YAAY,CAAS;QACrB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,0DAA0D;IAC1D,IAAI,WAAW;QACb,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM;gBACT,OAAO,mEAAmE,CAAC;YAC7E,KAAK,YAAY;gBACf,OAAO,mDAAmD,CAAC;YAC7D,KAAK,YAAY;gBACf,OAAO,+DAA+D,CAAC;YACzE,KAAK,YAAY;gBACf,OAAO,4EAA4E,CAAC;YACtF,KAAK,kBAAkB;gBACrB,OAAO,kEAAkE,CAAC;YAC5E;gBACE,OAAO,IAAI,CAAC,OAAO,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,QAAgB;IAC9D,IAAI,GAAG,YAAY,OAAO;QAAE,OAAO,GAAG,CAAC;IAEvC,MAAM,KAAK,GAAG,GAA8B,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,EAAE,MAA4B,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,EAAE,IAA0B,CAAC;IAC/C,MAAM,OAAO,GAAG,KAAK,EAAE,OAAiB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAExD,uDAAuD;IACvD,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,QAAQ,KAAK,QAAQ;YAChC,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,iCAAiC,CAAC;QACtC,OAAO,IAAI,OAAO,CAAC,sBAAsB,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,OAAO,CAAC,6BAA6B,QAAQ,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,UAAU,GAAI,KAAK,EAAE,OAAkC,EAAE,CAAC,aAAa,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,OAAO,IAAI,OAAO,CAAC,8BAA8B,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,OAAO,CAAC,4BAA4B,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * AI module public API.
3
+ *
4
+ * Re-exports the provider abstraction, factory, and error types.
5
+ * All AI functionality is accessed through this barrel export.
6
+ */
7
+ export type { AIProvider, AIMessage, AIRequestOptions, AIProviderConfig, AIProviderName, CodingAgentName, } from './types.js';
8
+ export { DEFAULT_MODELS, ENV_KEY_MAP } from './types.js';
9
+ export { AIError, wrapProviderError } from './errors.js';
10
+ export { createAIProvider } from './provider-factory.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * AI module public API.
3
+ *
4
+ * Re-exports the provider abstraction, factory, and error types.
5
+ * All AI functionality is accessed through this barrel export.
6
+ */
7
+ export { DEFAULT_MODELS, ENV_KEY_MAP } from './types.js';
8
+ export { AIError, wrapProviderError } from './errors.js';
9
+ export { createAIProvider } from './provider-factory.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Prompt composition for each artifact type.
3
+ *
4
+ * Each builder assembles a message array with:
5
+ * 1. Expert system prompt
6
+ * 2. User context (brief, parent artifacts, existing siblings, codebase)
7
+ *
8
+ * Existing sibling titles are injected to prevent the AI from
9
+ * generating duplicate artifacts.
10
+ */
11
+ import type { AIMessage } from '../types.js';
12
+ export declare function buildEpicPrompt(brief: string, existingEpics?: string[]): AIMessage[];
13
+ export declare function buildFeaturesPrompt(epicContent: string, existingFeatures?: string[], featureCount?: number): AIMessage[];
14
+ export declare function buildStoriesPrompt(featureContent: string, epicContext: string, existingStories?: string[]): AIMessage[];
15
+ export interface TasksPromptInput {
16
+ stories: Array<{
17
+ id: string;
18
+ raw: string;
19
+ }>;
20
+ gherkinScenarios?: Array<{
21
+ storyId: string;
22
+ content: string;
23
+ }>;
24
+ featureRaw?: string;
25
+ epicRaw?: string;
26
+ adrs?: Array<{
27
+ id: string;
28
+ content: string;
29
+ }>;
30
+ codebaseContext?: string;
31
+ /** When set, tells the AI the creation scope for naming the task list title. */
32
+ scope?: {
33
+ type: 'feature';
34
+ id: string;
35
+ } | {
36
+ type: 'story';
37
+ id: string;
38
+ };
39
+ }
40
+ export declare function buildTasksPrompt(ctx: TasksPromptInput): AIMessage[];
41
+ export declare function buildRefinePrompt(artifactContent: string, artifactType: string): AIMessage[];
42
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,MAAM,EAAO,GAC3B,SAAS,EAAE,CAWb;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,gBAAgB,GAAE,MAAM,EAAO,EAC/B,YAAY,CAAC,EAAE,MAAM,GACpB,SAAS,EAAE,CAeb;AAED,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,eAAe,GAAE,MAAM,EAAO,GAC7B,SAAS,EAAE,CAYb;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACzE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EAAE,CAqDnE;AAED,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,SAAS,EAAE,CAOb"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Prompt composition for each artifact type.
3
+ *
4
+ * Each builder assembles a message array with:
5
+ * 1. Expert system prompt
6
+ * 2. User context (brief, parent artifacts, existing siblings, codebase)
7
+ *
8
+ * Existing sibling titles are injected to prevent the AI from
9
+ * generating duplicate artifacts.
10
+ */
11
+ import { EPIC_SYSTEM_PROMPT, FEATURES_SYSTEM_PROMPT, STORIES_SYSTEM_PROMPT, TASKS_SYSTEM_PROMPT, REFINE_SYSTEM_PROMPT, } from './system-prompts.js';
12
+ export function buildEpicPrompt(brief, existingEpics = []) {
13
+ let userContent = `Create an epic from this brief:\n\n"${brief}"`;
14
+ if (existingEpics.length > 0) {
15
+ userContent += `\n\nExisting epics in this project (do NOT duplicate):\n${existingEpics.map((e) => `- ${e}`).join('\n')}`;
16
+ }
17
+ return [
18
+ { role: 'system', content: EPIC_SYSTEM_PROMPT },
19
+ { role: 'user', content: userContent },
20
+ ];
21
+ }
22
+ export function buildFeaturesPrompt(epicContent, existingFeatures = [], featureCount) {
23
+ let userContent = `Decompose this epic into features:\n\n${epicContent}`;
24
+ if (featureCount) {
25
+ userContent += `\n\nGenerate approximately ${featureCount} features.`;
26
+ }
27
+ if (existingFeatures.length > 0) {
28
+ userContent += `\n\nExisting features for this epic (do NOT duplicate):\n${existingFeatures.map((f) => `- ${f}`).join('\n')}`;
29
+ }
30
+ return [
31
+ { role: 'system', content: FEATURES_SYSTEM_PROMPT },
32
+ { role: 'user', content: userContent },
33
+ ];
34
+ }
35
+ export function buildStoriesPrompt(featureContent, epicContext, existingStories = []) {
36
+ let userContent = `Generate user stories for this feature:\n\n${featureContent}`;
37
+ userContent += `\n\n--- Parent Epic Context ---\n${epicContext}`;
38
+ if (existingStories.length > 0) {
39
+ userContent += `\n\nExisting stories for this feature (do NOT duplicate):\n${existingStories.map((s) => `- ${s}`).join('\n')}`;
40
+ }
41
+ return [
42
+ { role: 'system', content: STORIES_SYSTEM_PROMPT },
43
+ { role: 'user', content: userContent },
44
+ ];
45
+ }
46
+ export function buildTasksPrompt(ctx) {
47
+ const sections = [];
48
+ // User stories
49
+ sections.push('--- User Stories ---');
50
+ for (const story of ctx.stories) {
51
+ sections.push(`\n[${story.id}]\n${story.raw}`);
52
+ }
53
+ // Gherkin acceptance criteria
54
+ if (ctx.gherkinScenarios && ctx.gherkinScenarios.length > 0) {
55
+ sections.push('\n--- Gherkin Acceptance Criteria ---');
56
+ for (const g of ctx.gherkinScenarios) {
57
+ sections.push(`\n[Gherkin for ${g.storyId}]\n${g.content}`);
58
+ }
59
+ }
60
+ // Parent feature context
61
+ if (ctx.featureRaw) {
62
+ sections.push(`\n--- Parent Feature Context ---\n${ctx.featureRaw}`);
63
+ }
64
+ // Parent epic context
65
+ if (ctx.epicRaw) {
66
+ sections.push(`\n--- Parent Epic Context ---\n${ctx.epicRaw}`);
67
+ }
68
+ // Architecture decision records
69
+ if (ctx.adrs && ctx.adrs.length > 0) {
70
+ sections.push('\n--- Architecture Decision Records ---');
71
+ for (const adr of ctx.adrs) {
72
+ sections.push(`\n[${adr.id}]\n${adr.content}`);
73
+ }
74
+ }
75
+ // Codebase context
76
+ if (ctx.codebaseContext) {
77
+ sections.push(`\n--- Codebase Context ---\n${ctx.codebaseContext}`);
78
+ }
79
+ // Add scope hint so the AI titles the task list correctly
80
+ if (ctx.scope) {
81
+ sections.push(`\n--- Scope ---\nThis task list is being generated at ${ctx.scope.type} level for ${ctx.scope.id}. Title the task list as "Tasks for ${ctx.scope.id}: <descriptive name>".`);
82
+ }
83
+ const userContent = `Generate implementation tasks from the following agile artifacts:\n\n${sections.join('\n')}`;
84
+ return [
85
+ { role: 'system', content: TASKS_SYSTEM_PROMPT },
86
+ { role: 'user', content: userContent },
87
+ ];
88
+ }
89
+ export function buildRefinePrompt(artifactContent, artifactType) {
90
+ const userContent = `Review and improve this ${artifactType} artifact. The "improvedMarkdown" in your response must preserve the same file format (YAML frontmatter + markdown body) as shown below:\n\n${artifactContent}`;
91
+ return [
92
+ { role: 'system', content: REFINE_SYSTEM_PROMPT },
93
+ { role: 'user', content: userContent },
94
+ ];
95
+ }
96
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/ai/prompts/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Expert system prompts for AI-powered agile planning.
3
+ *
4
+ * Each prompt establishes the AI as a specialized agile consultant
5
+ * and instructs it to produce structured JSON output matching our
6
+ * artifact schemas.
7
+ */
8
+ export declare const EPIC_SYSTEM_PROMPT = "You are an expert agile planning consultant with deep experience in software development, product management, and technical architecture. You help teams create clear, actionable, and well-structured planning artifacts.\n\nYour task is to expand a brief description into a complete, detailed epic document.\n\nYou MUST respond with a valid JSON object containing these fields:\n- \"title\": A concise, descriptive epic title (max 80 chars)\n- \"owner\": The responsible team or role (e.g., \"Engineering\", \"Product\", \"Platform Team\")\n- \"businessValue\": Why this matters to the business (2-3 sentences)\n- \"targetUsers\": Who benefits from this (specific user personas)\n- \"problemStatement\": The problem being solved (2-3 sentences)\n- \"solutionOverview\": High-level approach to solving it (2-3 sentences)\n- \"successCriteria\": Array of 3-5 measurable definition-of-done bullet points (e.g., [\"Users can X within Y seconds\", \"System supports Z\"])\n- \"keyFeatures\": Array of 3-7 high-level feature names that compose this epic\n- \"dependencies\": Known dependencies or \"None\"\n- \"risks\": Known risks or \"None\"\n\nBe specific, avoid generic filler. Ground the epic in the user's brief.\nRespond with JSON only, no markdown or explanation.";
9
+ export declare const FEATURES_SYSTEM_PROMPT = "You are an expert agile planning consultant with deep experience in software development, product management, and technical architecture. You help teams create clear, actionable, and well-structured planning artifacts.\n\nYour task is to decompose an epic into individual features. Read the epic carefully and generate features that fully cover its scope.\n\nYou MUST respond with a valid JSON object containing:\n- \"features\": An array of feature objects, each with:\n - \"title\": A clear feature title (max 80 chars)\n - \"overview\": What this feature does (2-3 sentences)\n - \"functionalRequirements\": Array of 3-6 specific functional requirements\n - \"dependencies\": Dependencies on other features or systems, or \"None\"\n - \"technicalConsiderations\": Technical notes for implementation, or \"None\"\n - \"risks\": Feature-specific risks, or \"None\"\n - \"successMetrics\": How to measure success of this feature\n\nGenerate features that are:\n- Independently deliverable where possible\n- Roughly equal in scope\n- Non-overlapping (no duplicate functionality)\n\nRespond with JSON only, no markdown or explanation.";
10
+ export declare const STORIES_SYSTEM_PROMPT = "You are an expert agile planning consultant with deep experience in software development, product management, and technical architecture. You help teams create clear, actionable, and well-structured planning artifacts.\n\nYour task is to break a feature into user stories. Read the feature and its parent epic context carefully.\n\nYou MUST respond with a valid JSON object containing:\n- \"stories\": An array of story objects, each with:\n - \"title\": Concise story title (max 80 chars)\n - \"role\": The user role (\"As a <role>\")\n - \"goal\": What they want to do (\"I want to <goal>\")\n - \"benefit\": Why (\"So that <benefit>\")\n - \"additionalNotes\": Implementation notes or edge cases (optional, can be empty string)\n - \"gherkinScenarios\": Array of scenario objects, each with:\n - \"name\": Scenario name\n - \"given\": Given precondition\n - \"when\": When action\n - \"then\": Then expected outcome\n\nEach story should:\n- Follow INVEST principles (Independent, Negotiable, Valuable, Estimable, Small, Testable)\n- Include 1-3 Gherkin scenarios (happy path + edge cases)\n- Be specific enough for a developer to implement\n\nRespond with JSON only, no markdown or explanation.";
11
+ export declare const TASKS_SYSTEM_PROMPT = "You are an expert agile planning consultant with deep experience in software development, product management, and technical architecture. You help teams create clear, actionable, and well-structured planning artifacts.\n\nYour task is to generate a comprehensive implementation task list from agile artifacts (user stories, gherkin acceptance criteria, feature specs, epic context, ADRs, and codebase context).\n\nYou MUST respond with a valid JSON object containing:\n- \"title\": A task list title \u2014 use the scope ID if provided (e.g., \"Tasks for FEAT-001: Feature Name\" when scope is a feature, or \"Tasks for US-001: Story Name\" when scope is a story)\n- \"tasks\": An array of task group objects, each with:\n - \"id\": Numbering like \"1.0\", \"2.0\", \"3.0\"\n - \"title\": Task group title\n - \"subtasks\": Array of subtask objects, each with:\n - \"id\": Numbering like \"1.1\", \"1.2\", \"2.1\"\n - \"title\": Specific, actionable subtask description\n- \"acceptanceCriteriaMapping\": Array of objects mapping acceptance criteria to tasks:\n - \"criterion\": The acceptance criterion text (from gherkin scenarios or story requirements)\n - \"sourceStoryId\": Which user story this criterion comes from (e.g., \"US-001\")\n - \"taskIds\": Array of task/subtask IDs that satisfy this criterion (e.g., [\"1.1\", \"2.3\"])\n- \"relevantFiles\": Array of files to create or modify:\n - \"path\": File path relative to project root (e.g., \"src/auth/login.ts\")\n - \"reason\": Brief explanation of why this file needs changes\n\nTasks should:\n- Reference actual files/paths from the codebase when possible\n- Follow existing code patterns and conventions\n- Include setup, implementation, testing, and cleanup steps\n- Be ordered logically (dependencies first)\n- Address specific acceptance criteria from gherkin scenarios\n- Respect architectural decisions from ADRs when provided\n- Align with component structure and system architecture\n\nWhen multiple user stories and gherkin scenarios are provided, ensure every acceptance criterion is covered by at least one task. When codebase context is available, identify specific files to modify in relevantFiles.\n\nRespond with JSON only, no markdown or explanation.";
12
+ export declare const REFINE_SYSTEM_PROMPT = "You are an expert agile planning consultant with deep experience in software development, product management, and technical architecture. You help teams create clear, actionable, and well-structured planning artifacts.\n\nYour task is to review and improve an existing agile artifact. Analyze the content and suggest improvements for:\n- Clarity and specificity\n- Missing details or edge cases\n- Consistency with agile best practices\n- Technical accuracy\n\nYou MUST respond with a valid JSON object containing:\n- \"suggestions\": Array of improvement suggestions (strings)\n- \"improved\": The improved artifact data as a JSON object with the same fields as the original frontmatter\n- \"improvedMarkdown\": A raw markdown string that will be written directly to a .md file. It MUST preserve the original file format: YAML frontmatter between --- delimiters followed by the markdown body. Do NOT put JSON in this field.\n\nCRITICAL: The \"improvedMarkdown\" field must be a plain markdown string, NOT a JSON object. It should look exactly like the original artifact the user provided, but with improvements applied. For example, if the original starts with:\n---\nid: \"EPIC-001\"\ntitle: \"My Epic\"\n---\n# EPIC-001: My Epic\n...then \"improvedMarkdown\" must also start with --- frontmatter and contain markdown content. Keep the same structure and sections as the original.\n\nRespond with JSON only, no markdown or explanation.";
13
+ //# sourceMappingURL=system-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompts.d.ts","sourceRoot":"","sources":["../../../src/ai/prompts/system-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,eAAO,MAAM,kBAAkB,ovCAiBqB,CAAC;AAErD,eAAO,MAAM,sBAAsB,wnCAmBiB,CAAC;AAErD,eAAO,MAAM,qBAAqB,osCAsBkB,CAAC;AAErD,eAAO,MAAM,mBAAmB,0sEA+BoB,CAAC;AAErD,eAAO,MAAM,oBAAoB,k6CAqBmB,CAAC"}