feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command
Add /ultraresearch-local for structured research combining local codebase analysis with external knowledge via parallel agent swarms. Produces research briefs with triangulation, confidence ratings, and source quality assessment. New command: /ultraresearch-local with modes --quick, --local, --external, --fg. New agents: research-orchestrator (opus), docs-researcher, community-researcher, security-researcher, contrarian-researcher, gemini-bridge (all sonnet). New template: research-brief-template.md. Integration: --research flag in /ultraplan-local accepts pre-built research briefs (up to 3), enriches the interview and exploration phases. Planning orchestrator cross-references brief findings during synthesis. Design principle: Context Engineering — right information to right agent at right time. Research briefs are structured artifacts in the pipeline: ultraresearch → brief → ultraplan --research → plan → ultraexecute. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
commit
aca38d6558
20 changed files with 2299 additions and 0 deletions
49
tests/session-start.test.mjs
Normal file
49
tests/session-start.test.mjs
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import { describe, it, afterEach } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { join } from 'path';
|
||||
import { runHook, setupTestDir, cleanupTestDir, readState, readJsonl } from './test-helper.mjs';
|
||||
|
||||
let dir;
|
||||
afterEach(() => { if (dir) cleanupTestDir(dir); });
|
||||
|
||||
describe('session-start', () => {
|
||||
it('creates state file and emits context', () => {
|
||||
dir = setupTestDir();
|
||||
const out = runHook('session-start.mjs', { session_id: 's1', cwd: '/tmp' }, dir);
|
||||
assert.equal(out.continue, true);
|
||||
assert.ok(out.hookSpecificOutput.additionalContext.includes('Interaction Awareness is active'));
|
||||
const state = readState(dir, 's1');
|
||||
assert.ok(state);
|
||||
assert.equal(state.tool_count, 0);
|
||||
assert.equal(state.edit_count, 0);
|
||||
assert.equal(state.dep_flags, 0);
|
||||
});
|
||||
|
||||
it('writes start record to sessions.jsonl', () => {
|
||||
dir = setupTestDir();
|
||||
runHook('session-start.mjs', { session_id: 's2', cwd: '/tmp' }, dir);
|
||||
const records = readJsonl(join(dir, 'sessions.jsonl'));
|
||||
assert.equal(records.length, 1);
|
||||
assert.equal(records[0].session_id, 's2');
|
||||
assert.ok('hour' in records[0]);
|
||||
assert.ok('is_late_night' in records[0]);
|
||||
});
|
||||
|
||||
it('state has correct initial fields', () => {
|
||||
dir = setupTestDir();
|
||||
runHook('session-start.mjs', { session_id: 's3', cwd: '/tmp' }, dir);
|
||||
const state = readState(dir, 's3');
|
||||
assert.equal(state.burst_count, 0);
|
||||
assert.equal(state.last_event_epoch, 0);
|
||||
assert.equal(state.last_warning_epoch, 0);
|
||||
assert.ok(state.start_epoch > 0);
|
||||
assert.ok(state.start_iso.length > 0);
|
||||
});
|
||||
|
||||
it('returns continue with no side effects when session_id missing', () => {
|
||||
dir = setupTestDir();
|
||||
const out = runHook('session-start.mjs', { cwd: '/tmp' }, dir);
|
||||
assert.equal(out.continue, true);
|
||||
assert.ok(!out.hookSpecificOutput);
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue