popeye-cli 1.9.4 → 1.10.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 (68) hide show
  1. package/cheatsheet.md +65 -0
  2. package/dist/cli/commands/debug-context.d.ts +64 -0
  3. package/dist/cli/commands/debug-context.d.ts.map +1 -0
  4. package/dist/cli/commands/debug-context.js +221 -0
  5. package/dist/cli/commands/debug-context.js.map +1 -0
  6. package/dist/cli/commands/debug-prompts.d.ts +25 -0
  7. package/dist/cli/commands/debug-prompts.d.ts.map +1 -0
  8. package/dist/cli/commands/debug-prompts.js +80 -0
  9. package/dist/cli/commands/debug-prompts.js.map +1 -0
  10. package/dist/cli/commands/debug.d.ts +68 -0
  11. package/dist/cli/commands/debug.d.ts.map +1 -0
  12. package/dist/cli/commands/debug.js +543 -0
  13. package/dist/cli/commands/debug.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +1 -0
  15. package/dist/cli/commands/index.d.ts.map +1 -1
  16. package/dist/cli/commands/index.js +1 -0
  17. package/dist/cli/commands/index.js.map +1 -1
  18. package/dist/cli/index.d.ts.map +1 -1
  19. package/dist/cli/index.js +2 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/interactive.d.ts.map +1 -1
  22. package/dist/cli/interactive.js +25 -0
  23. package/dist/cli/interactive.js.map +1 -1
  24. package/dist/generators/all.d.ts.map +1 -1
  25. package/dist/generators/all.js +3 -0
  26. package/dist/generators/all.js.map +1 -1
  27. package/dist/generators/templates/database-docker.d.ts.map +1 -1
  28. package/dist/generators/templates/database-docker.js +11 -0
  29. package/dist/generators/templates/database-docker.js.map +1 -1
  30. package/dist/generators/templates/fullstack.d.ts +4 -1
  31. package/dist/generators/templates/fullstack.d.ts.map +1 -1
  32. package/dist/generators/templates/fullstack.js +6 -2
  33. package/dist/generators/templates/fullstack.js.map +1 -1
  34. package/package.json +1 -1
  35. package/skills/ARBITRATOR.md +137 -0
  36. package/skills/ARCHITECT.md +167 -0
  37. package/skills/AUDITOR.md +128 -0
  38. package/skills/AUDIT_REPORT_SCHEMA.md +20 -0
  39. package/skills/BACKEND_PROGRAMMER.md +95 -0
  40. package/skills/CONSENSUS_PACKET_SCHEMA.md +166 -0
  41. package/skills/DB_EXPERT.md +106 -0
  42. package/skills/DEBUGGER.md +286 -0
  43. package/skills/DISPATCHER.md +157 -0
  44. package/skills/FRONTEND_PROGRAMMER.md +84 -0
  45. package/skills/JOURNALIST.md +247 -0
  46. package/skills/MARKETING_EXPERT.md +23 -0
  47. package/skills/PHASE_GATE_ENGINE_SPEC.md +78 -0
  48. package/skills/PLAN_PACKET_SCHEMA.md +222 -0
  49. package/skills/POPEYE_CONSTITUTION.md +177 -0
  50. package/skills/POPEYE_FULL_AUTONOMY_PIPELINE.md +484 -0
  51. package/skills/PRODUCTION_READINESS_SCHEMA.md +19 -0
  52. package/skills/QA_TESTER.md +40 -0
  53. package/skills/RCA_PACKET_SCHEMA.md +22 -0
  54. package/skills/RELEASE_MANAGER.md +60 -0
  55. package/skills/REVIEWER.md +133 -0
  56. package/skills/SOCIAL_EXPERT.md +22 -0
  57. package/skills/UI_UX_SPECIALIST.md +22 -0
  58. package/skills/WEBSITE_PROGRAMMER.md +37 -0
  59. package/src/cli/commands/debug-context.ts +265 -0
  60. package/src/cli/commands/debug-prompts.ts +91 -0
  61. package/src/cli/commands/debug.ts +662 -0
  62. package/src/cli/commands/index.ts +1 -0
  63. package/src/cli/index.ts +2 -0
  64. package/src/cli/interactive.ts +27 -0
  65. package/src/generators/all.ts +3 -0
  66. package/src/generators/templates/database-docker.ts +11 -0
  67. package/src/generators/templates/fullstack.ts +6 -2
  68. package/tests/cli/commands/debug.test.ts +376 -0
