daedalus-cli 3.50.6 → 3.52.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/CHANGELOG.md +14 -0
- package/README.md +1 -0
- package/dist/skills/graph.d.ts +19 -0
- package/dist/skills/graph.d.ts.map +1 -0
- package/dist/skills/graph.js +124 -0
- package/dist/skills/graph.js.map +1 -0
- package/dist/skills/graph.test.d.ts +2 -0
- package/dist/skills/graph.test.d.ts.map +1 -0
- package/dist/skills/graph.test.js +57 -0
- package/dist/skills/graph.test.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +74 -11
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/index.test.js +56 -0
- package/dist/skills/index.test.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [3.52.0](https://github.com/bgill55/daedalus/compare/v3.51.0...v3.52.0) (2026-08-28)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **skills:** intent-based seed matching so paraphrases activate the CaSKG bundle ([2c8c45f](https://github.com/bgill55/daedalus/commit/2c8c45f341be659c5bed9b3dfdccc24f057856ba))
|
|
7
|
+
|
|
8
|
+
# [3.51.0](https://github.com/bgill55/daedalus/compare/v3.50.6...v3.51.0) (2026-08-28)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **skills:** implement CaSKG procedural dependency graph & bundle retrieval ([3caffc3](https://github.com/bgill55/daedalus/commit/3caffc3576b1046ff38d6d87c50520164baf7c0c))
|
|
14
|
+
|
|
1
15
|
## [3.50.6](https://github.com/bgill55/daedalus/compare/v3.50.5...v3.50.6) (2026-08-28)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -92,6 +92,7 @@ AI assistance without:
|
|
|
92
92
|
- **Dynamic complexity-based routing** — classifies each task on arrival (quick/trivial → `fast` tier, heavy/multi-file → `intelligence` tier) and **re-routes on the fly** mid-task as the work evolves, with hysteresis to avoid flapping and a token budget that resets on downgrade so it never ping-pongs. Repeated tool failures trigger automatic escalation to the next model in the chain.
|
|
93
93
|
- **Multi-agent orchestration** — spawns Metis (planner), Hephaestus (coder), Apollo (reviewer), Asclepius (debugger), and Mnemosyne (researcher) sub-agents — each carrying a divine callsign — with **OpenAI Swarm-Style Dynamic Handoffs (`handoff_task`)** and shared **Context Variables (`contextVariables`)** for seamless mid-turn role transfers. In single-agent REPL mode the active agent can also **auto-route** a large multi-phase task to helper agents in parallel via `route_task` (after explicit user approval through `ask_user`), so the user never has to spawn agents manually.
|
|
94
94
|
- **Autonomous Finn Loop** — interactive requirements gathering (`/spec`), GitHub Issues tracking, background daemon execution (`daedalus --loop`), and Discord PR review webhook embeds.
|
|
95
|
+
- **CaSKG Procedural Skill Graph Engine** — counterfactual-causal skill dependency graphs (`src/skills/graph.ts`) that resolve `prerequisites` and `leadsTo` relationships, retrieving **topologically sorted, compact skill bundles** to eliminate orphan execution and step thrashing.
|
|
95
96
|
- **Self-Healing & Immunity Engine** — Programmatic Codebase Constitution (`src/config/constitution.ts`), default Test Suite Read-Only Lock (`*.test.ts`, vitest/jest runner configs, CI workflows), Reviewer Diff Immunity Audit Checklist (protecting against type-loosening, error-swallowing, and assertion weakening), and Self-Generated Skill Synthesis (`.daedalus/skills/drafts/`).
|
|
96
97
|
- **Loop Engineering & Self-Repair** — automatic stack-aware compile/build verification checks (e.g., `npx tsc --noEmit`, `cargo check`, `go build`) with dynamic stdout/stderr feedback loops for self-repair, **Automated Workspace Rollback** to revert patches upon task failure, and **Git-Aware Smart Testing (`/test -g`)** to run only affected unit tests in < 200ms.
|
|
97
98
|
- **Codebase indexing & Live Watcher** — FTS5-powered symbol search, definitions, and call-graph references across 10+ languages with background **Live File-Watcher (`/watch`)** for automatic re-indexing on save.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Skill } from './index.js';
|
|
2
|
+
export interface SkillGraphNode {
|
|
3
|
+
skill: Skill;
|
|
4
|
+
prerequisites: string[];
|
|
5
|
+
leadsTo: string[];
|
|
6
|
+
stage?: 'spec' | 'plan' | 'code' | 'test' | 'review';
|
|
7
|
+
}
|
|
8
|
+
export declare class SkillGraph {
|
|
9
|
+
private nodes;
|
|
10
|
+
constructor(skills?: Skill[]);
|
|
11
|
+
buildGraph(skills: Skill[]): void;
|
|
12
|
+
getNode(name: string): SkillGraphNode | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Expand matched skills into a topologically ordered causal bundle.
|
|
15
|
+
* Includes essential prerequisites and recommended downstream steps up to maxBundleSize.
|
|
16
|
+
*/
|
|
17
|
+
getSkillBundle(initialMatches: Skill[], maxBundleSize?: number): Skill[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/skills/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;CACtD;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAqC;gBAEtC,MAAM,GAAE,KAAK,EAAO;IAIzB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAejC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIxD;;;OAGG;IACI,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,aAAa,SAAI,GAAG,KAAK,EAAE;CAuG3E"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
function normalizeKey(name) {
|
|
2
|
+
return name.toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
3
|
+
}
|
|
4
|
+
export class SkillGraph {
|
|
5
|
+
nodes = new Map();
|
|
6
|
+
constructor(skills = []) {
|
|
7
|
+
this.buildGraph(skills);
|
|
8
|
+
}
|
|
9
|
+
buildGraph(skills) {
|
|
10
|
+
this.nodes.clear();
|
|
11
|
+
for (const skill of skills) {
|
|
12
|
+
const key = normalizeKey(skill.name);
|
|
13
|
+
const prereqs = (skill.prerequisites ?? []).map(normalizeKey).filter(Boolean);
|
|
14
|
+
const leads = (skill.leadsTo ?? []).map(normalizeKey).filter(Boolean);
|
|
15
|
+
this.nodes.set(key, {
|
|
16
|
+
skill,
|
|
17
|
+
prerequisites: prereqs,
|
|
18
|
+
leadsTo: leads,
|
|
19
|
+
stage: skill.stage,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getNode(name) {
|
|
24
|
+
return this.nodes.get(normalizeKey(name));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Expand matched skills into a topologically ordered causal bundle.
|
|
28
|
+
* Includes essential prerequisites and recommended downstream steps up to maxBundleSize.
|
|
29
|
+
*/
|
|
30
|
+
getSkillBundle(initialMatches, maxBundleSize = 4) {
|
|
31
|
+
if (initialMatches.length === 0)
|
|
32
|
+
return [];
|
|
33
|
+
if (this.nodes.size === 0)
|
|
34
|
+
return initialMatches.slice(0, maxBundleSize);
|
|
35
|
+
const activeKeys = new Set();
|
|
36
|
+
const queue = [];
|
|
37
|
+
for (const match of initialMatches) {
|
|
38
|
+
const k = normalizeKey(match.name);
|
|
39
|
+
if (!activeKeys.has(k)) {
|
|
40
|
+
activeKeys.add(k);
|
|
41
|
+
queue.push(k);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 1. Expand prerequisites first (hard requirements)
|
|
45
|
+
for (let i = 0; i < queue.length; i++) {
|
|
46
|
+
const curr = this.nodes.get(queue[i]);
|
|
47
|
+
if (curr) {
|
|
48
|
+
for (const prereq of curr.prerequisites) {
|
|
49
|
+
if (!activeKeys.has(prereq) && this.nodes.has(prereq) && activeKeys.size < maxBundleSize) {
|
|
50
|
+
activeKeys.add(prereq);
|
|
51
|
+
queue.push(prereq);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// 2. Expand downstream recommendations (leadsTo) if budget remains
|
|
57
|
+
for (let i = 0; i < queue.length && activeKeys.size < maxBundleSize; i++) {
|
|
58
|
+
const curr = this.nodes.get(queue[i]);
|
|
59
|
+
if (curr) {
|
|
60
|
+
for (const next of curr.leadsTo) {
|
|
61
|
+
if (!activeKeys.has(next) && this.nodes.has(next) && activeKeys.size < maxBundleSize) {
|
|
62
|
+
activeKeys.add(next);
|
|
63
|
+
queue.push(next);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 3. Topological sort over the active subgraph
|
|
69
|
+
const inDegree = new Map();
|
|
70
|
+
const adjacency = new Map();
|
|
71
|
+
for (const key of activeKeys) {
|
|
72
|
+
inDegree.set(key, 0);
|
|
73
|
+
adjacency.set(key, []);
|
|
74
|
+
}
|
|
75
|
+
for (const key of activeKeys) {
|
|
76
|
+
const node = this.nodes.get(key);
|
|
77
|
+
if (!node)
|
|
78
|
+
continue;
|
|
79
|
+
for (const prereq of node.prerequisites) {
|
|
80
|
+
if (activeKeys.has(prereq)) {
|
|
81
|
+
adjacency.get(prereq)?.push(key);
|
|
82
|
+
inDegree.set(key, (inDegree.get(key) ?? 0) + 1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
for (const next of node.leadsTo) {
|
|
86
|
+
if (activeKeys.has(next)) {
|
|
87
|
+
adjacency.get(key)?.push(next);
|
|
88
|
+
inDegree.set(next, (inDegree.get(next) ?? 0) + 1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const sortQueue = [];
|
|
93
|
+
for (const [key, deg] of inDegree.entries()) {
|
|
94
|
+
if (deg === 0)
|
|
95
|
+
sortQueue.push(key);
|
|
96
|
+
}
|
|
97
|
+
const orderedKeys = [];
|
|
98
|
+
while (sortQueue.length > 0) {
|
|
99
|
+
const curr = sortQueue.shift();
|
|
100
|
+
orderedKeys.push(curr);
|
|
101
|
+
for (const neighbor of adjacency.get(curr) ?? []) {
|
|
102
|
+
const remaining = (inDegree.get(neighbor) ?? 1) - 1;
|
|
103
|
+
inDegree.set(neighbor, remaining);
|
|
104
|
+
if (remaining === 0) {
|
|
105
|
+
sortQueue.push(neighbor);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// If there were cycles, append any remaining active keys
|
|
110
|
+
for (const key of activeKeys) {
|
|
111
|
+
if (!orderedKeys.includes(key)) {
|
|
112
|
+
orderedKeys.push(key);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const result = [];
|
|
116
|
+
for (const key of orderedKeys) {
|
|
117
|
+
const node = this.nodes.get(key);
|
|
118
|
+
if (node)
|
|
119
|
+
result.push(node.skill);
|
|
120
|
+
}
|
|
121
|
+
return result.slice(0, maxBundleSize);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/skills/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.test.d.ts","sourceRoot":"","sources":["../../src/skills/graph.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { SkillGraph } from './graph.js';
|
|
3
|
+
function makeSkill(name, prereqs = [], leads = [], stage) {
|
|
4
|
+
return {
|
|
5
|
+
name,
|
|
6
|
+
description: `${name} description`,
|
|
7
|
+
trigger: name.toLowerCase(),
|
|
8
|
+
safety: 'instructions',
|
|
9
|
+
body: `Body for ${name}`,
|
|
10
|
+
source: `/mock/${name}/SKILL.md`,
|
|
11
|
+
prerequisites: prereqs,
|
|
12
|
+
leadsTo: leads,
|
|
13
|
+
stage,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
describe('SkillGraph', () => {
|
|
17
|
+
it('builds an empty graph safely', () => {
|
|
18
|
+
const graph = new SkillGraph([]);
|
|
19
|
+
expect(graph.getSkillBundle([])).toEqual([]);
|
|
20
|
+
});
|
|
21
|
+
it('returns initial match directly when no dependencies exist', () => {
|
|
22
|
+
const skillA = makeSkill('Linting');
|
|
23
|
+
const graph = new SkillGraph([skillA]);
|
|
24
|
+
const bundle = graph.getSkillBundle([skillA]);
|
|
25
|
+
expect(bundle.map((s) => s.name)).toEqual(['Linting']);
|
|
26
|
+
});
|
|
27
|
+
it('expands prerequisites and orders them before the matched skill', () => {
|
|
28
|
+
const spec = makeSkill('Spec Design');
|
|
29
|
+
const tdd = makeSkill('TDD Implementation', ['Spec Design'], ['Test Verification']);
|
|
30
|
+
const test = makeSkill('Test Verification');
|
|
31
|
+
const graph = new SkillGraph([spec, tdd, test]);
|
|
32
|
+
// Match only TDD Implementation
|
|
33
|
+
const bundle = graph.getSkillBundle([tdd]);
|
|
34
|
+
// Should pull Spec Design (prereq) and Test Verification (leadsTo), ordered chronologically
|
|
35
|
+
expect(bundle.map((s) => s.name)).toEqual(['Spec Design', 'TDD Implementation', 'Test Verification']);
|
|
36
|
+
});
|
|
37
|
+
it('respects maxBundleSize and prioritizes prerequisites over leadsTo', () => {
|
|
38
|
+
const s1 = makeSkill('Step 1');
|
|
39
|
+
const s2 = makeSkill('Step 2', ['Step 1'], ['Step 3']);
|
|
40
|
+
const s3 = makeSkill('Step 3', [], ['Step 4']);
|
|
41
|
+
const s4 = makeSkill('Step 4');
|
|
42
|
+
const graph = new SkillGraph([s1, s2, s3, s4]);
|
|
43
|
+
const bundle = graph.getSkillBundle([s2], 2);
|
|
44
|
+
expect(bundle.length).toBe(2);
|
|
45
|
+
expect(bundle.map((s) => s.name)).toEqual(['Step 1', 'Step 2']);
|
|
46
|
+
});
|
|
47
|
+
it('handles cyclic dependencies gracefully without infinite loop', () => {
|
|
48
|
+
const s1 = makeSkill('Cyclic A', ['Cyclic B']);
|
|
49
|
+
const s2 = makeSkill('Cyclic B', ['Cyclic A']);
|
|
50
|
+
const graph = new SkillGraph([s1, s2]);
|
|
51
|
+
const bundle = graph.getSkillBundle([s1]);
|
|
52
|
+
expect(bundle.length).toBe(2);
|
|
53
|
+
expect(bundle.map((s) => s.name)).toContain('Cyclic A');
|
|
54
|
+
expect(bundle.map((s) => s.name)).toContain('Cyclic B');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=graph.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.test.js","sourceRoot":"","sources":["../../src/skills/graph.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,SAAS,SAAS,CAAC,IAAY,EAAE,UAAoB,EAAE,EAAE,QAAkB,EAAE,EAAE,KAAsB;IACnG,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,GAAG,IAAI,cAAc;QAClC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;QAC3B,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,YAAY,IAAI,EAAE;QACxB,MAAM,EAAE,SAAS,IAAI,WAAW;QAChC,aAAa,EAAE,OAAO;QACtB,OAAO,EAAE,KAAK;QACd,KAAK;KACN,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,SAAS,CAAC,oBAAoB,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAE5C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,gCAAgC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3C,4FAA4F;QAC5F,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/skills/index.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ export interface Skill {
|
|
|
6
6
|
safety: 'instructions' | 'executable';
|
|
7
7
|
body: string;
|
|
8
8
|
source: string;
|
|
9
|
+
prerequisites?: string[];
|
|
10
|
+
leadsTo?: string[];
|
|
11
|
+
stage?: 'spec' | 'plan' | 'code' | 'test' | 'review';
|
|
9
12
|
}
|
|
10
13
|
export declare function discoverSkills(): Skill[];
|
|
11
14
|
export declare function matchSkills(request: string): Skill[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG9D,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,GAAG,YAAY,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;CACtD;AAuCD,wBAAgB,cAAc,IAAI,KAAK,EAAE,CAyCxC;AAoDD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAiBpD;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,UAAU,IAAI,KAAK,EAAE,CAEpC;AAGD,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,MAAM,CAE9E"}
|
package/dist/skills/index.js
CHANGED
|
@@ -15,7 +15,16 @@ import path from 'path';
|
|
|
15
15
|
import { fileURLToPath } from 'url';
|
|
16
16
|
import { homedir } from 'os';
|
|
17
17
|
import { writeSkillDraft } from './draft.js';
|
|
18
|
+
import { SkillGraph } from './graph.js';
|
|
18
19
|
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
|
|
20
|
+
function parseStringList(val) {
|
|
21
|
+
if (!val)
|
|
22
|
+
return [];
|
|
23
|
+
return val
|
|
24
|
+
.split(/[,|]/)
|
|
25
|
+
.map((s) => s.trim())
|
|
26
|
+
.filter(Boolean);
|
|
27
|
+
}
|
|
19
28
|
function parseFrontmatter(raw) {
|
|
20
29
|
const m = raw.match(FRONTMATTER_RE);
|
|
21
30
|
if (!m)
|
|
@@ -41,6 +50,7 @@ function userSkillsDir() {
|
|
|
41
50
|
return path.join(homedir(), '.daedalus', 'skills');
|
|
42
51
|
}
|
|
43
52
|
let cache = null;
|
|
53
|
+
let skillGraphCache = null;
|
|
44
54
|
export function discoverSkills() {
|
|
45
55
|
if (cache)
|
|
46
56
|
return cache;
|
|
@@ -77,6 +87,9 @@ export function discoverSkills() {
|
|
|
77
87
|
safety: meta.safety === 'executable' ? 'executable' : 'instructions',
|
|
78
88
|
body,
|
|
79
89
|
source: skillFile,
|
|
90
|
+
prerequisites: parseStringList(meta.prerequisites || meta.dependson),
|
|
91
|
+
leadsTo: parseStringList(meta.leadsto || meta.followup),
|
|
92
|
+
stage: meta.stage,
|
|
80
93
|
});
|
|
81
94
|
}
|
|
82
95
|
catch {
|
|
@@ -85,23 +98,72 @@ export function discoverSkills() {
|
|
|
85
98
|
}
|
|
86
99
|
}
|
|
87
100
|
cache = out;
|
|
101
|
+
skillGraphCache = new SkillGraph(out);
|
|
88
102
|
return out;
|
|
89
103
|
}
|
|
104
|
+
// ── Intent-based seed matching (replaces naive trigger-substring gate) ──
|
|
105
|
+
// Exact trigger phrase = strongest signal (score 1.0). Failing that, a weighted
|
|
106
|
+
// token-overlap score lets paraphrases within a skill's own vocabulary still
|
|
107
|
+
// activate the dependency graph. Offline, dependency-free.
|
|
108
|
+
const STOPWORDS = new Set([
|
|
109
|
+
'the', 'a', 'an', 'to', 'for', 'of', 'and', 'or', 'in', 'on', 'with', 'please',
|
|
110
|
+
'can', 'you', 'my', 'i', 'is', 'are', 'be', 'do', 'does', 'how', 'what', 'why',
|
|
111
|
+
'fix', 'make', 'add', 'use', 'me', 'we', 'it', 'this', 'that', 'from', 'at', 'by',
|
|
112
|
+
'as', 'so', 'if', 'then', 'your', 'our', 'them', 'they',
|
|
113
|
+
]);
|
|
114
|
+
function tokenize(s) {
|
|
115
|
+
return (s.toLowerCase().match(/[a-z0-9]+/g) ?? [])
|
|
116
|
+
.filter((w) => w.length > 1 && !STOPWORDS.has(w));
|
|
117
|
+
}
|
|
118
|
+
// Score a skill against the request. Exact trigger substring => 1.0 (tier 1).
|
|
119
|
+
// Otherwise weighted token overlap (trigger words double-weighted over
|
|
120
|
+
// description words), normalized so short requests don't over-match.
|
|
121
|
+
function scoreSkill(req, reqTokens, skill) {
|
|
122
|
+
const trig = (skill.trigger || '').toLowerCase();
|
|
123
|
+
// Tier 1: exact trigger substring — strongest possible signal.
|
|
124
|
+
if (trig && trig.split('|').some((t) => {
|
|
125
|
+
const term = t.trim();
|
|
126
|
+
return term.length > 0 && req.includes(term);
|
|
127
|
+
})) {
|
|
128
|
+
return 1.0;
|
|
129
|
+
}
|
|
130
|
+
const trigTokens = tokenize(trig);
|
|
131
|
+
const descTokens = tokenize(skill.description || '');
|
|
132
|
+
const total = trigTokens.length + descTokens.length;
|
|
133
|
+
if (total === 0 || reqTokens.size === 0)
|
|
134
|
+
return 0;
|
|
135
|
+
let weight = 0;
|
|
136
|
+
for (const t of reqTokens) {
|
|
137
|
+
if (trigTokens.includes(t))
|
|
138
|
+
weight += 2; // trigger word = double weight
|
|
139
|
+
else if (descTokens.includes(t))
|
|
140
|
+
weight += 1; // description word = single
|
|
141
|
+
}
|
|
142
|
+
if (weight === 0)
|
|
143
|
+
return 0;
|
|
144
|
+
// Normalize against the smaller side so a short request can't over-match.
|
|
145
|
+
const denom = Math.min(reqTokens.size, total) * 2;
|
|
146
|
+
return weight / denom;
|
|
147
|
+
}
|
|
148
|
+
const MATCH_THRESHOLD = 0.34;
|
|
90
149
|
export function matchSkills(request) {
|
|
91
150
|
const req = (request || '').toLowerCase();
|
|
92
151
|
if (!req)
|
|
93
152
|
return [];
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
153
|
+
const allSkills = discoverSkills();
|
|
154
|
+
const reqTokens = new Set(tokenize(req));
|
|
155
|
+
if (reqTokens.size === 0)
|
|
156
|
+
return [];
|
|
157
|
+
const scored = allSkills
|
|
158
|
+
.filter((s) => s.safety === 'instructions')
|
|
159
|
+
.map((s) => ({ skill: s, score: scoreSkill(req, reqTokens, s) }))
|
|
160
|
+
.filter((x) => x.score >= MATCH_THRESHOLD)
|
|
161
|
+
.sort((a, b) => b.score - a.score);
|
|
162
|
+
if (scored.length === 0)
|
|
163
|
+
return [];
|
|
164
|
+
// Seed with the top few intent matches; the graph expands prereqs/leadsTo.
|
|
165
|
+
const graph = skillGraphCache ?? new SkillGraph(allSkills);
|
|
166
|
+
return graph.getSkillBundle(scored.slice(0, 3).map((x) => x.skill));
|
|
105
167
|
}
|
|
106
168
|
// Returns the injected prompt section for matched skills, or '' if none.
|
|
107
169
|
export function getSkillsSection(request) {
|
|
@@ -120,6 +182,7 @@ export function listSkills() {
|
|
|
120
182
|
// Test/debug helper to invalidate the discovery cache (e.g. after adding skills).
|
|
121
183
|
export function clearSkillsCache() {
|
|
122
184
|
cache = null;
|
|
185
|
+
skillGraphCache = null;
|
|
123
186
|
}
|
|
124
187
|
// Bidirectional hook: the agent can propose a learned skill (e.g. a problem it
|
|
125
188
|
// solved that's likely to recur) as a draft. The draft is stored in the user's
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,iEAAiE;AACjE,2EAA2E;AAC3E,8EAA8E;AAC9E,iEAAiE;AACjE,+EAA+E;AAC/E,oEAAoE;AACpE,EAAE;AACF,sEAAsE;AAEtE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,5 +103,61 @@ describe('Skills module (beta, load-only)', () => {
|
|
|
103
103
|
expect(mod.getSkillsSection('the build is broken, fix the typescript errors'))
|
|
104
104
|
.toContain('Fixing a TypeScript Build');
|
|
105
105
|
});
|
|
106
|
+
it('expands prerequisite skills into a causal bundle upon match', async () => {
|
|
107
|
+
const prereqDir = path.join(userSkills, 'audit-first');
|
|
108
|
+
fs.mkdirSync(prereqDir, { recursive: true });
|
|
109
|
+
fs.writeFileSync(path.join(prereqDir, 'SKILL.md'), [
|
|
110
|
+
'---',
|
|
111
|
+
'name: audit-first',
|
|
112
|
+
'description: Audit before refactoring',
|
|
113
|
+
'trigger: audit code',
|
|
114
|
+
'safety: instructions',
|
|
115
|
+
'---',
|
|
116
|
+
'# Audit First',
|
|
117
|
+
'Inspect before modifying.',
|
|
118
|
+
].join('\n'));
|
|
119
|
+
const refactorDir = path.join(userSkills, 'refactor-code');
|
|
120
|
+
fs.mkdirSync(refactorDir, { recursive: true });
|
|
121
|
+
fs.writeFileSync(path.join(refactorDir, 'SKILL.md'), [
|
|
122
|
+
'---',
|
|
123
|
+
'name: refactor-code',
|
|
124
|
+
'description: Refactor code cleanly',
|
|
125
|
+
'trigger: refactor the codebase',
|
|
126
|
+
'prerequisites: audit-first',
|
|
127
|
+
'safety: instructions',
|
|
128
|
+
'---',
|
|
129
|
+
'# Refactor Code',
|
|
130
|
+
'Apply safe refactoring.',
|
|
131
|
+
].join('\n'));
|
|
132
|
+
vi.resetModules();
|
|
133
|
+
const mod = await import('./index.js');
|
|
134
|
+
const matched = mod.matchSkills('please refactor the codebase');
|
|
135
|
+
expect(matched.length).toBe(2);
|
|
136
|
+
// Prerequisite comes first
|
|
137
|
+
expect(matched[0].name).toBe('audit-first');
|
|
138
|
+
expect(matched[1].name).toBe('refactor-code');
|
|
139
|
+
});
|
|
140
|
+
it('matches a paraphrase that shares the skill vocabulary but not the literal trigger', async () => {
|
|
141
|
+
vi.resetModules();
|
|
142
|
+
const mod = await import('./index.js');
|
|
143
|
+
// No trigger phrase is a substring here ('build is broken' / 'type errors' absent),
|
|
144
|
+
// but the tokens overlap enough to clear the threshold.
|
|
145
|
+
const matched = mod.matchSkills('my build keeps failing with type issues');
|
|
146
|
+
expect(matched.some((s) => s.name === 'fix-typescript-build')).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
it('returns no skills for an unrelated request (threshold guard)', async () => {
|
|
149
|
+
vi.resetModules();
|
|
150
|
+
const mod = await import('./index.js');
|
|
151
|
+
expect(mod.matchSkills('summarize this README for me').length).toBe(0);
|
|
152
|
+
expect(mod.matchSkills('random chat').length).toBe(0);
|
|
153
|
+
});
|
|
154
|
+
it('scores an exact trigger match above any fuzzy overlap', async () => {
|
|
155
|
+
vi.resetModules();
|
|
156
|
+
const mod = await import('./index.js');
|
|
157
|
+
// 'add a command' is a demo trigger substring; demo must be among the matches
|
|
158
|
+
// (exact trigger tier fires, not merely fuzzy token overlap).
|
|
159
|
+
const matched = mod.matchSkills('how do i add a command for this?');
|
|
160
|
+
expect(matched.some((s) => s.name === 'demo')).toBe(true);
|
|
161
|
+
});
|
|
106
162
|
});
|
|
107
163
|
//# sourceMappingURL=index.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/skills/index.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/skills/index.test.ts"],"names":[],"mappings":"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"}
|