@soleri/core 9.2.0 → 9.3.1
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 +2 -0
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +136 -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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.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-complexity-assessor.d.ts +42 -0
- package/dist/planning/task-complexity-assessor.d.ts.map +1 -0
- package/dist/planning/task-complexity-assessor.js +132 -0
- package/dist/planning/task-complexity-assessor.js.map +1 -0
- 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-ops.d.ts.map +1 -1
- package/dist/runtime/admin-ops.js +18 -0
- package/dist/runtime/admin-ops.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 +75 -42
- 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 +48 -4
- package/src/engine/module-manifest.ts +138 -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/index.ts +8 -0
- 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-complexity-assessor.test.ts +298 -0
- package/src/planning/task-complexity-assessor.ts +183 -0
- 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 +22 -1
- package/src/runtime/admin-ops.ts +19 -0
- 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.test.ts +204 -0
- package/src/runtime/orchestrate-ops.ts +103 -65
- 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-scaling.test.ts +5 -5
- 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
|
@@ -24,9 +24,27 @@ function makePlan(overrides: Partial<Plan> = {}): Plan {
|
|
|
24
24
|
status: 'executing',
|
|
25
25
|
decisions: [],
|
|
26
26
|
tasks: [
|
|
27
|
-
{
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
{
|
|
28
|
+
id: 'task-1',
|
|
29
|
+
title: 'Add auth middleware',
|
|
30
|
+
description: 'Create auth middleware for Express',
|
|
31
|
+
status: 'completed',
|
|
32
|
+
updatedAt: Date.now(),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'task-2',
|
|
36
|
+
title: 'Add login endpoint',
|
|
37
|
+
description: 'POST /auth/login endpoint',
|
|
38
|
+
status: 'completed',
|
|
39
|
+
updatedAt: Date.now(),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'task-3',
|
|
43
|
+
title: 'Add JWT utils',
|
|
44
|
+
description: 'JWT signing and verification utilities',
|
|
45
|
+
status: 'pending',
|
|
46
|
+
updatedAt: Date.now(),
|
|
47
|
+
},
|
|
30
48
|
],
|
|
31
49
|
checks: [],
|
|
32
50
|
createdAt: Date.now(),
|
|
@@ -97,7 +115,13 @@ describe('collectGitEvidence', () => {
|
|
|
97
115
|
|
|
98
116
|
const plan = makePlan({
|
|
99
117
|
tasks: [
|
|
100
|
-
{
|
|
118
|
+
{
|
|
119
|
+
id: 'task-1',
|
|
120
|
+
title: 'Add auth middleware',
|
|
121
|
+
description: 'Auth middleware',
|
|
122
|
+
status: 'skipped',
|
|
123
|
+
updatedAt: Date.now(),
|
|
124
|
+
},
|
|
101
125
|
],
|
|
102
126
|
});
|
|
103
127
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
@@ -112,13 +136,21 @@ describe('collectGitEvidence', () => {
|
|
|
112
136
|
|
|
113
137
|
const plan = makePlan({
|
|
114
138
|
tasks: [
|
|
115
|
-
{
|
|
139
|
+
{
|
|
140
|
+
id: 'task-1',
|
|
141
|
+
title: 'Add auth middleware',
|
|
142
|
+
description: 'Auth middleware',
|
|
143
|
+
status: 'completed',
|
|
144
|
+
updatedAt: Date.now(),
|
|
145
|
+
},
|
|
116
146
|
],
|
|
117
147
|
});
|
|
118
148
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
119
149
|
|
|
120
150
|
expect(report.unplannedChanges.length).toBeGreaterThanOrEqual(1);
|
|
121
|
-
const configChange = report.unplannedChanges.find(
|
|
151
|
+
const configChange = report.unplannedChanges.find(
|
|
152
|
+
(uc) => uc.file.path === 'src/config/database.ts',
|
|
153
|
+
);
|
|
122
154
|
expect(configChange).toBeDefined();
|
|
123
155
|
expect(configChange?.possibleReason).toBe('configuration change');
|
|
124
156
|
});
|
|
@@ -130,8 +162,20 @@ describe('collectGitEvidence', () => {
|
|
|
130
162
|
|
|
131
163
|
const plan = makePlan({
|
|
132
164
|
tasks: [
|
|
133
|
-
{
|
|
134
|
-
|
|
165
|
+
{
|
|
166
|
+
id: 'task-1',
|
|
167
|
+
title: 'Add auth middleware',
|
|
168
|
+
description: 'Auth middleware',
|
|
169
|
+
status: 'completed',
|
|
170
|
+
updatedAt: Date.now(),
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
id: 'task-2',
|
|
174
|
+
title: 'Add login endpoint',
|
|
175
|
+
description: 'Login endpoint',
|
|
176
|
+
status: 'completed',
|
|
177
|
+
updatedAt: Date.now(),
|
|
178
|
+
},
|
|
135
179
|
],
|
|
136
180
|
});
|
|
137
181
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
@@ -141,9 +185,7 @@ describe('collectGitEvidence', () => {
|
|
|
141
185
|
});
|
|
142
186
|
|
|
143
187
|
it('returns 100% accuracy for empty task list', () => {
|
|
144
|
-
mockExecFileSync
|
|
145
|
-
.mockReturnValueOnce('main\n')
|
|
146
|
-
.mockReturnValueOnce('');
|
|
188
|
+
mockExecFileSync.mockReturnValueOnce('main\n').mockReturnValueOnce('');
|
|
147
189
|
|
|
148
190
|
const plan = makePlan({ tasks: [] });
|
|
149
191
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
@@ -167,12 +209,20 @@ describe('collectGitEvidence', () => {
|
|
|
167
209
|
it('falls back to HEAD~5 when branch diff fails', () => {
|
|
168
210
|
mockExecFileSync
|
|
169
211
|
.mockReturnValueOnce('feature/auth\n') // rev-parse
|
|
170
|
-
.mockImplementationOnce(() => {
|
|
212
|
+
.mockImplementationOnce(() => {
|
|
213
|
+
throw new Error('bad revision');
|
|
214
|
+
}) // main...HEAD fails
|
|
171
215
|
.mockReturnValueOnce('M\tsrc/auth/middleware.ts\n'); // HEAD~5 fallback
|
|
172
216
|
|
|
173
217
|
const plan = makePlan({
|
|
174
218
|
tasks: [
|
|
175
|
-
{
|
|
219
|
+
{
|
|
220
|
+
id: 'task-1',
|
|
221
|
+
title: 'Add auth middleware',
|
|
222
|
+
description: 'Auth middleware',
|
|
223
|
+
status: 'completed',
|
|
224
|
+
updatedAt: Date.now(),
|
|
225
|
+
},
|
|
176
226
|
],
|
|
177
227
|
});
|
|
178
228
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
@@ -188,7 +238,13 @@ describe('collectGitEvidence', () => {
|
|
|
188
238
|
|
|
189
239
|
const plan = makePlan({
|
|
190
240
|
tasks: [
|
|
191
|
-
{
|
|
241
|
+
{
|
|
242
|
+
id: 'task-1',
|
|
243
|
+
title: 'Add login endpoint',
|
|
244
|
+
description: 'Login endpoint',
|
|
245
|
+
status: 'completed',
|
|
246
|
+
updatedAt: Date.now(),
|
|
247
|
+
},
|
|
192
248
|
],
|
|
193
249
|
});
|
|
194
250
|
collectGitEvidence(plan, '/project', 'main');
|
|
@@ -206,7 +262,13 @@ describe('collectGitEvidence', () => {
|
|
|
206
262
|
|
|
207
263
|
const plan = makePlan({
|
|
208
264
|
tasks: [
|
|
209
|
-
{
|
|
265
|
+
{
|
|
266
|
+
id: 'task-1',
|
|
267
|
+
title: 'Add auth middleware',
|
|
268
|
+
description: 'Auth middleware',
|
|
269
|
+
status: 'completed',
|
|
270
|
+
updatedAt: Date.now(),
|
|
271
|
+
},
|
|
210
272
|
],
|
|
211
273
|
});
|
|
212
274
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
@@ -224,7 +286,13 @@ describe('collectGitEvidence', () => {
|
|
|
224
286
|
|
|
225
287
|
const plan = makePlan({
|
|
226
288
|
tasks: [
|
|
227
|
-
{
|
|
289
|
+
{
|
|
290
|
+
id: 'task-1',
|
|
291
|
+
title: 'Remove old auth middleware',
|
|
292
|
+
description: 'Delete old auth middleware files',
|
|
293
|
+
status: 'completed',
|
|
294
|
+
updatedAt: Date.now(),
|
|
295
|
+
},
|
|
228
296
|
],
|
|
229
297
|
});
|
|
230
298
|
const report = collectGitEvidence(plan, '/project', 'main');
|
|
@@ -252,11 +320,11 @@ describe('collectGitEvidence', () => {
|
|
|
252
320
|
.mockReturnValueOnce('feature/auth\n')
|
|
253
321
|
.mockReturnValueOnce(
|
|
254
322
|
'M\tpackage.json\n' +
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
323
|
+
'M\tsrc/types/auth.d.ts\n' +
|
|
324
|
+
'A\tsrc/tests/auth.test.ts\n' +
|
|
325
|
+
'M\tREADME.md\n' +
|
|
326
|
+
'M\tsrc/index.ts\n' +
|
|
327
|
+
'M\tsrc/random/file.ts\n',
|
|
260
328
|
);
|
|
261
329
|
|
|
262
330
|
const plan = makePlan({ tasks: [] });
|
|
@@ -276,7 +344,13 @@ describe('collectVerificationGaps', () => {
|
|
|
276
344
|
it('returns empty array when no tasks have verification', () => {
|
|
277
345
|
const tasks: PlanTask[] = [makeTask()];
|
|
278
346
|
const evidence: GitTaskEvidence[] = [
|
|
279
|
-
{
|
|
347
|
+
{
|
|
348
|
+
taskId: 'task-1',
|
|
349
|
+
taskTitle: 'Fix auth bug',
|
|
350
|
+
plannedStatus: 'completed',
|
|
351
|
+
matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
|
|
352
|
+
verdict: 'DONE',
|
|
353
|
+
},
|
|
280
354
|
];
|
|
281
355
|
|
|
282
356
|
const gaps = collectVerificationGaps(tasks, evidence);
|
|
@@ -287,14 +361,18 @@ describe('collectVerificationGaps', () => {
|
|
|
287
361
|
const tasks: PlanTask[] = [
|
|
288
362
|
makeTask({
|
|
289
363
|
verification: {
|
|
290
|
-
findings: [
|
|
291
|
-
{ description: 'Auth timeout under load', severity: 'high', proven: false },
|
|
292
|
-
],
|
|
364
|
+
findings: [{ description: 'Auth timeout under load', severity: 'high', proven: false }],
|
|
293
365
|
},
|
|
294
366
|
}),
|
|
295
367
|
];
|
|
296
368
|
const evidence: GitTaskEvidence[] = [
|
|
297
|
-
{
|
|
369
|
+
{
|
|
370
|
+
taskId: 'task-1',
|
|
371
|
+
taskTitle: 'Fix auth bug',
|
|
372
|
+
plannedStatus: 'completed',
|
|
373
|
+
matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
|
|
374
|
+
verdict: 'DONE',
|
|
375
|
+
},
|
|
298
376
|
];
|
|
299
377
|
|
|
300
378
|
const gaps = collectVerificationGaps(tasks, evidence);
|
|
@@ -308,13 +386,24 @@ describe('collectVerificationGaps', () => {
|
|
|
308
386
|
makeTask({
|
|
309
387
|
verification: {
|
|
310
388
|
findings: [
|
|
311
|
-
{
|
|
389
|
+
{
|
|
390
|
+
description: 'Auth timeout under load',
|
|
391
|
+
severity: 'high',
|
|
392
|
+
proven: true,
|
|
393
|
+
proof: 'Reproduced with load test',
|
|
394
|
+
},
|
|
312
395
|
],
|
|
313
396
|
},
|
|
314
397
|
}),
|
|
315
398
|
];
|
|
316
399
|
const evidence: GitTaskEvidence[] = [
|
|
317
|
-
{
|
|
400
|
+
{
|
|
401
|
+
taskId: 'task-1',
|
|
402
|
+
taskTitle: 'Fix auth bug',
|
|
403
|
+
plannedStatus: 'completed',
|
|
404
|
+
matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
|
|
405
|
+
verdict: 'DONE',
|
|
406
|
+
},
|
|
318
407
|
];
|
|
319
408
|
|
|
320
409
|
const gaps = collectVerificationGaps(tasks, evidence);
|
|
@@ -325,14 +414,18 @@ describe('collectVerificationGaps', () => {
|
|
|
325
414
|
const tasks: PlanTask[] = [
|
|
326
415
|
makeTask({
|
|
327
416
|
verification: {
|
|
328
|
-
findings: [
|
|
329
|
-
{ description: 'Some finding', severity: 'medium', proven: false },
|
|
330
|
-
],
|
|
417
|
+
findings: [{ description: 'Some finding', severity: 'medium', proven: false }],
|
|
331
418
|
},
|
|
332
419
|
}),
|
|
333
420
|
];
|
|
334
421
|
const evidence: GitTaskEvidence[] = [
|
|
335
|
-
{
|
|
422
|
+
{
|
|
423
|
+
taskId: 'task-1',
|
|
424
|
+
taskTitle: 'Fix auth bug',
|
|
425
|
+
plannedStatus: 'completed',
|
|
426
|
+
matchedFiles: [{ path: 'src/new-auth.ts', status: 'added' }],
|
|
427
|
+
verdict: 'DONE',
|
|
428
|
+
},
|
|
336
429
|
];
|
|
337
430
|
|
|
338
431
|
const gaps = collectVerificationGaps(tasks, evidence);
|
|
@@ -343,9 +436,7 @@ describe('collectVerificationGaps', () => {
|
|
|
343
436
|
const tasks: PlanTask[] = [
|
|
344
437
|
makeTask({
|
|
345
438
|
verification: {
|
|
346
|
-
findings: [
|
|
347
|
-
{ description: 'Some finding', severity: 'medium', proven: false },
|
|
348
|
-
],
|
|
439
|
+
findings: [{ description: 'Some finding', severity: 'medium', proven: false }],
|
|
349
440
|
},
|
|
350
441
|
}),
|
|
351
442
|
];
|
|
@@ -368,7 +459,13 @@ describe('collectVerificationGaps', () => {
|
|
|
368
459
|
}),
|
|
369
460
|
];
|
|
370
461
|
const evidence: GitTaskEvidence[] = [
|
|
371
|
-
{
|
|
462
|
+
{
|
|
463
|
+
taskId: 'task-1',
|
|
464
|
+
taskTitle: 'Fix auth bug',
|
|
465
|
+
plannedStatus: 'completed',
|
|
466
|
+
matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
|
|
467
|
+
verdict: 'DONE',
|
|
468
|
+
},
|
|
372
469
|
];
|
|
373
470
|
|
|
374
471
|
const gaps = collectVerificationGaps(tasks, evidence);
|
|
@@ -394,8 +491,20 @@ describe('collectVerificationGaps', () => {
|
|
|
394
491
|
}),
|
|
395
492
|
];
|
|
396
493
|
const evidence: GitTaskEvidence[] = [
|
|
397
|
-
{
|
|
398
|
-
|
|
494
|
+
{
|
|
495
|
+
taskId: 'task-1',
|
|
496
|
+
taskTitle: 'Fix auth bug',
|
|
497
|
+
plannedStatus: 'completed',
|
|
498
|
+
matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
|
|
499
|
+
verdict: 'DONE',
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
taskId: 'task-2',
|
|
503
|
+
taskTitle: 'Fix other bug',
|
|
504
|
+
plannedStatus: 'completed',
|
|
505
|
+
matchedFiles: [{ path: 'src/other.ts', status: 'modified' }],
|
|
506
|
+
verdict: 'DONE',
|
|
507
|
+
},
|
|
399
508
|
];
|
|
400
509
|
|
|
401
510
|
const gaps = collectVerificationGaps(tasks, evidence);
|
|
@@ -146,10 +146,7 @@ export function collectVerificationGaps(
|
|
|
146
146
|
/**
|
|
147
147
|
* Check if a task modifies existing code (vs. creating new files).
|
|
148
148
|
*/
|
|
149
|
-
function taskModifiesExistingCode(
|
|
150
|
-
task: PlanTask,
|
|
151
|
-
evidence: GitTaskEvidence[],
|
|
152
|
-
): boolean {
|
|
149
|
+
function taskModifiesExistingCode(task: PlanTask, evidence: GitTaskEvidence[]): boolean {
|
|
153
150
|
const taskEvidence = evidence.find((e) => e.taskId === task.id);
|
|
154
151
|
if (!taskEvidence) return false;
|
|
155
152
|
return taskEvidence.matchedFiles.some((f) => f.status === 'modified');
|
|
@@ -15,13 +15,40 @@ function makePlan(overrides: Partial<Plan> = {}): Plan {
|
|
|
15
15
|
scope: 'Auth module, middleware, and user service. Does not include OAuth providers.',
|
|
16
16
|
status: 'draft',
|
|
17
17
|
decisions: [
|
|
18
|
-
{
|
|
18
|
+
{
|
|
19
|
+
decision: 'Use JWT for stateless auth',
|
|
20
|
+
rationale: 'Because it scales horizontally without shared session store',
|
|
21
|
+
},
|
|
19
22
|
],
|
|
20
23
|
tasks: [
|
|
21
|
-
{
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
{
|
|
25
|
+
id: 'task-1',
|
|
26
|
+
title: 'Add JWT signing',
|
|
27
|
+
description: 'Implement JWT sign/verify using built-in crypto module',
|
|
28
|
+
status: 'pending',
|
|
29
|
+
updatedAt: Date.now(),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'task-2',
|
|
33
|
+
title: 'Add auth middleware',
|
|
34
|
+
description: 'Create Express middleware that validates JWT from Authorization header',
|
|
35
|
+
status: 'pending',
|
|
36
|
+
updatedAt: Date.now(),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'task-3',
|
|
40
|
+
title: 'Add login endpoint',
|
|
41
|
+
description: 'POST /auth/login returns JWT after verifying credentials',
|
|
42
|
+
status: 'pending',
|
|
43
|
+
updatedAt: Date.now(),
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'task-4',
|
|
47
|
+
title: 'Add test coverage',
|
|
48
|
+
description: 'Test JWT signing, middleware rejection, and login flow end-to-end',
|
|
49
|
+
status: 'pending',
|
|
50
|
+
updatedAt: Date.now(),
|
|
51
|
+
},
|
|
25
52
|
],
|
|
26
53
|
checks: [],
|
|
27
54
|
createdAt: Date.now(),
|
|
@@ -148,12 +175,15 @@ describe('Pass 8: Alternative Analysis', () => {
|
|
|
148
175
|
|
|
149
176
|
it('does not modify gaps from passes 1-7', () => {
|
|
150
177
|
const plan = makePlan({
|
|
151
|
-
alternatives: [
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
178
|
+
alternatives: [
|
|
179
|
+
makeAlternative(),
|
|
180
|
+
makeAlternative({
|
|
181
|
+
approach: 'Alternative B',
|
|
182
|
+
pros: ['Pro'],
|
|
183
|
+
cons: ['Con'],
|
|
184
|
+
rejected_reason: 'Not suitable',
|
|
185
|
+
}),
|
|
186
|
+
],
|
|
157
187
|
});
|
|
158
188
|
const gapsWithAlts = runGapAnalysis(plan);
|
|
159
189
|
|