@hivehub/rulebook 3.4.2 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/.claude/commands/continue.md +33 -0
  2. package/.claude-plugin/marketplace.json +28 -29
  3. package/.claude-plugin/plugin.json +8 -8
  4. package/README.md +66 -144
  5. package/dist/agents/ralph-parser.d.ts +41 -1
  6. package/dist/agents/ralph-parser.d.ts.map +1 -1
  7. package/dist/agents/ralph-parser.js +202 -14
  8. package/dist/agents/ralph-parser.js.map +1 -1
  9. package/dist/cli/commands.d.ts +65 -0
  10. package/dist/cli/commands.d.ts.map +1 -1
  11. package/dist/cli/commands.js +837 -61
  12. package/dist/cli/commands.js.map +1 -1
  13. package/dist/core/agent-manager.d.ts +7 -0
  14. package/dist/core/agent-manager.d.ts.map +1 -1
  15. package/dist/core/agent-manager.js +150 -3
  16. package/dist/core/agent-manager.js.map +1 -1
  17. package/dist/core/claude-mcp.d.ts +17 -0
  18. package/dist/core/claude-mcp.d.ts.map +1 -1
  19. package/dist/core/claude-mcp.js +90 -6
  20. package/dist/core/claude-mcp.js.map +1 -1
  21. package/dist/core/config-manager.d.ts.map +1 -1
  22. package/dist/core/config-manager.js +40 -0
  23. package/dist/core/config-manager.js.map +1 -1
  24. package/dist/core/cursor-mdc-generator.d.ts +30 -0
  25. package/dist/core/cursor-mdc-generator.d.ts.map +1 -0
  26. package/dist/core/cursor-mdc-generator.js +98 -0
  27. package/dist/core/cursor-mdc-generator.js.map +1 -0
  28. package/dist/core/detector.d.ts +25 -1
  29. package/dist/core/detector.d.ts.map +1 -1
  30. package/dist/core/detector.js +321 -1
  31. package/dist/core/detector.js.map +1 -1
  32. package/dist/core/generator.d.ts +10 -0
  33. package/dist/core/generator.d.ts.map +1 -1
  34. package/dist/core/generator.js +177 -3
  35. package/dist/core/generator.js.map +1 -1
  36. package/dist/core/github-issues-importer.d.ts +82 -0
  37. package/dist/core/github-issues-importer.d.ts.map +1 -0
  38. package/dist/core/github-issues-importer.js +161 -0
  39. package/dist/core/github-issues-importer.js.map +1 -0
  40. package/dist/core/health-scorer.d.ts +39 -0
  41. package/dist/core/health-scorer.d.ts.map +1 -1
  42. package/dist/core/health-scorer.js +256 -13
  43. package/dist/core/health-scorer.js.map +1 -1
  44. package/dist/core/indexer/background-indexer.d.ts +27 -0
  45. package/dist/core/indexer/background-indexer.d.ts.map +1 -0
  46. package/dist/core/indexer/background-indexer.js +135 -0
  47. package/dist/core/indexer/background-indexer.js.map +1 -0
  48. package/dist/core/indexer/file-parser.d.ts +28 -0
  49. package/dist/core/indexer/file-parser.d.ts.map +1 -0
  50. package/dist/core/indexer/file-parser.js +171 -0
  51. package/dist/core/indexer/file-parser.js.map +1 -0
  52. package/dist/core/indexer/indexer-types.d.ts +35 -0
  53. package/dist/core/indexer/indexer-types.d.ts.map +1 -0
  54. package/dist/core/indexer/indexer-types.js +8 -0
  55. package/dist/core/indexer/indexer-types.js.map +1 -0
  56. package/dist/core/iteration-tracker.d.ts +28 -0
  57. package/dist/core/iteration-tracker.d.ts.map +1 -1
  58. package/dist/core/iteration-tracker.js +86 -0
  59. package/dist/core/iteration-tracker.js.map +1 -1
  60. package/dist/core/multi-tool-generator.d.ts +59 -0
  61. package/dist/core/multi-tool-generator.d.ts.map +1 -0
  62. package/dist/core/multi-tool-generator.js +157 -0
  63. package/dist/core/multi-tool-generator.js.map +1 -0
  64. package/dist/core/override-manager.d.ts +23 -0
  65. package/dist/core/override-manager.d.ts.map +1 -0
  66. package/dist/core/override-manager.js +82 -0
  67. package/dist/core/override-manager.js.map +1 -0
  68. package/dist/core/plans-manager.d.ts +46 -0
  69. package/dist/core/plans-manager.d.ts.map +1 -0
  70. package/dist/core/plans-manager.js +158 -0
  71. package/dist/core/plans-manager.js.map +1 -0
  72. package/dist/core/prd-generator.d.ts +12 -0
  73. package/dist/core/prd-generator.d.ts.map +1 -1
  74. package/dist/core/prd-generator.js +91 -2
  75. package/dist/core/prd-generator.js.map +1 -1
  76. package/dist/core/ralph-manager.d.ts +47 -1
  77. package/dist/core/ralph-manager.d.ts.map +1 -1
  78. package/dist/core/ralph-manager.js +107 -0
  79. package/dist/core/ralph-manager.js.map +1 -1
  80. package/dist/core/ralph-parallel.d.ts +55 -0
  81. package/dist/core/ralph-parallel.d.ts.map +1 -0
  82. package/dist/core/ralph-parallel.js +201 -0
  83. package/dist/core/ralph-parallel.js.map +1 -0
  84. package/dist/core/ralph-plan-checkpoint.d.ts +58 -0
  85. package/dist/core/ralph-plan-checkpoint.d.ts.map +1 -0
  86. package/dist/core/ralph-plan-checkpoint.js +154 -0
  87. package/dist/core/ralph-plan-checkpoint.js.map +1 -0
  88. package/dist/core/ralph-scripts.d.ts +12 -0
  89. package/dist/core/ralph-scripts.d.ts.map +1 -0
  90. package/dist/core/ralph-scripts.js +49 -0
  91. package/dist/core/ralph-scripts.js.map +1 -0
  92. package/dist/core/review-manager.d.ts +74 -0
  93. package/dist/core/review-manager.d.ts.map +1 -0
  94. package/dist/core/review-manager.js +371 -0
  95. package/dist/core/review-manager.js.map +1 -0
  96. package/dist/index.js +94 -2
  97. package/dist/index.js.map +1 -1
  98. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  99. package/dist/mcp/rulebook-server.js +117 -8
  100. package/dist/mcp/rulebook-server.js.map +1 -1
  101. package/dist/memory/memory-manager.d.ts +4 -1
  102. package/dist/memory/memory-manager.d.ts.map +1 -1
  103. package/dist/memory/memory-manager.js +33 -4
  104. package/dist/memory/memory-manager.js.map +1 -1
  105. package/dist/memory/memory-search.d.ts +2 -2
  106. package/dist/memory/memory-search.d.ts.map +1 -1
  107. package/dist/memory/memory-search.js +19 -0
  108. package/dist/memory/memory-search.js.map +1 -1
  109. package/dist/memory/memory-store.d.ts +13 -0
  110. package/dist/memory/memory-store.d.ts.map +1 -1
  111. package/dist/memory/memory-store.js +92 -1
  112. package/dist/memory/memory-store.js.map +1 -1
  113. package/dist/memory/memory-types.d.ts +15 -0
  114. package/dist/memory/memory-types.d.ts.map +1 -1
  115. package/dist/types.d.ts +55 -2
  116. package/dist/types.d.ts.map +1 -1
  117. package/package.json +1 -1
  118. package/templates/agents/implementer.md +35 -0
  119. package/templates/agents/researcher.md +34 -0
  120. package/templates/agents/team-lead.md +34 -0
  121. package/templates/agents/tester.md +42 -0
  122. package/templates/ci/rulebook-review.yml +26 -0
  123. package/templates/commands/rulebook-task-archive.md +24 -0
  124. package/templates/core/AGENTS_LEAN.md +25 -0
  125. package/templates/core/AGENTS_OVERRIDE.md +16 -0
  126. package/templates/core/MULTI_AGENT.md +74 -0
  127. package/templates/core/PLANS.md +28 -0
  128. package/templates/core/RALPH.md +45 -4
  129. package/templates/core/RULEBOOK.md +42 -0
  130. package/templates/ides/CONTINUE_RULES.md +16 -0
  131. package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -0
  132. package/templates/ides/GEMINI_RULES.md +17 -0
  133. package/templates/ides/WINDSURF_RULES.md +14 -0
  134. package/templates/ides/cursor-mdc/go.mdc +24 -0
  135. package/templates/ides/cursor-mdc/python.mdc +24 -0
  136. package/templates/ides/cursor-mdc/quality.mdc +25 -0
  137. package/templates/ides/cursor-mdc/ralph.mdc +39 -0
  138. package/templates/ides/cursor-mdc/rulebook.mdc +38 -0
  139. package/templates/ides/cursor-mdc/rust.mdc +24 -0
  140. package/templates/ides/cursor-mdc/typescript.mdc +25 -0
  141. package/templates/modules/sequential-thinking.md +42 -0
  142. package/templates/ralph/ralph-history.bat +4 -0
  143. package/templates/ralph/ralph-history.sh +5 -0
  144. package/templates/ralph/ralph-init.bat +5 -0
  145. package/templates/ralph/ralph-init.sh +5 -0
  146. package/templates/ralph/ralph-pause.bat +5 -0
  147. package/templates/ralph/ralph-pause.sh +5 -0
  148. package/templates/ralph/ralph-run.bat +5 -0
  149. package/templates/ralph/ralph-run.sh +5 -0
  150. package/templates/ralph/ralph-status.bat +4 -0
  151. package/templates/ralph/ralph-status.sh +5 -0
  152. package/templates/services/DATADOG.md +26 -0
  153. package/templates/services/DOCKER.md +124 -0
  154. package/templates/services/DOCKER_COMPOSE.md +168 -0
  155. package/templates/services/HELM.md +194 -0
  156. package/templates/services/KUBERNETES.md +208 -0
  157. package/templates/services/OPENTELEMETRY.md +25 -0
  158. package/templates/services/PINO.md +24 -0
  159. package/templates/services/PROMETHEUS.md +33 -0
  160. package/templates/services/SENTRY.md +23 -0
  161. package/templates/services/WINSTON.md +30 -0
  162. package/dist/core/openspec-manager.d.ts +0 -133
  163. package/dist/core/openspec-manager.d.ts.map +0 -1
  164. package/dist/core/openspec-manager.js +0 -596
  165. package/dist/core/openspec-manager.js.map +0 -1
  166. package/dist/core/openspec-migrator.d.ts +0 -27
  167. package/dist/core/openspec-migrator.d.ts.map +0 -1
  168. package/dist/core/openspec-migrator.js +0 -262
  169. package/dist/core/openspec-migrator.js.map +0 -1
  170. package/dist/core/test-task-manager.d.ts +0 -49
  171. package/dist/core/test-task-manager.d.ts.map +0 -1
  172. package/dist/core/test-task-manager.js +0 -121
  173. package/dist/core/test-task-manager.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import chalk from 'chalk';
