popeye-cli 2.1.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/gemini.d.ts +14 -0
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +41 -6
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/grok.d.ts +14 -0
- package/dist/adapters/grok.d.ts.map +1 -1
- package/dist/adapters/grok.js +42 -6
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/openai.d.ts +10 -0
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +44 -5
- package/dist/adapters/openai.js.map +1 -1
- package/dist/cli/commands/create.js +1 -1
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +328 -21
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +25 -2
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/doc-parser.d.ts +21 -6
- package/dist/generators/doc-parser.d.ts.map +1 -1
- package/dist/generators/doc-parser.js +55 -4
- package/dist/generators/doc-parser.js.map +1 -1
- package/dist/generators/templates/fullstack.js +1 -1
- package/dist/generators/templates/website-components.js +1 -1
- package/dist/generators/templates/website-components.js.map +1 -1
- package/dist/generators/templates/website-config.d.ts +4 -1
- package/dist/generators/templates/website-config.d.ts.map +1 -1
- package/dist/generators/templates/website-config.js +17 -11
- package/dist/generators/templates/website-config.js.map +1 -1
- package/dist/generators/templates/website-conversion.js +1 -1
- package/dist/generators/templates/website-conversion.js.map +1 -1
- package/dist/generators/templates/website-landing.js +1 -1
- package/dist/generators/templates/website-landing.js.map +1 -1
- package/dist/generators/templates/website-layout.d.ts +36 -4
- package/dist/generators/templates/website-layout.d.ts.map +1 -1
- package/dist/generators/templates/website-layout.js +466 -23
- package/dist/generators/templates/website-layout.js.map +1 -1
- package/dist/generators/templates/website-pricing.js +1 -1
- package/dist/generators/templates/website-pricing.js.map +1 -1
- package/dist/generators/templates/website-sections.js +1 -1
- package/dist/generators/templates/website-sections.js.map +1 -1
- package/dist/generators/templates/website-seo.d.ts.map +1 -1
- package/dist/generators/templates/website-seo.js +4 -1
- package/dist/generators/templates/website-seo.js.map +1 -1
- package/dist/generators/templates/website.d.ts +1 -1
- package/dist/generators/templates/website.d.ts.map +1 -1
- package/dist/generators/templates/website.js +1 -1
- package/dist/generators/templates/website.js.map +1 -1
- package/dist/generators/website-content-ai.d.ts +52 -0
- package/dist/generators/website-content-ai.d.ts.map +1 -0
- package/dist/generators/website-content-ai.js +141 -0
- package/dist/generators/website-content-ai.js.map +1 -0
- package/dist/generators/website-content-scanner.d.ts +1 -1
- package/dist/generators/website-content-scanner.d.ts.map +1 -1
- package/dist/generators/website-content-scanner.js +98 -1
- package/dist/generators/website-content-scanner.js.map +1 -1
- package/dist/generators/website-context.d.ts +34 -1
- package/dist/generators/website-context.d.ts.map +1 -1
- package/dist/generators/website-context.js +131 -9
- package/dist/generators/website-context.js.map +1 -1
- package/dist/generators/website-debug.d.ts +12 -0
- package/dist/generators/website-debug.d.ts.map +1 -1
- package/dist/generators/website-debug.js +16 -0
- package/dist/generators/website-debug.js.map +1 -1
- package/dist/generators/website.d.ts.map +1 -1
- package/dist/generators/website.js +26 -4
- package/dist/generators/website.js.map +1 -1
- package/dist/pipeline/artifact-manager.d.ts.map +1 -1
- package/dist/pipeline/artifact-manager.js +3 -0
- package/dist/pipeline/artifact-manager.js.map +1 -1
- package/dist/pipeline/auto-recovery.d.ts +56 -0
- package/dist/pipeline/auto-recovery.d.ts.map +1 -0
- package/dist/pipeline/auto-recovery.js +185 -0
- package/dist/pipeline/auto-recovery.js.map +1 -0
- package/dist/pipeline/change-request.d.ts +39 -0
- package/dist/pipeline/change-request.d.ts.map +1 -1
- package/dist/pipeline/change-request.js +40 -1
- package/dist/pipeline/change-request.js.map +1 -1
- package/dist/pipeline/check-runner.d.ts +30 -1
- package/dist/pipeline/check-runner.d.ts.map +1 -1
- package/dist/pipeline/check-runner.js +122 -1
- package/dist/pipeline/check-runner.js.map +1 -1
- package/dist/pipeline/command-resolver.d.ts.map +1 -1
- package/dist/pipeline/command-resolver.js +33 -2
- package/dist/pipeline/command-resolver.js.map +1 -1
- package/dist/pipeline/consensus/arbitrator-query.d.ts +22 -0
- package/dist/pipeline/consensus/arbitrator-query.d.ts.map +1 -0
- package/dist/pipeline/consensus/arbitrator-query.js +70 -0
- package/dist/pipeline/consensus/arbitrator-query.js.map +1 -0
- package/dist/pipeline/consensus/consensus-runner.d.ts +131 -7
- package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -1
- package/dist/pipeline/consensus/consensus-runner.js +809 -35
- package/dist/pipeline/consensus/consensus-runner.js.map +1 -1
- package/dist/pipeline/cr-lifecycle.d.ts +42 -0
- package/dist/pipeline/cr-lifecycle.d.ts.map +1 -0
- package/dist/pipeline/cr-lifecycle.js +89 -0
- package/dist/pipeline/cr-lifecycle.js.map +1 -0
- package/dist/pipeline/gate-engine.d.ts +1 -0
- package/dist/pipeline/gate-engine.d.ts.map +1 -1
- package/dist/pipeline/gate-engine.js +27 -8
- package/dist/pipeline/gate-engine.js.map +1 -1
- package/dist/pipeline/migration.d.ts.map +1 -1
- package/dist/pipeline/migration.js +3 -26
- package/dist/pipeline/migration.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts +1 -1
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +311 -16
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/packets/consensus-packet-builder.d.ts +15 -4
- package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -1
- package/dist/pipeline/packets/consensus-packet-builder.js +29 -17
- package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -1
- package/dist/pipeline/phases/architecture.d.ts.map +1 -1
- package/dist/pipeline/phases/architecture.js +5 -3
- package/dist/pipeline/phases/architecture.js.map +1 -1
- package/dist/pipeline/phases/audit.d.ts.map +1 -1
- package/dist/pipeline/phases/audit.js +5 -3
- package/dist/pipeline/phases/audit.js.map +1 -1
- package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -1
- package/dist/pipeline/phases/consensus-architecture.js +10 -1
- package/dist/pipeline/phases/consensus-architecture.js.map +1 -1
- package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -1
- package/dist/pipeline/phases/consensus-master-plan.js +10 -3
- package/dist/pipeline/phases/consensus-master-plan.js.map +1 -1
- package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -1
- package/dist/pipeline/phases/consensus-role-plans.js +10 -1
- package/dist/pipeline/phases/consensus-role-plans.js.map +1 -1
- package/dist/pipeline/phases/done.d.ts.map +1 -1
- package/dist/pipeline/phases/done.js +9 -4
- package/dist/pipeline/phases/done.js.map +1 -1
- package/dist/pipeline/phases/intake.d.ts +1 -0
- package/dist/pipeline/phases/intake.d.ts.map +1 -1
- package/dist/pipeline/phases/intake.js +56 -13
- package/dist/pipeline/phases/intake.js.map +1 -1
- package/dist/pipeline/phases/phase-context.d.ts +2 -0
- package/dist/pipeline/phases/phase-context.d.ts.map +1 -1
- package/dist/pipeline/phases/phase-context.js +3 -1
- package/dist/pipeline/phases/phase-context.js.map +1 -1
- package/dist/pipeline/phases/production-gate.d.ts.map +1 -1
- package/dist/pipeline/phases/production-gate.js +28 -3
- package/dist/pipeline/phases/production-gate.js.map +1 -1
- package/dist/pipeline/phases/qa-validation.d.ts.map +1 -1
- package/dist/pipeline/phases/qa-validation.js +38 -5
- package/dist/pipeline/phases/qa-validation.js.map +1 -1
- package/dist/pipeline/phases/recovery-loop.d.ts +2 -0
- package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -1
- package/dist/pipeline/phases/recovery-loop.js +200 -6
- package/dist/pipeline/phases/recovery-loop.js.map +1 -1
- package/dist/pipeline/phases/review.d.ts.map +1 -1
- package/dist/pipeline/phases/review.js +58 -28
- package/dist/pipeline/phases/review.js.map +1 -1
- package/dist/pipeline/phases/role-planning.d.ts.map +1 -1
- package/dist/pipeline/phases/role-planning.js +20 -5
- package/dist/pipeline/phases/role-planning.js.map +1 -1
- package/dist/pipeline/phases/stuck.d.ts.map +1 -1
- package/dist/pipeline/phases/stuck.js +10 -0
- package/dist/pipeline/phases/stuck.js.map +1 -1
- package/dist/pipeline/repo-snapshot.d.ts.map +1 -1
- package/dist/pipeline/repo-snapshot.js +3 -0
- package/dist/pipeline/repo-snapshot.js.map +1 -1
- package/dist/pipeline/role-execution-adapter.d.ts +2 -1
- package/dist/pipeline/role-execution-adapter.d.ts.map +1 -1
- package/dist/pipeline/role-execution-adapter.js +22 -7
- package/dist/pipeline/role-execution-adapter.js.map +1 -1
- package/dist/pipeline/skill-loader.d.ts +19 -0
- package/dist/pipeline/skill-loader.d.ts.map +1 -1
- package/dist/pipeline/skill-loader.js +22 -0
- package/dist/pipeline/skill-loader.js.map +1 -1
- package/dist/pipeline/skills/constitution-generator.d.ts +51 -0
- package/dist/pipeline/skills/constitution-generator.d.ts.map +1 -0
- package/dist/pipeline/skills/constitution-generator.js +210 -0
- package/dist/pipeline/skills/constitution-generator.js.map +1 -0
- package/dist/pipeline/skills/coverage-gate.d.ts +44 -0
- package/dist/pipeline/skills/coverage-gate.d.ts.map +1 -0
- package/dist/pipeline/skills/coverage-gate.js +143 -0
- package/dist/pipeline/skills/coverage-gate.js.map +1 -0
- package/dist/pipeline/skills/generator.d.ts +65 -0
- package/dist/pipeline/skills/generator.d.ts.map +1 -0
- package/dist/pipeline/skills/generator.js +221 -0
- package/dist/pipeline/skills/generator.js.map +1 -0
- package/dist/pipeline/skills/role-map.d.ts +38 -0
- package/dist/pipeline/skills/role-map.d.ts.map +1 -0
- package/dist/pipeline/skills/role-map.js +234 -0
- package/dist/pipeline/skills/role-map.js.map +1 -0
- package/dist/pipeline/skills/types.d.ts +47 -0
- package/dist/pipeline/skills/types.d.ts.map +1 -0
- package/dist/pipeline/skills/types.js +5 -0
- package/dist/pipeline/skills/types.js.map +1 -0
- package/dist/pipeline/skills/usage-registry.d.ts +48 -0
- package/dist/pipeline/skills/usage-registry.d.ts.map +1 -0
- package/dist/pipeline/skills/usage-registry.js +55 -0
- package/dist/pipeline/skills/usage-registry.js.map +1 -0
- package/dist/pipeline/strategy-context.d.ts +20 -0
- package/dist/pipeline/strategy-context.d.ts.map +1 -0
- package/dist/pipeline/strategy-context.js +55 -0
- package/dist/pipeline/strategy-context.js.map +1 -0
- package/dist/pipeline/type-defs/artifacts.d.ts +30 -5
- package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -1
- package/dist/pipeline/type-defs/artifacts.js +5 -0
- package/dist/pipeline/type-defs/artifacts.js.map +1 -1
- package/dist/pipeline/type-defs/audit.d.ts +28 -13
- package/dist/pipeline/type-defs/audit.d.ts.map +1 -1
- package/dist/pipeline/type-defs/checks.d.ts +19 -8
- package/dist/pipeline/type-defs/checks.d.ts.map +1 -1
- package/dist/pipeline/type-defs/checks.js +4 -0
- package/dist/pipeline/type-defs/checks.js.map +1 -1
- package/dist/pipeline/type-defs/packets.d.ts +119 -18
- package/dist/pipeline/type-defs/packets.d.ts.map +1 -1
- package/dist/pipeline/type-defs/packets.js +17 -1
- package/dist/pipeline/type-defs/packets.js.map +1 -1
- package/dist/pipeline/type-defs/state.d.ts +165 -16
- package/dist/pipeline/type-defs/state.d.ts.map +1 -1
- package/dist/pipeline/type-defs/state.js +26 -1
- package/dist/pipeline/type-defs/state.js.map +1 -1
- package/dist/shared/text-utils.d.ts +23 -0
- package/dist/shared/text-utils.d.ts.map +1 -0
- package/dist/shared/text-utils.js +66 -0
- package/dist/shared/text-utils.js.map +1 -0
- package/dist/shared/website-strategy-format.d.ts +18 -0
- package/dist/shared/website-strategy-format.d.ts.map +1 -0
- package/dist/shared/website-strategy-format.js +47 -0
- package/dist/shared/website-strategy-format.js.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +57 -8
- package/dist/state/index.js.map +1 -1
- package/dist/types/consensus.d.ts +1 -0
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/website-strategy.d.ts +1 -1
- package/dist/types/workflow.d.ts +447 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +3 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.d.ts.map +1 -1
- package/dist/upgrade/handlers.js +6 -3
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +1 -0
- package/dist/workflow/consensus.js.map +1 -1
- package/dist/workflow/website-strategy.d.ts.map +1 -1
- package/dist/workflow/website-strategy.js +2 -29
- package/dist/workflow/website-strategy.js.map +1 -1
- package/dist/workflow/website-updater.d.ts.map +1 -1
- package/dist/workflow/website-updater.js +3 -2
- package/dist/workflow/website-updater.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/gemini.ts +51 -6
- package/src/adapters/grok.ts +51 -6
- package/src/adapters/openai.ts +53 -5
- package/src/cli/commands/create.ts +1 -1
- package/src/cli/interactive.ts +337 -20
- package/src/generators/all.ts +25 -2
- package/src/generators/doc-parser.ts +75 -15
- package/src/generators/templates/fullstack.ts +1 -1
- package/src/generators/templates/website-components.ts +1 -1
- package/src/generators/templates/website-config.ts +23 -11
- package/src/generators/templates/website-conversion.ts +1 -1
- package/src/generators/templates/website-landing.ts +1 -1
- package/src/generators/templates/website-layout.ts +491 -23
- package/src/generators/templates/website-pricing.ts +1 -1
- package/src/generators/templates/website-sections.ts +1 -1
- package/src/generators/templates/website-seo.ts +4 -1
- package/src/generators/templates/website.ts +3 -0
- package/src/generators/website-content-ai.ts +186 -0
- package/src/generators/website-content-scanner.ts +113 -1
- package/src/generators/website-context.ts +151 -12
- package/src/generators/website-debug.ts +26 -0
- package/src/generators/website.ts +28 -3
- package/src/pipeline/artifact-manager.ts +3 -0
- package/src/pipeline/auto-recovery.ts +283 -0
- package/src/pipeline/change-request.ts +63 -1
- package/src/pipeline/check-runner.ts +141 -2
- package/src/pipeline/command-resolver.ts +34 -2
- package/src/pipeline/consensus/arbitrator-query.ts +101 -0
- package/src/pipeline/consensus/consensus-runner.ts +1099 -42
- package/src/pipeline/cr-lifecycle.ts +103 -0
- package/src/pipeline/gate-engine.ts +36 -8
- package/src/pipeline/migration.ts +5 -30
- package/src/pipeline/orchestrator.ts +367 -16
- package/src/pipeline/packets/consensus-packet-builder.ts +44 -18
- package/src/pipeline/phases/architecture.ts +6 -3
- package/src/pipeline/phases/audit.ts +6 -3
- package/src/pipeline/phases/consensus-architecture.ts +10 -1
- package/src/pipeline/phases/consensus-master-plan.ts +10 -3
- package/src/pipeline/phases/consensus-role-plans.ts +10 -1
- package/src/pipeline/phases/done.ts +15 -4
- package/src/pipeline/phases/intake.ts +67 -14
- package/src/pipeline/phases/phase-context.ts +6 -1
- package/src/pipeline/phases/production-gate.ts +41 -3
- package/src/pipeline/phases/qa-validation.ts +51 -5
- package/src/pipeline/phases/recovery-loop.ts +229 -7
- package/src/pipeline/phases/review.ts +73 -30
- package/src/pipeline/phases/role-planning.ts +23 -5
- package/src/pipeline/phases/stuck.ts +10 -0
- package/src/pipeline/repo-snapshot.ts +3 -0
- package/src/pipeline/role-execution-adapter.ts +30 -4
- package/src/pipeline/skill-loader.ts +33 -0
- package/src/pipeline/skills/constitution-generator.ts +236 -0
- package/src/pipeline/skills/coverage-gate.ts +199 -0
- package/src/pipeline/skills/generator.ts +287 -0
- package/src/pipeline/skills/role-map.ts +248 -0
- package/src/pipeline/skills/types.ts +53 -0
- package/src/pipeline/skills/usage-registry.ts +87 -0
- package/src/pipeline/strategy-context.ts +60 -0
- package/src/pipeline/type-defs/artifacts.ts +5 -0
- package/src/pipeline/type-defs/checks.ts +4 -0
- package/src/pipeline/type-defs/packets.ts +18 -1
- package/src/pipeline/type-defs/state.ts +26 -1
- package/src/shared/text-utils.ts +70 -0
- package/src/shared/website-strategy-format.ts +56 -0
- package/src/state/index.ts +60 -8
- package/src/types/consensus.ts +1 -0
- package/src/types/workflow.ts +6 -0
- package/src/upgrade/handlers.ts +9 -3
- package/src/workflow/consensus.ts +1 -0
- package/src/workflow/website-strategy.ts +2 -36
- package/src/workflow/website-updater.ts +4 -2
- package/tests/adapters/gemini.test.ts +165 -0
- package/tests/adapters/grok.test.ts +137 -0
- package/tests/adapters/openai.test.ts +128 -0
- package/tests/generators/doc-parser.test.ts +88 -9
- package/tests/generators/quality-gate.test.ts +19 -3
- package/tests/generators/website-components.test.ts +34 -0
- package/tests/generators/website-content-ai.test.ts +308 -0
- package/tests/generators/website-content-scanner.test.ts +86 -0
- package/tests/generators/website-context.test.ts +3 -2
- package/tests/integration/smokestack-scaffold.test.ts +385 -0
- package/tests/pipeline/auto-recovery.test.ts +337 -0
- package/tests/pipeline/change-request.test.ts +70 -0
- package/tests/pipeline/command-resolver.test.ts +42 -0
- package/tests/pipeline/consensus/arbitrator-query.test.ts +107 -0
- package/tests/pipeline/consensus-runner.test.ts +1333 -10
- package/tests/pipeline/consensus-scoring.test.ts +602 -18
- package/tests/pipeline/gate-engine.test.ts +34 -0
- package/tests/pipeline/install-check.test.ts +261 -0
- package/tests/pipeline/migration.test.ts +4 -3
- package/tests/pipeline/orchestrator.test.ts +1506 -15
- package/tests/pipeline/packets/builders.test.ts +29 -6
- package/tests/pipeline/phases/role-planning.strategy.test.ts +204 -0
- package/tests/pipeline/pipeline-persistence.test.ts +230 -0
- package/tests/pipeline/recovery-loop-guidance.test.ts +280 -0
- package/tests/pipeline/role-execution-adapter.test.ts +88 -0
- package/tests/pipeline/skills/constitution-generator.test.ts +201 -0
- package/tests/pipeline/skills/coverage-gate.test.ts +370 -0
- package/tests/pipeline/skills/generator.test.ts +213 -0
- package/tests/pipeline/skills/role-map.test.ts +198 -0
- package/tests/pipeline/skills/usage-registry.test.ts +114 -0
- package/tests/pipeline/strategy-context.test.ts +148 -0
- package/tests/shared/text-utils.test.ts +155 -0
- package/tests/state/progress-analysis.test.ts +375 -0
- package/tests/upgrade/handlers.test.ts +33 -2
- package/tests/workflow/consensus.test.ts +6 -0
- package/tsconfig.json +1 -1
package/src/adapters/grok.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { ConsensusResult, ArbitrationResult } from '../types/consensus.js';
|
|
|
10
10
|
import type { OutputLanguage } from '../types/project.js';
|
|
11
11
|
import { getGrokToken, GROK_API_URL } from '../auth/grok.js';
|
|
12
12
|
import { DEFAULT_GROK_MODEL } from '../types/consensus.js';
|
|
13
|
+
import { normalizeIssueList } from '../shared/text-utils.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Default Grok configuration
|
|
@@ -79,6 +80,44 @@ export async function requestConsensus(
|
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Send a prompt directly to the Grok API and return the raw response string.
|
|
85
|
+
* No prompt wrapping or response parsing — used by the consensus runner
|
|
86
|
+
* which builds its own prompts and parses responses itself.
|
|
87
|
+
*
|
|
88
|
+
* @param prompt - The complete prompt to send
|
|
89
|
+
* @param config - Configuration for model/temperature/maxTokens
|
|
90
|
+
* @returns Raw LLM response text
|
|
91
|
+
*/
|
|
92
|
+
export async function requestRawReview(
|
|
93
|
+
prompt: string,
|
|
94
|
+
config: { model?: string; temperature?: number; maxTokens?: number } = {},
|
|
95
|
+
): Promise<string> {
|
|
96
|
+
const {
|
|
97
|
+
model = DEFAULT_GROK_CONFIG.model,
|
|
98
|
+
temperature = DEFAULT_GROK_CONFIG.temperature,
|
|
99
|
+
maxTokens = DEFAULT_GROK_CONFIG.maxTokens,
|
|
100
|
+
} = config;
|
|
101
|
+
|
|
102
|
+
const client = await createClient();
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const completion = await client.chat.completions.create({
|
|
106
|
+
model,
|
|
107
|
+
messages: [{ role: 'user', content: prompt }],
|
|
108
|
+
temperature,
|
|
109
|
+
max_tokens: maxTokens,
|
|
110
|
+
});
|
|
111
|
+
return completion.choices[0]?.message?.content || '';
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (error instanceof OpenAI.RateLimitError) {
|
|
114
|
+
await sleep(5000);
|
|
115
|
+
return requestRawReview(prompt, config);
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
82
121
|
/**
|
|
83
122
|
* Request arbitration from Grok when consensus is stuck
|
|
84
123
|
*
|
|
@@ -144,10 +183,13 @@ STRENGTHS:
|
|
|
144
183
|
- [etc.]
|
|
145
184
|
|
|
146
185
|
CONCERNS:
|
|
147
|
-
- [
|
|
148
|
-
- [
|
|
186
|
+
- [Non-blocking concern 1]
|
|
187
|
+
- [Non-blocking concern 2]
|
|
149
188
|
- [etc.]
|
|
150
189
|
|
|
190
|
+
BLOCKING_ISSUES:
|
|
191
|
+
- [Critical issue that must be resolved, or "None"]
|
|
192
|
+
|
|
151
193
|
RECOMMENDATIONS:
|
|
152
194
|
- [Recommendation 1]
|
|
153
195
|
- [Recommendation 2]
|
|
@@ -253,11 +295,13 @@ export function parseConsensusResponse(response: string): ConsensusResult {
|
|
|
253
295
|
const analysis = extractSection(response, ['ANALYSIS', '## Analysis', '### Analysis']);
|
|
254
296
|
const strengthsText = extractSection(response, ['STRENGTHS', '## Strengths', '### Strengths']);
|
|
255
297
|
const concernsText = extractSection(response, ['CONCERNS', '## Concerns', '### Concerns']);
|
|
298
|
+
const blockingIssuesText = extractSection(response, ['BLOCKING_ISSUES', '## Blocking Issues', '### Blocking Issues']);
|
|
256
299
|
const recommendationsText = extractSection(response, ['RECOMMENDATIONS', '## Recommendations', '### Recommendations']);
|
|
257
300
|
|
|
258
301
|
// Parse lists from sections
|
|
259
302
|
const strengths = parseList(strengthsText);
|
|
260
303
|
const concerns = parseList(concernsText);
|
|
304
|
+
const blockingIssues = normalizeIssueList(parseList(blockingIssuesText));
|
|
261
305
|
const recommendations = parseList(recommendationsText);
|
|
262
306
|
|
|
263
307
|
return {
|
|
@@ -265,6 +309,7 @@ export function parseConsensusResponse(response: string): ConsensusResult {
|
|
|
265
309
|
analysis: analysis.trim(),
|
|
266
310
|
strengths,
|
|
267
311
|
concerns,
|
|
312
|
+
blockingIssues,
|
|
268
313
|
recommendations,
|
|
269
314
|
approved: score >= 95,
|
|
270
315
|
rawResponse: response,
|
|
@@ -295,11 +340,11 @@ function parseArbitrationResponse(response: string): ArbitrationResult {
|
|
|
295
340
|
approved,
|
|
296
341
|
score,
|
|
297
342
|
analysis,
|
|
298
|
-
criticalConcerns: criticalConcerns
|
|
299
|
-
minorConcerns: minorConcerns
|
|
300
|
-
subjectiveConcerns: subjectiveConcerns
|
|
343
|
+
criticalConcerns: normalizeIssueList(criticalConcerns),
|
|
344
|
+
minorConcerns: normalizeIssueList(minorConcerns),
|
|
345
|
+
subjectiveConcerns: normalizeIssueList(subjectiveConcerns),
|
|
301
346
|
reasoning,
|
|
302
|
-
suggestedChanges: suggestedChanges
|
|
347
|
+
suggestedChanges: normalizeIssueList(suggestedChanges),
|
|
303
348
|
rawResponse: response,
|
|
304
349
|
};
|
|
305
350
|
}
|
package/src/adapters/openai.ts
CHANGED
|
@@ -7,6 +7,7 @@ import OpenAI from 'openai';
|
|
|
7
7
|
import type { ConsensusResult, ConsensusConfig, OpenAIModel, OutputLanguage } from '../types/index.js';
|
|
8
8
|
import { getOpenAIToken } from '../auth/index.js';
|
|
9
9
|
import { DEFAULT_CONSENSUS_CONFIG } from '../types/consensus.js';
|
|
10
|
+
import { normalizeIssueList } from '../shared/text-utils.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Create an OpenAI client with stored credentials
|
|
@@ -87,9 +88,10 @@ ${plan}
|
|
|
87
88
|
Please provide:
|
|
88
89
|
1. ANALYSIS: Detailed review of the plan
|
|
89
90
|
2. STRENGTHS: What works well
|
|
90
|
-
3. CONCERNS:
|
|
91
|
-
4.
|
|
92
|
-
5.
|
|
91
|
+
3. CONCERNS: Non-blocking issues, minor gaps, or suggestions for improvement
|
|
92
|
+
4. BLOCKING_ISSUES: Critical issues that MUST be resolved before proceeding (security, data loss, missing requirements, broken architecture). Write "None" if no blocking issues.
|
|
93
|
+
5. RECOMMENDATIONS: Specific improvements
|
|
94
|
+
6. CONSENSUS SCORE: A percentage (0-100%) indicating your agreement
|
|
93
95
|
- 95-100%: Ready for execution
|
|
94
96
|
- 80-94%: Minor revisions needed
|
|
95
97
|
- 60-79%: Significant revisions needed
|
|
@@ -109,15 +111,22 @@ export function parseConsensusResponse(response: string): ConsensusResult {
|
|
|
109
111
|
const scoreMatch = response.match(/CONSENSUS:\s*(\d+)%/i);
|
|
110
112
|
const score = scoreMatch ? parseInt(scoreMatch[1], 10) : 0;
|
|
111
113
|
|
|
112
|
-
// Extract sections
|
|
114
|
+
// Extract sections — handle backward compat when BLOCKING_ISSUES is absent
|
|
113
115
|
const analysis = extractSection(response, 'ANALYSIS', 'STRENGTHS');
|
|
114
116
|
const strengthsText = extractSection(response, 'STRENGTHS', 'CONCERNS');
|
|
115
|
-
const
|
|
117
|
+
const hasBlockingIssues = /BLOCKING_ISSUES[:\s]/i.test(response);
|
|
118
|
+
const concernsText = hasBlockingIssues
|
|
119
|
+
? extractSection(response, 'CONCERNS', 'BLOCKING_ISSUES')
|
|
120
|
+
: extractSection(response, 'CONCERNS', 'RECOMMENDATIONS');
|
|
121
|
+
const blockingIssuesText = hasBlockingIssues
|
|
122
|
+
? extractSection(response, 'BLOCKING_ISSUES', 'RECOMMENDATIONS')
|
|
123
|
+
: '';
|
|
116
124
|
const recommendationsText = extractSection(response, 'RECOMMENDATIONS', 'CONSENSUS');
|
|
117
125
|
|
|
118
126
|
// Parse lists from sections
|
|
119
127
|
const strengths = parseList(strengthsText);
|
|
120
128
|
const concerns = parseList(concernsText);
|
|
129
|
+
const blockingIssues = normalizeIssueList(parseList(blockingIssuesText));
|
|
121
130
|
const recommendations = parseList(recommendationsText);
|
|
122
131
|
|
|
123
132
|
return {
|
|
@@ -125,6 +134,7 @@ export function parseConsensusResponse(response: string): ConsensusResult {
|
|
|
125
134
|
analysis: analysis.trim(),
|
|
126
135
|
strengths,
|
|
127
136
|
concerns,
|
|
137
|
+
blockingIssues,
|
|
128
138
|
recommendations,
|
|
129
139
|
approved: score >= 95,
|
|
130
140
|
rawResponse: response,
|
|
@@ -217,6 +227,44 @@ function sleep(ms: number): Promise<void> {
|
|
|
217
227
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
218
228
|
}
|
|
219
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Send a prompt directly to the OpenAI API and return the raw response string.
|
|
232
|
+
* No prompt wrapping or response parsing — used by the consensus runner
|
|
233
|
+
* which builds its own prompts and parses responses itself.
|
|
234
|
+
*
|
|
235
|
+
* @param prompt - The complete prompt to send
|
|
236
|
+
* @param config - Consensus configuration for model/temperature/maxTokens
|
|
237
|
+
* @returns Raw LLM response text
|
|
238
|
+
*/
|
|
239
|
+
export async function requestRawReview(
|
|
240
|
+
prompt: string,
|
|
241
|
+
config: Partial<ConsensusConfig> = {},
|
|
242
|
+
): Promise<string> {
|
|
243
|
+
const {
|
|
244
|
+
openaiModel = DEFAULT_CONSENSUS_CONFIG.openaiModel,
|
|
245
|
+
temperature = DEFAULT_CONSENSUS_CONFIG.temperature,
|
|
246
|
+
maxTokens = DEFAULT_CONSENSUS_CONFIG.maxTokens,
|
|
247
|
+
} = config;
|
|
248
|
+
|
|
249
|
+
const client = await createClient();
|
|
250
|
+
|
|
251
|
+
try {
|
|
252
|
+
const completion = await client.chat.completions.create({
|
|
253
|
+
model: openaiModel,
|
|
254
|
+
messages: [{ role: 'user', content: prompt }],
|
|
255
|
+
temperature,
|
|
256
|
+
max_tokens: maxTokens,
|
|
257
|
+
});
|
|
258
|
+
return completion.choices[0]?.message?.content || '';
|
|
259
|
+
} catch (error) {
|
|
260
|
+
if (error instanceof OpenAI.RateLimitError) {
|
|
261
|
+
await sleep(5000);
|
|
262
|
+
return requestRawReview(prompt, config);
|
|
263
|
+
}
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
220
268
|
/**
|
|
221
269
|
* Validate that a model is available
|
|
222
270
|
*/
|
|
@@ -241,7 +241,7 @@ export function createCreateCommand(): Command {
|
|
|
241
241
|
printConsensusResult(
|
|
242
242
|
workflowResult.planResult.consensusResult.iterations[
|
|
243
243
|
workflowResult.planResult.consensusResult.iterations.length - 1
|
|
244
|
-
]?.result || { score: 0, analysis: '', approved: false, rawResponse: '' }
|
|
244
|
+
]?.result || { score: 0, analysis: '', approved: false, rawResponse: '', strengths: [], concerns: [], blockingIssues: [], recommendations: [] }
|
|
245
245
|
);
|
|
246
246
|
}
|
|
247
247
|
|