dual-brain 0.2.30 → 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 +56 -56
- 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 -87
- 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 -400
- package/src/pipeline.mjs +0 -1711
- 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 -296
- 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 -204
- package/src/self-correct.mjs +0 -147
- 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 -223
- package/src/signal.mjs +0 -115
- 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,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* intelligence.ts — Situational awareness for every pipeline run.
|
|
3
|
+
* Reads project reality fresh, derives task context, and detects contradictions
|
|
4
|
+
* between what an agent plans to do and what is actually true.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
const PROTECTED_PATHS = [
|
|
10
|
+
'src/pipeline.mjs',
|
|
11
|
+
'src/dispatch.mjs',
|
|
12
|
+
'src/decide.mjs',
|
|
13
|
+
'.claude/hooks/head-guard.mjs',
|
|
14
|
+
];
|
|
15
|
+
// --- Git helpers ---
|
|
16
|
+
function safeExec(cmd, cwd) {
|
|
17
|
+
try {
|
|
18
|
+
return execSync(cmd, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function getDirtyFiles(cwd) {
|
|
25
|
+
const raw = safeExec('git status --porcelain', cwd);
|
|
26
|
+
if (!raw)
|
|
27
|
+
return [];
|
|
28
|
+
return raw
|
|
29
|
+
.split('\n')
|
|
30
|
+
.filter(l => l.trim())
|
|
31
|
+
.map(l => l.slice(3).trim().replace(/^"(.*)"$/, '$1'))
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
}
|
|
34
|
+
function getRecentCommits(cwd, n = 5) {
|
|
35
|
+
const raw = safeExec(`git log -${n} --pretty=format:%s`, cwd);
|
|
36
|
+
if (!raw)
|
|
37
|
+
return [];
|
|
38
|
+
return raw.split('\n').filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
function getAheadCount(cwd) {
|
|
41
|
+
const raw = safeExec('git rev-list --count @{u}..HEAD', cwd);
|
|
42
|
+
const n = parseInt(raw, 10);
|
|
43
|
+
return isNaN(n) ? 0 : n;
|
|
44
|
+
}
|
|
45
|
+
function getCurrentBranch(cwd) {
|
|
46
|
+
return safeExec('git branch --show-current', cwd) || 'unknown';
|
|
47
|
+
}
|
|
48
|
+
function readRecentFailures(cwd, limit = 10) {
|
|
49
|
+
const path = join(cwd, '.dualbrain', 'failures.jsonl');
|
|
50
|
+
if (!existsSync(path))
|
|
51
|
+
return [];
|
|
52
|
+
try {
|
|
53
|
+
const lines = readFileSync(path, 'utf8').split('\n').filter(Boolean);
|
|
54
|
+
return lines
|
|
55
|
+
.slice(-limit)
|
|
56
|
+
.reverse()
|
|
57
|
+
.map(line => {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(line);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
.filter((r) => r !== null && !r.resolved)
|
|
66
|
+
.map(r => ({
|
|
67
|
+
prompt: r.prompt ?? '',
|
|
68
|
+
error: r.error ?? '',
|
|
69
|
+
approach: r.tier ? `${r.tier}/${r.model ?? 'unknown'}` : (r.model ?? 'unknown'),
|
|
70
|
+
timestamp: r.timestamp ?? 0,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function readRecentOutcomes(cwd, limit = 10) {
|
|
78
|
+
const dir = join(cwd, '.dualbrain', 'outcomes');
|
|
79
|
+
if (!existsSync(dir))
|
|
80
|
+
return [];
|
|
81
|
+
try {
|
|
82
|
+
const files = readdirSync(dir)
|
|
83
|
+
.filter(f => f.endsWith('.jsonl'))
|
|
84
|
+
.sort()
|
|
85
|
+
.reverse()
|
|
86
|
+
.slice(0, 3);
|
|
87
|
+
const records = [];
|
|
88
|
+
for (const file of files) {
|
|
89
|
+
try {
|
|
90
|
+
const lines = readFileSync(join(dir, file), 'utf8').split('\n').filter(Boolean);
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
try {
|
|
93
|
+
const r = JSON.parse(line);
|
|
94
|
+
records.push({
|
|
95
|
+
task: r.prompt ?? '',
|
|
96
|
+
success: r.result?.success ?? false,
|
|
97
|
+
timestamp: r.timestamp ?? 0,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch { /* skip bad line */ }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch { /* skip unreadable file */ }
|
|
104
|
+
}
|
|
105
|
+
return records
|
|
106
|
+
.sort((a, b) => b.timestamp - a.timestamp)
|
|
107
|
+
.slice(0, limit);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function readPackageJson(cwd) {
|
|
114
|
+
try {
|
|
115
|
+
return JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return {};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Read project reality fresh. No cache. Returns a ProjectBrief.
|
|
123
|
+
*/
|
|
124
|
+
export function deriveProjectState(cwd = process.cwd()) {
|
|
125
|
+
const pkg = readPackageJson(cwd);
|
|
126
|
+
const version = pkg.version ?? '0.0.0';
|
|
127
|
+
const versionMajor = parseInt(version.split('.')[0], 10) || 0;
|
|
128
|
+
const dirtyFiles = getDirtyFiles(cwd);
|
|
129
|
+
const recentCommits = getRecentCommits(cwd, 5);
|
|
130
|
+
const branch = getCurrentBranch(cwd);
|
|
131
|
+
const aheadOfRemote = getAheadCount(cwd);
|
|
132
|
+
const binField = pkg.bin ?? {};
|
|
133
|
+
const binValues = Object.values(binField);
|
|
134
|
+
const entryPoint = binValues[0] ?? (pkg.main ?? '');
|
|
135
|
+
const testCommand = pkg.scripts?.test ?? null;
|
|
136
|
+
const recentFailures = readRecentFailures(cwd, 10);
|
|
137
|
+
const recentOutcomes = readRecentOutcomes(cwd, 10);
|
|
138
|
+
return {
|
|
139
|
+
packageName: pkg.name ?? 'unknown',
|
|
140
|
+
version,
|
|
141
|
+
versionMajor,
|
|
142
|
+
description: pkg.description ?? '',
|
|
143
|
+
branch,
|
|
144
|
+
dirty: dirtyFiles.length > 0,
|
|
145
|
+
dirtyFiles,
|
|
146
|
+
recentCommits,
|
|
147
|
+
aheadOfRemote,
|
|
148
|
+
brandName: 'dual-brain',
|
|
149
|
+
cliCommand: 'dual-brain',
|
|
150
|
+
moduleType: pkg.type === 'module' ? 'esm' : 'cjs',
|
|
151
|
+
entryPoint,
|
|
152
|
+
testCommand,
|
|
153
|
+
protectedPaths: PROTECTED_PATHS,
|
|
154
|
+
recentFailures,
|
|
155
|
+
recentOutcomes,
|
|
156
|
+
derivedAt: Date.now(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Derive task-scoped context from the current prompt and optional session events.
|
|
161
|
+
*/
|
|
162
|
+
export function deriveTaskContext(task = '', recentEvents = []) {
|
|
163
|
+
const priorAttempts = [];
|
|
164
|
+
const filesOutOfScope = [];
|
|
165
|
+
const filesInScopeSet = new Set();
|
|
166
|
+
const FILE_RE = /(?:^|\s)((?:src|hooks|bin|scripts|\.claude)\/[\w./\-]+\.\w+)/g;
|
|
167
|
+
let m;
|
|
168
|
+
FILE_RE.lastIndex = 0;
|
|
169
|
+
while ((m = FILE_RE.exec(task)) !== null)
|
|
170
|
+
filesInScopeSet.add(m[1]);
|
|
171
|
+
for (const ev of (recentEvents ?? [])) {
|
|
172
|
+
if (!ev)
|
|
173
|
+
continue;
|
|
174
|
+
if (ev.type === 'failure' || ev.failed) {
|
|
175
|
+
priorAttempts.push({
|
|
176
|
+
approach: ev.approach ?? ev.tier ?? 'unknown',
|
|
177
|
+
failed: true,
|
|
178
|
+
reason: ev.error ?? ev.reason ?? '',
|
|
179
|
+
});
|
|
180
|
+
for (const f of (ev.files ?? ev.filesChanged ?? [])) {
|
|
181
|
+
filesOutOfScope.push(f);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
FILE_RE.lastIndex = 0;
|
|
185
|
+
const evText = JSON.stringify(ev);
|
|
186
|
+
while ((m = FILE_RE.exec(evText)) !== null)
|
|
187
|
+
filesInScopeSet.add(m[1]);
|
|
188
|
+
}
|
|
189
|
+
const failureCount = priorAttempts.filter(a => a.failed).length;
|
|
190
|
+
const escalationLevel = failureCount >= 3 ? 'critical' :
|
|
191
|
+
failureCount >= 1 ? 'elevated' :
|
|
192
|
+
'normal';
|
|
193
|
+
const constraintKeywords = [];
|
|
194
|
+
const CONSTRAINT_RE = /\b(must|never|always|do not|don't|only|no\s+\w+)\b[^.!?]{0,80}/gi;
|
|
195
|
+
let cm;
|
|
196
|
+
CONSTRAINT_RE.lastIndex = 0;
|
|
197
|
+
while ((cm = CONSTRAINT_RE.exec(task)) !== null) {
|
|
198
|
+
constraintKeywords.push(cm[0].trim());
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
task,
|
|
202
|
+
priorAttempts,
|
|
203
|
+
activeConstraints: constraintKeywords,
|
|
204
|
+
filesInScope: [...filesInScopeSet],
|
|
205
|
+
filesOutOfScope: [...new Set(filesOutOfScope)],
|
|
206
|
+
escalationLevel,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Detect contradictions between project reality, task context, and a proposed plan.
|
|
211
|
+
* Returns an array of contradiction objects.
|
|
212
|
+
*/
|
|
213
|
+
export function detectContradictions(projectBrief, taskBrief, plan = {}) {
|
|
214
|
+
const contradictions = [];
|
|
215
|
+
const planDesc = plan.description ?? '';
|
|
216
|
+
const planAssumptions = plan.assumptions ?? {};
|
|
217
|
+
const targetFiles = Array.isArray(plan.targetFiles) ? plan.targetFiles : [];
|
|
218
|
+
// 1. version_mismatch
|
|
219
|
+
const assumedVersion = typeof planAssumptions === 'string'
|
|
220
|
+
? planAssumptions
|
|
221
|
+
: (planAssumptions.version ?? planAssumptions.packageVersion ?? '');
|
|
222
|
+
if (assumedVersion) {
|
|
223
|
+
const assumedMajor = parseInt(String(assumedVersion).split('.')[0], 10);
|
|
224
|
+
if (!isNaN(assumedMajor) && assumedMajor !== projectBrief.versionMajor) {
|
|
225
|
+
contradictions.push({
|
|
226
|
+
type: 'version_mismatch',
|
|
227
|
+
severity: 'block',
|
|
228
|
+
message: `Plan assumes major version ${assumedMajor} but package is v${projectBrief.versionMajor} (${projectBrief.version})`,
|
|
229
|
+
evidence: { expected: projectBrief.version, actual: assumedVersion },
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// version reference in description
|
|
234
|
+
const versionInDesc = planDesc.match(/\bv?(\d+)\.\d+\.\d+\b/);
|
|
235
|
+
if (versionInDesc) {
|
|
236
|
+
const descMajor = parseInt(versionInDesc[1], 10);
|
|
237
|
+
if (!isNaN(descMajor) && descMajor !== projectBrief.versionMajor) {
|
|
238
|
+
contradictions.push({
|
|
239
|
+
type: 'version_mismatch',
|
|
240
|
+
severity: 'warn',
|
|
241
|
+
message: `Plan description references v${versionInDesc[0]} but package is v${projectBrief.version}`,
|
|
242
|
+
evidence: { expected: projectBrief.version, actual: versionInDesc[0] },
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// 2. branding_error
|
|
247
|
+
const WRONG_NAMES = ['data-tools', 'orchestrator', 'dual_brain', 'dualbrain', 'brain-dual'];
|
|
248
|
+
const searchText = [planDesc, JSON.stringify(planAssumptions)].join(' ').toLowerCase();
|
|
249
|
+
for (const wrongName of WRONG_NAMES) {
|
|
250
|
+
if (searchText.includes(wrongName) && !searchText.includes('dual-brain')) {
|
|
251
|
+
contradictions.push({
|
|
252
|
+
type: 'branding_error',
|
|
253
|
+
severity: 'block',
|
|
254
|
+
message: `Plan references "${wrongName}" but correct package name is "${projectBrief.brandName}"`,
|
|
255
|
+
evidence: { expected: projectBrief.brandName, actual: wrongName },
|
|
256
|
+
});
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// check explicit packageName assumption
|
|
261
|
+
const assumedName = typeof planAssumptions === 'object' ? planAssumptions.packageName : null;
|
|
262
|
+
if (assumedName && assumedName !== projectBrief.packageName) {
|
|
263
|
+
contradictions.push({
|
|
264
|
+
type: 'name_mismatch',
|
|
265
|
+
severity: 'block',
|
|
266
|
+
message: `Plan assumes packageName "${assumedName}" but actual package is "${projectBrief.packageName}"`,
|
|
267
|
+
evidence: { expected: projectBrief.packageName, actual: assumedName },
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// 3. repeated_failure
|
|
271
|
+
const planWords = new Set(planDesc.toLowerCase().split(/\W+/).filter(w => w.length > 3));
|
|
272
|
+
for (const failure of (projectBrief.recentFailures ?? [])) {
|
|
273
|
+
const failureWords = (failure.prompt ?? '').toLowerCase().split(/\W+/).filter(w => w.length > 3);
|
|
274
|
+
const overlap = failureWords.filter(w => planWords.has(w)).length;
|
|
275
|
+
const similarity = overlap / Math.max(planWords.size, failureWords.length, 1);
|
|
276
|
+
if (similarity >= 0.4) {
|
|
277
|
+
contradictions.push({
|
|
278
|
+
type: 'repeated_failure',
|
|
279
|
+
severity: 'warn',
|
|
280
|
+
message: `Plan resembles a recent failed attempt: "${failure.prompt.slice(0, 80)}"`,
|
|
281
|
+
evidence: { expected: 'novel approach', actual: failure.prompt.slice(0, 80) },
|
|
282
|
+
});
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// 4. scope_violation + 5. protected_file
|
|
287
|
+
const taskFiles = new Set(taskBrief?.filesInScope ?? []);
|
|
288
|
+
const protectedSet = new Set(projectBrief.protectedPaths ?? []);
|
|
289
|
+
for (const f of targetFiles) {
|
|
290
|
+
const isProtected = protectedSet.has(f) || [...protectedSet].some(p => f.endsWith(p));
|
|
291
|
+
const inScope = taskFiles.has(f) || taskFiles.size === 0;
|
|
292
|
+
if (isProtected && !inScope) {
|
|
293
|
+
contradictions.push({
|
|
294
|
+
type: 'protected_file',
|
|
295
|
+
severity: 'block',
|
|
296
|
+
message: `Plan targets protected file "${f}" without explicit scope justification`,
|
|
297
|
+
evidence: { expected: 'file not in plan', actual: f },
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
else if (!inScope && isProtected) {
|
|
301
|
+
contradictions.push({
|
|
302
|
+
type: 'scope_violation',
|
|
303
|
+
severity: 'warn',
|
|
304
|
+
message: `Plan targets "${f}" which is protected and not mentioned in task scope`,
|
|
305
|
+
evidence: { expected: [...taskFiles].join(', ') || 'none', actual: f },
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
else if (!inScope && taskFiles.size > 0) {
|
|
309
|
+
contradictions.push({
|
|
310
|
+
type: 'scope_violation',
|
|
311
|
+
severity: 'warn',
|
|
312
|
+
message: `Plan targets "${f}" which is outside the task's stated file scope`,
|
|
313
|
+
evidence: { expected: [...taskFiles].join(', '), actual: f },
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return contradictions;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Format a compact situational awareness summary (max 15 lines) for agent prompts.
|
|
321
|
+
*/
|
|
322
|
+
export function formatBrief(projectBrief, taskBrief, sessionContext = null) {
|
|
323
|
+
const lines = [];
|
|
324
|
+
const dirtyLabel = projectBrief.dirty ? 'dirty' : 'clean';
|
|
325
|
+
lines.push(`PROJECT: ${projectBrief.packageName} v${projectBrief.version} (${projectBrief.moduleType})`);
|
|
326
|
+
lines.push(`BRANCH: ${projectBrief.branch} (${dirtyLabel}) | ${projectBrief.aheadOfRemote} ahead`);
|
|
327
|
+
if (projectBrief.recentCommits?.length > 0) {
|
|
328
|
+
const preview = projectBrief.recentCommits
|
|
329
|
+
.slice(0, 2)
|
|
330
|
+
.map(c => `"${c.slice(0, 50)}"`)
|
|
331
|
+
.join(' · ');
|
|
332
|
+
lines.push(`RECENT: ${preview}`);
|
|
333
|
+
}
|
|
334
|
+
const failureCount = (projectBrief.recentFailures ?? []).length;
|
|
335
|
+
if (failureCount > 0) {
|
|
336
|
+
const dayMs = 24 * 60 * 60 * 1000;
|
|
337
|
+
const cutoff = Date.now() - dayMs;
|
|
338
|
+
const recent24 = projectBrief.recentFailures.filter(f => f.timestamp >= cutoff).length;
|
|
339
|
+
const categories = [...new Set(projectBrief.recentFailures.slice(0, 5).map(f => f.error?.split(':')[0]?.trim()).filter(Boolean))].slice(0, 2).join(', ');
|
|
340
|
+
lines.push(`FAILURES: ${recent24} in last 24h${categories ? ` (${categories})` : ''}`);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
lines.push('FAILURES: none');
|
|
344
|
+
}
|
|
345
|
+
const protectedNames = (projectBrief.protectedPaths ?? [])
|
|
346
|
+
.map(p => p.split('/').pop())
|
|
347
|
+
.join(', ');
|
|
348
|
+
if (protectedNames)
|
|
349
|
+
lines.push(`PROTECTED: ${protectedNames}`);
|
|
350
|
+
if (taskBrief) {
|
|
351
|
+
const taskPreview = (taskBrief.task ?? '').slice(0, 80);
|
|
352
|
+
if (taskPreview)
|
|
353
|
+
lines.push(`TASK: "${taskPreview}"`);
|
|
354
|
+
const failedAttempts = (taskBrief.priorAttempts ?? []).filter(a => a.failed);
|
|
355
|
+
if (failedAttempts.length > 0) {
|
|
356
|
+
const lastReason = failedAttempts[0].reason
|
|
357
|
+
? ` (${failedAttempts[0].reason.slice(0, 40)})`
|
|
358
|
+
: '';
|
|
359
|
+
lines.push(`PRIOR ATTEMPTS: ${failedAttempts.length} failed${lastReason}`);
|
|
360
|
+
}
|
|
361
|
+
if (taskBrief.escalationLevel && taskBrief.escalationLevel !== 'normal') {
|
|
362
|
+
lines.push(`ESCALATION: ${taskBrief.escalationLevel}`);
|
|
363
|
+
}
|
|
364
|
+
if (taskBrief.filesInScope?.length > 0) {
|
|
365
|
+
lines.push(`IN SCOPE: ${taskBrief.filesInScope.slice(0, 4).join(', ')}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Session context: include 1-2 lines about prior cross-session work when available
|
|
369
|
+
if (sessionContext) {
|
|
370
|
+
const priorAttempts = Array.isArray(sessionContext.priorAttempts) ? sessionContext.priorAttempts : [];
|
|
371
|
+
const failures = priorAttempts.filter(a => a && (a.failed || a.status === 'failed'));
|
|
372
|
+
const successes = priorAttempts.filter(a => a && !a.failed && a.status !== 'failed');
|
|
373
|
+
if (failures.length > 0) {
|
|
374
|
+
const lastFail = failures[failures.length - 1];
|
|
375
|
+
const age = lastFail.daysAgo != null ? `${lastFail.daysAgo}d ago` : (lastFail.when ?? 'recently');
|
|
376
|
+
const reason = lastFail.error ?? lastFail.reason ?? '';
|
|
377
|
+
const reasonClip = reason ? ` (${reason.slice(0, 40)})` : '';
|
|
378
|
+
lines.push(`PRIOR: similar task failed ${age}${reasonClip}`);
|
|
379
|
+
}
|
|
380
|
+
else if (successes.length > 0) {
|
|
381
|
+
const lastSuccess = successes[successes.length - 1];
|
|
382
|
+
const age = lastSuccess.daysAgo != null ? `${lastSuccess.daysAgo}d ago` : (lastSuccess.when ?? 'recently');
|
|
383
|
+
lines.push(`PRIOR: related work completed successfully ${age}`);
|
|
384
|
+
}
|
|
385
|
+
else if (Array.isArray(sessionContext.relatedSessions) && sessionContext.relatedSessions.length > 0) {
|
|
386
|
+
lines.push(`PRIOR: ${sessionContext.relatedSessions.length} related session(s) found`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return lines.slice(0, 15).join('\n');
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=intelligence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
type TaskStatus = 'open' | 'in_progress' | 'blocked' | 'done' | 'failed';
|
|
2
|
+
interface TaskEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
created: string;
|
|
5
|
+
updated: string;
|
|
6
|
+
intent: string;
|
|
7
|
+
status: TaskStatus;
|
|
8
|
+
owner: string;
|
|
9
|
+
priority: string;
|
|
10
|
+
blockers: string[];
|
|
11
|
+
proof: string | null;
|
|
12
|
+
subtasks: string[];
|
|
13
|
+
parentTask: string | null;
|
|
14
|
+
files: string[];
|
|
15
|
+
result: string | null;
|
|
16
|
+
cost: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface CreateTaskInput {
|
|
19
|
+
intent?: string;
|
|
20
|
+
owner?: string;
|
|
21
|
+
priority?: string;
|
|
22
|
+
blockers?: string[];
|
|
23
|
+
proof?: string | null;
|
|
24
|
+
subtasks?: string[];
|
|
25
|
+
parentTask?: string | null;
|
|
26
|
+
files?: string[];
|
|
27
|
+
result?: string | null;
|
|
28
|
+
cost?: unknown;
|
|
29
|
+
}
|
|
30
|
+
interface TaskSummary {
|
|
31
|
+
open: number;
|
|
32
|
+
inProgress: number;
|
|
33
|
+
blocked: number;
|
|
34
|
+
done: number;
|
|
35
|
+
failed: number;
|
|
36
|
+
total: number;
|
|
37
|
+
}
|
|
38
|
+
interface SubtaskInput extends CreateTaskInput {
|
|
39
|
+
}
|
|
40
|
+
export declare function createTask(task: CreateTaskInput, cwd?: string): TaskEntry;
|
|
41
|
+
export declare function updateTask(taskId: string, updates: Partial<TaskEntry>, cwd?: string): TaskEntry;
|
|
42
|
+
export declare function failTask(taskId: string, reason: string, cwd?: string): TaskEntry;
|
|
43
|
+
export declare function blockTask(taskId: string, blocker: string, cwd?: string): TaskEntry;
|
|
44
|
+
export declare function getTask(taskId: string, cwd?: string): TaskEntry | null;
|
|
45
|
+
export declare function getOpenTasks(cwd?: string): TaskEntry[];
|
|
46
|
+
export declare function getTaskHistory(taskId: string, cwd?: string): TaskEntry[];
|
|
47
|
+
export declare function getTaskSummary(cwd?: string): TaskSummary;
|
|
48
|
+
export declare function formatTaskList(tasks: TaskEntry[]): string;
|
|
49
|
+
export declare function reconcile(cwd?: string): TaskEntry[];
|
|
50
|
+
export declare function decompose(taskId: string, subtasks: SubtaskInput[], cwd?: string): {
|
|
51
|
+
parent: TaskEntry;
|
|
52
|
+
subtasks: TaskEntry[];
|
|
53
|
+
};
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// Task ledger: append-only accountability store for HEAD's promises. Every tracked task has a full snapshot per state change.
|
|
2
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const LEDGER_PATH = '.dualbrain/ledger.jsonl';
|
|
5
|
+
function ledgerPath(cwd) {
|
|
6
|
+
return join(cwd || process.cwd(), LEDGER_PATH);
|
|
7
|
+
}
|
|
8
|
+
function readAllEntries(cwd) {
|
|
9
|
+
const p = ledgerPath(cwd);
|
|
10
|
+
if (!existsSync(p))
|
|
11
|
+
return [];
|
|
12
|
+
const raw = readFileSync(p, 'utf8').trim();
|
|
13
|
+
if (!raw)
|
|
14
|
+
return [];
|
|
15
|
+
return raw.split('\n').map(line => JSON.parse(line));
|
|
16
|
+
}
|
|
17
|
+
function appendEntry(entry, cwd) {
|
|
18
|
+
const p = ledgerPath(cwd);
|
|
19
|
+
mkdirSync(join(cwd || process.cwd(), '.dualbrain'), { recursive: true });
|
|
20
|
+
writeFileSync(p, JSON.stringify(entry) + '\n', { flag: 'a' });
|
|
21
|
+
}
|
|
22
|
+
function getCurrentTasks(cwd) {
|
|
23
|
+
const entries = readAllEntries(cwd);
|
|
24
|
+
const map = new Map();
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
map.set(entry.id, entry);
|
|
27
|
+
}
|
|
28
|
+
return Array.from(map.values());
|
|
29
|
+
}
|
|
30
|
+
export function createTask(task, cwd) {
|
|
31
|
+
const entry = {
|
|
32
|
+
id: `task_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
33
|
+
created: new Date().toISOString(),
|
|
34
|
+
updated: new Date().toISOString(),
|
|
35
|
+
intent: task.intent || '',
|
|
36
|
+
status: 'open',
|
|
37
|
+
owner: task.owner || 'head',
|
|
38
|
+
priority: task.priority || 'medium',
|
|
39
|
+
blockers: task.blockers || [],
|
|
40
|
+
proof: task.proof || null,
|
|
41
|
+
subtasks: task.subtasks || [],
|
|
42
|
+
parentTask: task.parentTask || null,
|
|
43
|
+
files: task.files || [],
|
|
44
|
+
result: task.result || null,
|
|
45
|
+
cost: task.cost || null,
|
|
46
|
+
};
|
|
47
|
+
appendEntry(entry, cwd);
|
|
48
|
+
return entry;
|
|
49
|
+
}
|
|
50
|
+
export function updateTask(taskId, updates, cwd) {
|
|
51
|
+
const current = getTask(taskId, cwd);
|
|
52
|
+
if (!current)
|
|
53
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
54
|
+
if (updates.status === 'done') {
|
|
55
|
+
const proof = updates.proof ?? current.proof;
|
|
56
|
+
const result = updates.result ?? current.result;
|
|
57
|
+
if (!proof)
|
|
58
|
+
throw new Error(`Cannot mark task done without proof: ${taskId}`);
|
|
59
|
+
if (!result)
|
|
60
|
+
throw new Error(`Cannot mark task done without result: ${taskId}`);
|
|
61
|
+
}
|
|
62
|
+
const updated = {
|
|
63
|
+
...current,
|
|
64
|
+
...updates,
|
|
65
|
+
id: taskId,
|
|
66
|
+
updated: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
appendEntry(updated, cwd);
|
|
69
|
+
return updated;
|
|
70
|
+
}
|
|
71
|
+
export function failTask(taskId, reason, cwd) {
|
|
72
|
+
const current = getTask(taskId, cwd);
|
|
73
|
+
if (!current)
|
|
74
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
75
|
+
const updated = {
|
|
76
|
+
...current,
|
|
77
|
+
status: 'failed',
|
|
78
|
+
result: reason || 'failed',
|
|
79
|
+
updated: new Date().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
appendEntry(updated, cwd);
|
|
82
|
+
return updated;
|
|
83
|
+
}
|
|
84
|
+
export function blockTask(taskId, blocker, cwd) {
|
|
85
|
+
const current = getTask(taskId, cwd);
|
|
86
|
+
if (!current)
|
|
87
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
88
|
+
const updated = {
|
|
89
|
+
...current,
|
|
90
|
+
status: 'blocked',
|
|
91
|
+
blockers: [...(current.blockers || []), blocker],
|
|
92
|
+
updated: new Date().toISOString(),
|
|
93
|
+
};
|
|
94
|
+
appendEntry(updated, cwd);
|
|
95
|
+
return updated;
|
|
96
|
+
}
|
|
97
|
+
export function getTask(taskId, cwd) {
|
|
98
|
+
const entries = readAllEntries(cwd);
|
|
99
|
+
let latest = null;
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (entry.id === taskId)
|
|
102
|
+
latest = entry;
|
|
103
|
+
}
|
|
104
|
+
return latest;
|
|
105
|
+
}
|
|
106
|
+
export function getOpenTasks(cwd) {
|
|
107
|
+
return getCurrentTasks(cwd).filter(t => t.status === 'open' || t.status === 'in_progress' || t.status === 'blocked');
|
|
108
|
+
}
|
|
109
|
+
export function getTaskHistory(taskId, cwd) {
|
|
110
|
+
return readAllEntries(cwd).filter(e => e.id === taskId);
|
|
111
|
+
}
|
|
112
|
+
export function getTaskSummary(cwd) {
|
|
113
|
+
const tasks = getCurrentTasks(cwd);
|
|
114
|
+
const summary = { open: 0, inProgress: 0, blocked: 0, done: 0, failed: 0, total: tasks.length };
|
|
115
|
+
for (const t of tasks) {
|
|
116
|
+
if (t.status === 'open')
|
|
117
|
+
summary.open++;
|
|
118
|
+
else if (t.status === 'in_progress')
|
|
119
|
+
summary.inProgress++;
|
|
120
|
+
else if (t.status === 'blocked')
|
|
121
|
+
summary.blocked++;
|
|
122
|
+
else if (t.status === 'done')
|
|
123
|
+
summary.done++;
|
|
124
|
+
else if (t.status === 'failed')
|
|
125
|
+
summary.failed++;
|
|
126
|
+
}
|
|
127
|
+
return summary;
|
|
128
|
+
}
|
|
129
|
+
export function formatTaskList(tasks) {
|
|
130
|
+
const all = tasks;
|
|
131
|
+
const open = all.filter(t => t.status === 'open' || t.status === 'in_progress').length;
|
|
132
|
+
const blocked = all.filter(t => t.status === 'blocked').length;
|
|
133
|
+
const done = all.filter(t => t.status === 'done').length;
|
|
134
|
+
const lines = [`TASKS (${open} open, ${blocked} blocked, ${done} done)`];
|
|
135
|
+
for (const t of all) {
|
|
136
|
+
const pri = t.priority === 'critical' ? 'crit' : t.priority === 'high' ? 'high' : t.priority === 'low' ? 'low' : 'med';
|
|
137
|
+
const label = t.intent.length > 48 ? t.intent.slice(0, 45) + '...' : t.intent;
|
|
138
|
+
if (t.status === 'done') {
|
|
139
|
+
lines.push(` ✓ [${pri}] ${label} (done)`);
|
|
140
|
+
}
|
|
141
|
+
else if (t.status === 'failed') {
|
|
142
|
+
lines.push(` ✗ [${pri}] ${label} (failed)`);
|
|
143
|
+
}
|
|
144
|
+
else if (t.status === 'blocked') {
|
|
145
|
+
const blockerNote = t.blockers && t.blockers.length ? `: ${t.blockers[t.blockers.length - 1]}` : '';
|
|
146
|
+
lines.push(` ◌ [${pri}] ${label} (blocked${blockerNote})`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
lines.push(` ● [${pri}] ${label} (${t.status})`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
export function reconcile(cwd) {
|
|
155
|
+
const tasks = getCurrentTasks(cwd);
|
|
156
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
157
|
+
return tasks.filter(t => (t.status === 'open' || t.status === 'in_progress') &&
|
|
158
|
+
new Date(t.updated).getTime() < cutoff);
|
|
159
|
+
}
|
|
160
|
+
export function decompose(taskId, subtasks, cwd) {
|
|
161
|
+
const parent = getTask(taskId, cwd);
|
|
162
|
+
if (!parent)
|
|
163
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
164
|
+
const created = subtasks.map(sub => createTask({
|
|
165
|
+
...sub,
|
|
166
|
+
parentTask: taskId,
|
|
167
|
+
owner: sub.owner || parent.owner,
|
|
168
|
+
priority: sub.priority || parent.priority,
|
|
169
|
+
}, cwd));
|
|
170
|
+
const subtaskIds = created.map(s => s.id);
|
|
171
|
+
const updatedParent = {
|
|
172
|
+
...parent,
|
|
173
|
+
subtasks: [...(parent.subtasks || []), ...subtaskIds],
|
|
174
|
+
updated: new Date().toISOString(),
|
|
175
|
+
};
|
|
176
|
+
appendEntry(updatedParent, cwd);
|
|
177
|
+
return { parent: updatedParent, subtasks: created };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"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"}
|