@soleri/core 9.2.0 → 9.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/data/flows/build.flow.yaml +8 -9
- package/data/flows/deliver.flow.yaml +9 -10
- package/data/flows/design.flow.yaml +3 -4
- package/data/flows/enhance.flow.yaml +5 -6
- package/data/flows/explore.flow.yaml +3 -4
- package/data/flows/fix.flow.yaml +5 -6
- package/data/flows/plan.flow.yaml +4 -5
- package/data/flows/review.flow.yaml +3 -4
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +98 -22
- package/dist/curator/curator.js.map +1 -1
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +21 -1
- package/dist/engine/module-manifest.js.map +1 -1
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +25 -1
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/flows/gate-evaluator.js.map +1 -1
- package/dist/operator/operator-profile.d.ts.map +1 -1
- package/dist/operator/operator-profile.js +11 -5
- package/dist/operator/operator-profile.js.map +1 -1
- package/dist/operator/operator-signals.d.ts.map +1 -1
- package/dist/operator/operator-signals.js.map +1 -1
- package/dist/planning/evidence-collector.js.map +1 -1
- package/dist/planning/gap-passes.d.ts.map +1 -1
- package/dist/planning/gap-passes.js +23 -6
- package/dist/planning/gap-passes.js.map +1 -1
- package/dist/planning/gap-patterns.d.ts.map +1 -1
- package/dist/planning/gap-patterns.js +57 -11
- package/dist/planning/gap-patterns.js.map +1 -1
- package/dist/planning/github-projection.d.ts.map +1 -1
- package/dist/planning/github-projection.js +39 -20
- package/dist/planning/github-projection.js.map +1 -1
- package/dist/planning/impact-analyzer.d.ts.map +1 -1
- package/dist/planning/impact-analyzer.js +20 -18
- package/dist/planning/impact-analyzer.js.map +1 -1
- package/dist/planning/plan-lifecycle.d.ts.map +1 -1
- package/dist/planning/plan-lifecycle.js +22 -9
- package/dist/planning/plan-lifecycle.js.map +1 -1
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +60 -17
- package/dist/planning/planner.js.map +1 -1
- package/dist/planning/rationalization-detector.d.ts.map +1 -1
- package/dist/planning/rationalization-detector.js.map +1 -1
- package/dist/planning/reconciliation-engine.d.ts.map +1 -1
- package/dist/planning/reconciliation-engine.js.map +1 -1
- package/dist/planning/task-verifier.d.ts.map +1 -1
- package/dist/planning/task-verifier.js +14 -6
- package/dist/planning/task-verifier.js.map +1 -1
- package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
- package/dist/runtime/admin-setup-ops.js +2 -1
- package/dist/runtime/admin-setup-ops.js.map +1 -1
- package/dist/runtime/branching-ops.d.ts +12 -0
- package/dist/runtime/branching-ops.d.ts.map +1 -0
- package/dist/runtime/branching-ops.js +100 -0
- package/dist/runtime/branching-ops.js.map +1 -0
- package/dist/runtime/context-health.d.ts.map +1 -1
- package/dist/runtime/context-health.js.map +1 -1
- package/dist/runtime/facades/branching-facade.d.ts +7 -0
- package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
- package/dist/runtime/facades/branching-facade.js +8 -0
- package/dist/runtime/facades/branching-facade.js.map +1 -0
- package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
- package/dist/runtime/facades/chat-service-ops.js +3 -1
- package/dist/runtime/facades/chat-service-ops.js.map +1 -1
- package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
- package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +42 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/intake-facade.d.ts +9 -0
- package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
- package/dist/runtime/facades/intake-facade.js +11 -0
- package/dist/runtime/facades/intake-facade.js.map +1 -0
- package/dist/runtime/facades/links-facade.d.ts +9 -0
- package/dist/runtime/facades/links-facade.d.ts.map +1 -0
- package/dist/runtime/facades/links-facade.js +10 -0
- package/dist/runtime/facades/links-facade.js.map +1 -0
- package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
- package/dist/runtime/facades/operator-facade.js.map +1 -1
- package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
- package/dist/runtime/facades/plan-facade.js +4 -1
- package/dist/runtime/facades/plan-facade.js.map +1 -1
- package/dist/runtime/facades/tier-facade.d.ts +7 -0
- package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
- package/dist/runtime/facades/tier-facade.js +8 -0
- package/dist/runtime/facades/tier-facade.js.map +1 -0
- package/dist/runtime/facades/vault-facade.d.ts +9 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +44 -187
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/github-integration.d.ts.map +1 -1
- package/dist/runtime/github-integration.js +11 -4
- package/dist/runtime/github-integration.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +32 -10
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +3 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/session-briefing.d.ts.map +1 -1
- package/dist/runtime/session-briefing.js +5 -1
- package/dist/runtime/session-briefing.js.map +1 -1
- package/dist/runtime/tier-ops.d.ts +13 -0
- package/dist/runtime/tier-ops.d.ts.map +1 -0
- package/dist/runtime/tier-ops.js +110 -0
- package/dist/runtime/tier-ops.js.map +1 -0
- package/dist/skills/sync-skills.d.ts.map +1 -1
- package/dist/skills/sync-skills.js +1 -1
- package/dist/skills/sync-skills.js.map +1 -1
- package/dist/vault/linking.d.ts.map +1 -1
- package/dist/vault/linking.js +41 -5
- package/dist/vault/linking.js.map +1 -1
- package/dist/vault/vault-entries.d.ts.map +1 -1
- package/dist/vault/vault-entries.js +68 -26
- package/dist/vault/vault-entries.js.map +1 -1
- package/dist/vault/vault-maintenance.d.ts.map +1 -1
- package/dist/vault/vault-maintenance.js +6 -2
- package/dist/vault/vault-maintenance.js.map +1 -1
- package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
- package/dist/vault/vault-markdown-sync.js.map +1 -1
- package/dist/vault/vault-memories.d.ts.map +1 -1
- package/dist/vault/vault-memories.js +3 -1
- package/dist/vault/vault-memories.js.map +1 -1
- package/dist/vault/vault-schema.js +36 -10
- package/dist/vault/vault-schema.js.map +1 -1
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +5 -1
- package/dist/vault/vault.js.map +1 -1
- package/package.json +7 -7
- package/src/agency/agency-manager.test.ts +60 -40
- package/src/agency/default-rules.test.ts +17 -9
- package/src/capabilities/registry.test.ts +2 -12
- package/src/chat/agent-loop.test.ts +33 -43
- package/src/chat/mcp-bridge.test.ts +7 -2
- package/src/claudemd/inject.test.ts +2 -12
- package/src/context/context-engine.test.ts +96 -51
- package/src/control/intent-router.test.ts +3 -3
- package/src/curator/classifier.test.ts +14 -8
- package/src/curator/contradiction-detector.test.ts +30 -5
- package/src/curator/curator.ts +278 -56
- package/src/curator/duplicate-detector.test.ts +77 -15
- package/src/curator/quality-gate.test.ts +71 -31
- package/src/curator/tag-manager.test.ts +12 -4
- package/src/domain-packs/knowledge-installer.test.ts +2 -10
- package/src/domain-packs/token-resolver.test.ts +1 -3
- package/src/domain-packs/types.test.ts +16 -2
- package/src/enforcement/registry.test.ts +2 -8
- package/src/engine/bin/soleri-engine.ts +3 -1
- package/src/engine/module-manifest.test.ts +5 -4
- package/src/engine/module-manifest.ts +21 -1
- package/src/engine/register-engine.test.ts +6 -1
- package/src/engine/register-engine.ts +26 -3
- package/src/errors/classify.test.ts +6 -2
- package/src/errors/retry.test.ts +1 -4
- package/src/facades/facade-factory.test.ts +110 -64
- package/src/flows/epilogue.test.ts +16 -10
- package/src/flows/gate-evaluator.test.ts +12 -6
- package/src/flows/gate-evaluator.ts +1 -3
- package/src/governance/governance.test.ts +137 -21
- package/src/health/health-registry.test.ts +8 -1
- package/src/intake/content-classifier.test.ts +121 -51
- package/src/intake/dedup-gate.test.ts +38 -22
- package/src/intake/intake-pipeline.test.ts +5 -3
- package/src/intake/text-ingester.test.ts +26 -20
- package/src/llm/key-pool.test.ts +1 -3
- package/src/llm/llm-client.test.ts +1 -4
- package/src/llm/oauth-discovery.test.ts +16 -16
- package/src/llm/utils.test.ts +62 -18
- package/src/logging/logger.test.ts +4 -1
- package/src/loop/loop-manager.test.ts +2 -6
- package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
- package/src/operator/operator-profile-extended.test.ts +15 -5
- package/src/operator/operator-profile.test.ts +26 -8
- package/src/operator/operator-profile.ts +38 -22
- package/src/operator/operator-signals-extended.test.ts +35 -23
- package/src/operator/operator-signals.test.ts +6 -10
- package/src/operator/operator-signals.ts +2 -1
- package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
- package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
- package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
- package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
- package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
- package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
- package/src/persona/defaults.test.ts +1 -5
- package/src/planning/evidence-collector.test.ts +147 -38
- package/src/planning/evidence-collector.ts +1 -4
- package/src/planning/gap-analysis-alternatives.test.ts +41 -11
- package/src/planning/gap-passes.test.ts +215 -33
- package/src/planning/gap-passes.ts +115 -46
- package/src/planning/gap-patterns.test.ts +87 -13
- package/src/planning/gap-patterns.ts +114 -31
- package/src/planning/github-projection.test.ts +6 -1
- package/src/planning/github-projection.ts +41 -20
- package/src/planning/impact-analyzer.test.ts +10 -23
- package/src/planning/impact-analyzer.ts +33 -46
- package/src/planning/plan-lifecycle.test.ts +103 -36
- package/src/planning/plan-lifecycle.ts +49 -18
- package/src/planning/planner.test.ts +12 -2
- package/src/planning/planner.ts +198 -58
- package/src/planning/rationalization-detector.test.ts +5 -20
- package/src/planning/rationalization-detector.ts +14 -16
- package/src/planning/reconciliation-engine.test.ts +20 -3
- package/src/planning/reconciliation-engine.ts +1 -2
- package/src/planning/task-verifier.test.ts +59 -27
- package/src/planning/task-verifier.ts +15 -9
- package/src/playbooks/playbook-executor.test.ts +1 -3
- package/src/plugins/plugin-loader.test.ts +19 -14
- package/src/plugins/plugin-registry.test.ts +45 -33
- package/src/project/project-registry.test.ts +23 -12
- package/src/prompts/template-manager.test.ts +4 -1
- package/src/queue/job-queue.test.ts +10 -14
- package/src/runtime/admin-extra-ops.test.ts +5 -19
- package/src/runtime/admin-ops.test.ts +1 -3
- package/src/runtime/admin-setup-ops.test.ts +3 -4
- package/src/runtime/admin-setup-ops.ts +9 -2
- package/src/runtime/archive-ops.test.ts +4 -1
- package/src/runtime/branching-ops.test.ts +144 -0
- package/src/runtime/branching-ops.ts +107 -0
- package/src/runtime/capture-ops.test.ts +7 -21
- package/src/runtime/chain-ops.test.ts +16 -6
- package/src/runtime/claude-md-helpers.test.ts +1 -3
- package/src/runtime/context-health.test.ts +1 -3
- package/src/runtime/context-health.ts +1 -3
- package/src/runtime/curator-extra-ops.test.ts +3 -1
- package/src/runtime/domain-ops.test.ts +46 -36
- package/src/runtime/facades/admin-facade.test.ts +1 -4
- package/src/runtime/facades/archive-facade.test.ts +21 -7
- package/src/runtime/facades/brain-facade.test.ts +176 -72
- package/src/runtime/facades/branching-facade.test.ts +43 -0
- package/src/runtime/facades/branching-facade.ts +11 -0
- package/src/runtime/facades/chat-facade.test.ts +81 -28
- package/src/runtime/facades/chat-service-ops.test.ts +178 -73
- package/src/runtime/facades/chat-service-ops.ts +3 -1
- package/src/runtime/facades/chat-session-ops.test.ts +25 -10
- package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
- package/src/runtime/facades/chat-transport-ops.ts +0 -1
- package/src/runtime/facades/context-facade.test.ts +19 -4
- package/src/runtime/facades/control-facade.test.ts +3 -3
- package/src/runtime/facades/index.ts +42 -0
- package/src/runtime/facades/intake-facade.test.ts +215 -0
- package/src/runtime/facades/intake-facade.ts +14 -0
- package/src/runtime/facades/links-facade.test.ts +203 -0
- package/src/runtime/facades/links-facade.ts +13 -0
- package/src/runtime/facades/loop-facade.test.ts +22 -5
- package/src/runtime/facades/memory-facade.test.ts +19 -5
- package/src/runtime/facades/operator-facade.test.ts +17 -4
- package/src/runtime/facades/operator-facade.ts +11 -3
- package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
- package/src/runtime/facades/plan-facade.test.ts +29 -12
- package/src/runtime/facades/plan-facade.ts +7 -2
- package/src/runtime/facades/tier-facade.test.ts +47 -0
- package/src/runtime/facades/tier-facade.ts +11 -0
- package/src/runtime/facades/vault-facade.test.ts +174 -242
- package/src/runtime/facades/vault-facade.ts +55 -199
- package/src/runtime/github-integration.ts +11 -8
- package/src/runtime/grading-ops.test.ts +39 -8
- package/src/runtime/intake-ops.test.ts +69 -16
- package/src/runtime/loop-ops.test.ts +16 -6
- package/src/runtime/memory-cross-project-ops.test.ts +25 -14
- package/src/runtime/orchestrate-ops.ts +54 -27
- package/src/runtime/pack-ops.test.ts +23 -6
- package/src/runtime/planning-extra-ops.test.ts +17 -7
- package/src/runtime/planning-extra-ops.ts +3 -1
- package/src/runtime/playbook-ops.test.ts +26 -3
- package/src/runtime/plugin-ops.test.ts +83 -25
- package/src/runtime/project-ops.test.ts +26 -6
- package/src/runtime/runtime.ts +3 -1
- package/src/runtime/session-briefing.test.ts +183 -54
- package/src/runtime/session-briefing.ts +8 -2
- package/src/runtime/sync-ops.test.ts +3 -12
- package/src/runtime/telemetry-ops.test.ts +31 -6
- package/src/runtime/tier-ops.test.ts +159 -0
- package/src/runtime/tier-ops.ts +119 -0
- package/src/runtime/vault-extra-ops.test.ts +32 -8
- package/src/runtime/vault-sharing-ops.test.ts +1 -4
- package/src/skills/sync-skills.ts +2 -12
- package/src/transport/ws-server.test.ts +7 -4
- package/src/vault/__tests__/vault-characterization.test.ts +492 -81
- package/src/vault/linking.test.ts +50 -17
- package/src/vault/linking.ts +48 -7
- package/src/vault/obsidian-sync.test.ts +6 -3
- package/src/vault/scope-detector.test.ts +1 -3
- package/src/vault/vault-branching.test.ts +9 -7
- package/src/vault/vault-entries.ts +209 -65
- package/src/vault/vault-maintenance.ts +7 -12
- package/src/vault/vault-manager.test.ts +10 -10
- package/src/vault/vault-markdown-sync.ts +4 -1
- package/src/vault/vault-memories.ts +7 -7
- package/src/vault/vault-schema.ts +72 -15
- package/src/vault/vault.ts +55 -9
- package/src/brain/strength-scorer.ts +0 -404
- package/src/engine/index.ts +0 -21
- package/src/persona/index.ts +0 -9
- package/src/vault/vault-interfaces.ts +0 -56
|
@@ -31,12 +31,20 @@ describe('evaluateQuality', () => {
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
it('returns ACCEPT for high-quality entry', async () => {
|
|
34
|
-
const llm = mockLLM(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
const llm = mockLLM(
|
|
35
|
+
JSON.stringify({
|
|
36
|
+
verdict: 'ACCEPT',
|
|
37
|
+
overallScore: 85,
|
|
38
|
+
scores: {
|
|
39
|
+
novelty: 80,
|
|
40
|
+
actionability: 90,
|
|
41
|
+
specificity: 85,
|
|
42
|
+
relevance: 80,
|
|
43
|
+
informationDensity: 90,
|
|
44
|
+
},
|
|
45
|
+
reasoning: 'High quality entry with specific guidance.',
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
40
48
|
|
|
41
49
|
const result = await evaluateQuality(makeEntry(), llm);
|
|
42
50
|
expect(result.evaluated).toBe(true);
|
|
@@ -45,13 +53,21 @@ describe('evaluateQuality', () => {
|
|
|
45
53
|
});
|
|
46
54
|
|
|
47
55
|
it('returns REJECT for low-quality entry', async () => {
|
|
48
|
-
const llm = mockLLM(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
const llm = mockLLM(
|
|
57
|
+
JSON.stringify({
|
|
58
|
+
verdict: 'REJECT',
|
|
59
|
+
overallScore: 30,
|
|
60
|
+
scores: {
|
|
61
|
+
novelty: 10,
|
|
62
|
+
actionability: 30,
|
|
63
|
+
specificity: 40,
|
|
64
|
+
relevance: 50,
|
|
65
|
+
informationDensity: 20,
|
|
66
|
+
},
|
|
67
|
+
reasoning: 'Too generic.',
|
|
68
|
+
rejectReasons: ['Low novelty', 'Not actionable'],
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
55
71
|
|
|
56
72
|
const result = await evaluateQuality(makeEntry(), llm);
|
|
57
73
|
expect(result.evaluated).toBe(true);
|
|
@@ -87,24 +103,40 @@ describe('evaluateQuality', () => {
|
|
|
87
103
|
});
|
|
88
104
|
|
|
89
105
|
it('normalizes non-REJECT verdict to ACCEPT', async () => {
|
|
90
|
-
const llm = mockLLM(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
106
|
+
const llm = mockLLM(
|
|
107
|
+
JSON.stringify({
|
|
108
|
+
verdict: 'MAYBE',
|
|
109
|
+
overallScore: 60,
|
|
110
|
+
scores: {
|
|
111
|
+
novelty: 60,
|
|
112
|
+
actionability: 60,
|
|
113
|
+
specificity: 60,
|
|
114
|
+
relevance: 60,
|
|
115
|
+
informationDensity: 60,
|
|
116
|
+
},
|
|
117
|
+
reasoning: 'Borderline entry.',
|
|
118
|
+
}),
|
|
119
|
+
);
|
|
96
120
|
|
|
97
121
|
const result = await evaluateQuality(makeEntry(), llm);
|
|
98
122
|
expect(result.verdict).toBe('ACCEPT');
|
|
99
123
|
});
|
|
100
124
|
|
|
101
125
|
it('includes optional entry fields in prompt', async () => {
|
|
102
|
-
const llm = mockLLM(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
126
|
+
const llm = mockLLM(
|
|
127
|
+
JSON.stringify({
|
|
128
|
+
verdict: 'ACCEPT',
|
|
129
|
+
overallScore: 70,
|
|
130
|
+
scores: {
|
|
131
|
+
novelty: 70,
|
|
132
|
+
actionability: 70,
|
|
133
|
+
specificity: 70,
|
|
134
|
+
relevance: 70,
|
|
135
|
+
informationDensity: 70,
|
|
136
|
+
},
|
|
137
|
+
reasoning: 'OK.',
|
|
138
|
+
}),
|
|
139
|
+
);
|
|
108
140
|
|
|
109
141
|
const entry = makeEntry();
|
|
110
142
|
entry.why = 'Because security matters';
|
|
@@ -120,12 +152,20 @@ describe('evaluateQuality', () => {
|
|
|
120
152
|
});
|
|
121
153
|
|
|
122
154
|
it('uses low temperature for consistent scoring', async () => {
|
|
123
|
-
const llm = mockLLM(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
155
|
+
const llm = mockLLM(
|
|
156
|
+
JSON.stringify({
|
|
157
|
+
verdict: 'ACCEPT',
|
|
158
|
+
overallScore: 70,
|
|
159
|
+
scores: {
|
|
160
|
+
novelty: 70,
|
|
161
|
+
actionability: 70,
|
|
162
|
+
specificity: 70,
|
|
163
|
+
relevance: 70,
|
|
164
|
+
informationDensity: 70,
|
|
165
|
+
},
|
|
166
|
+
reasoning: 'OK.',
|
|
167
|
+
}),
|
|
168
|
+
);
|
|
129
169
|
|
|
130
170
|
await evaluateQuality(makeEntry(), llm);
|
|
131
171
|
|
|
@@ -16,8 +16,12 @@ function mockTagStore(): TagStore {
|
|
|
16
16
|
|
|
17
17
|
return {
|
|
18
18
|
getAlias: vi.fn((lower: string) => aliases.get(lower) ?? null),
|
|
19
|
-
insertCanonical: vi.fn((tag: string) => {
|
|
20
|
-
|
|
19
|
+
insertCanonical: vi.fn((tag: string) => {
|
|
20
|
+
canonicals.set(tag, null);
|
|
21
|
+
}),
|
|
22
|
+
upsertAlias: vi.fn((alias: string, canonical: string) => {
|
|
23
|
+
aliases.set(alias, canonical);
|
|
24
|
+
}),
|
|
21
25
|
getCanonicalRows: vi.fn(() =>
|
|
22
26
|
Array.from(canonicals.entries()).map(([tag, description]) => ({
|
|
23
27
|
tag,
|
|
@@ -59,7 +63,11 @@ describe('tag-manager', () => {
|
|
|
59
63
|
|
|
60
64
|
it('returns lowercased tag when no alias found', () => {
|
|
61
65
|
const result = normalizeTag('MyCustomTag', store);
|
|
62
|
-
expect(result).toEqual({
|
|
66
|
+
expect(result).toEqual({
|
|
67
|
+
original: 'MyCustomTag',
|
|
68
|
+
normalized: 'mycustomtag',
|
|
69
|
+
wasAliased: false,
|
|
70
|
+
});
|
|
63
71
|
});
|
|
64
72
|
|
|
65
73
|
it('trims whitespace', () => {
|
|
@@ -92,7 +100,7 @@ describe('tag-manager', () => {
|
|
|
92
100
|
describe('normalizeAndDedup', () => {
|
|
93
101
|
it('deduplicates after normalization', () => {
|
|
94
102
|
(store.getAlias as ReturnType<typeof vi.fn>)
|
|
95
|
-
.mockReturnValueOnce('styling')
|
|
103
|
+
.mockReturnValueOnce('styling') // css -> styling
|
|
96
104
|
.mockReturnValueOnce('styling'); // tailwind -> styling
|
|
97
105
|
const { results, dedupedTags, changed } = normalizeAndDedup(['css', 'tailwind'], store);
|
|
98
106
|
expect(results).toHaveLength(2);
|
|
@@ -128,11 +128,7 @@ describe('installKnowledge', () => {
|
|
|
128
128
|
const canonicalDir = join(tempDir, 'canonical');
|
|
129
129
|
writeMdFiles(canonicalDir, { 'tagged.md': 'Tagged entry.' });
|
|
130
130
|
const runtime = mockRuntime();
|
|
131
|
-
await installKnowledge(
|
|
132
|
-
mockPack({ knowledge: { canonical: 'canonical' } }),
|
|
133
|
-
runtime,
|
|
134
|
-
tempDir,
|
|
135
|
-
);
|
|
131
|
+
await installKnowledge(mockPack({ knowledge: { canonical: 'canonical' } }), runtime, tempDir);
|
|
136
132
|
const addCall = (runtime.vault.add as unknown).mock.calls[0][0];
|
|
137
133
|
expect(addCall.tags).toContain('pack:test-pack');
|
|
138
134
|
expect(addCall.tags).toContain('tier:canonical');
|
|
@@ -144,11 +140,7 @@ describe('installKnowledge', () => {
|
|
|
144
140
|
const curatedDir = join(tempDir, 'curated');
|
|
145
141
|
writeMdFiles(curatedDir, { 'my-pattern.md': 'Content.' });
|
|
146
142
|
const runtime = mockRuntime();
|
|
147
|
-
await installKnowledge(
|
|
148
|
-
mockPack({ knowledge: { curated: 'curated' } }),
|
|
149
|
-
runtime,
|
|
150
|
-
tempDir,
|
|
151
|
-
);
|
|
143
|
+
await installKnowledge(mockPack({ knowledge: { curated: 'curated' } }), runtime, tempDir);
|
|
152
144
|
const addCall = (runtime.vault.add as unknown).mock.calls[0][0];
|
|
153
145
|
expect(addCall.id).toBe('pack-test-pack-my-pattern');
|
|
154
146
|
});
|
|
@@ -75,9 +75,7 @@ describe('resolveToken', () => {
|
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
it('throws for unknown token', () => {
|
|
78
|
-
expect(() => resolveToken('unknown-token', emptyProject())).toThrow(
|
|
79
|
-
/Cannot resolve token/,
|
|
80
|
-
);
|
|
78
|
+
expect(() => resolveToken('unknown-token', emptyProject())).toThrow(/Cannot resolve token/);
|
|
81
79
|
});
|
|
82
80
|
|
|
83
81
|
it('throws for unknown color scale', () => {
|
|
@@ -53,7 +53,9 @@ describe('validateDomainPack', () => {
|
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
it('accepts pack with rules string', () => {
|
|
56
|
-
const result = validateDomainPack(
|
|
56
|
+
const result = validateDomainPack(
|
|
57
|
+
minimalPack({ rules: '## Token Rules\nUse semantic tokens.' }),
|
|
58
|
+
);
|
|
57
59
|
expect(result.success).toBe(true);
|
|
58
60
|
});
|
|
59
61
|
|
|
@@ -122,7 +124,19 @@ describe('SEMANTIC_FACADE_NAMES', () => {
|
|
|
122
124
|
});
|
|
123
125
|
|
|
124
126
|
it('contains all core engine facades', () => {
|
|
125
|
-
const expected = [
|
|
127
|
+
const expected = [
|
|
128
|
+
'vault',
|
|
129
|
+
'plan',
|
|
130
|
+
'brain',
|
|
131
|
+
'memory',
|
|
132
|
+
'admin',
|
|
133
|
+
'curator',
|
|
134
|
+
'loop',
|
|
135
|
+
'orchestrate',
|
|
136
|
+
'control',
|
|
137
|
+
'cognee',
|
|
138
|
+
'governance',
|
|
139
|
+
];
|
|
126
140
|
for (const name of expected) {
|
|
127
141
|
expect(SEMANTIC_FACADE_NAMES).toContain(name);
|
|
128
142
|
}
|
|
@@ -74,10 +74,7 @@ describe('EnforcementRegistry', () => {
|
|
|
74
74
|
|
|
75
75
|
describe('getEnabledRules', () => {
|
|
76
76
|
it('excludes disabled rules', () => {
|
|
77
|
-
registry.addRules([
|
|
78
|
-
makeRule({ id: 'active' }),
|
|
79
|
-
makeRule({ id: 'disabled', enabled: false }),
|
|
80
|
-
]);
|
|
77
|
+
registry.addRules([makeRule({ id: 'active' }), makeRule({ id: 'disabled', enabled: false })]);
|
|
81
78
|
const enabled = registry.getEnabledRules();
|
|
82
79
|
expect(enabled).toHaveLength(1);
|
|
83
80
|
expect(enabled[0].id).toBe('active');
|
|
@@ -91,10 +88,7 @@ describe('EnforcementRegistry', () => {
|
|
|
91
88
|
|
|
92
89
|
describe('getConfig', () => {
|
|
93
90
|
it('returns config with only enabled rules', () => {
|
|
94
|
-
registry.addRules([
|
|
95
|
-
makeRule({ id: 'on' }),
|
|
96
|
-
makeRule({ id: 'off', enabled: false }),
|
|
97
|
-
]);
|
|
91
|
+
registry.addRules([makeRule({ id: 'on' }), makeRule({ id: 'off', enabled: false })]);
|
|
98
92
|
const config = registry.getConfig();
|
|
99
93
|
expect(config.rules).toHaveLength(1);
|
|
100
94
|
expect(config.rules[0].id).toBe('on');
|
|
@@ -169,7 +169,9 @@ async function main(): Promise<void> {
|
|
|
169
169
|
const syncResult = syncSkillsToClaudeCode([skillsDir], config.name as string);
|
|
170
170
|
const total = syncResult.installed.length + syncResult.updated.length;
|
|
171
171
|
if (total > 0) {
|
|
172
|
-
console.error(
|
|
172
|
+
console.error(
|
|
173
|
+
`${tag} Skills synced: ${syncResult.installed.length} new, ${syncResult.updated.length} updated`,
|
|
174
|
+
);
|
|
173
175
|
}
|
|
174
176
|
}
|
|
175
177
|
|
|
@@ -29,10 +29,11 @@ describe('ENGINE_MODULE_MANIFEST', () => {
|
|
|
29
29
|
expect(suffixes).toContain('agency');
|
|
30
30
|
expect(suffixes).toContain('chat');
|
|
31
31
|
expect(suffixes).toContain('operator');
|
|
32
|
+
expect(suffixes).toContain('intake');
|
|
32
33
|
});
|
|
33
34
|
|
|
34
|
-
it('has exactly
|
|
35
|
-
expect(ENGINE_MODULE_MANIFEST).toHaveLength(
|
|
35
|
+
it('has exactly 20 modules', () => {
|
|
36
|
+
expect(ENGINE_MODULE_MANIFEST).toHaveLength(20);
|
|
36
37
|
});
|
|
37
38
|
|
|
38
39
|
it('has no duplicate suffixes', () => {
|
|
@@ -118,7 +119,7 @@ describe('manifest order stability', () => {
|
|
|
118
119
|
expect(ENGINE_MODULE_MANIFEST[0].suffix).toBe('vault');
|
|
119
120
|
});
|
|
120
121
|
|
|
121
|
-
it('
|
|
122
|
-
expect(ENGINE_MODULE_MANIFEST[ENGINE_MODULE_MANIFEST.length - 1].suffix).toBe('
|
|
122
|
+
it('tier is the last module', () => {
|
|
123
|
+
expect(ENGINE_MODULE_MANIFEST[ENGINE_MODULE_MANIFEST.length - 1].suffix).toBe('tier');
|
|
123
124
|
});
|
|
124
125
|
});
|
|
@@ -25,7 +25,7 @@ export interface ModuleManifestEntry {
|
|
|
25
25
|
export const ENGINE_MODULE_MANIFEST: ModuleManifestEntry[] = [
|
|
26
26
|
{
|
|
27
27
|
suffix: 'vault',
|
|
28
|
-
description: 'Knowledge management — search, CRUD,
|
|
28
|
+
description: 'Knowledge management — search, CRUD, capture, sharing scope.',
|
|
29
29
|
keyOps: ['search_intelligent', 'capture_knowledge', 'capture_quick'],
|
|
30
30
|
},
|
|
31
31
|
{
|
|
@@ -104,6 +104,26 @@ export const ENGINE_MODULE_MANIFEST: ModuleManifestEntry[] = [
|
|
|
104
104
|
description: 'Knowledge review workflow.',
|
|
105
105
|
keyOps: ['vault_submit_review', 'vault_approve', 'vault_reject'],
|
|
106
106
|
},
|
|
107
|
+
{
|
|
108
|
+
suffix: 'intake',
|
|
109
|
+
description: 'Content ingestion — books, URLs, text, batch import.',
|
|
110
|
+
keyOps: ['intake_ingest_book', 'ingest_url', 'ingest_text', 'ingest_batch'],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
suffix: 'links',
|
|
114
|
+
description: 'Entry linking — create, traverse, suggest, orphan detection.',
|
|
115
|
+
keyOps: ['link_entries', 'traverse', 'suggest_links', 'get_orphans'],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
suffix: 'branching',
|
|
119
|
+
description: 'Vault branching — create, list, merge, delete branches.',
|
|
120
|
+
keyOps: ['vault_branch', 'vault_branch_list', 'vault_merge_branch'],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
suffix: 'tier',
|
|
124
|
+
description: 'Multi-vault tiers — connect, disconnect, search across sources.',
|
|
125
|
+
keyOps: ['vault_connect_source', 'vault_search_all', 'vault_list_sources'],
|
|
126
|
+
},
|
|
107
127
|
];
|
|
108
128
|
|
|
109
129
|
/** Core facade ops (always present, not in ENGINE_MODULES) */
|
|
@@ -97,7 +97,12 @@ describe('registerEngine — core ops', () => {
|
|
|
97
97
|
it('registers core facade when coreOps provided', () => {
|
|
98
98
|
const server = makeServer();
|
|
99
99
|
const coreOps: OpDefinition[] = [
|
|
100
|
-
{
|
|
100
|
+
{
|
|
101
|
+
name: 'health',
|
|
102
|
+
description: 'Health check',
|
|
103
|
+
auth: 'read',
|
|
104
|
+
handler: async () => ({ ok: true }),
|
|
105
|
+
},
|
|
101
106
|
];
|
|
102
107
|
const result = registerEngine(server, runtime, { agentId: 'core', coreOps });
|
|
103
108
|
expect(result.tools).toContain('core_core');
|
|
@@ -39,6 +39,10 @@ import { createOperatorFacadeOps } from '../runtime/facades/operator-facade.js';
|
|
|
39
39
|
import { createArchiveFacadeOps } from '../runtime/facades/archive-facade.js';
|
|
40
40
|
import { createSyncFacadeOps } from '../runtime/facades/sync-facade.js';
|
|
41
41
|
import { createReviewFacadeOps } from '../runtime/facades/review-facade.js';
|
|
42
|
+
import { createIntakeFacadeOps } from '../runtime/facades/intake-facade.js';
|
|
43
|
+
import { createLinksFacadeOps } from '../runtime/facades/links-facade.js';
|
|
44
|
+
import { createBranchingFacadeOps } from '../runtime/facades/branching-facade.js';
|
|
45
|
+
import { createTierFacadeOps } from '../runtime/facades/tier-facade.js';
|
|
42
46
|
import { createDomainFacade } from '../runtime/domain-ops.js';
|
|
43
47
|
|
|
44
48
|
// ─── Types ────────────────────────────────────────────────────────────
|
|
@@ -88,7 +92,7 @@ interface ModuleDef {
|
|
|
88
92
|
export const ENGINE_MODULES: ModuleDef[] = [
|
|
89
93
|
{
|
|
90
94
|
suffix: 'vault',
|
|
91
|
-
description: 'Knowledge management — search, CRUD,
|
|
95
|
+
description: 'Knowledge management — search, CRUD, capture, sharing scope.',
|
|
92
96
|
createOps: createVaultFacadeOps,
|
|
93
97
|
},
|
|
94
98
|
{
|
|
@@ -123,8 +127,7 @@ export const ENGINE_MODULES: ModuleDef[] = [
|
|
|
123
127
|
},
|
|
124
128
|
{
|
|
125
129
|
suffix: 'orchestrate',
|
|
126
|
-
description:
|
|
127
|
-
'Execution orchestration — session start, playbooks, plan/execute/complete.',
|
|
130
|
+
description: 'Execution orchestration — session start, playbooks, plan/execute/complete.',
|
|
128
131
|
createOps: createOrchestrateFacadeOps,
|
|
129
132
|
},
|
|
130
133
|
{
|
|
@@ -167,6 +170,26 @@ export const ENGINE_MODULES: ModuleDef[] = [
|
|
|
167
170
|
description: 'Knowledge review workflow.',
|
|
168
171
|
createOps: createReviewFacadeOps,
|
|
169
172
|
},
|
|
173
|
+
{
|
|
174
|
+
suffix: 'intake',
|
|
175
|
+
description: 'Content ingestion — books, URLs, text, batch import.',
|
|
176
|
+
createOps: createIntakeFacadeOps,
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
suffix: 'links',
|
|
180
|
+
description: 'Entry linking — create, traverse, suggest, orphan detection.',
|
|
181
|
+
createOps: createLinksFacadeOps,
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
suffix: 'branching',
|
|
185
|
+
description: 'Vault branching — create, list, merge, delete branches.',
|
|
186
|
+
createOps: createBranchingFacadeOps,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
suffix: 'tier',
|
|
190
|
+
description: 'Multi-vault tiers — connect, disconnect, search across sources.',
|
|
191
|
+
createOps: createTierFacadeOps,
|
|
192
|
+
},
|
|
170
193
|
];
|
|
171
194
|
|
|
172
195
|
// ─── Core Registration ────────────────────────────────────────────────
|
|
@@ -95,7 +95,9 @@ describe('classifyError', () => {
|
|
|
95
95
|
|
|
96
96
|
describe('message pattern classification', () => {
|
|
97
97
|
it('should classify "overloaded" as LLM_OVERLOAD', () => {
|
|
98
|
-
expect(classifyError(new Error('server is overloaded')).code).toBe(
|
|
98
|
+
expect(classifyError(new Error('server is overloaded')).code).toBe(
|
|
99
|
+
SoleriErrorCode.LLM_OVERLOAD,
|
|
100
|
+
);
|
|
99
101
|
});
|
|
100
102
|
|
|
101
103
|
it('should classify "model busy" as LLM_OVERLOAD', () => {
|
|
@@ -123,7 +125,9 @@ describe('classifyError', () => {
|
|
|
123
125
|
});
|
|
124
126
|
|
|
125
127
|
it('should classify "not found" as RESOURCE_NOT_FOUND', () => {
|
|
126
|
-
expect(classifyError(new Error('resource not found')).code).toBe(
|
|
128
|
+
expect(classifyError(new Error('resource not found')).code).toBe(
|
|
129
|
+
SoleriErrorCode.RESOURCE_NOT_FOUND,
|
|
130
|
+
);
|
|
127
131
|
});
|
|
128
132
|
|
|
129
133
|
it('should classify "rate limit" as RATE_LIMIT', () => {
|
package/src/errors/retry.test.ts
CHANGED
|
@@ -118,10 +118,7 @@ describe('retryWithPreset', () => {
|
|
|
118
118
|
|
|
119
119
|
it('should call onRetry callback on each retry', async () => {
|
|
120
120
|
const onRetry = vi.fn();
|
|
121
|
-
const fn = vi
|
|
122
|
-
.fn()
|
|
123
|
-
.mockRejectedValueOnce(new Error('network fail'))
|
|
124
|
-
.mockResolvedValue('ok');
|
|
121
|
+
const fn = vi.fn().mockRejectedValueOnce(new Error('network fail')).mockResolvedValue('ok');
|
|
125
122
|
|
|
126
123
|
const resultPromise = retryWithPreset(fn, 'fast', { onRetry });
|
|
127
124
|
await vi.advanceTimersByTimeAsync(20_000);
|