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>
102 lines
3.8 KiB
JavaScript
102 lines
3.8 KiB
JavaScript
import { describe, test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { applyWeekRollover } from '../week-rollover.mjs';
|
|
|
|
const SAMPLE_STATE = `---
|
|
last_post_date: "2026-04-05"
|
|
first_post_date: "2026-01-15"
|
|
last_post_topic: "AI strategy"
|
|
posts_this_week: 3
|
|
weekly_goal: 3
|
|
current_streak: 5
|
|
longest_streak: 12
|
|
current_week: "2026-W14"
|
|
last_import_date: "2026-04-01"
|
|
follower_count: 850
|
|
follower_target: 10000
|
|
target_date: "2026-12-31"
|
|
---
|
|
|
|
## Recent Posts
|
|
- 2026-04-05: AI strategy post
|
|
`;
|
|
|
|
describe('applyWeekRollover', () => {
|
|
test('resets posts_this_week to 0 on week change', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.match(result.content, /^posts_this_week: 0$/m);
|
|
});
|
|
|
|
test('updates current_week to new week', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.match(result.content, /^current_week: "2026-W15"$/m);
|
|
});
|
|
|
|
test('returns descriptive message on rollover', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.ok(result.message.includes('2026-W15'));
|
|
assert.ok(result.message.includes('2026-W14'));
|
|
});
|
|
|
|
test('returns null when week matches (no change needed)', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '2026-W14');
|
|
assert.equal(result, null);
|
|
});
|
|
|
|
test('preserves all other YAML fields unchanged', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.match(result.content, /^last_post_date: "2026-04-05"$/m);
|
|
assert.match(result.content, /^current_streak: 5$/m);
|
|
assert.match(result.content, /^weekly_goal: 3$/m);
|
|
assert.match(result.content, /^follower_count: 850$/m);
|
|
});
|
|
|
|
test('preserves markdown body after frontmatter', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.ok(result.content.includes('## Recent Posts'));
|
|
assert.ok(result.content.includes('AI strategy post'));
|
|
});
|
|
|
|
test('initializes current_week when empty without resetting posts', () => {
|
|
const stateWithEmptyWeek = SAMPLE_STATE.replace(
|
|
'current_week: "2026-W14"',
|
|
'current_week: ""'
|
|
);
|
|
const result = applyWeekRollover(stateWithEmptyWeek, '', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.match(result.content, /^current_week: "2026-W15"$/m);
|
|
// posts_this_week should NOT be reset (user may have manually tracked)
|
|
assert.match(result.content, /^posts_this_week: 3$/m);
|
|
});
|
|
|
|
test('returns null when actualWeek is empty', () => {
|
|
const result = applyWeekRollover(SAMPLE_STATE, '2026-W14', '');
|
|
assert.equal(result, null);
|
|
});
|
|
|
|
test('returns null when actualWeek is null/undefined', () => {
|
|
assert.equal(applyWeekRollover(SAMPLE_STATE, '2026-W14', null), null);
|
|
assert.equal(applyWeekRollover(SAMPLE_STATE, '2026-W14', undefined), null);
|
|
});
|
|
|
|
test('handles year boundary rollover (W52 → W01)', () => {
|
|
const yearEndState = SAMPLE_STATE.replace('2026-W14', '2025-W52');
|
|
const result = applyWeekRollover(yearEndState, '2025-W52', '2026-W01');
|
|
assert.notEqual(result, null);
|
|
assert.match(result.content, /^posts_this_week: 0$/m);
|
|
assert.match(result.content, /^current_week: "2026-W01"$/m);
|
|
});
|
|
|
|
test('handles posts_this_week already at 0', () => {
|
|
const zeroPostsState = SAMPLE_STATE.replace('posts_this_week: 3', 'posts_this_week: 0');
|
|
const result = applyWeekRollover(zeroPostsState, '2026-W14', '2026-W15');
|
|
assert.notEqual(result, null);
|
|
assert.match(result.content, /^posts_this_week: 0$/m);
|
|
assert.match(result.content, /^current_week: "2026-W15"$/m);
|
|
});
|
|
});
|