4
+ const defaultExecAsync = promisify(exec);
5
+ // ─── Plan generation ─────────────────────────────────────────────────────────
6
+ /**
7
+ * Build the planning-only prompt sent to the AI CLI tool.
8
+ *
9
+ * The prompt asks for an implementation plan without generating any code.
10
+ */
11
+ export function buildPlanPrompt(story) {
12
+ const criteria = story.acceptanceCriteria.map((c) => `- ${c}`).join('\n');
13
+ return [
14
+ 'You are planning (NOT implementing) a solution for this story:',
15
+ '',
16
+ `Story: ${story.title}`,
17
+ `Description: ${story.description}`,
18
+ `Acceptance Criteria:`,
19
+ criteria,
20
+ '',
21
+ 'Provide a detailed implementation plan covering:',
22
+ '1. Files to create/modify',
23
+ '2. Key design decisions',
24
+ '3. Potential risks or blockers',
25
+ '4. Estimated implementation steps',
26
+ '',
27
+ 'IMPORTANT: Output ONLY the plan. Do NOT implement or generate code.',
28
+ ].join('\n');
29
+ }
30
+ /**
31
+ * Generate an implementation plan for a user story by invoking an AI CLI tool.
32
+ *
33
+ * Uses the same execution pattern as {@link review-manager#runAIReview} — runs
34
+ * the tool binary with the prompt piped via stdin (for Claude) or as an
35
+ * argument (for Gemini / Amp).
36
+ *
37
+ * @returns The plan text, or an empty string if the tool fails or times out.
38
+ */
39
+ export async function generateIterationPlan(story, tool, _projectRoot, execFn = defaultExecAsync) {
40
+ const prompt = buildPlanPrompt(story);
41
+ const commands = {
42
+ claude: 'claude',
43
+ gemini: 'gemini',
44
+ amp: 'amp',
45
+ };
46
+ const binary = commands[tool];
47
+ const flag = tool === 'gemini' ? '' : '-p';
48
+ // Pipe prompt via stdin to avoid shell escaping and arg-length issues
49
+ const escapedPrompt = prompt.replace(/'/g, "'\\''");
50
+ const command = flag
51
+ ? `echo '${escapedPrompt}' | ${binary} ${flag} -`
52
+ : `${binary} '${escapedPrompt}'`;
53
+ try {
54
+ const { stdout } = await execFn(command, { timeout: 120_000 });
55
+ return stdout.trim();
56
+ }
57
+ catch {
58
+ return '';
59
+ }
60
+ }
61
+ // ─── Plan display ────────────────────────────────────────────────────────────
62
+ /**
63
+ * Display the generated plan in the terminal with a chalk-styled border.
64
+ *
65
+ * Uses simple `console.log` output — no blessed/ncurses dependencies.
66
+ */
67
+ export function displayPlan(plan, storyTitle) {
68
+ const maxWidth = 60;
69
+ const titleLine = ` Story: ${storyTitle}`;
70
+ const headerLine = ' Implementation Plan';
71
+ const width = Math.max(maxWidth, headerLine.length + 4, titleLine.length + 4);
72
+ const top = chalk.cyan(`${'='.repeat(width + 4)}`);
73
+ const bottom = chalk.cyan(`${'='.repeat(width + 4)}`);
74
+ console.log('');
75
+ console.log(top);
76
+ console.log(chalk.cyan.bold(headerLine));
77
+ console.log(chalk.cyan(titleLine));
78
+ console.log(bottom);
79
+ console.log('');
80
+ console.log(plan);
81
+ console.log('');
82
+ }
83
+ /**
84
+ * Display the plan and interactively request approval from the user.
85
+ *
86
+ * When `autoApproveAfterSeconds` is greater than zero the plan is automatically
87
+ * approved after the specified delay. Otherwise an interactive inquirer prompt
88
+ * is presented with three choices: approve, reject, or edit.
89
+ *
90
+ * @returns Approval result indicating whether to proceed and optional feedback.
91
+ */
92
+ export async function requestPlanApproval(plan, story, autoApproveAfterSeconds) {
93
+ displayPlan(plan, story.title);
94
+ // Auto-approve path
95
+ if (autoApproveAfterSeconds > 0) {
96
+ console.log(chalk.yellow(` Auto-approving in ${autoApproveAfterSeconds} seconds... (Ctrl+C to abort)`));
97
+ await new Promise((resolve) => setTimeout(resolve, autoApproveAfterSeconds * 1000));
98
+ console.log(chalk.green(' Plan auto-approved.'));
99
+ return { approved: true };
100
+ }
101
+ // Interactive prompt path
102
+ const inquirer = (await import('inquirer')).default;
103
+ const { action } = await inquirer.prompt([
104
+ {
105
+ type: 'list',
106
+ name: 'action',
107
+ message: 'Review plan:',
108
+ choices: [
109
+ { name: 'approve', value: 'approve' },
110
+ { name: 'reject', value: 'reject' },
111
+ { name: 'edit', value: 'edit' },
112
+ ],
113
+ },
114
+ ]);
115
+ if (action === 'approve') {
116
+ return { approved: true };
117
+ }
118
+ const feedbackMessage = action === 'reject' ? 'Reason for rejection?' : 'What needs to change?';
119
+ const { feedback } = await inquirer.prompt([
120
+ {
121
+ type: 'input',
122
+ name: 'feedback',
123
+ message: feedbackMessage,
124
+ },
125
+ ]);
126
+ return { approved: false, feedback };
127
+ }
128
+ // ─── Checkpoint gate ─────────────────────────────────────────────────────────
129
+ /**
130
+ * Determine whether a plan checkpoint should be executed for the given story.
131
+ *
132
+ * Returns `false` when:
133
+ * - The checkpoint feature is disabled.
134
+ * - The session is non-interactive (CI, --yes flag, piped stdin).
135
+ * - `requireApprovalForStories` is `'none'`.
136
+ * - `requireApprovalForStories` is `'failed'` but the story already passes.
137
+ */
138
+ export function shouldRunCheckpoint(config, story, isNonInteractive) {
139
+ if (!config.enabled) {
140
+ return false;
141
+ }
142
+ if (isNonInteractive) {
143
+ return false;
144
+ }
145
+ if (config.requireApprovalForStories === 'none') {
146
+ return false;
147
+ }
148
+ if (config.requireApprovalForStories === 'all') {
149
+ return true;
150
+ }
151
+ // 'failed' — only checkpoint stories that haven't passed yet
152
+ return !story.passes;
153
+ }
154
+ //# sourceMappingURL=ralph-plan-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-plan-checkpoint.js","sourceRoot":"","sources":["../../src/core/ralph-plan-checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Install Ralph shell scripts into the project's `.rulebook/scripts/` directory.
3
+ *
4
+ * Copies `.sh` and `.bat` script pairs from the templates directory.
5
+ * Sets executable permissions (0o755) on `.sh` files on non-Windows platforms.
6
+ * Idempotent: overwrites existing scripts without error.
7
+ *
8
+ * @param projectRoot - Absolute path to the project root directory.
9
+ * @returns List of installed file paths (relative to projectRoot).
10
+ */
11
+ export declare function installRalphScripts(projectRoot: string): Promise<string[]>;
12
+ //# sourceMappingURL=ralph-scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-scripts.d.ts","sourceRoot":"","sources":["../../src/core/ralph-scripts.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BhF"}
@@ -0,0 +1,49 @@
1
+ import path from 'path';
2
+ import { promises as fs } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { copyFile, ensureDir } from '../utils/file-system.js';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ /** Resolve templates/ralph directory (handles both dev and production). */
8
+ function getRalphTemplatesDir() {
9
+ return path.join(__dirname, '..', '..', 'templates', 'ralph');
10
+ }
11
+ const RALPH_SCRIPTS = [
12
+ 'ralph-init',
13
+ 'ralph-run',
14
+ 'ralph-status',
15
+ 'ralph-pause',
16
+ 'ralph-history',
17
+ ];
18
+ const SCRIPT_EXTENSIONS = ['.sh', '.bat'];
19
+ /**
20
+ * Install Ralph shell scripts into the project's `.rulebook/scripts/` directory.
21
+ *
22
+ * Copies `.sh` and `.bat` script pairs from the templates directory.
23
+ * Sets executable permissions (0o755) on `.sh` files on non-Windows platforms.
24
+ * Idempotent: overwrites existing scripts without error.
25
+ *
26
+ * @param projectRoot - Absolute path to the project root directory.
27
+ * @returns List of installed file paths (relative to projectRoot).
28
+ */
29
+ export async function installRalphScripts(projectRoot) {
30
+ const templatesDir = getRalphTemplatesDir();
31
+ const scriptsDir = path.join(projectRoot, '.rulebook', 'scripts');
32
+ await ensureDir(scriptsDir);
33
+ const installed = [];
34
+ for (const scriptName of RALPH_SCRIPTS) {
35
+ for (const ext of SCRIPT_EXTENSIONS) {
36
+ const filename = `${scriptName}${ext}`;
37
+ const source = path.join(templatesDir, filename);
38
+ const destination = path.join(scriptsDir, filename);
39
+ await copyFile(source, destination);
40
+ // Set executable permissions on .sh files (Unix/macOS only)
41
+ if (ext === '.sh' && process.platform !== 'win32') {
42
+ await fs.chmod(destination, 0o755);
43
+ }
44
+ installed.push(path.join('.rulebook', 'scripts', filename));
45
+ }
46
+ }
47
+ return installed;
48
+ }
49
+ //# sourceMappingURL=ralph-scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-scripts.js","sourceRoot":"","sources":["../../src/core/ralph-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,2EAA2E;AAC3E,SAAS,oBAAoB;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,aAAa,GAAG;IACpB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,aAAa;IACb,eAAe;CACP,CAAC;AAEX,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAElE,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEpD,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEpC,4DAA4D;YAC5D,IAAI,GAAG,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAClD,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,74 @@
1
+ export interface ReviewIssue {
2
+ severity: 'critical' | 'major' | 'minor' | 'suggestion';
3
+ file?: string;
4
+ line?: number;
5
+ message: string;
6
+ code?: string;
7
+ }
8
+ export interface ReviewResult {
9
+ summary: string;
10
+ issues: ReviewIssue[];
11
+ suggestions: string[];
12
+ /** True when no critical or major issues are present. */
13
+ approved: boolean;
14
+ }
15
+ export type ReviewOutputFormat = 'terminal' | 'github-comment' | 'json';
16
+ export type ReviewFailOnSeverity = 'critical' | 'major' | 'minor';
17
+ export type ReviewTool = 'claude' | 'gemini' | 'amp';
18
+ /**
19
+ * Retrieve the git diff between the current HEAD and a base branch.
20
+ *
21
+ * Returns an empty string when:
22
+ * - The working directory is not a git repo.
23
+ * - There is no diff between the branches.
24
+ * - An error occurs during execution.
25
+ *
26
+ * The returned string is truncated to {@link MAX_DIFF_LENGTH} characters.
27
+ */
28
+ export declare function getDiffContext(projectRoot: string, baseBranch?: string): Promise<string>;
29
+ /**
30
+ * Build a structured review prompt suitable for an AI code reviewer.
31
+ */
32
+ export declare function buildReviewPrompt(diff: string, context: {
33
+ agentsMdContent?: string;
34
+ projectName?: string;
35
+ }): string;
36
+ /**
37
+ * Parse the raw AI output into a structured {@link ReviewResult}.
38
+ *
39
+ * Handles missing sections gracefully — every field has a sensible default.
40
+ */
41
+ export declare function parseReviewOutput(output: string): ReviewResult;
42
+ /**
43
+ * Run the specified AI CLI tool with the given prompt.
44
+ *
45
+ * Returns the tool's stdout. On any error (timeout, missing tool, etc.)
46
+ * returns an empty string.
47
+ */
48
+ export declare function runAIReview(prompt: string, tool?: ReviewTool): Promise<string>;
49
+ /**
50
+ * Format a {@link ReviewResult} as a chalk-colored terminal string.
51
+ */
52
+ export declare function formatReviewTerminal(result: ReviewResult): string;
53
+ /**
54
+ * Format a {@link ReviewResult} as a GitHub-flavored markdown comment.
55
+ */
56
+ export declare function formatReviewMarkdown(result: ReviewResult): string;
57
+ /**
58
+ * Post a review result as a PR comment using the `gh` CLI.
59
+ *
60
+ * When `prNumber` is omitted the `gh` CLI auto-detects the current PR
61
+ * from the branch.
62
+ */
63
+ export declare function postGitHubComment(result: ReviewResult, prNumber?: string): Promise<void>;
64
+ /**
65
+ * Check whether any issue meets or exceeds the given severity threshold.
66
+ *
67
+ * Returns `true` when at least one issue is at the threshold level or higher.
68
+ */
69
+ export declare function hasFailingIssues(issues: readonly ReviewIssue[], failOn: ReviewFailOnSeverity): boolean;
70
+ /**
71
+ * Read AGENTS.md from the given project root, if it exists.
72
+ */
73
+ export declare function readAgentsMd(projectRoot: string): Promise<string | undefined>;
74
+ //# sourceMappingURL=review-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-manager.d.ts","sourceRoot":"","sources":["../../src/core/review-manager.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yDAAyD;IACzD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAExE,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAIrD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAe,GAC1B,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,MAAM,CAiCR;AAWD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAW9D;AA4ED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB9F;AAkBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA2DjE;AAoBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAyCjE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9F;AAWD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAGT;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAMnF"}