cognitive-core 0.0.2 → 0.1.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/README.md +302 -116
- package/SKILL.md +193 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mock-provider.d.ts +23 -0
- package/dist/agents/mock-provider.d.ts.map +1 -0
- package/dist/agents/mock-provider.js +71 -0
- package/dist/agents/mock-provider.js.map +1 -0
- package/dist/agents/types.d.ts +98 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +44 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/atlas.d.ts +196 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +373 -0
- package/dist/atlas.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +18 -0
- package/dist/bin/cognitive-core.d.ts.map +1 -0
- package/dist/bin/cognitive-core.js +419 -0
- package/dist/bin/cognitive-core.js.map +1 -0
- package/dist/embeddings/bm25.d.ts +104 -0
- package/dist/embeddings/bm25.d.ts.map +1 -0
- package/dist/embeddings/bm25.js +264 -0
- package/dist/embeddings/bm25.js.map +1 -0
- package/dist/embeddings/index.d.ts +12 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +16 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +112 -0
- package/dist/embeddings/manager.d.ts.map +1 -0
- package/dist/embeddings/manager.js +215 -0
- package/dist/embeddings/manager.js.map +1 -0
- package/dist/embeddings/provider.d.ts +101 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +232 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +101 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +256 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/factory.d.ts +193 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +109 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +30 -453
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -509
- package/dist/index.js.map +1 -0
- package/dist/learning/analyzer.d.ts +110 -0
- package/dist/learning/analyzer.d.ts.map +1 -0
- package/dist/learning/analyzer.js +213 -0
- package/dist/learning/analyzer.js.map +1 -0
- package/dist/learning/effectiveness.d.ts +158 -0
- package/dist/learning/effectiveness.d.ts.map +1 -0
- package/dist/learning/effectiveness.js +251 -0
- package/dist/learning/effectiveness.js.map +1 -0
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +11 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/llm-extractor.d.ts +88 -0
- package/dist/learning/llm-extractor.d.ts.map +1 -0
- package/dist/learning/llm-extractor.js +372 -0
- package/dist/learning/llm-extractor.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +80 -0
- package/dist/learning/meta-learner.d.ts.map +1 -0
- package/dist/learning/meta-learner.js +355 -0
- package/dist/learning/meta-learner.js.map +1 -0
- package/dist/learning/pipeline.d.ts +65 -0
- package/dist/learning/pipeline.d.ts.map +1 -0
- package/dist/learning/pipeline.js +170 -0
- package/dist/learning/pipeline.js.map +1 -0
- package/dist/learning/playbook-extractor.d.ts +113 -0
- package/dist/learning/playbook-extractor.d.ts.map +1 -0
- package/dist/learning/playbook-extractor.js +523 -0
- package/dist/learning/playbook-extractor.js.map +1 -0
- package/dist/learning/usage-inference.d.ts +82 -0
- package/dist/learning/usage-inference.d.ts.map +1 -0
- package/dist/learning/usage-inference.js +261 -0
- package/dist/learning/usage-inference.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/playbook-server.d.ts +120 -0
- package/dist/mcp/playbook-server.d.ts.map +1 -0
- package/dist/mcp/playbook-server.js +427 -0
- package/dist/mcp/playbook-server.js.map +1 -0
- package/dist/memory/curated-loader.d.ts +62 -0
- package/dist/memory/curated-loader.d.ts.map +1 -0
- package/dist/memory/curated-loader.js +106 -0
- package/dist/memory/curated-loader.js.map +1 -0
- package/dist/memory/experience.d.ts +122 -0
- package/dist/memory/experience.d.ts.map +1 -0
- package/dist/memory/experience.js +392 -0
- package/dist/memory/experience.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/meta.d.ts +90 -0
- package/dist/memory/meta.d.ts.map +1 -0
- package/dist/memory/meta.js +362 -0
- package/dist/memory/meta.js.map +1 -0
- package/dist/memory/playbook.d.ts +133 -0
- package/dist/memory/playbook.d.ts.map +1 -0
- package/dist/memory/playbook.js +357 -0
- package/dist/memory/playbook.js.map +1 -0
- package/dist/memory/system.d.ts +167 -0
- package/dist/memory/system.d.ts.map +1 -0
- package/dist/memory/system.js +383 -0
- package/dist/memory/system.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +67 -0
- package/dist/runtime/backends/acp.d.ts.map +1 -0
- package/dist/runtime/backends/acp.js +290 -0
- package/dist/runtime/backends/acp.js.map +1 -0
- package/dist/runtime/backends/index.d.ts +5 -0
- package/dist/runtime/backends/index.d.ts.map +1 -0
- package/dist/runtime/backends/index.js +6 -0
- package/dist/runtime/backends/index.js.map +1 -0
- package/dist/runtime/backends/mock.d.ts +67 -0
- package/dist/runtime/backends/mock.d.ts.map +1 -0
- package/dist/runtime/backends/mock.js +153 -0
- package/dist/runtime/backends/mock.js.map +1 -0
- package/dist/runtime/backends/subprocess.d.ts +56 -0
- package/dist/runtime/backends/subprocess.d.ts.map +1 -0
- package/dist/runtime/backends/subprocess.js +260 -0
- package/dist/runtime/backends/subprocess.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +73 -0
- package/dist/runtime/flows/learning.d.ts.map +1 -0
- package/dist/runtime/flows/learning.js +116 -0
- package/dist/runtime/flows/learning.js.map +1 -0
- package/dist/runtime/flows/validation.d.ts +122 -0
- package/dist/runtime/flows/validation.d.ts.map +1 -0
- package/dist/runtime/flows/validation.js +223 -0
- package/dist/runtime/flows/validation.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/manager.d.ts +116 -0
- package/dist/runtime/manager.d.ts.map +1 -0
- package/dist/runtime/manager.js +416 -0
- package/dist/runtime/manager.js.map +1 -0
- package/dist/runtime/types.d.ts +138 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/search/evaluator.d.ts +102 -0
- package/dist/search/evaluator.d.ts.map +1 -0
- package/dist/search/evaluator.js +352 -0
- package/dist/search/evaluator.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +11 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/refinement-loop.d.ts +73 -0
- package/dist/search/refinement-loop.d.ts.map +1 -0
- package/dist/search/refinement-loop.js +245 -0
- package/dist/search/refinement-loop.js.map +1 -0
- package/dist/search/refinement-types.d.ts +154 -0
- package/dist/search/refinement-types.d.ts.map +1 -0
- package/dist/search/refinement-types.js +99 -0
- package/dist/search/refinement-types.js.map +1 -0
- package/dist/search/router.d.ts +61 -0
- package/dist/search/router.d.ts.map +1 -0
- package/dist/search/router.js +197 -0
- package/dist/search/router.js.map +1 -0
- package/dist/search/solver.d.ts +75 -0
- package/dist/search/solver.d.ts.map +1 -0
- package/dist/search/solver.js +216 -0
- package/dist/search/solver.js.map +1 -0
- package/dist/search/verification-runner.d.ts +125 -0
- package/dist/search/verification-runner.d.ts.map +1 -0
- package/dist/search/verification-runner.js +440 -0
- package/dist/search/verification-runner.js.map +1 -0
- package/dist/surfacing/index.d.ts +2 -0
- package/dist/surfacing/index.d.ts.map +1 -0
- package/dist/surfacing/index.js +2 -0
- package/dist/surfacing/index.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +158 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -0
- package/dist/surfacing/skill-library.js +429 -0
- package/dist/surfacing/skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1113 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +274 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/memory.d.ts +339 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +207 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/meta.d.ts +146 -0
- package/dist/types/meta.d.ts.map +1 -0
- package/dist/types/meta.js +51 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/outcome.d.ts +42 -0
- package/dist/types/outcome.d.ts.map +1 -0
- package/dist/types/outcome.js +50 -0
- package/dist/types/outcome.js.map +1 -0
- package/dist/types/playbook.d.ts +119 -0
- package/dist/types/playbook.d.ts.map +1 -0
- package/dist/types/playbook.js +71 -0
- package/dist/types/playbook.js.map +1 -0
- package/dist/types/step.d.ts +44 -0
- package/dist/types/step.d.ts.map +1 -0
- package/dist/types/step.js +32 -0
- package/dist/types/step.js.map +1 -0
- package/dist/types/task.d.ts +91 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +39 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/trajectory.d.ts +221 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +60 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/similarity.d.ts +31 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +107 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/storage.d.ts +106 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +203 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +129 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +171 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +50 -34
- package/scripts/migrate-to-playbooks.ts +307 -0
- package/src/agents/index.ts +14 -0
- package/src/agents/mock-provider.ts +93 -0
- package/src/agents/types.ts +137 -0
- package/src/atlas.ts +560 -0
- package/src/bin/cognitive-core.ts +470 -0
- package/src/embeddings/bm25.ts +337 -0
- package/src/embeddings/index.ts +39 -0
- package/src/embeddings/manager.ts +288 -0
- package/src/embeddings/provider.ts +311 -0
- package/src/embeddings/vector-store.ts +353 -0
- package/src/factory.ts +263 -0
- package/src/index.ts +246 -0
- package/src/learning/analyzer.ts +335 -0
- package/src/learning/effectiveness.ts +428 -0
- package/src/learning/index.ts +58 -0
- package/src/learning/llm-extractor.ts +542 -0
- package/src/learning/meta-learner.ts +516 -0
- package/src/learning/pipeline.ts +244 -0
- package/src/learning/playbook-extractor.ts +702 -0
- package/src/learning/usage-inference.ts +372 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/playbook-server.ts +565 -0
- package/src/memory/curated-loader.ts +160 -0
- package/src/memory/experience.ts +515 -0
- package/src/memory/index.ts +27 -0
- package/src/memory/meta.ts +506 -0
- package/src/memory/playbook.ts +493 -0
- package/src/memory/system.ts +551 -0
- package/src/runtime/backends/acp.ts +378 -0
- package/src/runtime/backends/index.ts +24 -0
- package/src/runtime/backends/mock.ts +218 -0
- package/src/runtime/backends/subprocess.ts +356 -0
- package/src/runtime/flows/learning.ts +183 -0
- package/src/runtime/flows/validation.ts +381 -0
- package/src/runtime/index.ts +53 -0
- package/src/runtime/manager.ts +541 -0
- package/src/runtime/types.ts +157 -0
- package/src/search/evaluator.ts +474 -0
- package/src/search/index.ts +59 -0
- package/src/search/refinement-loop.ts +363 -0
- package/src/search/refinement-types.ts +159 -0
- package/src/search/router.ts +261 -0
- package/src/search/solver.ts +303 -0
- package/src/search/verification-runner.ts +570 -0
- package/src/surfacing/index.ts +6 -0
- package/src/surfacing/skill-library.ts +594 -0
- package/src/types/config.ts +333 -0
- package/src/types/index.ts +130 -0
- package/src/types/memory.ts +270 -0
- package/src/types/meta.ts +218 -0
- package/src/types/outcome.ts +66 -0
- package/src/types/playbook.ts +196 -0
- package/src/types/step.ts +40 -0
- package/src/types/task.ts +52 -0
- package/src/types/trajectory.ts +80 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/similarity.ts +139 -0
- package/src/utils/storage.ts +249 -0
- package/src/utils/validation.ts +286 -0
- package/tests/embeddings/bm25.test.ts +130 -0
- package/tests/embeddings/manager.test.ts +205 -0
- package/tests/integration/atlas.test.ts +266 -0
- package/tests/integration/e2e.test.ts +929 -0
- package/tests/learning/analyzer.test.ts +426 -0
- package/tests/learning/effectiveness.test.ts +542 -0
- package/tests/learning/pipeline.test.ts +176 -0
- package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
- package/tests/learning/usage-inference.test.ts +254 -0
- package/tests/mcp/playbook-server.test.ts +252 -0
- package/tests/memory/experience.test.ts +198 -0
- package/tests/memory/playbook.test.ts +338 -0
- package/tests/memory/provenance.test.ts +639 -0
- package/tests/memory/system.test.ts +325 -0
- package/tests/runtime/agent-manager.test.ts +512 -0
- package/tests/runtime/mock-backend.test.ts +248 -0
- package/tests/search/refinement-loop.test.ts +468 -0
- package/tests/search/refinement.test.ts +267 -0
- package/tests/search/router.test.ts +427 -0
- package/tests/surfacing/skill-library.test.ts +292 -0
- package/tests/types/outcome.test.ts +147 -0
- package/tests/types/step.test.ts +133 -0
- package/tests/types/task.test.ts +158 -0
- package/tests/types/trajectory.test.ts +253 -0
- package/tests/utils/similarity.test.ts +188 -0
- package/tests/utils/validation.test.ts +252 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
- package/dist/index.d.mts +0 -466
- package/dist/index.mjs +0 -478
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { PlaybookLibrary, createPlaybookLibrary } from '../../src/memory/playbook.js';
|
|
3
|
+
import type { Playbook } from '../../src/types/playbook.js';
|
|
4
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
|
|
8
|
+
describe('PlaybookLibrary', () => {
|
|
9
|
+
let tempDir: string;
|
|
10
|
+
let library: PlaybookLibrary;
|
|
11
|
+
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
tempDir = await mkdtemp(join(tmpdir(), 'atlas-test-'));
|
|
14
|
+
library = createPlaybookLibrary(tempDir);
|
|
15
|
+
await library.init();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(async () => {
|
|
19
|
+
await library.close();
|
|
20
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
function createSamplePlaybook(overrides?: Partial<Playbook>): Playbook {
|
|
24
|
+
return {
|
|
25
|
+
id: `playbook-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
26
|
+
name: 'fix-type-error',
|
|
27
|
+
applicability: {
|
|
28
|
+
situations: ['Debugging TypeScript type errors'],
|
|
29
|
+
triggers: ['TS2322', 'Type error'],
|
|
30
|
+
antiPatterns: ['Simple typo'],
|
|
31
|
+
domains: ['typescript', 'code'],
|
|
32
|
+
},
|
|
33
|
+
guidance: {
|
|
34
|
+
strategy: 'Analyze the error message and trace back to the source',
|
|
35
|
+
tactics: [
|
|
36
|
+
'Read the full error message',
|
|
37
|
+
'Identify the expected vs actual types',
|
|
38
|
+
'Check the variable declaration',
|
|
39
|
+
],
|
|
40
|
+
steps: ['npm run typecheck', 'Fix the type mismatch'],
|
|
41
|
+
},
|
|
42
|
+
verification: {
|
|
43
|
+
successIndicators: ['Build passes', 'No type errors'],
|
|
44
|
+
failureIndicators: ['Same error persists', 'New errors appear'],
|
|
45
|
+
},
|
|
46
|
+
evolution: {
|
|
47
|
+
version: '1.0.0',
|
|
48
|
+
createdFrom: [],
|
|
49
|
+
failures: [],
|
|
50
|
+
refinements: [],
|
|
51
|
+
successCount: 0,
|
|
52
|
+
failureCount: 0,
|
|
53
|
+
},
|
|
54
|
+
confidence: 0.7,
|
|
55
|
+
complexity: 'moderate',
|
|
56
|
+
estimatedEffort: 3,
|
|
57
|
+
createdAt: new Date(),
|
|
58
|
+
updatedAt: new Date(),
|
|
59
|
+
...overrides,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
describe('add and get', () => {
|
|
64
|
+
it('should store and retrieve a playbook', async () => {
|
|
65
|
+
const playbook = createSamplePlaybook();
|
|
66
|
+
await library.add(playbook);
|
|
67
|
+
|
|
68
|
+
const retrieved = await library.get(playbook.id);
|
|
69
|
+
expect(retrieved).toBeDefined();
|
|
70
|
+
expect(retrieved?.name).toBe('fix-type-error');
|
|
71
|
+
expect(retrieved?.guidance.tactics).toHaveLength(3);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should return undefined for non-existent id', async () => {
|
|
75
|
+
const result = await library.get('non-existent');
|
|
76
|
+
expect(result).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('findMatching', () => {
|
|
81
|
+
it('should find matching playbooks by context', async () => {
|
|
82
|
+
await library.add(createSamplePlaybook({
|
|
83
|
+
name: 'type-fix',
|
|
84
|
+
applicability: {
|
|
85
|
+
situations: ['Fix TypeScript type errors in code'],
|
|
86
|
+
triggers: ['TS2322'],
|
|
87
|
+
antiPatterns: [],
|
|
88
|
+
domains: ['typescript'],
|
|
89
|
+
},
|
|
90
|
+
}));
|
|
91
|
+
await library.add(createSamplePlaybook({
|
|
92
|
+
name: 'perf-opt',
|
|
93
|
+
applicability: {
|
|
94
|
+
situations: ['Optimize database queries'],
|
|
95
|
+
triggers: ['slow query'],
|
|
96
|
+
antiPatterns: [],
|
|
97
|
+
domains: ['database'],
|
|
98
|
+
},
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
const results = await library.findMatching('typescript type error', { k: 2 });
|
|
102
|
+
expect(results.length).toBeGreaterThanOrEqual(1);
|
|
103
|
+
expect(results[0].playbook.name).toBe('type-fix');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should match against triggers', async () => {
|
|
107
|
+
await library.add(createSamplePlaybook({
|
|
108
|
+
name: 'specific-error-playbook',
|
|
109
|
+
applicability: {
|
|
110
|
+
situations: ['General error handling'],
|
|
111
|
+
triggers: ['TS2322: Type string is not assignable'],
|
|
112
|
+
antiPatterns: [],
|
|
113
|
+
domains: ['typescript'],
|
|
114
|
+
},
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
const results = await library.findMatching('TS2322: Type string', { k: 1 });
|
|
118
|
+
expect(results.length).toBeGreaterThanOrEqual(1);
|
|
119
|
+
expect(results[0].playbook.name).toBe('specific-error-playbook');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should filter by domain', async () => {
|
|
123
|
+
await library.add(createSamplePlaybook({
|
|
124
|
+
name: 'ts-playbook',
|
|
125
|
+
applicability: {
|
|
126
|
+
situations: ['TypeScript task'],
|
|
127
|
+
triggers: [],
|
|
128
|
+
antiPatterns: [],
|
|
129
|
+
domains: ['typescript'],
|
|
130
|
+
},
|
|
131
|
+
}));
|
|
132
|
+
await library.add(createSamplePlaybook({
|
|
133
|
+
name: 'py-playbook',
|
|
134
|
+
applicability: {
|
|
135
|
+
situations: ['Python task'],
|
|
136
|
+
triggers: [],
|
|
137
|
+
antiPatterns: [],
|
|
138
|
+
domains: ['python'],
|
|
139
|
+
},
|
|
140
|
+
}));
|
|
141
|
+
|
|
142
|
+
const results = await library.findMatching('test', { domains: ['typescript'] });
|
|
143
|
+
expect(results.every(r => r.playbook.applicability.domains.includes('typescript'))).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should filter by minimum confidence', async () => {
|
|
147
|
+
await library.add(createSamplePlaybook({
|
|
148
|
+
name: 'high-conf',
|
|
149
|
+
confidence: 0.9,
|
|
150
|
+
}));
|
|
151
|
+
await library.add(createSamplePlaybook({
|
|
152
|
+
name: 'low-conf',
|
|
153
|
+
confidence: 0.3,
|
|
154
|
+
}));
|
|
155
|
+
|
|
156
|
+
const results = await library.findMatching('test', { minConfidence: 0.8 });
|
|
157
|
+
expect(results.every(r => r.playbook.confidence >= 0.8)).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('should exclude anti-patterns when requested', async () => {
|
|
161
|
+
await library.add(createSamplePlaybook({
|
|
162
|
+
name: 'with-antipattern',
|
|
163
|
+
applicability: {
|
|
164
|
+
situations: ['General task'],
|
|
165
|
+
triggers: ['error'],
|
|
166
|
+
antiPatterns: ['simple typo', 'network issue'],
|
|
167
|
+
domains: ['code'],
|
|
168
|
+
},
|
|
169
|
+
}));
|
|
170
|
+
|
|
171
|
+
const resultsIncluding = await library.findMatching('simple typo error', {
|
|
172
|
+
excludeAntiPatterns: false,
|
|
173
|
+
});
|
|
174
|
+
const resultsExcluding = await library.findMatching('simple typo error', {
|
|
175
|
+
excludeAntiPatterns: true,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// When excluding anti-patterns, the match should be filtered out
|
|
179
|
+
expect(resultsIncluding.length).toBeGreaterThanOrEqual(resultsExcluding.length);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe('recordSuccess and recordFailure', () => {
|
|
184
|
+
it('should update success statistics', async () => {
|
|
185
|
+
const playbook = createSamplePlaybook({ confidence: 0.5 });
|
|
186
|
+
const initialConfidence = playbook.confidence;
|
|
187
|
+
await library.add(playbook);
|
|
188
|
+
|
|
189
|
+
await library.recordSuccess(playbook.id, 'traj-1');
|
|
190
|
+
await library.recordSuccess(playbook.id, 'traj-2');
|
|
191
|
+
|
|
192
|
+
const updated = await library.get(playbook.id);
|
|
193
|
+
expect(updated?.evolution.successCount).toBe(2);
|
|
194
|
+
// Confidence should increase after successes (at least not decrease)
|
|
195
|
+
expect(updated?.confidence).toBeGreaterThanOrEqual(initialConfidence);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('should update failure statistics', async () => {
|
|
199
|
+
const playbook = createSamplePlaybook({ confidence: 0.8 });
|
|
200
|
+
const initialConfidence = playbook.confidence;
|
|
201
|
+
await library.add(playbook);
|
|
202
|
+
|
|
203
|
+
await library.recordFailure(playbook.id, 'traj-1', 'monorepo', 'Failed with symlinks');
|
|
204
|
+
|
|
205
|
+
const updated = await library.get(playbook.id);
|
|
206
|
+
expect(updated?.evolution.failureCount).toBe(1);
|
|
207
|
+
expect(updated?.evolution.failures).toHaveLength(1);
|
|
208
|
+
// Confidence should decrease after failure (at least not increase)
|
|
209
|
+
expect(updated?.confidence).toBeLessThanOrEqual(initialConfidence);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe('addRefinement', () => {
|
|
214
|
+
it('should add a refinement to the playbook', async () => {
|
|
215
|
+
const playbook = createSamplePlaybook();
|
|
216
|
+
await library.add(playbook);
|
|
217
|
+
|
|
218
|
+
await library.addRefinement(
|
|
219
|
+
playbook.id,
|
|
220
|
+
'monorepo',
|
|
221
|
+
'Also check workspace symlinks',
|
|
222
|
+
'failure'
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
const updated = await library.get(playbook.id);
|
|
226
|
+
expect(updated?.evolution.refinements).toHaveLength(1);
|
|
227
|
+
expect(updated?.evolution.refinements[0].context).toBe('monorepo');
|
|
228
|
+
expect(updated?.evolution.refinements[0].addition).toBe('Also check workspace symlinks');
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('getByDomain and getMostEffective', () => {
|
|
233
|
+
it('should return playbooks by domain', async () => {
|
|
234
|
+
await library.add(createSamplePlaybook({
|
|
235
|
+
name: 'ts1',
|
|
236
|
+
applicability: {
|
|
237
|
+
situations: ['TS task'],
|
|
238
|
+
triggers: [],
|
|
239
|
+
antiPatterns: [],
|
|
240
|
+
domains: ['typescript'],
|
|
241
|
+
},
|
|
242
|
+
}));
|
|
243
|
+
await library.add(createSamplePlaybook({
|
|
244
|
+
name: 'ts2',
|
|
245
|
+
applicability: {
|
|
246
|
+
situations: ['TS task 2'],
|
|
247
|
+
triggers: [],
|
|
248
|
+
antiPatterns: [],
|
|
249
|
+
domains: ['typescript'],
|
|
250
|
+
},
|
|
251
|
+
}));
|
|
252
|
+
await library.add(createSamplePlaybook({
|
|
253
|
+
name: 'py1',
|
|
254
|
+
applicability: {
|
|
255
|
+
situations: ['Python task'],
|
|
256
|
+
triggers: [],
|
|
257
|
+
antiPatterns: [],
|
|
258
|
+
domains: ['python'],
|
|
259
|
+
},
|
|
260
|
+
}));
|
|
261
|
+
|
|
262
|
+
const tsPlaybooks = await library.getByDomain('typescript');
|
|
263
|
+
expect(tsPlaybooks).toHaveLength(2);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('should return most effective playbooks', async () => {
|
|
267
|
+
const p1 = createSamplePlaybook({ name: 'p1', confidence: 0.9 });
|
|
268
|
+
const p2 = createSamplePlaybook({ name: 'p2', confidence: 0.5 });
|
|
269
|
+
const p3 = createSamplePlaybook({ name: 'p3', confidence: 0.8 });
|
|
270
|
+
await library.add(p1);
|
|
271
|
+
await library.add(p2);
|
|
272
|
+
await library.add(p3);
|
|
273
|
+
|
|
274
|
+
// Add enough usage (getMostEffective requires at least 3 total uses)
|
|
275
|
+
await library.recordSuccess(p1.id, 'traj-1');
|
|
276
|
+
await library.recordSuccess(p1.id, 'traj-2');
|
|
277
|
+
await library.recordSuccess(p1.id, 'traj-3');
|
|
278
|
+
|
|
279
|
+
await library.recordSuccess(p2.id, 'traj-4');
|
|
280
|
+
await library.recordFailure(p2.id, 'traj-5', 'test', 'failed');
|
|
281
|
+
await library.recordFailure(p2.id, 'traj-6', 'test', 'failed');
|
|
282
|
+
|
|
283
|
+
const mostEffective = await library.getMostEffective(2);
|
|
284
|
+
expect(mostEffective).toHaveLength(2);
|
|
285
|
+
// p1 should be first (100% success rate) over p2 (33% success rate)
|
|
286
|
+
expect(mostEffective[0].id).toBe(p1.id);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
describe('exists', () => {
|
|
291
|
+
it('should find existing playbook by name', async () => {
|
|
292
|
+
await library.add(createSamplePlaybook({ name: 'existing-playbook' }));
|
|
293
|
+
|
|
294
|
+
const result = await library.exists('existing-playbook');
|
|
295
|
+
expect(result).toBeDefined();
|
|
296
|
+
expect(result?.name).toBe('existing-playbook');
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('should find existing playbook by similarity', async () => {
|
|
300
|
+
await library.add(createSamplePlaybook({
|
|
301
|
+
name: 'unique-playbook',
|
|
302
|
+
applicability: {
|
|
303
|
+
situations: ['Very specific and unique situation description'],
|
|
304
|
+
triggers: [],
|
|
305
|
+
antiPatterns: [],
|
|
306
|
+
domains: ['code'],
|
|
307
|
+
},
|
|
308
|
+
}));
|
|
309
|
+
|
|
310
|
+
const result = await library.exists(
|
|
311
|
+
'Very specific and unique situation description',
|
|
312
|
+
0.85
|
|
313
|
+
);
|
|
314
|
+
expect(result).toBeDefined();
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it('should return undefined if no match', async () => {
|
|
318
|
+
await library.add(createSamplePlaybook());
|
|
319
|
+
|
|
320
|
+
const result = await library.exists('completely unrelated topic');
|
|
321
|
+
expect(result).toBeUndefined();
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
describe('count and getAll', () => {
|
|
326
|
+
it('should return correct counts', async () => {
|
|
327
|
+
expect(await library.count()).toBe(0);
|
|
328
|
+
|
|
329
|
+
await library.add(createSamplePlaybook({ name: 'p1' }));
|
|
330
|
+
await library.add(createSamplePlaybook({ name: 'p2' }));
|
|
331
|
+
|
|
332
|
+
expect(await library.count()).toBe(2);
|
|
333
|
+
|
|
334
|
+
const all = await library.getAll();
|
|
335
|
+
expect(all).toHaveLength(2);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|