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.
Files changed (80) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +46 -17
  3. package/dist/cli-core.js +4 -0
  4. package/dist/lib/agents.js +498 -0
  5. package/dist/lib/intent.js +98 -8
  6. package/dist/lib/settings.js +17 -0
  7. package/dist/lib/sidecar.js +36 -0
  8. package/dist/verbs/agent.js +312 -0
  9. package/dist/verbs/checkpoint.js +2 -1
  10. package/dist/verbs/doctor.js +96 -3
  11. package/dist/verbs/status.js +64 -2
  12. package/node_modules/checkride/CHANGELOG.md +139 -0
  13. package/node_modules/checkride/LICENSE +21 -0
  14. package/node_modules/checkride/README.md +179 -0
  15. package/node_modules/checkride/dist/adapters.d.ts +56 -0
  16. package/node_modules/checkride/dist/adapters.d.ts.map +1 -0
  17. package/node_modules/checkride/dist/adapters.js +219 -0
  18. package/node_modules/checkride/dist/adapters.js.map +1 -0
  19. package/node_modules/checkride/dist/cli.d.ts +29 -0
  20. package/node_modules/checkride/dist/cli.d.ts.map +1 -0
  21. package/node_modules/checkride/dist/cli.js +227 -0
  22. package/node_modules/checkride/dist/cli.js.map +1 -0
  23. package/node_modules/checkride/dist/config.d.ts +74 -0
  24. package/node_modules/checkride/dist/config.d.ts.map +1 -0
  25. package/node_modules/checkride/dist/config.js +126 -0
  26. package/node_modules/checkride/dist/config.js.map +1 -0
  27. package/node_modules/checkride/dist/doctor.d.ts +76 -0
  28. package/node_modules/checkride/dist/doctor.d.ts.map +1 -0
  29. package/node_modules/checkride/dist/doctor.js +299 -0
  30. package/node_modules/checkride/dist/doctor.js.map +1 -0
  31. package/node_modules/checkride/dist/index.d.ts +18 -0
  32. package/node_modules/checkride/dist/index.d.ts.map +1 -0
  33. package/node_modules/checkride/dist/index.js +13 -0
  34. package/node_modules/checkride/dist/index.js.map +1 -0
  35. package/node_modules/checkride/dist/init.d.ts +64 -0
  36. package/node_modules/checkride/dist/init.d.ts.map +1 -0
  37. package/node_modules/checkride/dist/init.js +489 -0
  38. package/node_modules/checkride/dist/init.js.map +1 -0
  39. package/node_modules/checkride/dist/links.d.ts +23 -0
  40. package/node_modules/checkride/dist/links.d.ts.map +1 -0
  41. package/node_modules/checkride/dist/links.js +125 -0
  42. package/node_modules/checkride/dist/links.js.map +1 -0
  43. package/node_modules/checkride/dist/orchestrator.d.ts +96 -0
  44. package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -0
  45. package/node_modules/checkride/dist/orchestrator.js +234 -0
  46. package/node_modules/checkride/dist/orchestrator.js.map +1 -0
  47. package/node_modules/checkride/package.json +76 -0
  48. package/node_modules/checkride/templates/flat/fallow.toml +26 -0
  49. package/node_modules/checkride/templates/flat/pnpm-workspace.yaml +6 -0
  50. package/node_modules/checkride/templates/flat/tsconfig.json +9 -0
  51. package/node_modules/checkride/templates/hybrid/fallow.toml +42 -0
  52. package/node_modules/checkride/templates/hybrid/pnpm-workspace.yaml +6 -0
  53. package/node_modules/checkride/templates/hybrid/tsconfig.json +12 -0
  54. package/node_modules/checkride/templates/monorepo/fallow.toml +44 -0
  55. package/node_modules/checkride/templates/monorepo/pnpm-workspace.yaml +7 -0
  56. package/node_modules/checkride/templates/monorepo/tsconfig.json +7 -0
  57. package/node_modules/checkride/templates/shared/cspell.json +35 -0
  58. package/node_modules/checkride/templates/shared/gitignore +10 -0
  59. package/node_modules/checkride/templates/shared/markdownlint-cli2.jsonc +11 -0
  60. package/node_modules/checkride/templates/shared/npmrc +1 -0
  61. package/node_modules/checkride/templates/shared/oxlintrc.json +33 -0
  62. package/node_modules/checkride/templates/shared/rules/no-class.yml +8 -0
  63. package/node_modules/checkride/templates/shared/rules/no-deep-sibling-import.yml +15 -0
  64. package/node_modules/checkride/templates/shared/rules/no-default-export.yml +9 -0
  65. package/node_modules/checkride/templates/shared/rules/require-js-extension.yml +21 -0
  66. package/node_modules/checkride/templates/shared/sgconfig.yml +2 -0
  67. package/node_modules/checkride/templates/shared/tsconfig.base.json +28 -0
  68. package/node_modules/checkride/templates/shared/vitest.config.ts.template +27 -0
  69. package/package.json +4 -1
  70. package/skills/pb-build/SKILL.md +47 -12
  71. package/skills/pb-finish/SKILL.md +1 -1
  72. package/skills/pb-harvest/SKILL.md +1 -1
  73. package/skills/pb-park/SKILL.md +1 -1
  74. package/skills/pb-plan/SKILL.md +25 -4
  75. package/skills/pb-refine/SKILL.md +1 -1
  76. package/skills/pb-revert/SKILL.md +1 -1
  77. package/skills/pb-spike/SKILL.md +1 -1
  78. package/skills/pb-status/SKILL.md +1 -1
  79. package/skills/pb-step/SKILL.md +10 -2
  80. package/skills/pb-verify/SKILL.md +21 -6
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Adapter registry — pure data.
3
+ *
4
+ * A `Slot` is a role in the pipeline (the catalogue; order matters, cheapest
5
+ * first). An `Adapter` is a concrete tool that can fill a slot. The registry is
6
+ * data only: no logic lives here. Resolution (config vs detection) lives in
7
+ * `../config`, and execution lives in `../orchestrator`.
8
+ *
9
+ * Phase 1 ships the blessed defaults plus the two opt-in slots. Alternates
10
+ * (biome, knip, eslint, jest) land in Phase 2.
11
+ */
12
+ /** The aggregate-report schema version written to `.check/summary.json`. */
13
+ export const SCHEMA_VERSION = 1;
14
+ /** Pipeline order. Cheapest first so `--bail` fails fast. */
15
+ export const SLOTS = [
16
+ { name: 'types' },
17
+ { name: 'lint' },
18
+ { name: 'struct' },
19
+ { name: 'dead' },
20
+ { name: 'test' },
21
+ { name: 'docs' },
22
+ { name: 'links' },
23
+ { name: 'spell' },
24
+ { name: 'mutation', optIn: true },
25
+ { name: 'security', optIn: true },
26
+ ];
27
+ /**
28
+ * Adapter registry. The FIRST adapter for a slot is its blessed default: it
29
+ * wins detection when several tool configs coexist, and is the only one `init`
30
+ * generates config for. Alternates follow so checkride can still *run* them.
31
+ */
32
+ export const ADAPTERS = [
33
+ {
34
+ name: 'tsc',
35
+ slot: 'types',
36
+ description: 'TypeScript type checking (incremental, via project references)',
37
+ detect: ['tsconfig.json'],
38
+ command: 'pnpm',
39
+ args: ['exec', 'tsc', '--build'],
40
+ outputFile: null,
41
+ devDeps: { typescript: '6.0.3', '@types/node': '22.20.0' },
42
+ },
43
+ {
44
+ name: 'oxlint',
45
+ slot: 'lint',
46
+ description: 'Oxlint with tsgolint type-aware rules',
47
+ detect: ['.oxlintrc.json'],
48
+ command: 'pnpm',
49
+ args: ['exec', 'oxlint', '--type-aware', '--format=json'],
50
+ outputFile: 'lint.json',
51
+ fixArgs: ['exec', 'oxlint', '--type-aware', '--fix'],
52
+ devDeps: { oxlint: '1.61.0', 'oxlint-tsgolint': '0.21.1' },
53
+ },
54
+ {
55
+ name: 'biome',
56
+ slot: 'lint',
57
+ description: 'Biome lint + format check',
58
+ detect: ['biome.json', 'biome.jsonc'],
59
+ command: 'pnpm',
60
+ args: ['exec', 'biome', 'check', '--reporter=json'],
61
+ outputFile: 'lint.json',
62
+ fixArgs: ['exec', 'biome', 'check', '--write'],
63
+ devDeps: { '@biomejs/biome': '2.2.4' },
64
+ },
65
+ {
66
+ name: 'eslint',
67
+ slot: 'lint',
68
+ description: 'ESLint',
69
+ detect: [
70
+ 'eslint.config.js',
71
+ 'eslint.config.mjs',
72
+ 'eslint.config.cjs',
73
+ 'eslint.config.ts',
74
+ '.eslintrc.json',
75
+ '.eslintrc.cjs',
76
+ '.eslintrc.js',
77
+ ],
78
+ command: 'pnpm',
79
+ args: ['exec', 'eslint', '.', '--format', 'json'],
80
+ outputFile: 'lint.json',
81
+ fixArgs: ['exec', 'eslint', '.', '--fix'],
82
+ devDeps: { eslint: '9.36.0' },
83
+ },
84
+ {
85
+ name: 'ast-grep',
86
+ slot: 'struct',
87
+ description: 'Structural rules (ast-grep)',
88
+ detect: ['sgconfig.yml', 'sgconfig.yaml'],
89
+ command: 'pnpm',
90
+ args: ['exec', 'ast-grep', 'scan', '--json=compact'],
91
+ outputFile: 'struct.json',
92
+ devDeps: { '@ast-grep/cli': '0.42.1' },
93
+ },
94
+ {
95
+ name: 'fallow',
96
+ slot: 'dead',
97
+ description: 'Fallow: dead code, cycles, duplication, boundaries, complexity',
98
+ detect: ['fallow.toml'],
99
+ command: 'pnpm',
100
+ args: ['exec', 'fallow', '--format', 'json'],
101
+ outputFile: 'dead.json',
102
+ fixArgs: ['exec', 'fallow', 'fix'],
103
+ devDeps: { fallow: '2.48.0' },
104
+ },
105
+ {
106
+ name: 'knip',
107
+ slot: 'dead',
108
+ description: 'Knip: unused files, exports, and dependencies',
109
+ detect: ['knip.json', 'knip.jsonc', '.knip.json', 'knip.config.ts', 'knip.config.js'],
110
+ command: 'pnpm',
111
+ args: ['exec', 'knip', '--reporter', 'json'],
112
+ outputFile: 'dead.json',
113
+ fixArgs: ['exec', 'knip', '--fix'],
114
+ devDeps: { knip: '5.64.0' },
115
+ },
116
+ {
117
+ name: 'vitest',
118
+ slot: 'test',
119
+ description: 'Vitest tests with coverage',
120
+ detect: ['vitest.config.ts', 'vitest.config.js', 'vitest.config.mjs', 'vitest.config.mts'],
121
+ command: 'pnpm',
122
+ args: [
123
+ 'exec', 'vitest', 'run',
124
+ '--coverage',
125
+ '--reporter=default',
126
+ '--reporter=json',
127
+ '--outputFile=.check/test.json',
128
+ ],
129
+ outputFile: null,
130
+ changedArgs: ['--changed', 'origin/main'],
131
+ devDeps: { vitest: '4.1.5', '@vitest/coverage-v8': '4.1.5' },
132
+ },
133
+ {
134
+ name: 'jest',
135
+ slot: 'test',
136
+ description: 'Jest tests',
137
+ detect: [
138
+ 'jest.config.js',
139
+ 'jest.config.ts',
140
+ 'jest.config.mjs',
141
+ 'jest.config.cjs',
142
+ 'jest.config.json',
143
+ ],
144
+ command: 'pnpm',
145
+ args: ['exec', 'jest', '--ci', '--json', '--outputFile=.check/test.json'],
146
+ outputFile: null,
147
+ changedArgs: ['--changedSince', 'origin/main'],
148
+ devDeps: { jest: '30.0.5' },
149
+ },
150
+ {
151
+ name: 'markdownlint-cli2',
152
+ slot: 'docs',
153
+ description: 'Markdown linting',
154
+ detect: [
155
+ '.markdownlint-cli2.jsonc',
156
+ '.markdownlint-cli2.json',
157
+ '.markdownlint-cli2.yaml',
158
+ '.markdownlint-cli2.cjs',
159
+ '.markdownlint-cli2.mjs',
160
+ ],
161
+ command: 'pnpm',
162
+ args: ['exec', 'markdownlint-cli2'],
163
+ outputFile: null,
164
+ fixArgs: ['exec', 'markdownlint-cli2', '--fix'],
165
+ devDeps: { 'markdownlint-cli2': '0.22.1' },
166
+ },
167
+ {
168
+ name: 'links',
169
+ slot: 'links',
170
+ description: 'Relative markdown link targets exist on disk',
171
+ detect: [],
172
+ command: 'node',
173
+ args: [],
174
+ outputFile: 'links.json',
175
+ builtin: 'links',
176
+ devDeps: {},
177
+ },
178
+ {
179
+ name: 'cspell',
180
+ slot: 'spell',
181
+ description: 'Spell check',
182
+ detect: [
183
+ 'cspell.json',
184
+ '.cspell.json',
185
+ 'cspell.config.json',
186
+ 'cspell.config.yaml',
187
+ 'cspell.config.cjs',
188
+ 'cspell.config.mjs',
189
+ ],
190
+ command: 'pnpm',
191
+ args: ['exec', 'cspell', '--no-progress', '--no-summary', '--reporter=default'],
192
+ outputFile: null,
193
+ devDeps: { cspell: '10.0.0' },
194
+ },
195
+ {
196
+ name: 'stryker',
197
+ slot: 'mutation',
198
+ description: 'Stryker mutation testing (incremental)',
199
+ detect: ['stryker.config.mjs', 'stryker.config.json', 'stryker.conf.json', 'stryker.conf.js'],
200
+ command: 'pnpm',
201
+ args: ['exec', 'stryker', 'run'],
202
+ outputFile: null,
203
+ devDeps: {
204
+ '@stryker-mutator/core': '9.6.1',
205
+ '@stryker-mutator/vitest-runner': '9.6.1',
206
+ },
207
+ },
208
+ {
209
+ name: 'pnpm-audit',
210
+ slot: 'security',
211
+ description: 'Dependency audit (pnpm audit)',
212
+ detect: [],
213
+ command: 'pnpm',
214
+ args: ['audit', '--audit-level=high', '--json'],
215
+ outputFile: 'security.json',
216
+ devDeps: {},
217
+ },
218
+ ];
219
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry — arg parsing and command dispatch (the package `bin`).
4
+ *
5
+ * Commands: default `run`, plus `init`, `doctor`, and `fix`. The command is the
6
+ * first non-flag token; everything after it is parsed against that command's
7
+ * options. The module is import-safe: it only executes when invoked directly,
8
+ * so tests can import {@link runCli} without triggering a process exit.
9
+ *
10
+ * Exit codes: 0 pass, 1 check/verification failure, 2 orchestrator/usage error.
11
+ */
12
+ import type { InitOptions } from './init.js';
13
+ import type { Out, RunFlags } from './orchestrator.js';
14
+ /** Injected process surface, so {@link runCli} is testable. */
15
+ export type CliDeps = {
16
+ cwd: string;
17
+ stdout: Out;
18
+ stderr: Out;
19
+ };
20
+ /** Parse argv into a command name and the run flags. */
21
+ export declare function parseCliArgs(argv: string[]): {
22
+ command: string;
23
+ flags: RunFlags;
24
+ };
25
+ /** Parse `init` arguments into init options. */
26
+ export declare function parseInitArgs(argv: string[]): Partial<InitOptions>;
27
+ /** Dispatch a CLI invocation; returns the process exit code. */
28
+ export declare function runCli(argv: string[], deps: CliDeps): Promise<number>;
29
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAS,MAAM,WAAW,CAAC;AAEpD,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGvD,+DAA+D;AAC/D,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC;AA0FhE,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAajF;AAQD,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAclE;AAyBD,gEAAgE;AAChE,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC3E"}
@@ -0,0 +1,227 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry — arg parsing and command dispatch (the package `bin`).
4
+ *
5
+ * Commands: default `run`, plus `init`, `doctor`, and `fix`. The command is the
6
+ * first non-flag token; everything after it is parsed against that command's
7
+ * options. The module is import-safe: it only executes when invoked directly,
8
+ * so tests can import {@link runCli} without triggering a process exit.
9
+ *
10
+ * Exit codes: 0 pass, 1 check/verification failure, 2 orchestrator/usage error.
11
+ */
12
+ import { readFileSync, realpathSync } from 'node:fs';
13
+ import { parseArgs } from 'node:util';
14
+ import { fileURLToPath } from 'node:url';
15
+ import { runDoctor } from './doctor.js';
16
+ import { runInit } from './init.js';
17
+ import { runChecks, runFix } from './orchestrator.js';
18
+ const RUN_OPTIONS = {
19
+ bail: { type: 'boolean', default: false },
20
+ json: { type: 'boolean', default: false },
21
+ only: { type: 'string' },
22
+ skip: { type: 'string' },
23
+ include: { type: 'string' },
24
+ all: { type: 'boolean', default: false },
25
+ changed: { type: 'boolean', default: false },
26
+ };
27
+ const INIT_OPTIONS = {
28
+ shape: { type: 'string' },
29
+ name: { type: 'string' },
30
+ scope: { type: 'string' },
31
+ license: { type: 'string' },
32
+ author: { type: 'string' },
33
+ 'dry-run': { type: 'boolean', default: false },
34
+ add: { type: 'string' },
35
+ };
36
+ const HELP_TEXT = `checkride — an agent harness for TypeScript repositories
37
+
38
+ Usage: checkride [command] [options]
39
+
40
+ Commands:
41
+ (default) Run the checks. Exit 0 pass / 1 fail / 2 error.
42
+ init Set up a project (new or existing — auto-detected).
43
+ doctor Verify the environment and every slot's status (read-only).
44
+ fix Run every active adapter's fix command.
45
+
46
+ Run options:
47
+ --only <a,b> Run only these slots
48
+ --skip <a,b> Skip these slots
49
+ --include <a,b> Add opt-in slots (mutation, security) to the run
50
+ --all Include every opt-in slot
51
+ --changed Affected-only mode (incremental)
52
+ --bail Stop at the first failure
53
+ --json Emit the summary as JSON on stdout
54
+ -h, --help Show this help
55
+ -V, --version Show the version
56
+
57
+ Every run writes a report to .check/summary.json.
58
+ Docs: https://github.com/robmclarty/checkride#readme
59
+ `;
60
+ function errorMessage(err) {
61
+ return err instanceof Error ? err.message : String(err);
62
+ }
63
+ /** The `code` property of an Error-like value (e.g. Node's `ERR_PARSE_ARGS_*`). */
64
+ function errorCode(err) {
65
+ if (err instanceof Error && 'code' in err && typeof err.code === 'string') {
66
+ return err.code;
67
+ }
68
+ return undefined;
69
+ }
70
+ /** parseArgs appends a long "To specify a positional…" hint; keep the first sentence. */
71
+ function firstSentence(message) {
72
+ const head = message.split('. ')[0] ?? message;
73
+ return head.endsWith('.') ? head : `${head}.`;
74
+ }
75
+ /** Read the package's own version from its shipped package.json (next to dist/). */
76
+ function readVersion() {
77
+ try {
78
+ const pkgPath = fileURLToPath(new URL('../package.json', import.meta.url));
79
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
80
+ return pkg.version ?? '0.0.0';
81
+ }
82
+ catch {
83
+ return '0.0.0';
84
+ }
85
+ }
86
+ function parseList(value) {
87
+ if (!value)
88
+ return null;
89
+ return value.split(',').map((s) => s.trim()).filter(Boolean);
90
+ }
91
+ /** The command is the first non-flag token; the rest are its arguments. */
92
+ function detectCommand(argv) {
93
+ const first = argv[0];
94
+ if (first !== undefined && !first.startsWith('-')) {
95
+ return { command: first, rest: argv.slice(1) };
96
+ }
97
+ return { command: 'run', rest: argv };
98
+ }
99
+ /** Parse argv into a command name and the run flags. */
100
+ export function parseCliArgs(argv) {
101
+ const { command, rest } = detectCommand(argv);
102
+ const { values } = parseArgs({ args: rest, allowPositionals: true, options: RUN_OPTIONS });
103
+ const flags = {
104
+ bail: values.bail,
105
+ json: values.json,
106
+ all: values.all,
107
+ changed: values.changed,
108
+ only: parseList(values.only),
109
+ skip: parseList(values.skip),
110
+ include: parseList(values.include),
111
+ };
112
+ return { command, flags };
113
+ }
114
+ function asShape(value) {
115
+ if (value === undefined)
116
+ return undefined;
117
+ if (value === 'flat' || value === 'monorepo' || value === 'hybrid')
118
+ return value;
119
+ throw new Error(`invalid --shape '${value}' (expected flat | monorepo | hybrid)`);
120
+ }
121
+ /** Parse `init` arguments into init options. */
122
+ export function parseInitArgs(argv) {
123
+ const { rest } = detectCommand(argv);
124
+ const { values } = parseArgs({ args: rest, allowPositionals: true, options: INIT_OPTIONS });
125
+ const opts = {};
126
+ const shape = asShape(values.shape);
127
+ if (shape)
128
+ opts.shape = shape;
129
+ if (values.name)
130
+ opts.name = values.name;
131
+ if (values.scope)
132
+ opts.scope = values.scope;
133
+ if (values.license)
134
+ opts.license = values.license;
135
+ if (values.author)
136
+ opts.author = values.author;
137
+ if (values['dry-run'])
138
+ opts.dryRun = true;
139
+ const add = parseList(values.add);
140
+ if (add)
141
+ opts.add = add;
142
+ return opts;
143
+ }
144
+ async function dispatchRun(argv, deps) {
145
+ const { flags } = parseCliArgs(argv);
146
+ const result = await runChecks({ ...flags, cwd: deps.cwd, stdout: deps.stdout, stderr: deps.stderr });
147
+ return result.exitCode;
148
+ }
149
+ async function dispatchInit(argv, deps) {
150
+ const result = await runInit({ ...parseInitArgs(argv), cwd: deps.cwd, stdout: deps.stdout });
151
+ return result.exitCode;
152
+ }
153
+ async function dispatchDoctor(argv, deps) {
154
+ const { flags } = parseCliArgs(argv);
155
+ const result = await runDoctor({ json: flags.json ?? false, cwd: deps.cwd, stdout: deps.stdout });
156
+ return result.exitCode;
157
+ }
158
+ async function dispatchFix(argv, deps) {
159
+ const { flags } = parseCliArgs(argv);
160
+ const result = await runFix({ ...flags, cwd: deps.cwd, stderr: deps.stderr });
161
+ return result.exitCode;
162
+ }
163
+ /** Dispatch a CLI invocation; returns the process exit code. */
164
+ export async function runCli(argv, deps) {
165
+ if (argv.includes('--help') || argv.includes('-h')) {
166
+ deps.stdout.write(HELP_TEXT);
167
+ return 0;
168
+ }
169
+ if (argv.includes('--version') || argv.includes('-V')) {
170
+ deps.stdout.write(`${readVersion()}\n`);
171
+ return 0;
172
+ }
173
+ const { command } = detectCommand(argv);
174
+ const dispatch = {
175
+ run: dispatchRun,
176
+ init: dispatchInit,
177
+ doctor: dispatchDoctor,
178
+ fix: dispatchFix,
179
+ };
180
+ const handler = dispatch[command];
181
+ if (!handler) {
182
+ deps.stderr.write(`checkride: unknown command '${command}'.\nRun \`checkride --help\` for usage.\n`);
183
+ return 2;
184
+ }
185
+ try {
186
+ return await handler(argv, deps);
187
+ }
188
+ catch (err) {
189
+ if (errorCode(err)?.startsWith('ERR_PARSE_ARGS')) {
190
+ deps.stderr.write(`checkride: ${firstSentence(errorMessage(err))}\nRun \`checkride --help\` for usage.\n`);
191
+ }
192
+ else {
193
+ deps.stderr.write(`checkride: ${errorMessage(err)}\n`);
194
+ }
195
+ return 2;
196
+ }
197
+ }
198
+ /**
199
+ * True when this module is the process entry point — invoked as a command, not
200
+ * imported. Package managers expose the bin as a symlink
201
+ * (`node_modules/.bin/checkride` → `../checkride/dist/cli.js`), so
202
+ * `process.argv[1]` is the symlink path while `import.meta.url` resolves to the
203
+ * real target. The comparison must therefore be on real, symlink-resolved
204
+ * paths: a naive URL equality check is false through the symlink, which would
205
+ * silently no-op `pnpm exec checkride`, `npx checkride`, and the generated
206
+ * `pnpm check` alias — the way every consumer actually runs it.
207
+ */
208
+ function isEntryPoint() {
209
+ const invokedPath = process.argv[1];
210
+ if (invokedPath === undefined)
211
+ return false;
212
+ try {
213
+ return realpathSync(invokedPath) === realpathSync(fileURLToPath(import.meta.url));
214
+ }
215
+ catch {
216
+ return false;
217
+ }
218
+ }
219
+ if (isEntryPoint()) {
220
+ const code = await runCli(process.argv.slice(2), {
221
+ cwd: process.cwd(),
222
+ stdout: process.stdout,
223
+ stderr: process.stderr,
224
+ });
225
+ process.exit(code);
226
+ }
227
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Configuration: load `checkride.config.json`, detect installed tools, and
3
+ * resolve each slot to an adapter (or a skip reason).
4
+ *
5
+ * Resolution rule per slot (see plan §4):
6
+ * 1. config entry wins — string picks an adapter; `false` disables the slot;
7
+ * `{ use, ...overrides }` picks an adapter with overrides; `{ command, args }`
8
+ * is a custom check needing no adapter.
9
+ * 2. otherwise detection — the first registry adapter for the slot whose
10
+ * `detect` files exist (or whose `detect` is empty, i.e. always available).
11
+ * 3. otherwise the slot is skipped (skipped ≠ failed).
12
+ */
13
+ import type { Adapter, Slot } from './adapters.js';
14
+ /** A custom check: a bare command, no adapter required. */
15
+ export type CustomCheck = {
16
+ command: string;
17
+ args?: string[];
18
+ description?: string;
19
+ outputFile?: string | null;
20
+ changedArgs?: string[];
21
+ fixArgs?: string[];
22
+ timeout?: number;
23
+ name?: string;
24
+ /**
25
+ * Where a config-only custom check runs relative to the built-in catalogue:
26
+ * `'first'` (ahead of every built-in check) or `'last'` (after them, the
27
+ * default). Ignored on entries that fill a catalogue slot — those keep their
28
+ * fixed catalogue position.
29
+ */
30
+ order?: 'first' | 'last';
31
+ };
32
+ /** Pick an adapter by name, with optional field overrides. */
33
+ export type UseConfig = {
34
+ use: string;
35
+ command?: string;
36
+ args?: string[];
37
+ description?: string;
38
+ outputFile?: string | null;
39
+ changedArgs?: string[];
40
+ fixArgs?: string[];
41
+ timeout?: number;
42
+ };
43
+ /** Per-slot config: adapter name, `false` to disable, an override, or a custom check. */
44
+ export type SlotConfig = string | false | UseConfig | CustomCheck;
45
+ /** Shape of `checkride.config.json`. */
46
+ export type CheckrideConfig = {
47
+ checks?: Record<string, SlotConfig>;
48
+ /** Default per-check timeout in seconds (no cap when unset). `0` on a check disables its cap. */
49
+ timeout?: number;
50
+ };
51
+ /** A slot resolved to a concrete adapter, or marked skipped with a reason. */
52
+ export type ResolvedCheck = {
53
+ slot: string;
54
+ optIn: boolean;
55
+ adapter: Adapter | null;
56
+ skip: string | null;
57
+ };
58
+ /** Read and parse `checkride.config.json` from `cwd`, or `null` when absent. */
59
+ export declare function loadConfig(cwd: string): CheckrideConfig | null;
60
+ /**
61
+ * Resolve every catalogue slot (in order) to an adapter or a skip reason, and
62
+ * fold in any config-only custom checks (an object with a `command`, keyed by a
63
+ * name not in the catalogue — e.g. a project's `"licenses"` check). Each custom
64
+ * check runs ahead of the catalogue (`order: 'first'`) or after it (`'last'`,
65
+ * the default); within a group, config key order is preserved.
66
+ */
67
+ export declare function resolveChecks(input: {
68
+ slots: readonly Slot[];
69
+ adapters: readonly Adapter[];
70
+ config: CheckrideConfig | null;
71
+ cwd?: string;
72
+ fileExists?: (file: string) => boolean;
73
+ }): ResolvedCheck[];
74
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnD,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEF,8DAA8D;AAC9D,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,CAAC;AAElE,wCAAwC;AACxC,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAIF,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAW9D;AAsFD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC,GAAG,aAAa,EAAE,CAoBlB"}