plumbbob 0.5.4 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +46 -17
- package/dist/cli-core.js +4 -0
- package/dist/lib/agents.js +498 -0
- package/dist/lib/intent.js +98 -8
- package/dist/lib/settings.js +17 -0
- package/dist/lib/sidecar.js +36 -0
- package/dist/verbs/agent.js +312 -0
- package/dist/verbs/checkpoint.js +2 -1
- package/dist/verbs/doctor.js +96 -3
- package/dist/verbs/status.js +64 -2
- package/node_modules/checkride/CHANGELOG.md +139 -0
- package/node_modules/checkride/LICENSE +21 -0
- package/node_modules/checkride/README.md +179 -0
- package/node_modules/checkride/dist/adapters.d.ts +56 -0
- package/node_modules/checkride/dist/adapters.d.ts.map +1 -0
- package/node_modules/checkride/dist/adapters.js +219 -0
- package/node_modules/checkride/dist/adapters.js.map +1 -0
- package/node_modules/checkride/dist/cli.d.ts +29 -0
- package/node_modules/checkride/dist/cli.d.ts.map +1 -0
- package/node_modules/checkride/dist/cli.js +227 -0
- package/node_modules/checkride/dist/cli.js.map +1 -0
- package/node_modules/checkride/dist/config.d.ts +74 -0
- package/node_modules/checkride/dist/config.d.ts.map +1 -0
- package/node_modules/checkride/dist/config.js +126 -0
- package/node_modules/checkride/dist/config.js.map +1 -0
- package/node_modules/checkride/dist/doctor.d.ts +76 -0
- package/node_modules/checkride/dist/doctor.d.ts.map +1 -0
- package/node_modules/checkride/dist/doctor.js +299 -0
- package/node_modules/checkride/dist/doctor.js.map +1 -0
- package/node_modules/checkride/dist/index.d.ts +18 -0
- package/node_modules/checkride/dist/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/index.js +13 -0
- package/node_modules/checkride/dist/index.js.map +1 -0
- package/node_modules/checkride/dist/init.d.ts +64 -0
- package/node_modules/checkride/dist/init.d.ts.map +1 -0
- package/node_modules/checkride/dist/init.js +489 -0
- package/node_modules/checkride/dist/init.js.map +1 -0
- package/node_modules/checkride/dist/links.d.ts +23 -0
- package/node_modules/checkride/dist/links.d.ts.map +1 -0
- package/node_modules/checkride/dist/links.js +125 -0
- package/node_modules/checkride/dist/links.js.map +1 -0
- package/node_modules/checkride/dist/orchestrator.d.ts +96 -0
- package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -0
- package/node_modules/checkride/dist/orchestrator.js +234 -0
- package/node_modules/checkride/dist/orchestrator.js.map +1 -0
- package/node_modules/checkride/package.json +76 -0
- package/node_modules/checkride/templates/flat/fallow.toml +26 -0
- package/node_modules/checkride/templates/flat/pnpm-workspace.yaml +6 -0
- package/node_modules/checkride/templates/flat/tsconfig.json +9 -0
- package/node_modules/checkride/templates/hybrid/fallow.toml +42 -0
- package/node_modules/checkride/templates/hybrid/pnpm-workspace.yaml +6 -0
- package/node_modules/checkride/templates/hybrid/tsconfig.json +12 -0
- package/node_modules/checkride/templates/monorepo/fallow.toml +44 -0
- package/node_modules/checkride/templates/monorepo/pnpm-workspace.yaml +7 -0
- package/node_modules/checkride/templates/monorepo/tsconfig.json +7 -0
- package/node_modules/checkride/templates/shared/cspell.json +35 -0
- package/node_modules/checkride/templates/shared/gitignore +10 -0
- package/node_modules/checkride/templates/shared/markdownlint-cli2.jsonc +11 -0
- package/node_modules/checkride/templates/shared/npmrc +1 -0
- package/node_modules/checkride/templates/shared/oxlintrc.json +33 -0
- package/node_modules/checkride/templates/shared/rules/no-class.yml +8 -0
- package/node_modules/checkride/templates/shared/rules/no-deep-sibling-import.yml +15 -0
- package/node_modules/checkride/templates/shared/rules/no-default-export.yml +9 -0
- package/node_modules/checkride/templates/shared/rules/require-js-extension.yml +21 -0
- package/node_modules/checkride/templates/shared/sgconfig.yml +2 -0
- package/node_modules/checkride/templates/shared/tsconfig.base.json +28 -0
- package/node_modules/checkride/templates/shared/vitest.config.ts.template +27 -0
- package/package.json +4 -1
- package/skills/pb-build/SKILL.md +47 -12
- package/skills/pb-finish/SKILL.md +1 -1
- package/skills/pb-harvest/SKILL.md +1 -1
- package/skills/pb-park/SKILL.md +1 -1
- package/skills/pb-plan/SKILL.md +25 -4
- package/skills/pb-refine/SKILL.md +1 -1
- package/skills/pb-revert/SKILL.md +1 -1
- package/skills/pb-spike/SKILL.md +1 -1
- package/skills/pb-status/SKILL.md +1 -1
- package/skills/pb-step/SKILL.md +10 -2
- package/skills/pb-verify/SKILL.md +21 -6
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in relative-markdown-link check (ported from the interim
|
|
3
|
+
* `scripts/check-links.mjs`).
|
|
4
|
+
*
|
|
5
|
+
* Walks every `*.md` under `cwd` (minus the exclude set), parses inline
|
|
6
|
+
* `[text](target)` links, and verifies that each relative target exists on
|
|
7
|
+
* disk. External URLs and pure `#anchor` targets are skipped; a `#fragment`
|
|
8
|
+
* on a relative target is stripped before the existence check.
|
|
9
|
+
*
|
|
10
|
+
* Returns a result the orchestrator persists to `.check/links.json`:
|
|
11
|
+
* stdout `{ "ok": true }` on success (exit 0)
|
|
12
|
+
* stdout `[{ file, line, link, resolved }]` on miss (exit 1)
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync } from 'node:fs';
|
|
15
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
16
|
+
import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
17
|
+
const EXCLUDE_DIRS = new Set([
|
|
18
|
+
'node_modules',
|
|
19
|
+
'dist',
|
|
20
|
+
'.check',
|
|
21
|
+
'.stryker-tmp',
|
|
22
|
+
'.git',
|
|
23
|
+
'.fallow',
|
|
24
|
+
'coverage',
|
|
25
|
+
'.pnpm-store',
|
|
26
|
+
]);
|
|
27
|
+
const LINK_RE = /\[([^\]\n]*)\]\(([^)\n]+)\)/g;
|
|
28
|
+
async function walkMarkdown(dir, acc) {
|
|
29
|
+
let entries;
|
|
30
|
+
try {
|
|
31
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return acc;
|
|
35
|
+
}
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const full = join(dir, entry.name);
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
if (EXCLUDE_DIRS.has(entry.name))
|
|
40
|
+
continue;
|
|
41
|
+
await walkMarkdown(full, acc);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
45
|
+
acc.push(full);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return acc;
|
|
49
|
+
}
|
|
50
|
+
function isExternal(target) {
|
|
51
|
+
return (target.startsWith('http://') ||
|
|
52
|
+
target.startsWith('https://') ||
|
|
53
|
+
target.startsWith('mailto:'));
|
|
54
|
+
}
|
|
55
|
+
function stripFragment(target) {
|
|
56
|
+
const hash = target.indexOf('#');
|
|
57
|
+
return hash === -1 ? target : target.slice(0, hash);
|
|
58
|
+
}
|
|
59
|
+
function parseLinks(text) {
|
|
60
|
+
const hits = [];
|
|
61
|
+
const lines = text.split('\n');
|
|
62
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
63
|
+
const line = lines[i] ?? '';
|
|
64
|
+
let m;
|
|
65
|
+
LINK_RE.lastIndex = 0;
|
|
66
|
+
while ((m = LINK_RE.exec(line)) !== null) {
|
|
67
|
+
hits.push({ line: i + 1, target: m[2] ?? '' });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return hits;
|
|
71
|
+
}
|
|
72
|
+
async function checkFile(mdPath, repoRoot) {
|
|
73
|
+
let text;
|
|
74
|
+
try {
|
|
75
|
+
text = await readFile(mdPath, 'utf8');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const misses = [];
|
|
81
|
+
for (const { line, target } of parseLinks(text)) {
|
|
82
|
+
if (!target)
|
|
83
|
+
continue;
|
|
84
|
+
if (isExternal(target))
|
|
85
|
+
continue;
|
|
86
|
+
if (target.startsWith('#'))
|
|
87
|
+
continue;
|
|
88
|
+
const fileHalf = stripFragment(target).trim();
|
|
89
|
+
if (!fileHalf)
|
|
90
|
+
continue;
|
|
91
|
+
const base = isAbsolute(fileHalf)
|
|
92
|
+
? join(repoRoot, fileHalf)
|
|
93
|
+
: resolve(dirname(mdPath), fileHalf);
|
|
94
|
+
if (!existsSync(base)) {
|
|
95
|
+
misses.push({
|
|
96
|
+
file: relative(repoRoot, mdPath),
|
|
97
|
+
line,
|
|
98
|
+
link: target,
|
|
99
|
+
resolved: relative(repoRoot, base),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return misses;
|
|
104
|
+
}
|
|
105
|
+
/** Run the links check against `cwd`; never throws on a per-file read failure. */
|
|
106
|
+
export async function checkLinks(cwd) {
|
|
107
|
+
const files = await walkMarkdown(cwd, []);
|
|
108
|
+
const misses = [];
|
|
109
|
+
for (const f of files) {
|
|
110
|
+
misses.push(...(await checkFile(f, cwd)));
|
|
111
|
+
}
|
|
112
|
+
if (misses.length === 0) {
|
|
113
|
+
return { ok: true, exit_code: 0, stdout: `${JSON.stringify({ ok: true }, null, 2)}\n`, stderr: '' };
|
|
114
|
+
}
|
|
115
|
+
const stderr = misses
|
|
116
|
+
.map((m) => `check-links: broken link in ${m.file}:${m.line} -> ${m.link} (resolved: ${m.resolved})`)
|
|
117
|
+
.join('\n');
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
exit_code: 1,
|
|
121
|
+
stdout: `${JSON.stringify(misses, null, 2)}\n`,
|
|
122
|
+
stderr: `${stderr}\n`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator — behavior-ported from the interim `scripts/check.mjs`.
|
|
3
|
+
*
|
|
4
|
+
* Resolves slots to adapters, selects which to run (flags), spawns each command
|
|
5
|
+
* (or runs a built-in), captures raw output to `.check/`, and writes the
|
|
6
|
+
* aggregate `.check/summary.json`. The orchestrator stays dumb: it never parses
|
|
7
|
+
* diagnostics — agents read the per-tool JSON directly.
|
|
8
|
+
*/
|
|
9
|
+
import type { Adapter, Slot } from './adapters.js';
|
|
10
|
+
import type { CheckrideConfig, ResolvedCheck } from './config.js';
|
|
11
|
+
import type { CheckOutcome } from './links.js';
|
|
12
|
+
/** Minimal writable sink (satisfied by `process.stdout`/`process.stderr`). */
|
|
13
|
+
export type Out = {
|
|
14
|
+
write(text: string): unknown;
|
|
15
|
+
};
|
|
16
|
+
/** Run flags, mirroring the interim script's `parseArgs` surface. */
|
|
17
|
+
export type RunFlags = {
|
|
18
|
+
bail?: boolean;
|
|
19
|
+
json?: boolean;
|
|
20
|
+
changed?: boolean;
|
|
21
|
+
all?: boolean;
|
|
22
|
+
only?: string[] | null;
|
|
23
|
+
skip?: string[] | null;
|
|
24
|
+
include?: string[] | null;
|
|
25
|
+
};
|
|
26
|
+
/** A single check in the aggregate report. */
|
|
27
|
+
export type SummaryCheck = {
|
|
28
|
+
name: string;
|
|
29
|
+
adapter: string | null;
|
|
30
|
+
description: string;
|
|
31
|
+
ok: boolean;
|
|
32
|
+
skipped?: boolean;
|
|
33
|
+
reason?: string;
|
|
34
|
+
exit_code: number | null;
|
|
35
|
+
duration_ms: number;
|
|
36
|
+
output_file: string | null;
|
|
37
|
+
};
|
|
38
|
+
/** The `.check/summary.json` contract. A public API for agents. */
|
|
39
|
+
export type Summary = {
|
|
40
|
+
schema_version: number;
|
|
41
|
+
timestamp: string;
|
|
42
|
+
ok: boolean;
|
|
43
|
+
total_duration_ms: number;
|
|
44
|
+
checks: SummaryCheck[];
|
|
45
|
+
};
|
|
46
|
+
/** Low-level runner: executes one active check and returns its raw outcome. */
|
|
47
|
+
export type CheckRunner = (resolved: ResolvedCheck, ctx: {
|
|
48
|
+
cwd: string;
|
|
49
|
+
changed: boolean;
|
|
50
|
+
timeout?: number;
|
|
51
|
+
}) => Promise<CheckOutcome>;
|
|
52
|
+
export type RunOptions = RunFlags & {
|
|
53
|
+
cwd?: string;
|
|
54
|
+
slots?: readonly Slot[];
|
|
55
|
+
adapters?: readonly Adapter[];
|
|
56
|
+
config?: CheckrideConfig | null;
|
|
57
|
+
stdout?: Out;
|
|
58
|
+
stderr?: Out;
|
|
59
|
+
runner?: CheckRunner;
|
|
60
|
+
};
|
|
61
|
+
export type RunResult = {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
summary: Summary;
|
|
64
|
+
exitCode: number;
|
|
65
|
+
};
|
|
66
|
+
/** Port of the interim `select_checks`: only/skip/opt-in selection by slot name. */
|
|
67
|
+
export declare function selectChecks(resolved: readonly ResolvedCheck[], flags: RunFlags): ResolvedCheck[];
|
|
68
|
+
/** Append an adapter's `changedArgs` under `--changed` (otherwise base args). */
|
|
69
|
+
export declare function runtimeArgs(adapter: Adapter, changed: boolean): string[];
|
|
70
|
+
/** Run the selected checks against `cwd`, persist output, write the summary. */
|
|
71
|
+
export declare function runChecks(options: RunOptions): Promise<RunResult>;
|
|
72
|
+
/** Result of a single adapter's fix command. */
|
|
73
|
+
export type FixOutcome = {
|
|
74
|
+
ok: boolean;
|
|
75
|
+
exit_code: number;
|
|
76
|
+
};
|
|
77
|
+
/** Runs one adapter's `fixArgs`. Injectable for testing. */
|
|
78
|
+
export type FixRunner = (adapter: Adapter, ctx: {
|
|
79
|
+
cwd: string;
|
|
80
|
+
}) => Promise<FixOutcome>;
|
|
81
|
+
export type FixOptions = RunFlags & {
|
|
82
|
+
cwd?: string;
|
|
83
|
+
slots?: readonly Slot[];
|
|
84
|
+
adapters?: readonly Adapter[];
|
|
85
|
+
config?: CheckrideConfig | null;
|
|
86
|
+
stderr?: Out;
|
|
87
|
+
fixRunner?: FixRunner;
|
|
88
|
+
};
|
|
89
|
+
export type FixResult = {
|
|
90
|
+
ok: boolean;
|
|
91
|
+
exitCode: number;
|
|
92
|
+
ran: string[];
|
|
93
|
+
};
|
|
94
|
+
/** Run every active adapter's `fixArgs` (`checkride fix`). */
|
|
95
|
+
export declare function runFix(options: FixOptions): Promise<FixResult>;
|
|
96
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator — behavior-ported from the interim `scripts/check.mjs`.
|
|
3
|
+
*
|
|
4
|
+
* Resolves slots to adapters, selects which to run (flags), spawns each command
|
|
5
|
+
* (or runs a built-in), captures raw output to `.check/`, and writes the
|
|
6
|
+
* aggregate `.check/summary.json`. The orchestrator stays dumb: it never parses
|
|
7
|
+
* diagnostics — agents read the per-tool JSON directly.
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { performance } from 'node:perf_hooks';
|
|
13
|
+
import { ADAPTERS, SCHEMA_VERSION, SLOTS } from './adapters.js';
|
|
14
|
+
import { loadConfig, resolveChecks } from './config.js';
|
|
15
|
+
import { checkLinks } from './links.js';
|
|
16
|
+
/** Port of the interim `select_checks`: only/skip/opt-in selection by slot name. */
|
|
17
|
+
export function selectChecks(resolved, flags) {
|
|
18
|
+
const only = flags.only ?? null;
|
|
19
|
+
const skipSet = new Set(flags.skip ?? []);
|
|
20
|
+
const includeSet = new Set(flags.include ?? []);
|
|
21
|
+
const all = flags.all ?? false;
|
|
22
|
+
return resolved.filter((r) => {
|
|
23
|
+
if (only)
|
|
24
|
+
return only.includes(r.slot);
|
|
25
|
+
if (skipSet.has(r.slot))
|
|
26
|
+
return false;
|
|
27
|
+
if (r.optIn && !all && !includeSet.has(r.slot))
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Append an adapter's `changedArgs` under `--changed` (otherwise base args). */
|
|
33
|
+
export function runtimeArgs(adapter, changed) {
|
|
34
|
+
if (changed && adapter.changedArgs)
|
|
35
|
+
return [...adapter.args, ...adapter.changedArgs];
|
|
36
|
+
return adapter.args;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Spawn one check. `timeoutSec` is optional and off by default — a falsy or
|
|
40
|
+
* non-positive value means no cap. When it fires, the child is killed and a
|
|
41
|
+
* failed outcome carries a `"timed out after Ns"` note so the slot is recorded
|
|
42
|
+
* failed with its elapsed duration (the timer is always cleared on `close`).
|
|
43
|
+
*/
|
|
44
|
+
function spawnCheck(command, args, cwd, timeoutSec) {
|
|
45
|
+
return new Promise((resolveOutcome) => {
|
|
46
|
+
const proc = spawn(command, args, {
|
|
47
|
+
cwd,
|
|
48
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
49
|
+
env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' },
|
|
50
|
+
});
|
|
51
|
+
let stdout = '';
|
|
52
|
+
let stderr = '';
|
|
53
|
+
let timedOut = false;
|
|
54
|
+
const timer = timeoutSec && timeoutSec > 0
|
|
55
|
+
? setTimeout(() => { timedOut = true; proc.kill('SIGTERM'); }, timeoutSec * 1000)
|
|
56
|
+
: null;
|
|
57
|
+
proc.stdout.on('data', (chunk) => { stdout += chunk.toString(); });
|
|
58
|
+
proc.stderr.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
59
|
+
proc.on('error', (err) => {
|
|
60
|
+
if (timer)
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
resolveOutcome({ ok: false, exit_code: -1, stdout: '', stderr: `Failed to spawn: ${err.message}` });
|
|
63
|
+
});
|
|
64
|
+
proc.on('close', (code) => {
|
|
65
|
+
if (timer)
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
if (timedOut) {
|
|
68
|
+
const note = `timed out after ${timeoutSec}s`;
|
|
69
|
+
resolveOutcome({ ok: false, exit_code: -1, stdout, stderr: stderr ? `${stderr}\n${note}` : `${note}\n` });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
resolveOutcome({ ok: code === 0, exit_code: code ?? -1, stdout, stderr });
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const defaultRunner = (resolved, ctx) => {
|
|
77
|
+
const adapter = resolved.adapter;
|
|
78
|
+
if (!adapter)
|
|
79
|
+
return Promise.resolve({ ok: true, exit_code: 0, stdout: '', stderr: '' });
|
|
80
|
+
if (adapter.builtin === 'links')
|
|
81
|
+
return checkLinks(ctx.cwd);
|
|
82
|
+
const timeout = adapter.timeout ?? ctx.timeout;
|
|
83
|
+
return spawnCheck(adapter.command, runtimeArgs(adapter, ctx.changed), ctx.cwd, timeout);
|
|
84
|
+
};
|
|
85
|
+
/** Persist raw output: JSON to `.check/<outputFile>`, else stdout/stderr text. */
|
|
86
|
+
async function persistOutput(cwd, adapter, outcome) {
|
|
87
|
+
const dir = join(cwd, '.check');
|
|
88
|
+
if (adapter.outputFile && outcome.stdout.trim()) {
|
|
89
|
+
try {
|
|
90
|
+
JSON.parse(outcome.stdout);
|
|
91
|
+
await writeFile(join(dir, adapter.outputFile), outcome.stdout);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Not JSON after all; fall through to raw text.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (outcome.stdout.trim())
|
|
99
|
+
await writeFile(join(dir, `${adapter.slot}.stdout.txt`), outcome.stdout);
|
|
100
|
+
if (outcome.stderr.trim())
|
|
101
|
+
await writeFile(join(dir, `${adapter.slot}.stderr.txt`), outcome.stderr);
|
|
102
|
+
}
|
|
103
|
+
function writeLine(out, line) {
|
|
104
|
+
out.write(`${line}\n`);
|
|
105
|
+
}
|
|
106
|
+
function formatStatusLine(check) {
|
|
107
|
+
const mark = check.ok ? '✔' : '✘';
|
|
108
|
+
const name = check.name.padEnd(8);
|
|
109
|
+
const duration = `${check.duration_ms}ms`.padStart(8);
|
|
110
|
+
return ` ${mark} ${name} ${duration} ${check.description}`;
|
|
111
|
+
}
|
|
112
|
+
function skippedEntry(resolved) {
|
|
113
|
+
return {
|
|
114
|
+
name: resolved.slot,
|
|
115
|
+
adapter: resolved.adapter?.name ?? null,
|
|
116
|
+
description: resolved.adapter?.description ?? resolved.slot,
|
|
117
|
+
ok: true,
|
|
118
|
+
skipped: true,
|
|
119
|
+
reason: resolved.skip ?? 'skipped',
|
|
120
|
+
exit_code: null,
|
|
121
|
+
duration_ms: 0,
|
|
122
|
+
output_file: resolved.adapter?.outputFile ?? null,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function buildSummary(checks) {
|
|
126
|
+
return {
|
|
127
|
+
schema_version: SCHEMA_VERSION,
|
|
128
|
+
timestamp: new Date().toISOString(),
|
|
129
|
+
ok: checks.every((c) => c.ok),
|
|
130
|
+
total_duration_ms: checks.reduce((sum, c) => sum + c.duration_ms, 0),
|
|
131
|
+
checks,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Run the selected checks against `cwd`, persist output, write the summary. */
|
|
135
|
+
export async function runChecks(options) {
|
|
136
|
+
const cwd = options.cwd ?? process.cwd();
|
|
137
|
+
const slots = options.slots ?? SLOTS;
|
|
138
|
+
const adapters = options.adapters ?? ADAPTERS;
|
|
139
|
+
const config = options.config !== undefined ? options.config : loadConfig(cwd);
|
|
140
|
+
const stderr = options.stderr ?? process.stderr;
|
|
141
|
+
const stdout = options.stdout ?? process.stdout;
|
|
142
|
+
const runner = options.runner ?? defaultRunner;
|
|
143
|
+
const json = options.json ?? false;
|
|
144
|
+
const bail = options.bail ?? false;
|
|
145
|
+
const changed = options.changed ?? false;
|
|
146
|
+
const timeout = config?.timeout;
|
|
147
|
+
await mkdir(join(cwd, '.check'), { recursive: true });
|
|
148
|
+
const resolved = resolveChecks({ slots, adapters, config, cwd });
|
|
149
|
+
const selected = selectChecks(resolved, options);
|
|
150
|
+
if (!json)
|
|
151
|
+
writeLine(stderr, `\nRunning ${selected.length} check(s)...\n`);
|
|
152
|
+
const checks = [];
|
|
153
|
+
for (const r of selected) {
|
|
154
|
+
if (r.skip || !r.adapter) {
|
|
155
|
+
const entry = skippedEntry(r);
|
|
156
|
+
checks.push(entry);
|
|
157
|
+
if (!json)
|
|
158
|
+
writeLine(stderr, ` ○ ${entry.name.padEnd(8)} skip ${entry.reason ?? ''}`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const adapter = r.adapter;
|
|
162
|
+
if (!json)
|
|
163
|
+
writeLine(stderr, ` ▸ ${r.slot} ${adapter.description}`);
|
|
164
|
+
const start = performance.now();
|
|
165
|
+
const outcome = await runner(r, { cwd, changed, ...(timeout !== undefined ? { timeout } : {}) });
|
|
166
|
+
const duration_ms = Math.round(performance.now() - start);
|
|
167
|
+
await persistOutput(cwd, adapter, outcome);
|
|
168
|
+
const entry = {
|
|
169
|
+
name: r.slot,
|
|
170
|
+
adapter: adapter.name,
|
|
171
|
+
description: adapter.description,
|
|
172
|
+
ok: outcome.ok,
|
|
173
|
+
exit_code: outcome.exit_code,
|
|
174
|
+
duration_ms,
|
|
175
|
+
output_file: adapter.outputFile,
|
|
176
|
+
};
|
|
177
|
+
checks.push(entry);
|
|
178
|
+
if (!json)
|
|
179
|
+
writeLine(stderr, formatStatusLine(entry));
|
|
180
|
+
if (!outcome.ok && bail)
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
const summary = buildSummary(checks);
|
|
184
|
+
await writeFile(join(cwd, '.check', 'summary.json'), `${JSON.stringify(summary, null, 2)}\n`);
|
|
185
|
+
if (json) {
|
|
186
|
+
stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
writeLine(stderr, '');
|
|
190
|
+
const status = summary.ok ? '✔ all checks passed' : '✘ one or more checks failed';
|
|
191
|
+
writeLine(stderr, `${status} in ${summary.total_duration_ms}ms`);
|
|
192
|
+
writeLine(stderr, 'report: .check/summary.json');
|
|
193
|
+
writeLine(stderr, '');
|
|
194
|
+
}
|
|
195
|
+
return { ok: summary.ok, summary, exitCode: summary.ok ? 0 : 1 };
|
|
196
|
+
}
|
|
197
|
+
function spawnInherit(command, args, cwd) {
|
|
198
|
+
return new Promise((resolveOutcome) => {
|
|
199
|
+
const proc = spawn(command, args, { cwd, stdio: 'inherit', env: process.env });
|
|
200
|
+
proc.on('error', () => { resolveOutcome({ ok: false, exit_code: -1 }); });
|
|
201
|
+
proc.on('close', (code) => { resolveOutcome({ ok: code === 0, exit_code: code ?? -1 }); });
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const defaultFixRunner = (adapter, ctx) => spawnInherit(adapter.command, adapter.fixArgs ?? [], ctx.cwd);
|
|
205
|
+
/** Run every active adapter's `fixArgs` (`checkride fix`). */
|
|
206
|
+
export async function runFix(options) {
|
|
207
|
+
const cwd = options.cwd ?? process.cwd();
|
|
208
|
+
const slots = options.slots ?? SLOTS;
|
|
209
|
+
const adapters = options.adapters ?? ADAPTERS;
|
|
210
|
+
const config = options.config !== undefined ? options.config : loadConfig(cwd);
|
|
211
|
+
const stderr = options.stderr ?? process.stderr;
|
|
212
|
+
const fixRunner = options.fixRunner ?? defaultFixRunner;
|
|
213
|
+
const resolved = resolveChecks({ slots, adapters, config, cwd });
|
|
214
|
+
const fixable = selectChecks(resolved, options).filter((r) => r.adapter?.fixArgs);
|
|
215
|
+
if (fixable.length === 0) {
|
|
216
|
+
writeLine(stderr, 'checkride fix: no active adapters expose a fix command.');
|
|
217
|
+
return { ok: true, exitCode: 0, ran: [] };
|
|
218
|
+
}
|
|
219
|
+
const ran = [];
|
|
220
|
+
let ok = true;
|
|
221
|
+
for (const r of fixable) {
|
|
222
|
+
const adapter = r.adapter;
|
|
223
|
+
if (!adapter)
|
|
224
|
+
continue;
|
|
225
|
+
writeLine(stderr, ` ▸ fix ${r.slot.padEnd(8)} (${adapter.name})`);
|
|
226
|
+
const outcome = await fixRunner(adapter, { cwd });
|
|
227
|
+
ran.push(adapter.name);
|
|
228
|
+
writeLine(stderr, outcome.ok ? ` ✔ ${r.slot}` : ` ✘ ${r.slot} (exit ${outcome.exit_code})`);
|
|
229
|
+
if (!outcome.ok)
|
|
230
|
+
ok = false;
|
|
231
|
+
}
|
|
232
|
+
return { ok, exitCode: ok ? 0 : 1, ran };
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "checkride",
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"description": "An agent harness for TypeScript repositories: one command that is the definition of done, plus mechanically enforced module boundaries.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Rob McLarty",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/robmclarty/checkride.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/robmclarty/checkride#readme",
|
|
12
|
+
"bugs": "https://github.com/robmclarty/checkride/issues",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"agent",
|
|
16
|
+
"typescript",
|
|
17
|
+
"lint",
|
|
18
|
+
"check",
|
|
19
|
+
"ci",
|
|
20
|
+
"deep-modules",
|
|
21
|
+
"boundaries"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22.18.0",
|
|
25
|
+
"pnpm": ">=9.0.0"
|
|
26
|
+
},
|
|
27
|
+
"bin": {
|
|
28
|
+
"checkride": "dist/cli.js"
|
|
29
|
+
},
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"default": "./dist/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"templates",
|
|
42
|
+
"README.md",
|
|
43
|
+
"CHANGELOG.md",
|
|
44
|
+
"LICENSE"
|
|
45
|
+
],
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@ast-grep/cli": "0.42.1",
|
|
48
|
+
"@stryker-mutator/core": "9.6.1",
|
|
49
|
+
"@stryker-mutator/vitest-runner": "9.6.1",
|
|
50
|
+
"@types/node": "22.20.0",
|
|
51
|
+
"@vitest/coverage-v8": "4.1.5",
|
|
52
|
+
"cspell": "10.0.0",
|
|
53
|
+
"fallow": "2.48.0",
|
|
54
|
+
"markdownlint-cli2": "0.22.1",
|
|
55
|
+
"oxlint": "1.61.0",
|
|
56
|
+
"oxlint-tsgolint": "0.21.1",
|
|
57
|
+
"typescript": "6.0.3",
|
|
58
|
+
"vitest": "4.1.5"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"check": "tsc --build && node dist/cli.js",
|
|
62
|
+
"check:all": "tsc --build && node dist/cli.js --all",
|
|
63
|
+
"check:json": "tsc --build && node dist/cli.js --json",
|
|
64
|
+
"check:bail": "tsc --build && node dist/cli.js --bail",
|
|
65
|
+
"check:changed": "tsc --build && node dist/cli.js --changed",
|
|
66
|
+
"check:fix": "tsc --build && node dist/cli.js fix",
|
|
67
|
+
"doctor": "tsc --build && node dist/cli.js doctor",
|
|
68
|
+
"test": "vitest run",
|
|
69
|
+
"test:watch": "vitest",
|
|
70
|
+
"test:e2e": "tsc --build && vitest run --config vitest.e2e.config.ts",
|
|
71
|
+
"mutation": "stryker run",
|
|
72
|
+
"build": "tsc --build",
|
|
73
|
+
"build:clean": "tsc --build --clean",
|
|
74
|
+
"types": "tsc --build"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Fallow: dead code, circular deps, duplication, complexity, architecture boundaries.
|
|
2
|
+
# Docs: https://docs.fallow.tools
|
|
3
|
+
|
|
4
|
+
entry = [
|
|
5
|
+
"src/index.ts",
|
|
6
|
+
"src/**/*.test.ts",
|
|
7
|
+
"test/**/*.test.ts",
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
# CLI/tooling deps used via command line or config files, not imported from source.
|
|
11
|
+
ignoreDependencies = ["@ast-grep/cli"]
|
|
12
|
+
|
|
13
|
+
[rules]
|
|
14
|
+
unused-exports = "error"
|
|
15
|
+
unused-files = "error"
|
|
16
|
+
unused-dependencies = "error"
|
|
17
|
+
circular-dependencies = "error"
|
|
18
|
+
boundary-violation = "error"
|
|
19
|
+
|
|
20
|
+
[duplicates]
|
|
21
|
+
mode = "mild"
|
|
22
|
+
minTokens = 50
|
|
23
|
+
|
|
24
|
+
[health]
|
|
25
|
+
maxCyclomatic = 15
|
|
26
|
+
maxCognitive = 15
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Flat (single-package) repo: no `packages:` globs, so this defines no workspace
|
|
2
|
+
# members. It exists only to approve the native build scripts of the two tools
|
|
3
|
+
# that ship platform binaries, which pnpm 11 blocks by default.
|
|
4
|
+
allowBuilds:
|
|
5
|
+
'@ast-grep/cli': true
|
|
6
|
+
fallow: true
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Fallow: dead code, circular deps, duplication, complexity, architecture boundaries.
|
|
2
|
+
# Docs: https://docs.fallow.tools
|
|
3
|
+
|
|
4
|
+
entry = [
|
|
5
|
+
"src/index.ts",
|
|
6
|
+
"packages/*/src/index.ts",
|
|
7
|
+
"src/**/*.test.ts",
|
|
8
|
+
"packages/*/src/**/*.test.ts",
|
|
9
|
+
"test/**/*.test.ts",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
# CLI/tooling deps used via command line or config files, not imported from source.
|
|
13
|
+
ignoreDependencies = ["@ast-grep/cli"]
|
|
14
|
+
|
|
15
|
+
[rules]
|
|
16
|
+
unused-exports = "error"
|
|
17
|
+
unused-files = "error"
|
|
18
|
+
unused-dependencies = "error"
|
|
19
|
+
circular-dependencies = "error"
|
|
20
|
+
boundary-violation = "error"
|
|
21
|
+
|
|
22
|
+
[duplicates]
|
|
23
|
+
mode = "mild"
|
|
24
|
+
minTokens = 50
|
|
25
|
+
|
|
26
|
+
[health]
|
|
27
|
+
maxCyclomatic = 15
|
|
28
|
+
maxCognitive = 15
|
|
29
|
+
|
|
30
|
+
# Architecture boundary: the root app may depend on internal packages, but
|
|
31
|
+
# packages may only depend on other packages.
|
|
32
|
+
[[boundaries.zones]]
|
|
33
|
+
name = "app"
|
|
34
|
+
patterns = ["src/**"]
|
|
35
|
+
|
|
36
|
+
[[boundaries.zones]]
|
|
37
|
+
name = "packages"
|
|
38
|
+
patterns = ["packages/*/src/**"]
|
|
39
|
+
|
|
40
|
+
[[boundaries.rules]]
|
|
41
|
+
from = "packages"
|
|
42
|
+
allow = ["packages"]
|