Ship the batch: undo, parallel subagents, lazy MCP, hot-reloaded skills; docs and CI/CD
Loop and ergonomics batch across Now/Next and Maintenance:
- /undo and /redo via pre-prompt file snapshots (snapshot.ts)
- task takes a tasks[] array and runs investigations concurrently (subagent.ts)
- lazy MCP tools: mcp_list/mcp_inspect/mcp_call meta-tools, eager opt-in (mcp.ts, config.ts)
- skill tool reads its list live so a mid-session install is callable next turn (skills.ts)
- tool-name lists (tool-kinds.ts) derived from a mutating() marker; gates previously ungated writes
- prune/session recovery path summarized, and step-back doom-loop primitive (step-back.ts)
- @file completion re-walks on a slow cooldown; estimateTokens and pricing labeled as estimates
Docs: README, CHANGELOG, docs/{mcp,architecture,development} updated to match.
CI/CD: bun install-store cache and concurrency gates on both workflows; release.yml now
composes file-based release notes via scripts/make-release-notes.ts and verifies every binary.
This commit is contained in:
@@ -131,11 +131,15 @@ test('the skill catalogue and skill tool are offered when skills are loaded', as
|
||||
expect(system).toContain('Skills available');
|
||||
});
|
||||
|
||||
test('no skill tool is offered when there are no skills', async () => {
|
||||
test('the skill tool is present even with no skills, serving an empty list', async () => {
|
||||
// The tool must exist at zero skills so a skill installed mid-session is callable
|
||||
// on the next turn without a session rebuild; it just rejects every name until one
|
||||
// is installed. An unconditional registration is the point, so the tool is never
|
||||
// absent from the request.
|
||||
const { seen, model } = recorder();
|
||||
const session = new Session({ model, askApproval: async () => 'deny', skills: [] });
|
||||
for await (const _ of session.send('hi')) void _;
|
||||
expect((seen[0]?.tools ?? []).map((t) => t.name)).not.toContain('skill');
|
||||
expect((seen[0]?.tools ?? []).map((t) => t.name)).toContain('skill');
|
||||
});
|
||||
|
||||
test('the skill tool never needs approval', async () => {
|
||||
|
||||
Reference in New Issue
Block a user