dual-brain 0.2.29 → 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.
- package/.dual-brain/docs/claude-code-extension-points.md +32 -0
- package/.dual-brain/docs/data-tools-capabilities.md +181 -0
- package/.dual-brain/docs/ecosystem-tools.md +91 -0
- package/.dual-brain/docs/panel-handoff.md +124 -0
- package/.dual-brain/docs/ruflo-analysis.md +48 -0
- package/bin/dual-brain.mjs +122 -51
- package/dist/mcp-server/index.d.ts +27 -0
- package/dist/mcp-server/index.js +359 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/agent-protocol.d.ts +163 -0
- package/dist/src/agent-protocol.js +368 -0
- package/dist/src/agent-protocol.js.map +1 -0
- package/dist/src/agents/registry.d.ts +52 -0
- package/dist/src/agents/registry.js +393 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/awareness.d.ts +93 -0
- package/dist/src/awareness.js +406 -0
- package/dist/src/awareness.js.map +1 -0
- package/dist/src/brief.d.ts +48 -0
- package/dist/src/brief.js +179 -0
- package/dist/src/brief.js.map +1 -0
- package/dist/src/calibration.d.ts +32 -0
- package/dist/src/calibration.js +133 -0
- package/dist/src/calibration.js.map +1 -0
- package/dist/src/checkpoint.d.ts +33 -0
- package/dist/src/checkpoint.js +99 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/ci-triage.d.ts +33 -0
- package/dist/src/ci-triage.js +193 -0
- package/dist/src/ci-triage.js.map +1 -0
- package/dist/src/cognitive-loop.d.ts +56 -0
- package/dist/src/cognitive-loop.js +495 -0
- package/dist/src/cognitive-loop.js.map +1 -0
- package/dist/src/collaboration.d.ts +147 -0
- package/dist/src/collaboration.js +438 -0
- package/dist/src/collaboration.js.map +1 -0
- package/dist/src/context-intel.d.ts +47 -0
- package/dist/src/context-intel.js +156 -0
- package/dist/src/context-intel.js.map +1 -0
- package/dist/src/context.d.ts +53 -0
- package/dist/src/context.js +332 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/continuity.d.ts +89 -0
- package/dist/src/continuity.js +230 -0
- package/dist/src/continuity.js.map +1 -0
- package/dist/src/cost-tracker.d.ts +47 -0
- package/dist/src/cost-tracker.js +170 -0
- package/dist/src/cost-tracker.js.map +1 -0
- package/dist/src/debrief.d.ts +53 -0
- package/dist/src/debrief.js +222 -0
- package/dist/src/debrief.js.map +1 -0
- package/dist/src/decide.d.ts +96 -0
- package/dist/src/decide.js +744 -0
- package/dist/src/decide.js.map +1 -0
- package/dist/src/decompose.d.ts +39 -0
- package/dist/src/decompose.js +218 -0
- package/dist/src/decompose.js.map +1 -0
- package/dist/src/detect.d.ts +91 -0
- package/dist/src/detect.js +544 -0
- package/dist/src/detect.js.map +1 -0
- package/dist/src/dispatch.d.ts +154 -0
- package/dist/src/dispatch.js +1306 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +421 -0
- package/dist/src/doctor.js +1689 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/engine.d.ts +70 -0
- package/dist/src/engine.js +155 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/envelope.d.ts +36 -0
- package/dist/src/envelope.js +80 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/failure-memory.d.ts +55 -0
- package/dist/src/failure-memory.js +175 -0
- package/dist/src/failure-memory.js.map +1 -0
- package/dist/src/fx.d.ts +87 -0
- package/dist/src/fx.js +272 -0
- package/dist/src/fx.js.map +1 -0
- package/dist/src/governance.d.ts +93 -0
- package/dist/src/governance.js +261 -0
- package/dist/src/governance.js.map +1 -0
- package/dist/src/handoff.d.ts +11 -0
- package/dist/src/handoff.js +90 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/head-protocol.d.ts +76 -0
- package/dist/src/head-protocol.js +109 -0
- package/dist/src/head-protocol.js.map +1 -0
- package/dist/src/head.d.ts +222 -0
- package/dist/src/head.js +765 -0
- package/dist/src/head.js.map +1 -0
- package/dist/src/health.d.ts +132 -0
- package/dist/src/health.js +435 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/inbox.d.ts +70 -0
- package/dist/src/inbox.js +218 -0
- package/dist/src/inbox.js.map +1 -0
- package/dist/src/index.d.ts +33 -0
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/install-hooks.d.ts +13 -0
- package/dist/src/install-hooks.js +88 -0
- package/dist/src/install-hooks.js.map +1 -0
- package/dist/src/integrity.d.ts +59 -0
- package/dist/src/integrity.js +206 -0
- package/dist/src/integrity.js.map +1 -0
- package/dist/src/intelligence.d.ts +104 -0
- package/dist/src/intelligence.js +391 -0
- package/dist/src/intelligence.js.map +1 -0
- package/dist/src/ledger.d.ts +54 -0
- package/dist/src/ledger.js +179 -0
- package/dist/src/ledger.js.map +1 -0
- package/dist/src/living-docs.d.ts +14 -0
- package/dist/src/living-docs.js +197 -0
- package/dist/src/living-docs.js.map +1 -0
- package/dist/src/memory-tiers.d.ts +37 -0
- package/dist/src/memory-tiers.js +160 -0
- package/dist/src/memory-tiers.js.map +1 -0
- package/dist/src/model-profiles.d.ts +65 -0
- package/dist/src/model-profiles.js +568 -0
- package/dist/src/model-profiles.js.map +1 -0
- package/dist/src/models.d.ts +58 -0
- package/dist/src/models.js +327 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/narrative.d.ts +54 -0
- package/dist/src/narrative.js +163 -0
- package/dist/src/narrative.js.map +1 -0
- package/dist/src/nextstep.d.ts +16 -0
- package/dist/src/nextstep.js +103 -0
- package/dist/src/nextstep.js.map +1 -0
- package/dist/src/observer.d.ts +18 -0
- package/dist/src/observer.js +251 -0
- package/dist/src/observer.js.map +1 -0
- package/dist/src/outcome.d.ts +110 -0
- package/dist/src/outcome.js +377 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/pipeline.d.ts +167 -0
- package/dist/src/pipeline.js +1503 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/playbook.d.ts +59 -0
- package/dist/src/playbook.js +238 -0
- package/dist/src/playbook.js.map +1 -0
- package/dist/src/pr-agent.d.ts +97 -0
- package/dist/src/pr-agent.js +195 -0
- package/dist/src/pr-agent.js.map +1 -0
- package/dist/src/predictive.d.ts +57 -0
- package/dist/src/predictive.js +230 -0
- package/dist/src/predictive.js.map +1 -0
- package/dist/src/profile.d.ts +294 -0
- package/dist/src/profile.js +1347 -0
- package/dist/src/profile.js.map +1 -0
- package/dist/src/prompt-audit.d.ts +22 -0
- package/dist/src/prompt-audit.js +194 -0
- package/dist/src/prompt-audit.js.map +1 -0
- package/dist/src/prompt-intel.d.ts +12 -0
- package/dist/src/prompt-intel.js +321 -0
- package/dist/src/prompt-intel.js.map +1 -0
- package/dist/src/provider-context.d.ts +121 -0
- package/dist/src/provider-context.js +222 -0
- package/dist/src/provider-context.js.map +1 -0
- package/dist/src/provider-manager.d.ts +92 -0
- package/dist/src/provider-manager.js +428 -0
- package/dist/src/provider-manager.js.map +1 -0
- package/dist/src/receipt.d.ts +87 -0
- package/dist/src/receipt.js +326 -0
- package/dist/src/receipt.js.map +1 -0
- package/dist/src/recommendations.d.ts +13 -0
- package/dist/src/recommendations.js +291 -0
- package/dist/src/recommendations.js.map +1 -0
- package/dist/src/redact.d.ts +15 -0
- package/dist/src/redact.js +129 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/replit.d.ts +397 -0
- package/dist/src/replit.js +1160 -0
- package/dist/src/replit.js.map +1 -0
- package/dist/src/repo.d.ts +149 -0
- package/dist/src/repo.js +416 -0
- package/dist/src/repo.js.map +1 -0
- package/dist/src/revert.d.ts +30 -0
- package/dist/src/revert.js +166 -0
- package/dist/src/revert.js.map +1 -0
- package/dist/src/room.d.ts +102 -0
- package/dist/src/room.js +212 -0
- package/dist/src/room.js.map +1 -0
- package/dist/src/routing-advisor.d.ts +57 -0
- package/dist/src/routing-advisor.js +221 -0
- package/dist/src/routing-advisor.js.map +1 -0
- package/dist/src/self-correct.d.ts +40 -0
- package/dist/src/self-correct.js +137 -0
- package/dist/src/self-correct.js.map +1 -0
- package/dist/src/session-lock.d.ts +35 -0
- package/dist/src/session-lock.js +134 -0
- package/dist/src/session-lock.js.map +1 -0
- package/dist/src/session.d.ts +267 -0
- package/dist/src/session.js +1660 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/settings-tui.d.ts +5 -0
- package/dist/src/settings-tui.js +422 -0
- package/dist/src/settings-tui.js.map +1 -0
- package/dist/src/setup-flow.d.ts +63 -0
- package/dist/src/setup-flow.js +233 -0
- package/dist/src/setup-flow.js.map +1 -0
- package/dist/src/signal.d.ts +19 -0
- package/dist/src/signal.js +122 -0
- package/dist/src/signal.js.map +1 -0
- package/dist/src/simmer.d.ts +85 -0
- package/dist/src/simmer.js +224 -0
- package/dist/src/simmer.js.map +1 -0
- package/dist/src/state-export.d.ts +129 -0
- package/dist/src/state-export.js +233 -0
- package/dist/src/state-export.js.map +1 -0
- package/dist/src/strategy.d.ts +54 -0
- package/dist/src/strategy.js +95 -0
- package/dist/src/strategy.js.map +1 -0
- package/dist/src/subscription.d.ts +40 -0
- package/dist/src/subscription.js +189 -0
- package/dist/src/subscription.js.map +1 -0
- package/dist/src/templates.d.ts +208 -0
- package/dist/src/templates.js +238 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/test.d.ts +9 -0
- package/dist/src/test.js +1173 -0
- package/dist/src/test.js.map +1 -0
- package/dist/src/think-engine.d.ts +67 -0
- package/dist/src/think-engine.js +412 -0
- package/dist/src/think-engine.js.map +1 -0
- package/dist/src/tui.d.ts +71 -0
- package/dist/src/tui.js +242 -0
- package/dist/src/tui.js.map +1 -0
- package/dist/src/types.d.ts +177 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/update-check.d.ts +7 -0
- package/dist/src/update-check.js +36 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/wave-planner.d.ts +30 -0
- package/dist/src/wave-planner.js +281 -0
- package/dist/src/wave-planner.js.map +1 -0
- package/hooks/head-guard.sh +41 -0
- package/hooks/task-classifier.mjs +328 -0
- package/hooks/vibe-router.mjs +387 -0
- package/package.json +29 -153
- package/src/agents/registry.mjs +0 -405
- package/src/awareness.mjs +0 -425
- package/src/brief.mjs +0 -266
- package/src/calibration.mjs +0 -148
- package/src/checkpoint.mjs +0 -109
- package/src/ci-triage.mjs +0 -191
- package/src/cognitive-loop.mjs +0 -562
- package/src/collaboration.mjs +0 -545
- package/src/context-intel.mjs +0 -158
- package/src/context.mjs +0 -389
- package/src/continuity.mjs +0 -298
- package/src/cost-tracker.mjs +0 -184
- package/src/debrief.mjs +0 -228
- package/src/decide.mjs +0 -1099
- package/src/decompose.mjs +0 -331
- package/src/detect.mjs +0 -702
- package/src/dispatch.mjs +0 -1447
- package/src/doctor.mjs +0 -1607
- package/src/envelope.mjs +0 -139
- package/src/failure-memory.mjs +0 -178
- package/src/fx.mjs +0 -276
- package/src/governance.mjs +0 -279
- package/src/handoff.mjs +0 -85
- package/src/head-protocol.mjs +0 -128
- package/src/head.mjs +0 -952
- package/src/health.mjs +0 -528
- package/src/inbox.mjs +0 -195
- package/src/index.mjs +0 -44
- package/src/install-hooks.mjs +0 -100
- package/src/integrity.mjs +0 -245
- package/src/intelligence.mjs +0 -447
- package/src/ledger.mjs +0 -196
- package/src/living-docs.mjs +0 -210
- package/src/memory-tiers.mjs +0 -193
- package/src/models.mjs +0 -363
- package/src/narrative.mjs +0 -169
- package/src/nextstep.mjs +0 -100
- package/src/observer.mjs +0 -241
- package/src/outcome.mjs +0 -386
- package/src/pipeline.mjs +0 -1689
- package/src/playbook.mjs +0 -257
- package/src/pr-agent.mjs +0 -214
- package/src/predictive.mjs +0 -250
- package/src/profile.mjs +0 -1411
- package/src/prompt-audit.mjs +0 -231
- package/src/prompt-intel.mjs +0 -325
- package/src/provider-context.mjs +0 -257
- package/src/receipt.mjs +0 -344
- package/src/recommendations.mjs +0 -291
- package/src/redact.mjs +0 -192
- package/src/replit.mjs +0 -1210
- package/src/repo.mjs +0 -445
- package/src/revert.mjs +0 -149
- package/src/routing-advisor.mjs +0 -200
- package/src/self-correct.mjs +0 -146
- package/src/session-lock.mjs +0 -160
- package/src/session.mjs +0 -1655
- package/src/settings-tui.mjs +0 -373
- package/src/setup-flow.mjs +0 -215
- package/src/signal.mjs +0 -114
- package/src/simmer.mjs +0 -241
- package/src/strategy.mjs +0 -235
- package/src/subscription.mjs +0 -212
- package/src/templates.mjs +0 -260
- package/src/think-engine.mjs +0 -428
- package/src/tui.mjs +0 -276
- package/src/update-check.mjs +0 -35
- package/src/wave-planner.mjs +0 -294
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* awareness.ts — Environment awareness layer for dual-brain.
|
|
3
|
+
* Scans runtime environment once on startup and caches results with TTL.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { join, resolve } from 'node:path';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
// ─── Cache ───────────────────────────────────────────────────────────────────
|
|
10
|
+
let _cache = null;
|
|
11
|
+
let _cacheTime = 0;
|
|
12
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
13
|
+
function safeExec(cmd, timeoutMs = 2000) {
|
|
14
|
+
try {
|
|
15
|
+
return execSync(cmd, {
|
|
16
|
+
encoding: 'utf8',
|
|
17
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
18
|
+
timeout: timeoutMs,
|
|
19
|
+
}).trim();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function extractVersion(output) {
|
|
26
|
+
if (!output)
|
|
27
|
+
return null;
|
|
28
|
+
const m = output.match(/(\d+\.\d+[\.\d]*)/);
|
|
29
|
+
return m ? m[1] : null;
|
|
30
|
+
}
|
|
31
|
+
function probeToolAvailability(name) {
|
|
32
|
+
const path = safeExec(`which ${name}`);
|
|
33
|
+
if (!path)
|
|
34
|
+
return { available: false, version: null };
|
|
35
|
+
if (name === 'rg' || name === 'replit' || name === 'gh') {
|
|
36
|
+
return { available: true };
|
|
37
|
+
}
|
|
38
|
+
const versionOutput = safeExec(`${name} --version`);
|
|
39
|
+
return { available: true, version: extractVersion(versionOutput) };
|
|
40
|
+
}
|
|
41
|
+
function detectContainerType() {
|
|
42
|
+
const env = process.env;
|
|
43
|
+
if (env.REPL_ID || env.REPL_SLUG)
|
|
44
|
+
return 'replit';
|
|
45
|
+
if (env.CODESPACES)
|
|
46
|
+
return 'codespace';
|
|
47
|
+
if (env.CI || env.GITHUB_ACTIONS || env.GITLAB_CI || env.JENKINS_URL)
|
|
48
|
+
return 'ci';
|
|
49
|
+
return 'local';
|
|
50
|
+
}
|
|
51
|
+
function scanSecrets() {
|
|
52
|
+
const keys = [
|
|
53
|
+
'NPM_TOKEN',
|
|
54
|
+
'DATABASE_URL',
|
|
55
|
+
'GITHUB_TOKEN',
|
|
56
|
+
'REPLIT_DB_URL',
|
|
57
|
+
];
|
|
58
|
+
const result = {};
|
|
59
|
+
for (const key of keys) {
|
|
60
|
+
result[key] = Boolean(process.env[key]);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
function scanReplitTools() {
|
|
65
|
+
const home = homedir();
|
|
66
|
+
const candidates = [
|
|
67
|
+
join(home, '.replit-tools'),
|
|
68
|
+
join('/home/runner/workspace', '.replit-tools'),
|
|
69
|
+
join(process.cwd(), '.replit-tools'),
|
|
70
|
+
];
|
|
71
|
+
let toolsDir = null;
|
|
72
|
+
for (const c of candidates) {
|
|
73
|
+
if (existsSync(c)) {
|
|
74
|
+
toolsDir = c;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!toolsDir) {
|
|
79
|
+
return { installed: false, version: null, sessionArchivePath: null, capabilities: [] };
|
|
80
|
+
}
|
|
81
|
+
let version = null;
|
|
82
|
+
const versionFile = join(toolsDir, '.version');
|
|
83
|
+
if (existsSync(versionFile)) {
|
|
84
|
+
try {
|
|
85
|
+
version = readFileSync(versionFile, 'utf8').trim() || null;
|
|
86
|
+
}
|
|
87
|
+
catch { /* skip */ }
|
|
88
|
+
}
|
|
89
|
+
const persistentBase = join(toolsDir, '.claude-persistent');
|
|
90
|
+
const projectDir = join(persistentBase, 'projects');
|
|
91
|
+
let sessionArchivePath = null;
|
|
92
|
+
if (existsSync(projectDir)) {
|
|
93
|
+
sessionArchivePath = projectDir;
|
|
94
|
+
}
|
|
95
|
+
else if (existsSync(persistentBase)) {
|
|
96
|
+
sessionArchivePath = persistentBase;
|
|
97
|
+
}
|
|
98
|
+
const capabilities = [];
|
|
99
|
+
if (existsSync(join(toolsDir, '.claude-persistent')))
|
|
100
|
+
capabilities.push('sessions');
|
|
101
|
+
const hasSearch = existsSync(join(toolsDir, 'search')) || existsSync(join(toolsDir, 'search.mjs'));
|
|
102
|
+
if (hasSearch)
|
|
103
|
+
capabilities.push('search');
|
|
104
|
+
const hasContext = existsSync(join(toolsDir, 'context')) || existsSync(join(toolsDir, 'context.mjs'));
|
|
105
|
+
if (hasContext)
|
|
106
|
+
capabilities.push('context');
|
|
107
|
+
const hasMcp = existsSync(join(toolsDir, 'mcp-server')) || existsSync(join(toolsDir, 'mcp'));
|
|
108
|
+
if (hasMcp)
|
|
109
|
+
capabilities.push('mcp');
|
|
110
|
+
return { installed: true, version, sessionArchivePath, capabilities };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Basic Replit environment scan used for the awareness report.
|
|
114
|
+
*
|
|
115
|
+
* NOTE: Detailed Replit integration (auth status, replit-tools capabilities,
|
|
116
|
+
* session archive, secrets listing, config planning, init flow) lives in
|
|
117
|
+
* src/replit.ts. When that module is available, prefer its
|
|
118
|
+
* detectReplitEnvironment() over duplicating detection logic here.
|
|
119
|
+
*
|
|
120
|
+
* Usage (fail-safe):
|
|
121
|
+
* try {
|
|
122
|
+
* const { detectReplitEnvironment } = await import('./replit.js');
|
|
123
|
+
* const rich = detectReplitEnvironment(cwd);
|
|
124
|
+
* // rich has .isReplit, .replId, .version, .authStatus, .capabilities ...
|
|
125
|
+
* } catch {
|
|
126
|
+
* // fall back to this scanReplit() result from scanEnvironment()
|
|
127
|
+
* }
|
|
128
|
+
*/
|
|
129
|
+
function scanReplit(cwd) {
|
|
130
|
+
const env = process.env;
|
|
131
|
+
const isReplit = Boolean(env.REPL_ID || env.REPL_SLUG);
|
|
132
|
+
let hasDeployments = false;
|
|
133
|
+
const replitConfigPath = join(cwd, '.replit');
|
|
134
|
+
if (existsSync(replitConfigPath)) {
|
|
135
|
+
try {
|
|
136
|
+
const content = readFileSync(replitConfigPath, 'utf8');
|
|
137
|
+
hasDeployments = content.includes('[deployment]');
|
|
138
|
+
}
|
|
139
|
+
catch { /* skip */ }
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
isReplit,
|
|
143
|
+
replId: env.REPL_ID || null,
|
|
144
|
+
replSlug: env.REPL_SLUG || null,
|
|
145
|
+
hasDatabase: Boolean(env.DATABASE_URL),
|
|
146
|
+
hasKV: Boolean(env.REPLIT_DB_URL),
|
|
147
|
+
hasObjectStorage: Boolean(env.REPLIT_BUCKET_URL || env.OBJECT_STORAGE_URL),
|
|
148
|
+
hasAuth: existsSync(join(cwd, '.replit-auth')) || Boolean(env.REPLIT_AUTH),
|
|
149
|
+
hasDeployments,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function scanClaudeCode(cwd) {
|
|
153
|
+
const claudeDir = join(cwd, '.claude');
|
|
154
|
+
const homeClaudeDir = join(homedir(), '.claude');
|
|
155
|
+
const isInsideClaude = Boolean(process.env.CLAUDE_CODE || process.env.CLAUDE_AGENT || process.env.ANTHROPIC_CLAUDE_CODE);
|
|
156
|
+
let hooksDir = null;
|
|
157
|
+
const localHooks = join(claudeDir, 'hooks');
|
|
158
|
+
const rootHooks = join(cwd, 'hooks');
|
|
159
|
+
if (existsSync(localHooks)) {
|
|
160
|
+
hooksDir = localHooks;
|
|
161
|
+
}
|
|
162
|
+
else if (existsSync(rootHooks)) {
|
|
163
|
+
hooksDir = rootHooks;
|
|
164
|
+
}
|
|
165
|
+
let mcpConfigured = false;
|
|
166
|
+
const mcpPaths = [
|
|
167
|
+
join(claudeDir, 'mcp.json'),
|
|
168
|
+
join(claudeDir, 'mcp_servers.json'),
|
|
169
|
+
join(homeClaudeDir, 'mcp.json'),
|
|
170
|
+
];
|
|
171
|
+
for (const p of mcpPaths) {
|
|
172
|
+
if (existsSync(p)) {
|
|
173
|
+
mcpConfigured = true;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
let settingsPath = null;
|
|
178
|
+
const settingsCandidates = [
|
|
179
|
+
join(claudeDir, 'settings.json'),
|
|
180
|
+
join(homeClaudeDir, 'settings.json'),
|
|
181
|
+
];
|
|
182
|
+
for (const p of settingsCandidates) {
|
|
183
|
+
if (existsSync(p)) {
|
|
184
|
+
settingsPath = p;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { isInsideClaude, hooksDir, mcpConfigured, settingsPath };
|
|
189
|
+
}
|
|
190
|
+
function scanDualBrain(cwd) {
|
|
191
|
+
let version = '0.0.0';
|
|
192
|
+
try {
|
|
193
|
+
const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
|
|
194
|
+
version = pkg.version ?? '0.0.0';
|
|
195
|
+
}
|
|
196
|
+
catch { /* skip */ }
|
|
197
|
+
const livingDocsDir = join(cwd, '.dual-brain');
|
|
198
|
+
const livingDocsInit = existsSync(livingDocsDir);
|
|
199
|
+
let sessionCount = 0;
|
|
200
|
+
const sessionDir = join(cwd, '.dualbrain', 'sessions');
|
|
201
|
+
if (existsSync(sessionDir)) {
|
|
202
|
+
try {
|
|
203
|
+
sessionCount = readdirSync(sessionDir).filter(f => f.endsWith('.jsonl')).length;
|
|
204
|
+
}
|
|
205
|
+
catch { /* skip */ }
|
|
206
|
+
}
|
|
207
|
+
const hasLedger = existsSync(join(cwd, '.dualbrain', 'ledger.jsonl'));
|
|
208
|
+
const hasFailureMemory = existsSync(join(cwd, '.dualbrain', 'failures.jsonl'));
|
|
209
|
+
return { version, livingDocsInit, sessionCount, hasLedger, hasFailureMemory };
|
|
210
|
+
}
|
|
211
|
+
// ─── Exports ─────────────────────────────────────────────────────────────────
|
|
212
|
+
export function scanEnvironment(cwd, options = {}) {
|
|
213
|
+
const ttl = options.ttl ?? 300000;
|
|
214
|
+
if (_cache && Date.now() - _cacheTime < ttl && !options.force)
|
|
215
|
+
return _cache;
|
|
216
|
+
const resolvedCwd = resolve(cwd || process.cwd());
|
|
217
|
+
const container = {
|
|
218
|
+
type: detectContainerType(),
|
|
219
|
+
hostname: process.env.HOSTNAME || process.env.REPL_ID || 'unknown',
|
|
220
|
+
nodeVersion: process.version,
|
|
221
|
+
platform: process.platform,
|
|
222
|
+
arch: process.arch,
|
|
223
|
+
};
|
|
224
|
+
const toolNames = ['git', 'node', 'npm', 'codex', 'claude'];
|
|
225
|
+
const flagOnlyTools = ['rg', 'replit', 'gh'];
|
|
226
|
+
const tools = {};
|
|
227
|
+
for (const name of toolNames) {
|
|
228
|
+
tools[name] = probeToolAvailability(name);
|
|
229
|
+
}
|
|
230
|
+
for (const name of flagOnlyTools) {
|
|
231
|
+
const path = safeExec(`which ${name}`);
|
|
232
|
+
tools[name] = { available: Boolean(path) };
|
|
233
|
+
}
|
|
234
|
+
const secrets = scanSecrets();
|
|
235
|
+
const replitTools = scanReplitTools();
|
|
236
|
+
const replit = scanReplit(resolvedCwd);
|
|
237
|
+
const claudeCode = scanClaudeCode(resolvedCwd);
|
|
238
|
+
const dualBrain = scanDualBrain(resolvedCwd);
|
|
239
|
+
const report = {
|
|
240
|
+
scannedAt: Date.now(),
|
|
241
|
+
ttl,
|
|
242
|
+
container,
|
|
243
|
+
tools,
|
|
244
|
+
secrets,
|
|
245
|
+
replitTools,
|
|
246
|
+
replit,
|
|
247
|
+
claudeCode,
|
|
248
|
+
dualBrain,
|
|
249
|
+
};
|
|
250
|
+
_cache = report;
|
|
251
|
+
_cacheTime = Date.now();
|
|
252
|
+
return report;
|
|
253
|
+
}
|
|
254
|
+
export function formatEnvironment(report) {
|
|
255
|
+
const { container, tools, secrets, replitTools, replit, dualBrain } = report;
|
|
256
|
+
const nodeShort = container.nodeVersion.replace(/^v/, '').split('.')[0];
|
|
257
|
+
const containerLabel = container.type === 'replit'
|
|
258
|
+
? 'Replit'
|
|
259
|
+
: container.type.charAt(0).toUpperCase() + container.type.slice(1);
|
|
260
|
+
const lines = [];
|
|
261
|
+
lines.push(`Environment: ${containerLabel} (node ${nodeShort}.x)`);
|
|
262
|
+
const toolEntries = [];
|
|
263
|
+
for (const [name, info] of Object.entries(tools)) {
|
|
264
|
+
if (info.available)
|
|
265
|
+
toolEntries.push(`${name} ✓`);
|
|
266
|
+
}
|
|
267
|
+
if (toolEntries.length)
|
|
268
|
+
lines.push(`Tools: ${toolEntries.join(' ')}`);
|
|
269
|
+
const secretMap = {
|
|
270
|
+
NPM_TOKEN: 'npm',
|
|
271
|
+
GITHUB_TOKEN: 'GitHub',
|
|
272
|
+
DATABASE_URL: 'PostgreSQL',
|
|
273
|
+
REPLIT_DB_URL: 'KV',
|
|
274
|
+
};
|
|
275
|
+
const secretEntries = [];
|
|
276
|
+
for (const [key, label] of Object.entries(secretMap)) {
|
|
277
|
+
if (secrets[key])
|
|
278
|
+
secretEntries.push(`${label} ✓`);
|
|
279
|
+
}
|
|
280
|
+
if (secretEntries.length)
|
|
281
|
+
lines.push(`Secrets: ${secretEntries.join(' ')}`);
|
|
282
|
+
const platformParts = [];
|
|
283
|
+
if (replit.hasDatabase)
|
|
284
|
+
platformParts.push('PostgreSQL ✓');
|
|
285
|
+
if (replit.hasKV)
|
|
286
|
+
platformParts.push('KV ✓');
|
|
287
|
+
if (replit.hasObjectStorage)
|
|
288
|
+
platformParts.push('ObjectStorage ✓');
|
|
289
|
+
if (replit.hasAuth)
|
|
290
|
+
platformParts.push('Auth ✓');
|
|
291
|
+
if (replit.hasDeployments)
|
|
292
|
+
platformParts.push('Deployments ✓');
|
|
293
|
+
if (platformParts.length)
|
|
294
|
+
lines.push(`Platform: ${platformParts.join(' ')}`);
|
|
295
|
+
if (replitTools.installed) {
|
|
296
|
+
const ver = replitTools.version ? `v${replitTools.version}` : 'installed';
|
|
297
|
+
const caps = replitTools.capabilities.join(', ');
|
|
298
|
+
lines.push(`replit-tools: ${ver}${caps ? ` (${caps})` : ''}`);
|
|
299
|
+
}
|
|
300
|
+
const dbFlag = dualBrain.hasLedger ? ', ledger ✓' : '';
|
|
301
|
+
const docsFlag = dualBrain.livingDocsInit ? 'living docs ✓' : 'living docs ✗';
|
|
302
|
+
lines.push(`dual-brain: v${dualBrain.version} (${docsFlag}${dbFlag})`);
|
|
303
|
+
return lines.join('\n');
|
|
304
|
+
}
|
|
305
|
+
export function getCapabilitySummary(report) {
|
|
306
|
+
const caps = [];
|
|
307
|
+
if (report.container.type !== 'unknown') {
|
|
308
|
+
caps.push(`${report.container.type}-container`);
|
|
309
|
+
}
|
|
310
|
+
if (report.replit.hasDatabase)
|
|
311
|
+
caps.push('postgresql');
|
|
312
|
+
if (report.replit.hasKV)
|
|
313
|
+
caps.push('replit-kv');
|
|
314
|
+
if (report.replit.hasObjectStorage)
|
|
315
|
+
caps.push('object-storage');
|
|
316
|
+
if (report.replit.hasAuth)
|
|
317
|
+
caps.push('replit-auth');
|
|
318
|
+
if (report.replit.hasDeployments)
|
|
319
|
+
caps.push('replit-deployments');
|
|
320
|
+
if (report.tools.codex?.available)
|
|
321
|
+
caps.push('codex-cli');
|
|
322
|
+
if (report.tools.claude?.available)
|
|
323
|
+
caps.push('claude-cli');
|
|
324
|
+
if (report.tools.git?.available)
|
|
325
|
+
caps.push('git');
|
|
326
|
+
if (report.tools.gh?.available)
|
|
327
|
+
caps.push('github-cli');
|
|
328
|
+
if (report.tools.rg?.available)
|
|
329
|
+
caps.push('ripgrep');
|
|
330
|
+
if (report.replitTools.installed) {
|
|
331
|
+
for (const c of report.replitTools.capabilities) {
|
|
332
|
+
caps.push(`replit-tools-${c}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (report.claudeCode.mcpConfigured)
|
|
336
|
+
caps.push('mcp-configured');
|
|
337
|
+
if (report.claudeCode.hooksDir)
|
|
338
|
+
caps.push('claude-hooks');
|
|
339
|
+
if (report.dualBrain.hasLedger)
|
|
340
|
+
caps.push('dual-brain-ledger');
|
|
341
|
+
if (report.dualBrain.hasFailureMemory)
|
|
342
|
+
caps.push('dual-brain-failure-memory');
|
|
343
|
+
if (report.dualBrain.livingDocsInit)
|
|
344
|
+
caps.push('dual-brain-living-docs');
|
|
345
|
+
return caps;
|
|
346
|
+
}
|
|
347
|
+
export function invalidateCache() {
|
|
348
|
+
_cache = null;
|
|
349
|
+
_cacheTime = 0;
|
|
350
|
+
}
|
|
351
|
+
// ─── Ambiguity Detection ──────────────────────────────────────────────────────
|
|
352
|
+
const TECHNICAL_TERMS = /\b(fix|bug|error|test|deploy|refactor|import|export|function|class|module|api|endpoint|auth|token|database|query|schema|migration|build|lint|type|interface|component|route|handler|middleware|config|env|secret|key|file|path|directory|repo|branch|commit|merge|pull|push|install|upgrade|package|dependency|version|release|publish|log|trace|debug|stack|exception|undefined|null|async|await|promise|fetch|request|response|status|server|client|socket|cache|session)\b/i;
|
|
353
|
+
/**
|
|
354
|
+
* Detect whether a prompt is ambiguous and needs clarification before dispatch.
|
|
355
|
+
*
|
|
356
|
+
* A prompt is considered ambiguous when ALL of the following are true:
|
|
357
|
+
* 1. It is very short (under 4 words)
|
|
358
|
+
* 2. No file context is provided
|
|
359
|
+
* 3. It lacks specific technical terms that narrow the intent
|
|
360
|
+
*/
|
|
361
|
+
export function detectAmbiguity(prompt, context = {}) {
|
|
362
|
+
if (!prompt || typeof prompt !== 'string') {
|
|
363
|
+
return { isAmbiguous: true, reason: 'missing context: empty prompt' };
|
|
364
|
+
}
|
|
365
|
+
const words = prompt.trim().split(/\s+/).filter(Boolean);
|
|
366
|
+
const isTooShort = words.length < 4;
|
|
367
|
+
const hasFileContext = Array.isArray(context?.files) && context.files.length > 0;
|
|
368
|
+
const hasTechnicalTerms = TECHNICAL_TERMS.test(prompt);
|
|
369
|
+
if (isTooShort && !hasFileContext && !hasTechnicalTerms) {
|
|
370
|
+
return {
|
|
371
|
+
isAmbiguous: true,
|
|
372
|
+
reason: `unclear: prompt is vague ("${prompt.trim()}") — missing context about what to change and where`,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
return { isAmbiguous: false, reason: null };
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Detect whether a user prompt is too vague to act on confidently.
|
|
379
|
+
*
|
|
380
|
+
* Checks for:
|
|
381
|
+
* - Very short prompts (under 10 chars)
|
|
382
|
+
* - No file paths, function names, or specific identifiers
|
|
383
|
+
* - Pronoun-only references without antecedents ("fix that thing", "change it")
|
|
384
|
+
*/
|
|
385
|
+
export function isAmbiguous(prompt) {
|
|
386
|
+
if (!prompt || typeof prompt !== 'string')
|
|
387
|
+
return { ambiguous: true, reason: 'empty-prompt', confidence: 1.0 };
|
|
388
|
+
const trimmed = prompt.trim();
|
|
389
|
+
if (trimmed.length < 10)
|
|
390
|
+
return { ambiguous: true, reason: 'too-short', confidence: 0.9 };
|
|
391
|
+
// Check for file paths, function names, specific identifiers
|
|
392
|
+
const hasSpecifics = /[a-zA-Z_]\w*\.(mjs|js|ts|tsx|jsx|py|go|rs|java|rb|css|html|json|yaml|yml|md|sh)/.test(trimmed)
|
|
393
|
+
|| /[a-zA-Z_]\w*\(\)/.test(trimmed) // function calls
|
|
394
|
+
|| /`[^`]+`/.test(trimmed) // backtick-quoted identifiers
|
|
395
|
+
|| /"[^"]{3,}"/.test(trimmed) // quoted strings
|
|
396
|
+
|| /\b(line|function|class|method|variable|module|component|endpoint|route|table|column)\s+\w+/i.test(trimmed);
|
|
397
|
+
// Vague pronoun patterns
|
|
398
|
+
const vaguePatterns = /^(fix|change|update|do|make|help|look at|check)\s+(this|that|it|the thing|stuff|things?)$/i;
|
|
399
|
+
if (vaguePatterns.test(trimmed))
|
|
400
|
+
return { ambiguous: true, reason: 'vague-reference', confidence: 0.85 };
|
|
401
|
+
if (!hasSpecifics && trimmed.split(/\s+/).length < 5) {
|
|
402
|
+
return { ambiguous: true, reason: 'lacks-specifics', confidence: 0.7 };
|
|
403
|
+
}
|
|
404
|
+
return { ambiguous: false, reason: null, confidence: 0.1 };
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=awareness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../src/awareness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* brief.ts — Delegation brief generator for the Dual-Brain Orchestrator HEAD.
|
|
3
|
+
*
|
|
4
|
+
* Generates typed delegation prompts from role-based templates. The HEAD's
|
|
5
|
+
* primary skill is writing great agent briefs. Pure string construction —
|
|
6
|
+
* no imports from sibling modules.
|
|
7
|
+
*
|
|
8
|
+
* Exports: generateBrief, compressPriorResults, listRoles
|
|
9
|
+
*/
|
|
10
|
+
type Role = 'researcher' | 'implementer' | 'reviewer' | 'verifier';
|
|
11
|
+
interface TaskInput {
|
|
12
|
+
id?: string;
|
|
13
|
+
title: string;
|
|
14
|
+
goal: string;
|
|
15
|
+
tier?: string;
|
|
16
|
+
role?: Role;
|
|
17
|
+
owns?: string[];
|
|
18
|
+
consensus?: boolean;
|
|
19
|
+
risk?: string;
|
|
20
|
+
}
|
|
21
|
+
interface BriefContext {
|
|
22
|
+
prompt?: string;
|
|
23
|
+
priorResults?: PriorResult[];
|
|
24
|
+
repo?: {
|
|
25
|
+
projectType?: string;
|
|
26
|
+
branch?: string;
|
|
27
|
+
testCmd?: string;
|
|
28
|
+
lintCmd?: string;
|
|
29
|
+
};
|
|
30
|
+
cwd?: string;
|
|
31
|
+
}
|
|
32
|
+
interface PriorResult {
|
|
33
|
+
stepId?: string;
|
|
34
|
+
taskId?: string;
|
|
35
|
+
summary?: string;
|
|
36
|
+
output?: string;
|
|
37
|
+
filesChanged?: string[];
|
|
38
|
+
decisions?: string[];
|
|
39
|
+
findings?: string;
|
|
40
|
+
}
|
|
41
|
+
interface RoleDescription {
|
|
42
|
+
role: string;
|
|
43
|
+
description: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function listRoles(): RoleDescription[];
|
|
46
|
+
export declare function compressPriorResults(results: PriorResult[] | undefined): string;
|
|
47
|
+
export declare function generateBrief(task: TaskInput, context?: BriefContext): string;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* brief.ts — Delegation brief generator for the Dual-Brain Orchestrator HEAD.
|
|
3
|
+
*
|
|
4
|
+
* Generates typed delegation prompts from role-based templates. The HEAD's
|
|
5
|
+
* primary skill is writing great agent briefs. Pure string construction —
|
|
6
|
+
* no imports from sibling modules.
|
|
7
|
+
*
|
|
8
|
+
* Exports: generateBrief, compressPriorResults, listRoles
|
|
9
|
+
*/
|
|
10
|
+
const TEMPLATES = {
|
|
11
|
+
researcher: {
|
|
12
|
+
prefix: 'You are a code researcher. READ ONLY — do NOT edit any files.',
|
|
13
|
+
outputFormat: 'Return: { findings: string, files: string[], lineRefs: string[], confidence: "high"|"medium"|"low" }',
|
|
14
|
+
constraints: 'Max 50 lines of quoted code. Focus on structure and relationships, not implementation details.',
|
|
15
|
+
},
|
|
16
|
+
implementer: {
|
|
17
|
+
prefix: 'You are a code implementer. Edit ONLY files in your ownership list.',
|
|
18
|
+
outputFormat: 'Return: { filesChanged: string[], testsRun: string[], decisions: string[], risks: string[] }',
|
|
19
|
+
constraints: 'Run tests after changes. Make minimal edits. Do not refactor beyond scope.',
|
|
20
|
+
},
|
|
21
|
+
reviewer: {
|
|
22
|
+
prefix: 'You are a code reviewer. READ ONLY — do NOT edit any files.',
|
|
23
|
+
outputFormat: 'Return: { issues: { severity: string, file: string, line: number, description: string }[], approved: boolean, risks: string[] }',
|
|
24
|
+
constraints: 'Focus on correctness, security, and behavior preservation. Ignore style.',
|
|
25
|
+
},
|
|
26
|
+
verifier: {
|
|
27
|
+
prefix: 'You are a test verifier. Run the test suite and report results.',
|
|
28
|
+
outputFormat: 'Return: { passed: boolean, failCount: number, failures: string[], rootCause: string | null }',
|
|
29
|
+
constraints: 'If tests fail, identify root cause but DO NOT fix. Report only.',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
// --- Exported: listRoles ---
|
|
33
|
+
export function listRoles() {
|
|
34
|
+
return [
|
|
35
|
+
{ role: 'researcher', description: 'Read-only exploration and mapping. Returns findings, file refs, and confidence.' },
|
|
36
|
+
{ role: 'implementer', description: 'Makes edits within ownership scope. Returns changed files, test results, and decisions.' },
|
|
37
|
+
{ role: 'reviewer', description: 'Read-only code review. Returns issues by severity and an approval verdict.' },
|
|
38
|
+
{ role: 'verifier', description: 'Runs the test suite and identifies failures. Does not fix anything.' },
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
// --- Exported: compressPriorResults ---
|
|
42
|
+
export function compressPriorResults(results) {
|
|
43
|
+
if (!results || results.length === 0)
|
|
44
|
+
return '';
|
|
45
|
+
const lines = [];
|
|
46
|
+
for (const r of results) {
|
|
47
|
+
const id = r.stepId ?? r.taskId ?? '?';
|
|
48
|
+
const parts = [];
|
|
49
|
+
// Extract summary or findings
|
|
50
|
+
const rawSummary = r.summary ?? r.findings ?? r.output ?? '';
|
|
51
|
+
if (rawSummary) {
|
|
52
|
+
// Strip code blocks
|
|
53
|
+
const cleaned = String(rawSummary)
|
|
54
|
+
.replace(/```[\s\S]*?```/g, '[code block]')
|
|
55
|
+
.replace(/`[^`]+`/g, (m) => m.replace(/\n/g, ' '))
|
|
56
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
57
|
+
.trim();
|
|
58
|
+
// Keep only first 200 chars of text
|
|
59
|
+
const snippet = cleaned.length > 200 ? cleaned.slice(0, 197) + '...' : cleaned;
|
|
60
|
+
if (snippet)
|
|
61
|
+
parts.push(snippet);
|
|
62
|
+
}
|
|
63
|
+
// Append file lists compactly
|
|
64
|
+
if (Array.isArray(r.filesChanged) && r.filesChanged.length > 0) {
|
|
65
|
+
parts.push(`files: ${r.filesChanged.join(', ')}`);
|
|
66
|
+
}
|
|
67
|
+
// Append key decisions
|
|
68
|
+
if (Array.isArray(r.decisions) && r.decisions.length > 0) {
|
|
69
|
+
parts.push(`decisions: ${r.decisions.slice(0, 3).join('; ')}`);
|
|
70
|
+
}
|
|
71
|
+
if (parts.length > 0) {
|
|
72
|
+
lines.push(`[${id}] ${parts.join(' | ')}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
// --- Section builders ---
|
|
78
|
+
function buildOwnershipSection(owns) {
|
|
79
|
+
if (!owns || owns.length === 0)
|
|
80
|
+
return null;
|
|
81
|
+
return `File ownership (ONLY edit these):\n ${owns.join('\n ')}`;
|
|
82
|
+
}
|
|
83
|
+
function buildPriorResultsSection(priorResults) {
|
|
84
|
+
const compressed = compressPriorResults(priorResults);
|
|
85
|
+
if (!compressed)
|
|
86
|
+
return null;
|
|
87
|
+
return `Prior wave results (context only — do not repeat this work):\n${compressed}`;
|
|
88
|
+
}
|
|
89
|
+
function buildAcceptanceCriteria(task) {
|
|
90
|
+
const lines = [];
|
|
91
|
+
if (task.role === 'researcher') {
|
|
92
|
+
lines.push('- Return a structured findings object with file paths and line references');
|
|
93
|
+
lines.push('- Report confidence level based on coverage of the codebase you explored');
|
|
94
|
+
}
|
|
95
|
+
else if (task.role === 'implementer') {
|
|
96
|
+
lines.push('- All edits must stay within the ownership list above');
|
|
97
|
+
lines.push('- Run existing tests; report any failures');
|
|
98
|
+
lines.push('- Document decisions made during implementation');
|
|
99
|
+
}
|
|
100
|
+
else if (task.role === 'reviewer') {
|
|
101
|
+
lines.push('- Report every issue with severity (critical / high / medium / low)');
|
|
102
|
+
lines.push('- Provide a clear approved: true/false verdict');
|
|
103
|
+
lines.push('- Do not edit any files');
|
|
104
|
+
}
|
|
105
|
+
else if (task.role === 'verifier') {
|
|
106
|
+
lines.push('- Run the full test suite');
|
|
107
|
+
lines.push('- If tests fail, identify root cause but do NOT fix');
|
|
108
|
+
lines.push('- Return pass/fail with failure details');
|
|
109
|
+
}
|
|
110
|
+
if (task.consensus) {
|
|
111
|
+
lines.push('- This task requires dual-brain consensus — be thorough and explicit in your reasoning');
|
|
112
|
+
}
|
|
113
|
+
return lines.length > 0 ? `Acceptance criteria:\n${lines.join('\n')}` : null;
|
|
114
|
+
}
|
|
115
|
+
// --- Exported: generateBrief ---
|
|
116
|
+
export function generateBrief(task, context = {}) {
|
|
117
|
+
const { prompt = '', priorResults = [], repo = {} } = context;
|
|
118
|
+
const role = task.role ?? 'implementer';
|
|
119
|
+
const template = TEMPLATES[role] ?? TEMPLATES.implementer;
|
|
120
|
+
const sections = [];
|
|
121
|
+
// 1. Role header
|
|
122
|
+
sections.push(template.prefix);
|
|
123
|
+
sections.push('');
|
|
124
|
+
// 2. Task identity
|
|
125
|
+
sections.push(`Task: ${task.title}`);
|
|
126
|
+
if (task.id)
|
|
127
|
+
sections.push(`Task ID: ${task.id}`);
|
|
128
|
+
if (task.tier)
|
|
129
|
+
sections.push(`Tier: ${task.tier}`);
|
|
130
|
+
sections.push('');
|
|
131
|
+
// 3. Goal
|
|
132
|
+
sections.push(`Goal:\n${task.goal}`);
|
|
133
|
+
sections.push('');
|
|
134
|
+
// 4. Original user request (for context)
|
|
135
|
+
if (prompt && prompt !== task.goal) {
|
|
136
|
+
const snippet = prompt.length > 300 ? prompt.slice(0, 297) + '...' : prompt;
|
|
137
|
+
sections.push(`Original request (for context):\n${snippet}`);
|
|
138
|
+
sections.push('');
|
|
139
|
+
}
|
|
140
|
+
// 5. File ownership
|
|
141
|
+
const ownershipSection = buildOwnershipSection(task.owns);
|
|
142
|
+
if (ownershipSection) {
|
|
143
|
+
sections.push(ownershipSection);
|
|
144
|
+
sections.push('');
|
|
145
|
+
}
|
|
146
|
+
// 6. Repository context (if available)
|
|
147
|
+
const repoLines = [];
|
|
148
|
+
if (repo.projectType)
|
|
149
|
+
repoLines.push(`Project type: ${repo.projectType}`);
|
|
150
|
+
if (repo.branch)
|
|
151
|
+
repoLines.push(`Branch: ${repo.branch}`);
|
|
152
|
+
if (repo.testCmd)
|
|
153
|
+
repoLines.push(`Test command: ${repo.testCmd}`);
|
|
154
|
+
if (repo.lintCmd)
|
|
155
|
+
repoLines.push(`Lint command: ${repo.lintCmd}`);
|
|
156
|
+
if (repoLines.length > 0) {
|
|
157
|
+
sections.push(`Repository context:\n ${repoLines.join('\n ')}`);
|
|
158
|
+
sections.push('');
|
|
159
|
+
}
|
|
160
|
+
// 7. Prior results
|
|
161
|
+
const priorSection = buildPriorResultsSection(priorResults);
|
|
162
|
+
if (priorSection) {
|
|
163
|
+
sections.push(priorSection);
|
|
164
|
+
sections.push('');
|
|
165
|
+
}
|
|
166
|
+
// 8. Acceptance criteria
|
|
167
|
+
const criteriaSection = buildAcceptanceCriteria(task);
|
|
168
|
+
if (criteriaSection) {
|
|
169
|
+
sections.push(criteriaSection);
|
|
170
|
+
sections.push('');
|
|
171
|
+
}
|
|
172
|
+
// 9. Constraints
|
|
173
|
+
sections.push(`Constraints:\n${template.constraints}`);
|
|
174
|
+
sections.push('');
|
|
175
|
+
// 10. Output format requirement
|
|
176
|
+
sections.push(`Required output format:\n${template.outputFormat}`);
|
|
177
|
+
return sections.join('\n').trimEnd();
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/brief.ts"],"names":[],"mappings":"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"}
|