mirror of
https://github.com/garrytan/gbrain.git
synced 2026-07-28 06:23:01 +00:00
Ports #3015 by @jdewoski-cmd onto current master: - src/core/orphan-policy.ts centralizes the orphan-reporting exclusion convention so `gbrain orphans`, doctor's orphan_ratio, and both engines' getHealth orphan_pages can no longer drift. - getHealth stale_pages now uses the link-extractor stale watermark (countStalePagesForExtraction) so health agrees with what `gbrain extract --stale` will actually process. - New `gbrain maintain` command: dry-run by default, `--safe` applies only the conservative runbook actions (DB-backed stale extraction + source-scoped dream cycles for doctor cycle_freshness findings), `--json` for structured before/action/after reports. Frontmatter mutations, schema-pack upgrades, and semantic hub links stay review-only by design. Changed from the original PR: the shared defaults carried slugs specific to the contributor's own brain ('josa-secrets/', '*-ga4-property-id.md', '*-josa-test', literal 'welcome'/'untitled' fixtures). Global defaults now carry only GBrain-wide conventions; brain-specific exclusions move to a new per-brain config plane the policy reads through loadOrphanPolicyOverrides: gbrain config set orphans.exclude_prefixes "my-private-folder/,archive/" gbrain config set orphans.exclude_slugs "some-one-off-page" Both engines' getHealth and the orphans command thread the overrides; tests cover the neutral defaults, the override plane, and health parity. Also registered `maintain` in CLI_ONLY_SELF_HELP so `gbrain maintain --help` reaches the command's own usage block. Co-authored-by: Garry Tan <garrytan@gmail.com> Co-authored-by: jdewoski-cmd <jdewoski@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
import {
|
|
extractCycleFreshnessSourceIds,
|
|
parseMaintainArgs,
|
|
} from '../src/commands/maintain.ts';
|
|
import type { Check } from '../src/commands/doctor.ts';
|
|
|
|
describe('maintain args', () => {
|
|
test('defaults to dry-run unless --safe is explicit', () => {
|
|
expect(parseMaintainArgs([])).toMatchObject({
|
|
safe: false,
|
|
dryRun: true,
|
|
json: false,
|
|
});
|
|
});
|
|
|
|
test('--safe enables mutating safe mode', () => {
|
|
expect(parseMaintainArgs(['--safe', '--json'])).toMatchObject({
|
|
safe: true,
|
|
dryRun: false,
|
|
json: true,
|
|
});
|
|
});
|
|
|
|
test('--dry-run wins over --safe', () => {
|
|
expect(parseMaintainArgs(['--safe', '--dry-run'])).toMatchObject({
|
|
safe: true,
|
|
dryRun: true,
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('cycle freshness source extraction', () => {
|
|
test('extracts stale source ids from doctor messages', () => {
|
|
const checks: Check[] = [
|
|
{
|
|
name: 'cycle_freshness',
|
|
status: 'fail',
|
|
message: "Source 'brain-sync-remote-teffur' last cycled 40h ago. Run `gbrain dream --source <id>`.",
|
|
},
|
|
{
|
|
name: 'cycle_freshness',
|
|
status: 'fail',
|
|
message: "Source 'wiki' last cycled 25h ago. Source 'wiki' last cycled 25h ago.",
|
|
},
|
|
];
|
|
|
|
expect(extractCycleFreshnessSourceIds(checks)).toEqual([
|
|
'brain-sync-remote-teffur',
|
|
'wiki',
|
|
]);
|
|
});
|
|
|
|
test('ignores ok and unrelated checks', () => {
|
|
const checks: Check[] = [
|
|
{ name: 'cycle_freshness', status: 'ok', message: "Source 'fresh' last cycled recently." },
|
|
{ name: 'frontmatter_integrity', status: 'warn', message: "Source 'wiki' has frontmatter issues." },
|
|
];
|
|
|
|
expect(extractCycleFreshnessSourceIds(checks)).toEqual([]);
|
|
});
|
|
});
|