package/cheatsheet.md CHANGED
@@ -231,6 +231,32 @@ popeye-cli audit ./my-project --target frontend
231
231
 
232
232
  ---
233
233
 
234
+ ### `popeye-cli debug [projectDir]`
235
+
236
+ Start an interactive debugging session for a Popeye-generated project. Indexes the project, loads anchor docs (CLAUDE.md, README, config files), then opens a debug sub-REPL where you paste errors for AI-assisted diagnosis and fixes.
237
+
238
+ | Option | Description | Default |
239
+ |--------|-------------|---------|
240
+ | `-l, --language <lang>` | Project language/type | `backend` |
241
+
242
+ ```bash
243
+ popeye-cli debug ./my-project
244
+ popeye-cli debug ./my-project --language fullstack
245
+ ```
246
+
247
+ **How it works:**
248
+ 1. Scans the project directory and builds a lightweight file index (paths + metadata)
249
+ 2. Loads anchor documents: CLAUDE.md, README, package.json, docker-compose.yml, etc.
250
+ 3. Opens a `debug >` sub-REPL -- paste an error or describe a bug
251
+ 4. Extracts file paths from stack traces and detects tech context (alembic, vite, fastapi, etc.)
252
+ 5. Loads only the relevant source files on-demand (not the entire codebase)
253
+ 6. Sends targeted context to Claude for structured diagnosis
254
+ 7. Claude responds with: Diagnosis, Evidence, Proposed Fix, Commands to Verify, Ready to Apply
255
+
256
+ **Permission model:** Same as Claude Code -- asks before making any file edits (no auto-write).
257
+
258
+ ---
259
+
234
260
  ## Interactive Mode Slash Commands
235
261
 
236
262
  Enter these commands during an interactive session (started via `popeye-cli interactive`).
@@ -317,6 +343,41 @@ Available upgrade paths depend on the current project type:
317
343
  | `/doctor` | Run all readiness checks inline |
318
344
  | `/review`, `/audit` | Run a post-build audit with findings and optional recovery |
319
345
 
346
+ ### Debugging
347
+
348
+ | Command | Description |
349
+ |---------|-------------|
350
+ | `/debug`, `/dbg` | Start interactive debugging session (requires active project) |
351
+
352
+ Once inside the debug session, the following sub-commands are available:
353
+
354
+ | Debug Sub-Command | Description |
355
+ |-------------------|-------------|
356
+ | `/back`, `/done` | Return to main Popeye session |
357
+ | `/clear` | Reset conversation history |
358
+ | `/context` | Re-display project summary |
359
+ | `/fix` | Apply last proposed fix via Popeye execution pipeline |
360
+
361
+ **Debug session input:** Single Enter submits for commands and short messages. Multi-line paste is auto-detected and waits for the full paste to arrive before submitting.
362
+
363
+ ```
364
+ # Start a debug session from the Popeye REPL
365
+ /debug
366
+
367
+ # Inside debug session, paste an error:
368
+ debug > Traceback (most recent call last):
369
+ ... File "/app/src/database/connection.py", line 15
370
+ ... ConnectionRefusedError: [Errno 111] Connection refused
371
+ ...
372
+ ... (paste auto-detected, submits after 2s pause)
373
+
374
+ # Apply the proposed fix
375
+ debug > /fix
376
+
377
+ # Return to main Popeye REPL (use /back, not /exit which would exit Popeye)
378
+ debug > /back
379
+ ```
380
+
320
381
  ### Session Control
321
382
 
322
383
  | Command | Description |
@@ -435,6 +496,10 @@ popeye-cli resume ./taskmaster
435
496
  popeye-cli review ./taskmaster
436
497
  popeye-cli review ./taskmaster --depth 3 --strict
437
498
 
499
+ # Debug a project (paste errors, get AI-assisted fixes)
500
+ popeye-cli debug ./taskmaster
501
+ popeye-cli debug ./taskmaster --language fullstack
502
+
438
503
  # Reset and re-plan
