B23 (e2e hardcoded -> real): e2e.ts now runs actual test suites via
execSync(bun test) per phase gate, with file-existence fallback checks.
Reports pass/fail counts and exits non-zero on failure.
B25 (missing MVP tools): BuiltInToolRegistrar now registers all 28
tool-registry-v1 MVP tools including process.kill, git.worktree.create,
git.merge_workspace, project.scan, project.profile.write, cpp.detect,
cpp.cmake.configure, cpp.clangd.query, debug.parse_logs, gui.screenshot,
network.capture, permission.request, doctor.run.
Refactored create_stub_definitions() to use a helper def() factory
for all 20 stub tools. Stub executors return {type:'text', alpha_stub:true}.
B26 (ContextAssembler L6-L9): L6-L9 layers now contain structured
placeholder content with session/task references, token_estimate>0.
Layers support additional_layers override for real data injection.
Pre-existing fix: git/index.ts 'delete' reserved keyword -> deleteBranch.
Tests: tool-stubs.test.ts rewritten to validate actual ToolRegistry
state (28 MVP tools via list()) instead of source text inspection.
context-assembler-layers.test.ts updated for non-zero token_estimates.
169/169 pass (0 fail).
Remaining for future: B13 (MainAgent LLM classify, Alpha scope accepted),
B14 (IPC envelope 5 fields, requires IPC cross-cutting refactor).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
66 lines
2.1 KiB
TypeScript
Executable File
66 lines
2.1 KiB
TypeScript
Executable File
/**
|
|
* Regression test: ContextAssembler L6-L9 stub layers
|
|
*
|
|
* Verifies that L6-L9 layers are implemented as actual stub layer pushes,
|
|
* not just TODO comments.
|
|
*/
|
|
|
|
import { describe, test, expect } from 'bun:test'
|
|
import { readFileSync } from 'fs'
|
|
import { join } from 'path'
|
|
|
|
const SOURCE_PATH = join(
|
|
import.meta.dir,
|
|
'..',
|
|
'..',
|
|
'src',
|
|
'context',
|
|
'ContextAssembler.ts'
|
|
)
|
|
|
|
const source = readFileSync(SOURCE_PATH, 'utf-8')
|
|
|
|
describe('ContextAssembler L6-L9 stub layers', () => {
|
|
test('source has L6 evidence layer (not just TODO comment)', () => {
|
|
// TODO(P3): L6 should be gone
|
|
expect(source).not.toContain("TODO(P3): L6")
|
|
// 'evidence' level should exist as a pushed layer
|
|
expect(source).toContain("level: 'evidence'")
|
|
})
|
|
|
|
test('source has L7 conversation layer', () => {
|
|
expect(source).not.toContain("TODO(P3): L7")
|
|
expect(source).toContain("level: 'conversation'")
|
|
})
|
|
|
|
test('source has L8 tool_output layer', () => {
|
|
expect(source).not.toContain("TODO(P3): L8")
|
|
expect(source).toContain("level: 'tool_output'")
|
|
})
|
|
|
|
test('source has L9 user_override layer', () => {
|
|
expect(source).not.toContain("TODO(P3): L9")
|
|
expect(source).toContain("level: 'user_override'")
|
|
})
|
|
|
|
test('stub layers have priority values 6-9', () => {
|
|
expect(source).toContain('priority: 6')
|
|
expect(source).toContain('priority: 7')
|
|
expect(source).toContain('priority: 8')
|
|
expect(source).toContain('priority: 9')
|
|
})
|
|
|
|
test('L6-L9 layers have positive token_estimate (B26: populated stubs)', () => {
|
|
// B26: L6-L9 now have structured placeholder content with token_estimate > 0
|
|
// Verify by finding each layer's token_estimate line and checking it's not 0
|
|
const layerLevels = ["evidence", "conversation", "tool_output", "user_override"]
|
|
for (const level of layerLevels) {
|
|
// Find the token_estimate value for this layer by finding it after the level marker
|
|
const section = source.split(`level: '${level}'`)[1] || ''
|
|
const tokenMatch = section.match(/token_estimate:\s*(\d+)/)
|
|
expect(tokenMatch).not.toBeNull()
|
|
expect(parseInt(tokenMatch![1], 10)).toBeGreaterThan(0)
|
|
}
|
|
})
|
|
})
|