decibel-tools-mcp 1.0.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/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/agentic/compiler.d.ts +21 -0
- package/dist/agentic/compiler.d.ts.map +1 -0
- package/dist/agentic/compiler.js +267 -0
- package/dist/agentic/compiler.js.map +1 -0
- package/dist/agentic/golden.d.ts +25 -0
- package/dist/agentic/golden.d.ts.map +1 -0
- package/dist/agentic/golden.js +255 -0
- package/dist/agentic/golden.js.map +1 -0
- package/dist/agentic/index.d.ts +17 -0
- package/dist/agentic/index.d.ts.map +1 -0
- package/dist/agentic/index.js +153 -0
- package/dist/agentic/index.js.map +1 -0
- package/dist/agentic/linter.d.ts +20 -0
- package/dist/agentic/linter.d.ts.map +1 -0
- package/dist/agentic/linter.js +340 -0
- package/dist/agentic/linter.js.map +1 -0
- package/dist/agentic/renderer.d.ts +17 -0
- package/dist/agentic/renderer.d.ts.map +1 -0
- package/dist/agentic/renderer.js +277 -0
- package/dist/agentic/renderer.js.map +1 -0
- package/dist/agentic/types.d.ts +199 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/agentic/types.js +8 -0
- package/dist/agentic/types.js.map +1 -0
- package/dist/architectAdrs.d.ts +19 -0
- package/dist/architectAdrs.d.ts.map +1 -0
- package/dist/architectAdrs.js +123 -0
- package/dist/architectAdrs.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/dataRoot.d.ts +45 -0
- package/dist/dataRoot.d.ts.map +1 -0
- package/dist/dataRoot.js +201 -0
- package/dist/dataRoot.js.map +1 -0
- package/dist/decibelPaths.d.ts +42 -0
- package/dist/decibelPaths.d.ts.map +1 -0
- package/dist/decibelPaths.js +150 -0
- package/dist/decibelPaths.js.map +1 -0
- package/dist/httpServer.d.ts +49 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +1472 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/lib/benchmark.d.ts +110 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +338 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/supabase.d.ts +123 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +91 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/projectPaths.d.ts +27 -0
- package/dist/projectPaths.d.ts.map +1 -0
- package/dist/projectPaths.js +86 -0
- package/dist/projectPaths.js.map +1 -0
- package/dist/projectRegistry.d.ts +97 -0
- package/dist/projectRegistry.d.ts.map +1 -0
- package/dist/projectRegistry.js +362 -0
- package/dist/projectRegistry.js.map +1 -0
- package/dist/sentinelIssues.d.ts +44 -0
- package/dist/sentinelIssues.d.ts.map +1 -0
- package/dist/sentinelIssues.js +213 -0
- package/dist/sentinelIssues.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +93 -0
- package/dist/server.js.map +1 -0
- package/dist/test.d.ts +7 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +77 -0
- package/dist/test.js.map +1 -0
- package/dist/tools/agentic/index.d.ts +7 -0
- package/dist/tools/agentic/index.d.ts.map +1 -0
- package/dist/tools/agentic/index.js +180 -0
- package/dist/tools/agentic/index.js.map +1 -0
- package/dist/tools/architect/index.d.ts +9 -0
- package/dist/tools/architect/index.d.ts.map +1 -0
- package/dist/tools/architect/index.js +383 -0
- package/dist/tools/architect/index.js.map +1 -0
- package/dist/tools/architect.d.ts +19 -0
- package/dist/tools/architect.d.ts.map +1 -0
- package/dist/tools/architect.js +88 -0
- package/dist/tools/architect.js.map +1 -0
- package/dist/tools/bench.d.ts +89 -0
- package/dist/tools/bench.d.ts.map +1 -0
- package/dist/tools/bench.js +826 -0
- package/dist/tools/bench.js.map +1 -0
- package/dist/tools/context/index.d.ts +11 -0
- package/dist/tools/context/index.d.ts.map +1 -0
- package/dist/tools/context/index.js +439 -0
- package/dist/tools/context/index.js.map +1 -0
- package/dist/tools/context.d.ts +146 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +481 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/crit.d.ts +63 -0
- package/dist/tools/crit.d.ts.map +1 -0
- package/dist/tools/crit.js +159 -0
- package/dist/tools/crit.js.map +1 -0
- package/dist/tools/data-inspector.d.ts +188 -0
- package/dist/tools/data-inspector.d.ts.map +1 -0
- package/dist/tools/data-inspector.js +650 -0
- package/dist/tools/data-inspector.js.map +1 -0
- package/dist/tools/deck.d.ts +11 -0
- package/dist/tools/deck.d.ts.map +1 -0
- package/dist/tools/deck.js +170 -0
- package/dist/tools/deck.js.map +1 -0
- package/dist/tools/designer/index.d.ts +6 -0
- package/dist/tools/designer/index.d.ts.map +1 -0
- package/dist/tools/designer/index.js +177 -0
- package/dist/tools/designer/index.js.map +1 -0
- package/dist/tools/designer.d.ts +20 -0
- package/dist/tools/designer.d.ts.map +1 -0
- package/dist/tools/designer.js +75 -0
- package/dist/tools/designer.js.map +1 -0
- package/dist/tools/dojo/index.d.ts +13 -0
- package/dist/tools/dojo/index.d.ts.map +1 -0
- package/dist/tools/dojo/index.js +547 -0
- package/dist/tools/dojo/index.js.map +1 -0
- package/dist/tools/dojo.d.ts +254 -0
- package/dist/tools/dojo.d.ts.map +1 -0
- package/dist/tools/dojo.js +933 -0
- package/dist/tools/dojo.js.map +1 -0
- package/dist/tools/dojoBench.d.ts +49 -0
- package/dist/tools/dojoBench.d.ts.map +1 -0
- package/dist/tools/dojoBench.js +205 -0
- package/dist/tools/dojoBench.js.map +1 -0
- package/dist/tools/dojoGraduated.d.ts +50 -0
- package/dist/tools/dojoGraduated.d.ts.map +1 -0
- package/dist/tools/dojoGraduated.js +174 -0
- package/dist/tools/dojoGraduated.js.map +1 -0
- package/dist/tools/dojoPolicy.d.ts +65 -0
- package/dist/tools/dojoPolicy.d.ts.map +1 -0
- package/dist/tools/dojoPolicy.js +263 -0
- package/dist/tools/dojoPolicy.js.map +1 -0
- package/dist/tools/friction/index.d.ts +7 -0
- package/dist/tools/friction/index.d.ts.map +1 -0
- package/dist/tools/friction/index.js +239 -0
- package/dist/tools/friction/index.js.map +1 -0
- package/dist/tools/friction.d.ts +82 -0
- package/dist/tools/friction.d.ts.map +1 -0
- package/dist/tools/friction.js +331 -0
- package/dist/tools/friction.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/learnings/index.d.ts +5 -0
- package/dist/tools/learnings/index.d.ts.map +1 -0
- package/dist/tools/learnings/index.js +123 -0
- package/dist/tools/learnings/index.js.map +1 -0
- package/dist/tools/learnings.d.ts +41 -0
- package/dist/tools/learnings.d.ts.map +1 -0
- package/dist/tools/learnings.js +149 -0
- package/dist/tools/learnings.js.map +1 -0
- package/dist/tools/oracle/index.d.ts +5 -0
- package/dist/tools/oracle/index.d.ts.map +1 -0
- package/dist/tools/oracle/index.js +97 -0
- package/dist/tools/oracle/index.js.map +1 -0
- package/dist/tools/oracle.d.ts +90 -0
- package/dist/tools/oracle.d.ts.map +1 -0
- package/dist/tools/oracle.js +529 -0
- package/dist/tools/oracle.js.map +1 -0
- package/dist/tools/policy.d.ts +119 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +406 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/provenance/index.d.ts +4 -0
- package/dist/tools/provenance/index.d.ts.map +1 -0
- package/dist/tools/provenance/index.js +58 -0
- package/dist/tools/provenance/index.js.map +1 -0
- package/dist/tools/provenance.d.ts +75 -0
- package/dist/tools/provenance.d.ts.map +1 -0
- package/dist/tools/provenance.js +197 -0
- package/dist/tools/provenance.js.map +1 -0
- package/dist/tools/rateLimiter.d.ts +45 -0
- package/dist/tools/rateLimiter.d.ts.map +1 -0
- package/dist/tools/rateLimiter.js +91 -0
- package/dist/tools/rateLimiter.js.map +1 -0
- package/dist/tools/registry/index.d.ts +10 -0
- package/dist/tools/registry/index.d.ts.map +1 -0
- package/dist/tools/registry/index.js +467 -0
- package/dist/tools/registry/index.js.map +1 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +189 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/roadmap/index.d.ts +9 -0
- package/dist/tools/roadmap/index.d.ts.map +1 -0
- package/dist/tools/roadmap/index.js +250 -0
- package/dist/tools/roadmap/index.js.map +1 -0
- package/dist/tools/roadmap.d.ts +88 -0
- package/dist/tools/roadmap.d.ts.map +1 -0
- package/dist/tools/roadmap.js +365 -0
- package/dist/tools/roadmap.js.map +1 -0
- package/dist/tools/sentinel/index.d.ts +19 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -0
- package/dist/tools/sentinel/index.js +832 -0
- package/dist/tools/sentinel/index.js.map +1 -0
- package/dist/tools/sentinel-scan-data.d.ts +90 -0
- package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
- package/dist/tools/sentinel-scan-data.js +122 -0
- package/dist/tools/sentinel-scan-data.js.map +1 -0
- package/dist/tools/sentinel.d.ts +156 -0
- package/dist/tools/sentinel.d.ts.map +1 -0
- package/dist/tools/sentinel.js +603 -0
- package/dist/tools/sentinel.js.map +1 -0
- package/dist/tools/shared/index.d.ts +4 -0
- package/dist/tools/shared/index.d.ts.map +1 -0
- package/dist/tools/shared/index.js +7 -0
- package/dist/tools/shared/index.js.map +1 -0
- package/dist/tools/shared/project.d.ts +17 -0
- package/dist/tools/shared/project.d.ts.map +1 -0
- package/dist/tools/shared/project.js +36 -0
- package/dist/tools/shared/project.js.map +1 -0
- package/dist/tools/shared/response.d.ts +10 -0
- package/dist/tools/shared/response.d.ts.map +1 -0
- package/dist/tools/shared/response.js +36 -0
- package/dist/tools/shared/response.js.map +1 -0
- package/dist/tools/shared/validation.d.ts +10 -0
- package/dist/tools/shared/validation.d.ts.map +1 -0
- package/dist/tools/shared/validation.js +26 -0
- package/dist/tools/shared/validation.js.map +1 -0
- package/dist/tools/studio/cloud-spine.d.ts +27 -0
- package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
- package/dist/tools/studio/cloud-spine.js +773 -0
- package/dist/tools/studio/cloud-spine.js.map +1 -0
- package/dist/tools/studio/index.d.ts +154 -0
- package/dist/tools/studio/index.d.ts.map +1 -0
- package/dist/tools/studio/index.js +525 -0
- package/dist/tools/studio/index.js.map +1 -0
- package/dist/tools/testSpec.d.ts +122 -0
- package/dist/tools/testSpec.d.ts.map +1 -0
- package/dist/tools/testSpec.js +525 -0
- package/dist/tools/testSpec.js.map +1 -0
- package/dist/tools/toolsIndex.d.ts +5 -0
- package/dist/tools/toolsIndex.d.ts.map +1 -0
- package/dist/tools/toolsIndex.js +37 -0
- package/dist/tools/toolsIndex.js.map +1 -0
- package/dist/tools/types.d.ts +30 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +7 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/voice/index.d.ts +8 -0
- package/dist/tools/voice/index.d.ts.map +1 -0
- package/dist/tools/voice/index.js +176 -0
- package/dist/tools/voice/index.js.map +1 -0
- package/dist/tools/voice.d.ts +291 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +734 -0
- package/dist/tools/voice.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
4
|
+
import { log } from '../config.js';
|
|
5
|
+
import { resolveProjectPaths } from '../projectRegistry.js';
|
|
6
|
+
function makeProjectError(operation) {
|
|
7
|
+
return {
|
|
8
|
+
error: 'PROJECT_NOT_FOUND',
|
|
9
|
+
message: `Cannot ${operation}: No project context available.`,
|
|
10
|
+
hint: 'Specify project_id parameter, set DECIBEL_PROJECT_ROOT env var, or run from a directory with .decibel/',
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function isOracleError(result) {
|
|
14
|
+
return (typeof result === 'object' &&
|
|
15
|
+
result !== null &&
|
|
16
|
+
'error' in result &&
|
|
17
|
+
'message' in result);
|
|
18
|
+
}
|
|
19
|
+
async function getFilesFromDir(dirPath, type, location, recursive = false) {
|
|
20
|
+
const files = [];
|
|
21
|
+
try {
|
|
22
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
25
|
+
// Recursively scan subdirectories if enabled
|
|
26
|
+
if (entry.isDirectory() && recursive) {
|
|
27
|
+
const subFiles = await getFilesFromDir(fullPath, type, location, true);
|
|
28
|
+
files.push(...subFiles);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
32
|
+
const filePath = fullPath;
|
|
33
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
34
|
+
// Parse timestamp from filename (YYYY-MM-DDTHH-mm-ssZ-slug.md)
|
|
35
|
+
const timestampMatch = entry.name.match(/^(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})/);
|
|
36
|
+
let timestamp = new Date();
|
|
37
|
+
if (timestampMatch) {
|
|
38
|
+
const isoTimestamp = timestampMatch[1].replace(/-/g, (match, offset) => {
|
|
39
|
+
// Only replace the hyphens after the date part (position > 10)
|
|
40
|
+
if (offset > 10 && offset < 19)
|
|
41
|
+
return ':';
|
|
42
|
+
return match;
|
|
43
|
+
});
|
|
44
|
+
timestamp = new Date(isoTimestamp);
|
|
45
|
+
}
|
|
46
|
+
// Extract summary from frontmatter or first heading
|
|
47
|
+
let summary;
|
|
48
|
+
let severity;
|
|
49
|
+
const summaryMatch = content.match(/^summary:\s*(.+)$/m);
|
|
50
|
+
if (summaryMatch)
|
|
51
|
+
summary = summaryMatch[1];
|
|
52
|
+
const changeMatch = content.match(/^change:\s*(.+)$/m);
|
|
53
|
+
if (changeMatch && !summary)
|
|
54
|
+
summary = changeMatch[1];
|
|
55
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
56
|
+
if (titleMatch && !summary)
|
|
57
|
+
summary = titleMatch[1];
|
|
58
|
+
const severityMatch = content.match(/^severity:\s*(.+)$/m);
|
|
59
|
+
if (severityMatch)
|
|
60
|
+
severity = severityMatch[1];
|
|
61
|
+
files.push({
|
|
62
|
+
filename: entry.name,
|
|
63
|
+
path: filePath,
|
|
64
|
+
timestamp,
|
|
65
|
+
type,
|
|
66
|
+
summary,
|
|
67
|
+
severity,
|
|
68
|
+
location,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Directory might not exist, that's OK
|
|
75
|
+
log(`Oracle: Could not read ${dirPath}:`, error);
|
|
76
|
+
}
|
|
77
|
+
return files;
|
|
78
|
+
}
|
|
79
|
+
async function getFrictionFiles(resolved) {
|
|
80
|
+
// Friction is in project .decibel/friction/
|
|
81
|
+
const frictionDir = resolved.subPath('friction');
|
|
82
|
+
const frictionList = [];
|
|
83
|
+
try {
|
|
84
|
+
const entries = await fs.readdir(frictionDir, { withFileTypes: true });
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
87
|
+
const filePath = path.join(frictionDir, entry.name);
|
|
88
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
89
|
+
// Parse frontmatter
|
|
90
|
+
const contextMatch = content.match(/^context:\s*(.+)$/m);
|
|
91
|
+
const impactMatch = content.match(/^impact:\s*(.+)$/m);
|
|
92
|
+
const statusMatch = content.match(/^status:\s*(.+)$/m);
|
|
93
|
+
const signalMatch = content.match(/^signal_count:\s*(\d+)$/m);
|
|
94
|
+
const lastReportedMatch = content.match(/^last_reported:\s*(.+)$/m);
|
|
95
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
96
|
+
const status = statusMatch?.[1] || 'open';
|
|
97
|
+
// Only include open friction
|
|
98
|
+
if (status !== 'open' && status !== 'acknowledged' && status !== 'solving') {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
frictionList.push({
|
|
102
|
+
filename: entry.name,
|
|
103
|
+
path: filePath,
|
|
104
|
+
context: contextMatch?.[1] || 'unknown',
|
|
105
|
+
description: titleMatch?.[1] || entry.name,
|
|
106
|
+
impact: impactMatch?.[1] || 'medium',
|
|
107
|
+
status,
|
|
108
|
+
signal_count: parseInt(signalMatch?.[1] || '1', 10),
|
|
109
|
+
last_reported: new Date(lastReportedMatch?.[1] || Date.now()),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
log(`Oracle: Could not read friction directory:`, error);
|
|
116
|
+
}
|
|
117
|
+
return frictionList;
|
|
118
|
+
}
|
|
119
|
+
async function collectRecentFiles(resolved) {
|
|
120
|
+
const allFiles = [];
|
|
121
|
+
// Sentinel issues from project .decibel/sentinel/issues/
|
|
122
|
+
const projectIssuesDir = resolved.subPath('sentinel', 'issues');
|
|
123
|
+
const projectIssues = await getFilesFromDir(projectIssuesDir, 'sentinel', 'project');
|
|
124
|
+
allFiles.push(...projectIssues);
|
|
125
|
+
// Architect ADRs from project .decibel/architect/adrs/
|
|
126
|
+
const projectArchitectDir = resolved.subPath('architect', 'adrs');
|
|
127
|
+
const projectArchitect = await getFilesFromDir(projectArchitectDir, 'architect', 'project');
|
|
128
|
+
allFiles.push(...projectArchitect);
|
|
129
|
+
// Designer from project .decibel/designer/ (recursively scan area subdirectories)
|
|
130
|
+
const projectDesignerDir = resolved.subPath('designer');
|
|
131
|
+
const projectDesigner = await getFilesFromDir(projectDesignerDir, 'designer', 'project', true);
|
|
132
|
+
allFiles.push(...projectDesigner);
|
|
133
|
+
// Sort by timestamp descending and take last 10
|
|
134
|
+
allFiles.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
|
|
135
|
+
return allFiles.slice(0, 10);
|
|
136
|
+
}
|
|
137
|
+
function inferPriority(file) {
|
|
138
|
+
// Sentinel issues with high/critical severity get high priority
|
|
139
|
+
if (file.type === 'sentinel') {
|
|
140
|
+
if (file.severity === 'critical' || file.severity === 'high') {
|
|
141
|
+
return 'high';
|
|
142
|
+
}
|
|
143
|
+
if (file.severity === 'med') {
|
|
144
|
+
return 'med';
|
|
145
|
+
}
|
|
146
|
+
return 'low';
|
|
147
|
+
}
|
|
148
|
+
// Architect decisions are typically medium-high priority
|
|
149
|
+
if (file.type === 'architect') {
|
|
150
|
+
return 'med';
|
|
151
|
+
}
|
|
152
|
+
// Designer decisions are typically medium-low priority
|
|
153
|
+
return 'low';
|
|
154
|
+
}
|
|
155
|
+
function inferFrictionPriority(friction) {
|
|
156
|
+
// Blocking = always high
|
|
157
|
+
if (friction.impact === 'blocking')
|
|
158
|
+
return 'high';
|
|
159
|
+
// High signal (3+) elevates priority
|
|
160
|
+
if (friction.signal_count >= 3) {
|
|
161
|
+
if (friction.impact === 'high')
|
|
162
|
+
return 'high';
|
|
163
|
+
return 'med';
|
|
164
|
+
}
|
|
165
|
+
// High impact with any signal
|
|
166
|
+
if (friction.impact === 'high')
|
|
167
|
+
return 'med';
|
|
168
|
+
// Medium signal (2) with medium impact
|
|
169
|
+
if (friction.signal_count >= 2 && friction.impact === 'medium')
|
|
170
|
+
return 'med';
|
|
171
|
+
return 'low';
|
|
172
|
+
}
|
|
173
|
+
function generateActionDescription(file) {
|
|
174
|
+
const prefix = {
|
|
175
|
+
designer: 'Review design decision',
|
|
176
|
+
architect: 'Implement architecture change',
|
|
177
|
+
sentinel: 'Address issue',
|
|
178
|
+
};
|
|
179
|
+
const summary = file.summary || file.filename;
|
|
180
|
+
return `${prefix[file.type]}: ${summary}`;
|
|
181
|
+
}
|
|
182
|
+
export async function nextActions(input) {
|
|
183
|
+
let resolved;
|
|
184
|
+
try {
|
|
185
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return makeProjectError('get next actions');
|
|
189
|
+
}
|
|
190
|
+
log(`Oracle: Getting next actions for project ${resolved.id}`);
|
|
191
|
+
const recentFiles = await collectRecentFiles(resolved);
|
|
192
|
+
const allFriction = await getFrictionFiles(resolved);
|
|
193
|
+
// Filter friction by project context (or include all if no specific match)
|
|
194
|
+
const projectFriction = allFriction.filter(f => f.context === resolved.id ||
|
|
195
|
+
f.context.toLowerCase().includes(resolved.id.toLowerCase()));
|
|
196
|
+
// Also get high-signal friction from any context
|
|
197
|
+
const highSignalFriction = allFriction.filter(f => f.signal_count >= 3 || f.impact === 'blocking');
|
|
198
|
+
// Combine and dedupe
|
|
199
|
+
const relevantFriction = Array.from(new Map([...projectFriction, ...highSignalFriction].map(f => [f.filename, f])).values());
|
|
200
|
+
// Build friction summary
|
|
201
|
+
const frictionSummary = {
|
|
202
|
+
total_open: allFriction.length,
|
|
203
|
+
high_signal: allFriction.filter(f => f.signal_count >= 3).length,
|
|
204
|
+
blocking: allFriction.filter(f => f.impact === 'blocking').length,
|
|
205
|
+
};
|
|
206
|
+
const dataLocations = {
|
|
207
|
+
project_local: true,
|
|
208
|
+
global: false,
|
|
209
|
+
};
|
|
210
|
+
if (recentFiles.length === 0 && relevantFriction.length === 0) {
|
|
211
|
+
return {
|
|
212
|
+
actions: [{
|
|
213
|
+
description: `No recent activity found for project ${resolved.id}. Start by recording design decisions or architecture changes.`,
|
|
214
|
+
source: 'oracle',
|
|
215
|
+
priority: 'low',
|
|
216
|
+
}],
|
|
217
|
+
friction_summary: frictionSummary,
|
|
218
|
+
data_locations: dataLocations,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// Generate actions based on recent files
|
|
222
|
+
const actions = [];
|
|
223
|
+
// Filter by focus if provided
|
|
224
|
+
let filesToProcess = recentFiles;
|
|
225
|
+
if (input.focus) {
|
|
226
|
+
const focusLower = input.focus.toLowerCase();
|
|
227
|
+
filesToProcess = recentFiles.filter(f => f.type === focusLower ||
|
|
228
|
+
f.summary?.toLowerCase().includes(focusLower) ||
|
|
229
|
+
f.filename.toLowerCase().includes(focusLower));
|
|
230
|
+
// If no matches, fall back to all files
|
|
231
|
+
if (filesToProcess.length === 0) {
|
|
232
|
+
filesToProcess = recentFiles;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Add friction actions FIRST (they're often the most actionable)
|
|
236
|
+
const sortedFriction = relevantFriction.sort((a, b) => {
|
|
237
|
+
// Sort by: blocking first, then signal count, then impact
|
|
238
|
+
if (a.impact === 'blocking' && b.impact !== 'blocking')
|
|
239
|
+
return -1;
|
|
240
|
+
if (b.impact === 'blocking' && a.impact !== 'blocking')
|
|
241
|
+
return 1;
|
|
242
|
+
if (b.signal_count !== a.signal_count)
|
|
243
|
+
return b.signal_count - a.signal_count;
|
|
244
|
+
const impactOrder = { blocking: 4, high: 3, medium: 2, low: 1 };
|
|
245
|
+
return (impactOrder[b.impact] || 0) - (impactOrder[a.impact] || 0);
|
|
246
|
+
});
|
|
247
|
+
for (const friction of sortedFriction.slice(0, 2)) {
|
|
248
|
+
actions.push({
|
|
249
|
+
description: `Resolve friction (signal: ${friction.signal_count}): ${friction.description}`,
|
|
250
|
+
source: friction.path,
|
|
251
|
+
priority: inferFrictionPriority(friction),
|
|
252
|
+
domain: 'friction',
|
|
253
|
+
location: 'project',
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Prioritize sentinel issues first
|
|
257
|
+
const sentinelFiles = filesToProcess.filter(f => f.type === 'sentinel');
|
|
258
|
+
const architectFiles = filesToProcess.filter(f => f.type === 'architect');
|
|
259
|
+
const designerFiles = filesToProcess.filter(f => f.type === 'designer');
|
|
260
|
+
// Add sentinel issues (high priority items first)
|
|
261
|
+
for (const file of sentinelFiles.slice(0, 3)) {
|
|
262
|
+
actions.push({
|
|
263
|
+
description: generateActionDescription(file),
|
|
264
|
+
source: file.path,
|
|
265
|
+
priority: inferPriority(file),
|
|
266
|
+
domain: 'sentinel',
|
|
267
|
+
location: file.location,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// Add architect decisions
|
|
271
|
+
for (const file of architectFiles.slice(0, 2)) {
|
|
272
|
+
actions.push({
|
|
273
|
+
description: generateActionDescription(file),
|
|
274
|
+
source: file.path,
|
|
275
|
+
priority: inferPriority(file),
|
|
276
|
+
domain: 'architect',
|
|
277
|
+
location: file.location,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// Add designer decisions
|
|
281
|
+
for (const file of designerFiles.slice(0, 2)) {
|
|
282
|
+
actions.push({
|
|
283
|
+
description: generateActionDescription(file),
|
|
284
|
+
source: file.path,
|
|
285
|
+
priority: inferPriority(file),
|
|
286
|
+
domain: 'designer',
|
|
287
|
+
location: file.location,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
// Ensure we have at least 3 and at most 7 actions
|
|
291
|
+
if (actions.length < 3 && filesToProcess.length > actions.length) {
|
|
292
|
+
for (const file of filesToProcess) {
|
|
293
|
+
if (actions.length >= 7)
|
|
294
|
+
break;
|
|
295
|
+
if (!actions.find(a => a.source === file.path)) {
|
|
296
|
+
actions.push({
|
|
297
|
+
description: generateActionDescription(file),
|
|
298
|
+
source: file.path,
|
|
299
|
+
priority: inferPriority(file),
|
|
300
|
+
domain: file.type,
|
|
301
|
+
location: file.location,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Sort by priority (high > med > low)
|
|
307
|
+
const priorityOrder = { high: 0, med: 1, low: 2 };
|
|
308
|
+
actions.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
|
|
309
|
+
return {
|
|
310
|
+
actions: actions.slice(0, 7),
|
|
311
|
+
friction_summary: frictionSummary,
|
|
312
|
+
data_locations: dataLocations,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
async function loadRoadmap(resolved) {
|
|
316
|
+
const roadmapPath = resolved.subPath('architect', 'roadmap', 'roadmap.yaml');
|
|
317
|
+
try {
|
|
318
|
+
const content = await fs.readFile(roadmapPath, 'utf-8');
|
|
319
|
+
return parseYaml(content);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async function loadSentinelIssues(resolved) {
|
|
326
|
+
const issuesDir = resolved.subPath('sentinel', 'issues');
|
|
327
|
+
const issues = [];
|
|
328
|
+
try {
|
|
329
|
+
const entries = await fs.readdir(issuesDir, { withFileTypes: true });
|
|
330
|
+
for (const entry of entries) {
|
|
331
|
+
if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {
|
|
332
|
+
const filePath = path.join(issuesDir, entry.name);
|
|
333
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
334
|
+
const data = parseYaml(content);
|
|
335
|
+
issues.push({
|
|
336
|
+
id: data.id || entry.name.replace(/\.(yaml|yml)$/, ''),
|
|
337
|
+
epic_id: data.epic_id,
|
|
338
|
+
status: data.status || 'open',
|
|
339
|
+
severity: data.severity || 'medium',
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
// Issues directory might not exist
|
|
346
|
+
}
|
|
347
|
+
return issues;
|
|
348
|
+
}
|
|
349
|
+
async function loadEpicStatuses(resolved) {
|
|
350
|
+
const epicsDir = resolved.subPath('sentinel', 'epics');
|
|
351
|
+
const statuses = new Map();
|
|
352
|
+
try {
|
|
353
|
+
const entries = await fs.readdir(epicsDir, { withFileTypes: true });
|
|
354
|
+
for (const entry of entries) {
|
|
355
|
+
if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml') || entry.name.endsWith('.md'))) {
|
|
356
|
+
const filePath = path.join(epicsDir, entry.name);
|
|
357
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
358
|
+
// Try YAML first
|
|
359
|
+
if (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')) {
|
|
360
|
+
const data = parseYaml(content);
|
|
361
|
+
const epicId = data.id || data.epic_id || entry.name.replace(/\.(yaml|yml)$/, '');
|
|
362
|
+
const status = data.status || 'not_started';
|
|
363
|
+
statuses.set(epicId, status);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// Try to parse frontmatter from markdown
|
|
367
|
+
const statusMatch = content.match(/^status:\s*(.+)$/m);
|
|
368
|
+
const idMatch = content.match(/^(?:id|epic_id):\s*(.+)$/m);
|
|
369
|
+
const epicId = idMatch?.[1] || entry.name.replace(/\.md$/, '');
|
|
370
|
+
const status = statusMatch?.[1] || 'not_started';
|
|
371
|
+
statuses.set(epicId, status);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
// Epics directory might not exist
|
|
378
|
+
}
|
|
379
|
+
return statuses;
|
|
380
|
+
}
|
|
381
|
+
function calculateMilestoneStatus(milestone, epicsCompleted, epicsTotal, epicsBlocked) {
|
|
382
|
+
if (epicsTotal > 0 && epicsCompleted === epicsTotal) {
|
|
383
|
+
return 'completed';
|
|
384
|
+
}
|
|
385
|
+
const targetDate = new Date(milestone.target_date);
|
|
386
|
+
const now = new Date();
|
|
387
|
+
const daysRemaining = Math.ceil((targetDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
|
|
388
|
+
if (daysRemaining < 0) {
|
|
389
|
+
return 'behind';
|
|
390
|
+
}
|
|
391
|
+
const progressPercent = epicsTotal > 0 ? (epicsCompleted / epicsTotal) * 100 : 0;
|
|
392
|
+
// If we have blocked epics or low progress with little time, we're at risk
|
|
393
|
+
if (epicsBlocked > 0) {
|
|
394
|
+
return 'at_risk';
|
|
395
|
+
}
|
|
396
|
+
// Calculate expected progress based on time
|
|
397
|
+
const totalDays = 90; // Assume 90 day milestones as baseline
|
|
398
|
+
const expectedProgress = Math.min(100, ((totalDays - daysRemaining) / totalDays) * 100);
|
|
399
|
+
if (progressPercent < expectedProgress - 20) {
|
|
400
|
+
return 'behind';
|
|
401
|
+
}
|
|
402
|
+
if (progressPercent < expectedProgress - 10) {
|
|
403
|
+
return 'at_risk';
|
|
404
|
+
}
|
|
405
|
+
return 'on_track';
|
|
406
|
+
}
|
|
407
|
+
export async function roadmapProgress(input) {
|
|
408
|
+
let resolved;
|
|
409
|
+
try {
|
|
410
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return makeProjectError('evaluate roadmap progress');
|
|
414
|
+
}
|
|
415
|
+
log(`Oracle: Evaluating roadmap progress for project ${resolved.id}`);
|
|
416
|
+
// Load roadmap
|
|
417
|
+
const roadmap = await loadRoadmap(resolved);
|
|
418
|
+
if (!roadmap) {
|
|
419
|
+
return {
|
|
420
|
+
error: 'ROADMAP_NOT_FOUND',
|
|
421
|
+
message: 'No roadmap.yaml found in .decibel/architect/roadmap/',
|
|
422
|
+
hint: 'Initialize a roadmap with roadmap_init tool or create roadmap.yaml manually',
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
// Load epic statuses and issues
|
|
426
|
+
const epicStatuses = await loadEpicStatuses(resolved);
|
|
427
|
+
const issues = input.noSignals ? [] : await loadSentinelIssues(resolved);
|
|
428
|
+
// Build epic status list
|
|
429
|
+
const epics = [];
|
|
430
|
+
for (const [epicId, context] of Object.entries(roadmap.epic_context)) {
|
|
431
|
+
const statusStr = epicStatuses.get(epicId) || 'not_started';
|
|
432
|
+
const epicIssues = issues.filter(i => i.epic_id === epicId);
|
|
433
|
+
const openIssues = epicIssues.filter(i => i.status === 'open' || i.status === 'in_progress');
|
|
434
|
+
let status = 'not_started';
|
|
435
|
+
if (statusStr === 'completed' || statusStr === 'done') {
|
|
436
|
+
status = 'completed';
|
|
437
|
+
}
|
|
438
|
+
else if (statusStr === 'blocked') {
|
|
439
|
+
status = 'blocked';
|
|
440
|
+
}
|
|
441
|
+
else if (statusStr === 'in_progress' || statusStr === 'active') {
|
|
442
|
+
status = 'in_progress';
|
|
443
|
+
}
|
|
444
|
+
epics.push({
|
|
445
|
+
epic_id: epicId,
|
|
446
|
+
status,
|
|
447
|
+
issue_count: epicIssues.length,
|
|
448
|
+
open_issues: openIssues.length,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
// Calculate milestone progress
|
|
452
|
+
const milestones = roadmap.milestones.map(ms => {
|
|
453
|
+
const msEpics = ms.epics || [];
|
|
454
|
+
const epicStatusList = msEpics.map(eid => epics.find(e => e.epic_id === eid));
|
|
455
|
+
const total = msEpics.length;
|
|
456
|
+
const completed = epicStatusList.filter(e => e?.status === 'completed').length;
|
|
457
|
+
const inProgress = epicStatusList.filter(e => e?.status === 'in_progress').length;
|
|
458
|
+
const blocked = epicStatusList.filter(e => e?.status === 'blocked').length;
|
|
459
|
+
const targetDate = new Date(ms.target_date);
|
|
460
|
+
const now = new Date();
|
|
461
|
+
const daysRemaining = Math.ceil((targetDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
|
|
462
|
+
return {
|
|
463
|
+
id: ms.id,
|
|
464
|
+
label: ms.label,
|
|
465
|
+
target_date: ms.target_date,
|
|
466
|
+
epics_total: total,
|
|
467
|
+
epics_completed: completed,
|
|
468
|
+
epics_in_progress: inProgress,
|
|
469
|
+
epics_blocked: blocked,
|
|
470
|
+
progress_percent: total > 0 ? Math.round((completed / total) * 100) : 0,
|
|
471
|
+
status: calculateMilestoneStatus(ms, completed, total, blocked),
|
|
472
|
+
days_remaining: daysRemaining,
|
|
473
|
+
};
|
|
474
|
+
});
|
|
475
|
+
// Calculate objective progress (simplified - just count linked epics)
|
|
476
|
+
const objectives = roadmap.objectives.map(obj => {
|
|
477
|
+
const linkedEpics = Object.values(roadmap.epic_context)
|
|
478
|
+
.filter(ec => ec.objectives?.includes(obj.id));
|
|
479
|
+
const completedEpics = linkedEpics.filter(ec => epics.find(e => e.epic_id === ec.epic_id)?.status === 'completed');
|
|
480
|
+
return {
|
|
481
|
+
id: obj.id,
|
|
482
|
+
title: obj.title,
|
|
483
|
+
timeframe: obj.timeframe,
|
|
484
|
+
key_results: obj.key_results || [],
|
|
485
|
+
overall_progress: linkedEpics.length > 0
|
|
486
|
+
? Math.round((completedEpics.length / linkedEpics.length) * 100)
|
|
487
|
+
: 0,
|
|
488
|
+
};
|
|
489
|
+
});
|
|
490
|
+
// Build signals summary
|
|
491
|
+
const signals = input.noSignals ? undefined : {
|
|
492
|
+
blocking_issues: issues.filter(i => i.severity === 'critical' || i.severity === 'blocking').length,
|
|
493
|
+
high_severity_issues: issues.filter(i => i.severity === 'high').length,
|
|
494
|
+
friction_points: 0, // Would need to load friction files
|
|
495
|
+
};
|
|
496
|
+
// Summary
|
|
497
|
+
const summary = {
|
|
498
|
+
total_milestones: milestones.length,
|
|
499
|
+
on_track: milestones.filter(m => m.status === 'on_track').length,
|
|
500
|
+
at_risk: milestones.filter(m => m.status === 'at_risk').length,
|
|
501
|
+
behind: milestones.filter(m => m.status === 'behind').length,
|
|
502
|
+
completed: milestones.filter(m => m.status === 'completed').length,
|
|
503
|
+
};
|
|
504
|
+
const output = {
|
|
505
|
+
project_id: resolved.id,
|
|
506
|
+
evaluated_at: new Date().toISOString(),
|
|
507
|
+
milestones,
|
|
508
|
+
objectives,
|
|
509
|
+
epics,
|
|
510
|
+
signals,
|
|
511
|
+
summary,
|
|
512
|
+
};
|
|
513
|
+
// Save progress file unless dry run
|
|
514
|
+
if (!input.dryRun) {
|
|
515
|
+
const progressDir = resolved.subPath('oracle');
|
|
516
|
+
const progressPath = path.join(progressDir, 'progress.yaml');
|
|
517
|
+
try {
|
|
518
|
+
await fs.mkdir(progressDir, { recursive: true });
|
|
519
|
+
await fs.writeFile(progressPath, stringifyYaml(output), 'utf-8');
|
|
520
|
+
output.progress_file = progressPath;
|
|
521
|
+
log(`Oracle: Saved progress to ${progressPath}`);
|
|
522
|
+
}
|
|
523
|
+
catch (err) {
|
|
524
|
+
log(`Oracle: Could not save progress file:`, err);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
return output;
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/tools/oracle.ts"],"names":[],"mappings":"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"}
|