439
504
  popeye-cli reset ./taskmaster --phase plan
440
505
  ```
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Debug context helpers
3
+ * Deterministic functions for error analysis and smart file selection.
4
+ * Pure functions, easily testable.
5
+ */
6
+ /**
7
+ * Entry in the lightweight file index (paths + metadata, no content).
8
+ */
9
+ export interface FileIndexEntry {
10
+ relativePath: string;
11
+ size: number;
12
+ mtime: number;
13
+ isConfig: boolean;
14
+ }
15
+ /**
16
+ * Check if a file path matches a config pattern.
17
+ *
18
+ * @param filePath - Relative path to check.
19
+ * @returns True if the file is a known config file.
20
+ */
21
+ export declare function isConfigFile(filePath: string): boolean;
22
+ /**
23
+ * Extract file paths mentioned in stack traces.
24
+ * Supports Python tracebacks, TypeScript/JS errors, and generic path patterns.
25
+ *
26
+ * @param text - Error text or stack trace.
27
+ * @returns Deduplicated array of file paths found in the text.
28
+ */
29
+ export declare function extractPathsFromError(text: string): string[];
30
+ /**
31
+ * Detect framework/tech keywords from error text.
32
+ *
33
+ * @param text - Error text or stack trace.
34
+ * @returns Object with deduplicated tags array.
35
+ */
36
+ export declare function detectTechFromError(text: string): {
37
+ tags: string[];
38
+ };
39
+ /**
40
+ * Select relevant files from the project index based on error paths and tech tags.
41
+ * Returns file paths sorted by relevance (direct matches first, then config, then nearby).
42
+ *
43
+ * @param fileIndex - Lightweight file index.
44
+ * @param errorPaths - Paths extracted from the error.
45
+ * @param tags - Tech tags detected from the error.
46
+ * @returns Array of relative paths to load.
47
+ */
48
+ export declare function selectRelevantFiles(fileIndex: FileIndexEntry[], errorPaths: string[], tags: string[]): string[];
49
+ /**
50
+ * Extract image/screenshot file paths from user input text.
51
+ * Detects both quoted and unquoted absolute/relative paths ending in image extensions.
52
+ *
53
+ * @param text - User input text.
54
+ * @returns Array of image file paths found in the text.
55
+ */
56
+ export declare function extractImagePaths(text: string): string[];
57
+ /**
58
+ * Check if a file path points to an image file.
59
+ *
60
+ * @param filePath - File path to check.
61
+ * @returns True if the file has an image extension.
62
+ */
63
+ export declare function isImageFile(filePath: string): boolean;
64
+ //# sourceMappingURL=debug-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/debug-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAsC5D;AA2BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAapE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,cAAc,EAAE,EAC3B,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,EAAE,MAAM,EAAE,GACb,MAAM,EAAE,CAkEV;AAKD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBxD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrD"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Debug context helpers
3
+ * Deterministic functions for error analysis and smart file selection.
4
+ * Pure functions, easily testable.
5
+ */
6
+ import path from 'node:path';
7
+ /** Config file patterns that are always considered relevant */
8
+ const CONFIG_PATTERNS = [
9
+ 'package.json', 'package-lock.json', 'tsconfig.json', 'vite.config',
10
+ 'pyproject.toml', 'requirements.txt', 'Pipfile',
11
+ 'docker-compose.yml', 'docker-compose.yaml', 'Dockerfile',
12
+ '.env.example', '.env.local', 'alembic.ini',
13
+ 'next.config', 'tailwind.config', 'postcss.config',
14
+ 'jest.config', 'vitest.config', 'pytest.ini', 'setup.cfg',
15
+ ];
16
+ /**
17
+ * Check if a file path matches a config pattern.
18
+ *
19
+ * @param filePath - Relative path to check.
20
+ * @returns True if the file is a known config file.
21
+ */
22
+ export function isConfigFile(filePath) {
23
+ const basename = path.basename(filePath);
24
+ return CONFIG_PATTERNS.some((p) => basename.startsWith(p));
25
+ }
26
+ /**
27
+ * Extract file paths mentioned in stack traces.
28
+ * Supports Python tracebacks, TypeScript/JS errors, and generic path patterns.
29
+ *
30
+ * @param text - Error text or stack trace.
31
+ * @returns Deduplicated array of file paths found in the text.
32
+ */
33
+ export function extractPathsFromError(text) {
34
+ const paths = new Set();
35
+ // Python traceback: File "/app/src/module/file.py", line 42
36
+ const pyPattern = /File "([^"]+\.py[cw]?)", line \d+/g;
37
+ for (const match of text.matchAll(pyPattern)) {
38
+ paths.add(normalizePath(match[1]));
39
+ }
40
+ // TS/JS errors: src/components/App.tsx(15,3) or src/components/App.tsx:15:3
41
+ const tsPattern = /([a-zA-Z0-9_./\\-]+\.(?:ts|tsx|js|jsx|mjs|cjs))[\s:(]/g;
42
+ for (const match of text.matchAll(tsPattern)) {
43
+ paths.add(normalizePath(match[1]));
44
+ }
45
+ // Docker / generic paths: /app/src/..., ./src/...
46
+ const genericPattern = /(?:\/app\/|\.\/)((?:src|app|lib|tests?|config)\/[a-zA-Z0-9_./-]+\.\w+)/g;
47
+ for (const match of text.matchAll(genericPattern)) {
48
+ paths.add(normalizePath(match[1]));
49
+ }
50
+ // Module not found patterns: Cannot find module './foo/bar'
51
+ const modulePattern = /Cannot find module ['"]([^'"]+)['"]/g;
52
+ for (const match of text.matchAll(modulePattern)) {
53
+ const mod = match[1];
54
+ if (mod.startsWith('.') || mod.startsWith('/')) {
55
+ paths.add(normalizePath(mod));
56
+ }
57
+ }
58
+ // ModuleNotFoundError: No module named 'src.foo.bar'
59
+ const pyModulePattern = /No module named ['"]([^'"]+)['"]/g;
60
+ for (const match of text.matchAll(pyModulePattern)) {
61
+ const dotPath = match[1].replace(/\./g, '/');
62
+ paths.add(dotPath);
63
+ }
64
+ return Array.from(paths);
65
+ }
66
+ /** Tech keyword map: keyword -> tags */
67
+ const TECH_KEYWORDS = {
68
+ 'alembic': ['alembic', 'database', 'migration'],
69
+ 'sqlalchemy': ['sqlalchemy', 'database', 'orm'],
70
+ 'prisma': ['prisma', 'database', 'orm'],
71
+ 'docker': ['docker', 'container'],
72
+ 'docker-compose': ['docker', 'container', 'compose'],
73
+ 'vite': ['vite', 'bundler', 'frontend'],
74
+ 'webpack': ['webpack', 'bundler', 'frontend'],
75
+ 'next': ['nextjs', 'react', 'frontend'],
76
+ 'fastapi': ['fastapi', 'backend', 'python'],
77
+ 'flask': ['flask', 'backend', 'python'],
78
+ 'express': ['express', 'backend', 'node'],
79
+ 'postgres': ['postgres', 'database'],
80
+ 'redis': ['redis', 'cache'],
81
+ 'tailwind': ['tailwind', 'css', 'frontend'],
82
+ 'pytest': ['pytest', 'testing', 'python'],
83
+ 'jest': ['jest', 'testing', 'node'],
84
+ 'vitest': ['vitest', 'testing', 'node'],
85
+ 'nginx': ['nginx', 'proxy'],
86
+ 'cors': ['cors', 'api'],
87
+ 'migration': ['migration', 'database'],
88
+ 'celery': ['celery', 'queue', 'python'],
89
+ };
90
+ /**
91
+ * Detect framework/tech keywords from error text.
92
+ *
93
+ * @param text - Error text or stack trace.
94
+ * @returns Object with deduplicated tags array.
95
+ */
96
+ export function detectTechFromError(text) {
97
+ const tags = new Set();
98
+ const lower = text.toLowerCase();
99
+ for (const [keyword, keywordTags] of Object.entries(TECH_KEYWORDS)) {
100
+ if (lower.includes(keyword)) {
101
+ for (const tag of keywordTags) {
102
+ tags.add(tag);
103
+ }
104
+ }
105
+ }
106
+ return { tags: Array.from(tags) };
107
+ }
108
+ /**
109
+ * Select relevant files from the project index based on error paths and tech tags.
110
+ * Returns file paths sorted by relevance (direct matches first, then config, then nearby).
111
+ *
112
+ * @param fileIndex - Lightweight file index.
113
+ * @param errorPaths - Paths extracted from the error.
114
+ * @param tags - Tech tags detected from the error.
115
+ * @returns Array of relative paths to load.
116
+ */
117
+ export function selectRelevantFiles(fileIndex, errorPaths, tags) {
118
+ if (fileIndex.length === 0)
119
+ return [];
120
+ const selected = new Set();
121
+ const MAX_FILES = 15;
122
+ // 1. Direct matches: files mentioned in the error
123
+ for (const errorPath of errorPaths) {
124
+ for (const entry of fileIndex) {
125
+ if (entry.relativePath.endsWith(errorPath) ||
126
+ entry.relativePath === errorPath ||
127
+ entry.relativePath.includes(errorPath)) {
128
+ selected.add(entry.relativePath);
129
+ }
130
+ }
131
+ }
132
+ // 2. Sibling files: files in the same directory as matches
133
+ const matchedDirs = new Set();
134
+ for (const sel of selected) {
135
+ matchedDirs.add(path.dirname(sel));
136
+ }
137
+ for (const dir of matchedDirs) {
138
+ for (const entry of fileIndex) {
139
+ if (path.dirname(entry.relativePath) === dir && selected.size < MAX_FILES) {
140
+ selected.add(entry.relativePath);
141
+ }
142
+ }
143
+ }
144
+ // 3. Tag-based: config files related to detected tech
145
+ if (tags.includes('database') || tags.includes('migration')) {
146
+ for (const entry of fileIndex) {
147
+ if (entry.relativePath.includes('alembic') ||
148
+ entry.relativePath.includes('migration') ||
149
+ entry.relativePath.includes('prisma') ||
150
+ entry.relativePath.includes('schema.sql')) {
151
+ if (selected.size < MAX_FILES)
152
+ selected.add(entry.relativePath);
153
+ }
154
+ }
155
+ }
156
+ if (tags.includes('docker') || tags.includes('compose')) {
157
+ for (const entry of fileIndex) {
158
+ if (entry.relativePath.includes('docker') ||
159
+ entry.relativePath.includes('Dockerfile')) {
160
+ if (selected.size < MAX_FILES)
161
+ selected.add(entry.relativePath);
162
+ }
163
+ }
164
+ }
165
+ // 4. Fallback: always include config files if we have few matches
166
+ if (selected.size < 5) {
167
+ for (const entry of fileIndex) {
168
+ if (entry.isConfig && selected.size < MAX_FILES) {
169
+ selected.add(entry.relativePath);
170
+ }
171
+ }
172
+ }
173
+ return Array.from(selected).slice(0, MAX_FILES);
174
+ }
175
+ /** Image file extensions that Claude can read via the Read tool */
176
+ const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg']);
177
+ /**
178
+ * Extract image/screenshot file paths from user input text.
179
+ * Detects both quoted and unquoted absolute/relative paths ending in image extensions.
180
+ *
181
+ * @param text - User input text.
182
+ * @returns Array of image file paths found in the text.
183
+ */
184
+ export function extractImagePaths(text) {
185
+ const paths = new Set();
186
+ // Quoted paths: '/path/to/image.png' or "/path/to/image.png"
187
+ const quotedPattern = /['"]([^'"]+\.(?:png|jpg|jpeg|gif|webp|bmp|svg))['"]/gi;
188
+ for (const match of text.matchAll(quotedPattern)) {
189
+ paths.add(match[1]);
190
+ }
191
+ // Unquoted absolute paths: /path/to/image.png (no spaces allowed in unquoted)
192
+ const absolutePattern = /(\/[^\s'"]+\.(?:png|jpg|jpeg|gif|webp|bmp|svg))/gi;
193
+ for (const match of text.matchAll(absolutePattern)) {
194
+ paths.add(match[1]);
195
+ }
196
+ return Array.from(paths);
197
+ }
198
+ /**
199
+ * Check if a file path points to an image file.
200
+ *
201
+ * @param filePath - File path to check.
202
+ * @returns True if the file has an image extension.
203
+ */
204
+ export function isImageFile(filePath) {
205
+ const ext = path.extname(filePath).toLowerCase();
206
+ return IMAGE_EXTENSIONS.has(ext);
207
+ }
208
+ /**
209
+ * Normalize a file path by stripping common prefixes (/app/, ./, etc.).
210
+ *
211
+ * @param p - Raw file path from error text.
212
+ * @returns Normalized relative path.
213
+ */
214
+ function normalizePath(p) {
215
+ let normalized = p.replace(/\\/g, '/');
216
+ // Strip common container prefixes
217
+ normalized = normalized.replace(/^\/app\//, '');
218
+ normalized = normalized.replace(/^\.\//, '');
219
+ return normalized;
220
+ }
221
+ //# sourceMappingURL=debug-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-context.js","sourceRoot":"","sources":["../../../src/cli/commands/debug-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Debug session prompts
3
+ * System prompt with strict output contract and conversation history formatting.
4
+ */
5
+ /**
6
+ * Message in the debug conversation history.
7
+ */
8
+ export interface DebugMessage {
9
+ role: 'user' | 'assistant';
10
+ content: string;
11
+ }
12
+ /**
13
+ * Build the system prompt for the debug session.
14
+ *
15
+ * @returns The system prompt instructing Claude on debug response format.
16
+ */
17
+ export declare function getDebugSystemPrompt(): string;
18
+ /**
19
+ * Format conversation history for inclusion in the prompt.
20
+ *
21
+ * @param history - Array of debug messages.
22
+ * @returns Formatted string of conversation history.
23
+ */
24
+ export declare function formatConversationHistory(history: DebugMessage[]): string;
25
+ //# sourceMappingURL=debug-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-prompts.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/debug-prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAqD7C;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAWzE"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Debug session prompts
3
+ * System prompt with strict output contract and conversation history formatting.
4
+ */
5
+ /**
6
+ * Build the system prompt for the debug session.
7
+ *
8
+ * @returns The system prompt instructing Claude on debug response format.
9
+ */
10
+ export function getDebugSystemPrompt() {
11
+ return `You are an expert debugger embedded in the Popeye CLI. Your role is to diagnose
12
+ errors in projects generated by Popeye (full-stack apps, backends, frontends, websites).
13
+
14
+ You have access to the project's file system through your tools. When the user pastes an error,
15
+ diagnose it using the project context provided and the files you can read.
16
+
17
+ ## Response Format
18
+
19
+ You MUST structure every response with these sections:
20
+
21
+ ### Diagnosis
22
+ Explain what is wrong and why it is happening. Be specific -- reference exact module names,
23
+ configuration keys, or missing dependencies.
24
+
25
+ ### Evidence
26
+ List the specific files and lines that confirm your diagnosis. Use the format:
27
+ - \`path/to/file.ts:42\` -- description of what you found
28
+
29
+ ### Proposed Fix
30
+ Provide the exact changes needed. Show file paths and the code to add, modify, or remove.
31
+ Use diff-style formatting when helpful:
32
+ \`\`\`diff
33
+ - old line
34
+ + new line
35
+ \`\`\`
36
+
37
+ ### Commands to Verify
38
+ List shell commands the user should run to confirm the fix works. For example:
39
+ \`\`\`bash
40
+ docker-compose up --build
41
+ npm run dev
42
+ pytest tests/ -v
43
+ \`\`\`
44
+
45
+ ### Ready to Apply?
46
+ End with a short note reminding the user they can type \`/fix\` in the debug session
47
+ to have Popeye apply the proposed changes automatically.
48
+
49
+ ## Screenshots and Images
50
+ - Users may paste file paths to screenshots or images (e.g., \`/path/to/Screenshot.png\`).
51
+ - When you see an image path in the user's message, use the **Read** tool to view it.
52
+ The Read tool supports PNG, JPG, GIF, WebP, and other image formats.
53
+ - After viewing the screenshot, analyze what it shows (UI bugs, missing elements, error dialogs,
54
+ browser console errors, terminal output, etc.) and include your visual findings in the Diagnosis.
55
+ - If the image path is invalid or unreadable, tell the user and ask them to verify the path.
56
+
57
+ ## Rules
58
+ - Never guess. If you need more context, ask the user or read additional files.
59
+ - Reference actual file paths from the project, not hypothetical ones.
60
+ - When multiple issues exist, address the root cause first.
61
+ - Keep explanations concise -- developers are your audience.
62
+ - If the error is outside the project (e.g., a system-level issue), say so clearly.`;
63
+ }
64
+ /**
65
+ * Format conversation history for inclusion in the prompt.
66
+ *
67
+ * @param history - Array of debug messages.
68
+ * @returns Formatted string of conversation history.
69
+ */
70
+ export function formatConversationHistory(history) {
71
+ if (history.length === 0)
72
+ return '';
73
+ const lines = ['## Previous Conversation'];
74
+ for (const msg of history) {
75
+ const role = msg.role === 'user' ? 'User' : 'Assistant';
76
+ lines.push(`\n**${role}:**\n${msg.content}`);
77
+ }
78
+ return lines.join('\n');
79
+ }
80
+ //# sourceMappingURL=debug-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-prompts.js","sourceRoot":"","sources":["../../../src/cli/commands/debug-prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFAmD2E,CAAC;AACrF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAuB;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAa,CAAC,0BAA0B,CAAC,CAAC;IAErD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Debug command
3
+ * Interactive debugging session that primes Claude with project context
4
+ * and lets users paste errors for AI-assisted diagnosis and fixes.
5
+ */
6
+ import { Command } from 'commander';
7
+ import type { FileIndexEntry } from './debug-context.js';
8
+ import type { DebugMessage } from './debug-prompts.js';
9
+ /**
10
+ * Context gathered about the project for debug sessions.
11
+ */
12
+ export interface DebugContext {
13
+ projectDir: string;
14
+ structureSummary: string;
15
+ purpose: string;
16
+ claudeMd?: string;
17
+ readme?: string;
18
+ anchorFiles: Record<string, string>;
19
+ fileIndex: FileIndexEntry[];
20
+ language: string;
21
+ }
22
+ /**
23
+ * Options for starting a debug session.
24
+ */
25
+ export interface DebugSessionOptions {
26
+ projectDir: string;
27
+ language: string;
28
+ }
29
+ /**
30
+ * Gather debug context for the project. Builds a lightweight index and
31
+ * reads anchor documents (CLAUDE.md, README, config files).
32
+ *
33
+ * @param projectDir - Project root directory.
34
+ * @param language - Project language/type.
35
+ * @returns DebugContext with project metadata and file index.
36
+ */
37
+ export declare function gatherDebugContext(projectDir: string, language: string): Promise<DebugContext>;
38
+ /**
39
+ * Display project summary to the user at the start of a debug session.
40
+ *
41
+ * @param context - The gathered debug context.
42
+ */
43
+ export declare function displayProjectSummary(context: DebugContext): void;
44
+ /**
45
+ * Build the full debug prompt for Claude, combining project context,
46
+ * relevant file contents, conversation history, and the current message.
47
+ *
48
+ * @param context - Debug context with project metadata.
49
+ * @param history - Conversation history.
50
+ * @param userMessage - Current user message/error.
51
+ * @param relevantFileContents - Map of file path -> content for relevant files.
52
+ * @param imagePaths - Optional array of image/screenshot paths to read.
53
+ * @returns Assembled prompt string.
54
+ */
55
+ export declare function buildDebugPrompt(context: DebugContext, history: DebugMessage[], userMessage: string, relevantFileContents: Record<string, string>, imagePaths?: string[]): string;
56
+ /**
57
+ * Run the interactive debug session sub-REPL.
58
+ *
59
+ * @param options - Debug session options (projectDir, language).
60
+ */
61
+ export declare function runDebugSession(options: DebugSessionOptions): Promise<void>;
62
+ /**
63
+ * Create the Commander.js debug command for CLI usage.
64
+ *
65
+ * @returns Commander Command instance.
66
+ */
67
+ export declare function createDebugCommand(): Command;
68
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/debug.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiBvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAiCjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5C,UAAU,GAAE,MAAM,EAAO,GACxB,MAAM,CAmDR;AAuHD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoIjF;AAqDD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAyB5C"}