plumbbob 0.5.4 → 0.6.1
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 +9 -0
- 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 +42 -7
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,4EAA4E;IAC5E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAWF,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAgBnG,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CA4BlE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUjE;AAMD,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC,GAAG,cAAc,EAAE,CAcnB;AA0aD,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,CAE1D;AAED,0CAA0C;AAC1C,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAGvE"}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `checkride init` — set up a project (new or existing, auto-detected).
|
|
3
|
+
*
|
|
4
|
+
* New-project mode generates a complete, green-out-of-the-box repo for one of
|
|
5
|
+
* three shapes (flat / monorepo / hybrid); the shapes differ only in
|
|
6
|
+
* tsconfig.json, fallow.toml, and pnpm-workspace.yaml. Existing-project mode is
|
|
7
|
+
* additive: it inventories detectable tools, writes only what is missing
|
|
8
|
+
* (checkride.config.json, the AGENTS stanza, the `check` alias) and never
|
|
9
|
+
* touches an existing tool config.
|
|
10
|
+
*
|
|
11
|
+
* Generation, not transformation: every file is written once; the project owns
|
|
12
|
+
* it afterward.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
15
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
16
|
+
import { basename, dirname, join } from 'node:path';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
import { ADAPTERS, SLOTS } from './adapters.js';
|
|
19
|
+
import { resolveChecks } from './config.js';
|
|
20
|
+
import { runChecks } from './orchestrator.js';
|
|
21
|
+
const NULL_OUT = { write: () => true };
|
|
22
|
+
/** Run the adopted checks once; a failing (non-skipped) check marks its slot. */
|
|
23
|
+
async function defaultProbe(slots, cwd) {
|
|
24
|
+
if (slots.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const { summary } = await runChecks({ cwd, only: slots, json: true, stdout: NULL_OUT, stderr: NULL_OUT });
|
|
27
|
+
return summary.checks.filter((c) => !c.ok && c.skipped !== true).map((c) => c.name);
|
|
28
|
+
}
|
|
29
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const TEMPLATES_DIR = join(HERE, '..', 'templates');
|
|
31
|
+
const STANZA_BEGIN = '<!-- checkride:begin -->';
|
|
32
|
+
const STANZA_END = '<!-- checkride:end -->';
|
|
33
|
+
// ----------------------------------------------------------------------------
|
|
34
|
+
// AGENTS.md stanza (gate: idempotent)
|
|
35
|
+
// ----------------------------------------------------------------------------
|
|
36
|
+
function escapeRegex(text) {
|
|
37
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
38
|
+
}
|
|
39
|
+
/** The agent-facing contract block, parameterized by the active checks. */
|
|
40
|
+
export function buildStanza(activeSlots) {
|
|
41
|
+
return [
|
|
42
|
+
'## Checkride: the definition of done',
|
|
43
|
+
'',
|
|
44
|
+
'`pnpm check` is the single source of truth for "done". Exit 0 means the work is',
|
|
45
|
+
'complete; any other exit code means it is not. Never claim a task is finished while',
|
|
46
|
+
'`pnpm check` is red.',
|
|
47
|
+
'',
|
|
48
|
+
'When it fails:',
|
|
49
|
+
'',
|
|
50
|
+
'1. Read `.check/summary.json` to see which check failed.',
|
|
51
|
+
"2. Read that check's raw output (`.check/<slot>.json` or `.check/<slot>.stdout.txt`).",
|
|
52
|
+
'3. Fix the root cause, then re-run.',
|
|
53
|
+
'',
|
|
54
|
+
'Tight feedback loops: `pnpm check --bail`, `pnpm check --only types,lint`, and',
|
|
55
|
+
'`pnpm check --changed`.',
|
|
56
|
+
'',
|
|
57
|
+
'### Module boundaries',
|
|
58
|
+
'',
|
|
59
|
+
'A module is a unit of encapsulation. A single file is a module; promote it to a',
|
|
60
|
+
'folder with a barrel `index.ts` when it grows internals worth hiding. A folder',
|
|
61
|
+
"module's `index.ts` is its only public surface — re-exports only, no logic. Import",
|
|
62
|
+
"siblings through `'../<sibling>/index.js'`, never their internals.",
|
|
63
|
+
'',
|
|
64
|
+
'Named exports only; no classes; `.js` extensions on relative imports.',
|
|
65
|
+
'',
|
|
66
|
+
`Active checks in this repo: ${activeSlots.join(', ')}.`,
|
|
67
|
+
].join('\n');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Insert or refresh the checkride stanza in an AGENTS.md body. Idempotent:
|
|
71
|
+
* applying twice yields identical output.
|
|
72
|
+
*/
|
|
73
|
+
export function applyStanza(content, body) {
|
|
74
|
+
const block = `${STANZA_BEGIN}\n\n${body}\n\n${STANZA_END}`;
|
|
75
|
+
const re = new RegExp(`${escapeRegex(STANZA_BEGIN)}[\\s\\S]*?${escapeRegex(STANZA_END)}`);
|
|
76
|
+
if (re.test(content)) {
|
|
77
|
+
return content.replace(re, block);
|
|
78
|
+
}
|
|
79
|
+
if (content.trim().length === 0) {
|
|
80
|
+
return `${block}\n`;
|
|
81
|
+
}
|
|
82
|
+
return `${content.replace(/\s*$/, '')}\n\n${block}\n`;
|
|
83
|
+
}
|
|
84
|
+
// ----------------------------------------------------------------------------
|
|
85
|
+
// Inventory (gate: adoption inventory)
|
|
86
|
+
// ----------------------------------------------------------------------------
|
|
87
|
+
/** For each default (non-opt-in) slot, report whether a tool config is present. */
|
|
88
|
+
export function inventory(input) {
|
|
89
|
+
const slots = (input.slots ?? SLOTS).filter((s) => !s.optIn);
|
|
90
|
+
const resolved = resolveChecks({
|
|
91
|
+
slots,
|
|
92
|
+
adapters: input.adapters ?? ADAPTERS,
|
|
93
|
+
config: null,
|
|
94
|
+
...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
|
|
95
|
+
...(input.fileExists !== undefined ? { fileExists: input.fileExists } : {}),
|
|
96
|
+
});
|
|
97
|
+
return resolved.map((r) => ({
|
|
98
|
+
slot: r.slot,
|
|
99
|
+
status: r.adapter ? 'adopted' : 'empty',
|
|
100
|
+
adapter: r.adapter?.name ?? null,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
// ----------------------------------------------------------------------------
|
|
104
|
+
// Generation helpers
|
|
105
|
+
// ----------------------------------------------------------------------------
|
|
106
|
+
function readTemplate(rel) {
|
|
107
|
+
return readFileSync(join(TEMPLATES_DIR, rel), 'utf8');
|
|
108
|
+
}
|
|
109
|
+
function render(text, vars) {
|
|
110
|
+
return text.replace(/\{\{(\w+)\}\}/g, (_m, key) => vars[key] ?? '');
|
|
111
|
+
}
|
|
112
|
+
function constName(name) {
|
|
113
|
+
const id = name.toUpperCase().replace(/[^A-Z0-9]+/g, '_').replace(/^_+|_+$/g, '');
|
|
114
|
+
return id.length > 0 ? id : 'APP';
|
|
115
|
+
}
|
|
116
|
+
function productVersion() {
|
|
117
|
+
try {
|
|
118
|
+
const raw = readFileSync(join(TEMPLATES_DIR, '..', 'package.json'), 'utf8');
|
|
119
|
+
const pkg = JSON.parse(raw);
|
|
120
|
+
return pkg.version ?? '0.1.0';
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return '0.1.0';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function collectDevDeps(adapters, slots, checkrideSpec) {
|
|
127
|
+
const deps = {};
|
|
128
|
+
for (const slot of slots) {
|
|
129
|
+
if (slot.optIn)
|
|
130
|
+
continue;
|
|
131
|
+
const adapter = adapters.find((a) => a.slot === slot.name);
|
|
132
|
+
if (adapter)
|
|
133
|
+
Object.assign(deps, adapter.devDeps);
|
|
134
|
+
}
|
|
135
|
+
deps['checkride'] = checkrideSpec;
|
|
136
|
+
const sorted = {};
|
|
137
|
+
for (const key of Object.keys(deps).toSorted())
|
|
138
|
+
sorted[key] = deps[key] ?? '';
|
|
139
|
+
return sorted;
|
|
140
|
+
}
|
|
141
|
+
function rootPackageJson(fullName, license, author, devDeps, workspace) {
|
|
142
|
+
const pkg = {
|
|
143
|
+
name: fullName,
|
|
144
|
+
version: '0.1.0',
|
|
145
|
+
description: '',
|
|
146
|
+
license,
|
|
147
|
+
...(author ? { author } : {}),
|
|
148
|
+
type: 'module',
|
|
149
|
+
...(workspace ? { private: true } : {}),
|
|
150
|
+
engines: { node: '>=22.18.0', pnpm: '>=9.0.0' },
|
|
151
|
+
scripts: {
|
|
152
|
+
check: 'checkride',
|
|
153
|
+
'check:all': 'checkride --all',
|
|
154
|
+
'check:json': 'checkride --json',
|
|
155
|
+
'check:bail': 'checkride --bail',
|
|
156
|
+
'check:changed': 'checkride --changed',
|
|
157
|
+
'check:fix': 'checkride fix',
|
|
158
|
+
doctor: 'checkride doctor',
|
|
159
|
+
test: 'vitest run',
|
|
160
|
+
'test:watch': 'vitest',
|
|
161
|
+
build: 'tsc --build',
|
|
162
|
+
types: 'tsc --build',
|
|
163
|
+
},
|
|
164
|
+
devDependencies: devDeps,
|
|
165
|
+
};
|
|
166
|
+
return `${JSON.stringify(pkg, null, 2)}\n`;
|
|
167
|
+
}
|
|
168
|
+
function packageJsonFor(pkgName) {
|
|
169
|
+
const pkg = {
|
|
170
|
+
name: pkgName,
|
|
171
|
+
version: '0.0.0',
|
|
172
|
+
private: true,
|
|
173
|
+
type: 'module',
|
|
174
|
+
exports: { '.': './src/index.ts' },
|
|
175
|
+
};
|
|
176
|
+
return `${JSON.stringify(pkg, null, 2)}\n`;
|
|
177
|
+
}
|
|
178
|
+
const PACKAGE_TSCONFIG = `${JSON.stringify({
|
|
179
|
+
extends: '../../tsconfig.base.json',
|
|
180
|
+
compilerOptions: { rootDir: './src', outDir: './dist' },
|
|
181
|
+
include: ['src/**/*'],
|
|
182
|
+
exclude: ['dist', 'node_modules'],
|
|
183
|
+
}, null, 2)}\n`;
|
|
184
|
+
function sourceModule(value) {
|
|
185
|
+
const id = constName(value);
|
|
186
|
+
return `export const ${id} = '${value}';\n`;
|
|
187
|
+
}
|
|
188
|
+
function smokeTest(value) {
|
|
189
|
+
const id = constName(value);
|
|
190
|
+
return [
|
|
191
|
+
"import { expect, test } from 'vitest';",
|
|
192
|
+
'',
|
|
193
|
+
"import { " + id + " } from './index.js';",
|
|
194
|
+
'',
|
|
195
|
+
`test('${value} smoke', () => {`,
|
|
196
|
+
` expect(${id}).toBe('${value}');`,
|
|
197
|
+
'});',
|
|
198
|
+
'',
|
|
199
|
+
].join('\n');
|
|
200
|
+
}
|
|
201
|
+
function readme(name) {
|
|
202
|
+
return [
|
|
203
|
+
`# ${name}`,
|
|
204
|
+
'',
|
|
205
|
+
'A TypeScript project verified by checkride.',
|
|
206
|
+
'',
|
|
207
|
+
'```bash',
|
|
208
|
+
'pnpm check # run the full pipeline; exit 0 = done',
|
|
209
|
+
'```',
|
|
210
|
+
'',
|
|
211
|
+
'See [AGENTS.md](./AGENTS.md) for the contract agents follow in this repository.',
|
|
212
|
+
'',
|
|
213
|
+
].join('\n');
|
|
214
|
+
}
|
|
215
|
+
function claudeMd() {
|
|
216
|
+
return [
|
|
217
|
+
'# CLAUDE.md',
|
|
218
|
+
'',
|
|
219
|
+
'Claude Code-specific notes. See [AGENTS.md](./AGENTS.md) for the full contract.',
|
|
220
|
+
'',
|
|
221
|
+
].join('\n');
|
|
222
|
+
}
|
|
223
|
+
function agentsMd(activeSlots) {
|
|
224
|
+
const intro = ['# AGENTS.md', '', 'Instructions for any coding agent working in this repository.', ''].join('\n');
|
|
225
|
+
return applyStanza(intro, buildStanza(activeSlots));
|
|
226
|
+
}
|
|
227
|
+
const MIT = (year, holder) => [
|
|
228
|
+
'MIT License',
|
|
229
|
+
'',
|
|
230
|
+
`Copyright (c) ${year} ${holder}`,
|
|
231
|
+
'',
|
|
232
|
+
'Permission is hereby granted, free of charge, to any person obtaining a copy',
|
|
233
|
+
'of this software and associated documentation files (the "Software"), to deal',
|
|
234
|
+
'in the Software without restriction, including without limitation the rights',
|
|
235
|
+
'to use, copy, modify, merge, publish, distribute, sublicense, and/or sell',
|
|
236
|
+
'copies of the Software, and to permit persons to whom the Software is',
|
|
237
|
+
'furnished to do so, subject to the following conditions:',
|
|
238
|
+
'',
|
|
239
|
+
'The above copyright notice and this permission notice shall be included in all',
|
|
240
|
+
'copies or substantial portions of the Software.',
|
|
241
|
+
'',
|
|
242
|
+
'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR',
|
|
243
|
+
'IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,',
|
|
244
|
+
'FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE',
|
|
245
|
+
'AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER',
|
|
246
|
+
'LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,',
|
|
247
|
+
'OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE',
|
|
248
|
+
'SOFTWARE.',
|
|
249
|
+
'',
|
|
250
|
+
].join('\n');
|
|
251
|
+
function licenseText(license, holder) {
|
|
252
|
+
const year = new Date().getFullYear();
|
|
253
|
+
if (license === 'MIT')
|
|
254
|
+
return MIT(year, holder);
|
|
255
|
+
return `${license} License\n\nCopyright (c) ${year} ${holder}\n`;
|
|
256
|
+
}
|
|
257
|
+
function cspellWithName(name, scope) {
|
|
258
|
+
const base = JSON.parse(readTemplate('shared/cspell.json'));
|
|
259
|
+
const words = new Set(base.words ?? []);
|
|
260
|
+
for (const token of `${name} ${scope ?? ''}`.split(/[^A-Za-z0-9]+/)) {
|
|
261
|
+
if (token.length > 1)
|
|
262
|
+
words.add(token);
|
|
263
|
+
}
|
|
264
|
+
base.words = [...words].toSorted();
|
|
265
|
+
return `${JSON.stringify(base, null, 2)}\n`;
|
|
266
|
+
}
|
|
267
|
+
async function put(w, relPath, content) {
|
|
268
|
+
w.written.push(relPath);
|
|
269
|
+
if (w.dryRun)
|
|
270
|
+
return;
|
|
271
|
+
const target = join(w.cwd, relPath);
|
|
272
|
+
await mkdir(dirname(target), { recursive: true });
|
|
273
|
+
await writeFile(target, content);
|
|
274
|
+
}
|
|
275
|
+
async function writeSharedStatic(w) {
|
|
276
|
+
const map = [
|
|
277
|
+
['shared/tsconfig.base.json', 'tsconfig.base.json'],
|
|
278
|
+
['shared/oxlintrc.json', '.oxlintrc.json'],
|
|
279
|
+
['shared/markdownlint-cli2.jsonc', '.markdownlint-cli2.jsonc'],
|
|
280
|
+
['shared/sgconfig.yml', 'sgconfig.yml'],
|
|
281
|
+
['shared/vitest.config.ts.template', 'vitest.config.ts'],
|
|
282
|
+
['shared/gitignore', '.gitignore'],
|
|
283
|
+
['shared/npmrc', '.npmrc'],
|
|
284
|
+
];
|
|
285
|
+
for (const [from, to] of map)
|
|
286
|
+
await put(w, to, readTemplate(from));
|
|
287
|
+
for (const rule of ['no-class.yml', 'no-default-export.yml', 'no-deep-sibling-import.yml', 'require-js-extension.yml']) {
|
|
288
|
+
await put(w, join('rules', rule), readTemplate(join('shared', 'rules', rule)));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async function writePackage(w, dir, pkgName, value) {
|
|
292
|
+
await put(w, join(dir, 'package.json'), packageJsonFor(pkgName));
|
|
293
|
+
await put(w, join(dir, 'tsconfig.json'), PACKAGE_TSCONFIG);
|
|
294
|
+
await put(w, join(dir, 'src', 'index.ts'), sourceModule(value));
|
|
295
|
+
await put(w, join(dir, 'src', 'index.test.ts'), smokeTest(value));
|
|
296
|
+
}
|
|
297
|
+
// ----------------------------------------------------------------------------
|
|
298
|
+
// New-project mode
|
|
299
|
+
// ----------------------------------------------------------------------------
|
|
300
|
+
const DEFAULT_ACTIVE_SLOTS = ['types', 'lint', 'struct', 'dead', 'test', 'docs', 'links', 'spell'];
|
|
301
|
+
async function initNew(options, cwd) {
|
|
302
|
+
const shape = options.shape ?? 'flat';
|
|
303
|
+
const name = options.name ?? (basename(cwd) || 'app');
|
|
304
|
+
const scope = options.scope ?? null;
|
|
305
|
+
const license = options.license ?? 'MIT';
|
|
306
|
+
const author = options.author ?? null;
|
|
307
|
+
const fullName = scope ? `${scope}/${name}` : name;
|
|
308
|
+
const adapters = options.adapters ?? ADAPTERS;
|
|
309
|
+
const slots = options.slots ?? SLOTS;
|
|
310
|
+
const checkrideSpec = options.checkrideSpec ?? `^${productVersion()}`;
|
|
311
|
+
const w = { cwd, dryRun: options.dryRun ?? false, written: [] };
|
|
312
|
+
await writeSharedStatic(w);
|
|
313
|
+
await put(w, 'tsconfig.json', render(readTemplate(join(shape, 'tsconfig.json')), { name }));
|
|
314
|
+
await put(w, 'fallow.toml', render(readTemplate(join(shape, 'fallow.toml')), { name }));
|
|
315
|
+
await put(w, 'pnpm-workspace.yaml', render(readTemplate(join(shape, 'pnpm-workspace.yaml')), { name }));
|
|
316
|
+
await put(w, 'cspell.json', cspellWithName(name, scope));
|
|
317
|
+
await put(w, 'package.json', rootPackageJson(fullName, license, author, collectDevDeps(adapters, slots, checkrideSpec), shape !== 'flat'));
|
|
318
|
+
await put(w, 'LICENSE', licenseText(license, author ?? fullName));
|
|
319
|
+
await put(w, 'README.md', readme(name));
|
|
320
|
+
await put(w, 'AGENTS.md', agentsMd(DEFAULT_ACTIVE_SLOTS));
|
|
321
|
+
await put(w, 'CLAUDE.md', claudeMd());
|
|
322
|
+
if (shape === 'flat') {
|
|
323
|
+
await put(w, join('src', 'index.ts'), sourceModule(name));
|
|
324
|
+
await put(w, join('src', 'index.test.ts'), smokeTest(name));
|
|
325
|
+
}
|
|
326
|
+
else if (shape === 'monorepo') {
|
|
327
|
+
await writePackage(w, join('libs', 'core'), scope ? `${scope}/core` : 'core', 'core');
|
|
328
|
+
await writePackage(w, join('apps', name), fullName, name);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
await put(w, join('src', 'index.ts'), sourceModule(name));
|
|
332
|
+
await put(w, join('src', 'index.test.ts'), smokeTest(name));
|
|
333
|
+
await writePackage(w, join('packages', 'core'), scope ? `${scope}/core` : 'core', 'core');
|
|
334
|
+
}
|
|
335
|
+
if (options.stdout) {
|
|
336
|
+
options.stdout.write(`checkride init: generated a ${shape} project (${w.written.length} files)${w.dryRun ? ' [dry run]' : ''}.\n`);
|
|
337
|
+
}
|
|
338
|
+
return { mode: 'new', shape, written: w.written, skipped: [], disabled: [], exitCode: 0 };
|
|
339
|
+
}
|
|
340
|
+
// ----------------------------------------------------------------------------
|
|
341
|
+
// Existing-project mode
|
|
342
|
+
// ----------------------------------------------------------------------------
|
|
343
|
+
async function readIfExists(path) {
|
|
344
|
+
try {
|
|
345
|
+
return await readFile(path, 'utf8');
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Blessed-default config files `--add <slot>` scaffolds for an empty slot.
|
|
352
|
+
// Shape-specific slots (types, dead) use the flat variant — existing repos
|
|
353
|
+
// adopting checkride incrementally are overwhelmingly single-package.
|
|
354
|
+
const ADD_CONFIGS = {
|
|
355
|
+
types: [['shared/tsconfig.base.json', 'tsconfig.base.json'], ['flat/tsconfig.json', 'tsconfig.json']],
|
|
356
|
+
lint: [['shared/oxlintrc.json', '.oxlintrc.json']],
|
|
357
|
+
struct: [
|
|
358
|
+
['shared/sgconfig.yml', 'sgconfig.yml'],
|
|
359
|
+
['shared/rules/no-class.yml', 'rules/no-class.yml'],
|
|
360
|
+
['shared/rules/no-default-export.yml', 'rules/no-default-export.yml'],
|
|
361
|
+
['shared/rules/no-deep-sibling-import.yml', 'rules/no-deep-sibling-import.yml'],
|
|
362
|
+
['shared/rules/require-js-extension.yml', 'rules/require-js-extension.yml'],
|
|
363
|
+
],
|
|
364
|
+
dead: [['flat/fallow.toml', 'fallow.toml']],
|
|
365
|
+
test: [['shared/vitest.config.ts.template', 'vitest.config.ts']],
|
|
366
|
+
docs: [['shared/markdownlint-cli2.jsonc', '.markdownlint-cli2.jsonc']],
|
|
367
|
+
spell: [['shared/cspell.json', 'cspell.json']],
|
|
368
|
+
};
|
|
369
|
+
/** `--add <slots>`: scaffold blessed-default configs for the named empty slots. */
|
|
370
|
+
async function addConfigs(w, add, skipped) {
|
|
371
|
+
for (const slot of add) {
|
|
372
|
+
const files = ADD_CONFIGS[slot];
|
|
373
|
+
if (!files) {
|
|
374
|
+
skipped.push(`--add ${slot} (no blessed config to scaffold)`);
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
for (const [from, to] of files) {
|
|
378
|
+
if (existsSync(join(w.cwd, to)))
|
|
379
|
+
skipped.push(`${to} (exists)`);
|
|
380
|
+
else
|
|
381
|
+
await put(w, to, readTemplate(from));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/** Add the `check: checkride` alias to an existing package.json (never overwrites). */
|
|
386
|
+
async function addCheckAlias(w, skipped) {
|
|
387
|
+
const pkgPath = join(w.cwd, 'package.json');
|
|
388
|
+
const raw = await readIfExists(pkgPath);
|
|
389
|
+
if (raw === null)
|
|
390
|
+
return;
|
|
391
|
+
const pkg = JSON.parse(raw);
|
|
392
|
+
if (pkg.scripts?.['check']) {
|
|
393
|
+
skipped.push('package.json (check script exists)');
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
pkg.scripts = { ...pkg.scripts, check: 'checkride' };
|
|
397
|
+
if (!w.dryRun)
|
|
398
|
+
await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
399
|
+
w.written.push('package.json (added check script)');
|
|
400
|
+
}
|
|
401
|
+
async function initExisting(options, cwd) {
|
|
402
|
+
const adapters = options.adapters ?? ADAPTERS;
|
|
403
|
+
const slots = options.slots ?? SLOTS;
|
|
404
|
+
const w = { cwd, dryRun: options.dryRun ?? false, written: [] };
|
|
405
|
+
const skipped = [];
|
|
406
|
+
// --add scaffolds blessed configs for empty slots before inventory, so the
|
|
407
|
+
// additions are detected and adopted in this same run.
|
|
408
|
+
await addConfigs(w, options.add ?? [], skipped);
|
|
409
|
+
const items = inventory({ cwd, slots, adapters });
|
|
410
|
+
const adopted = items.filter((i) => i.status === 'adopted');
|
|
411
|
+
// Step 3: run each adopted check once; failing slots are recorded as `false`
|
|
412
|
+
// (disabled) so the first `pnpm check` is green-ish — re-enable as you fix.
|
|
413
|
+
const probe = options.probeFailures ?? defaultProbe;
|
|
414
|
+
const failing = new Set(await probe(adopted.map((i) => i.slot), cwd));
|
|
415
|
+
const disabled = adopted.filter((i) => failing.has(i.slot)).map((i) => i.slot);
|
|
416
|
+
// checkride.config.json reflecting adopted tools (and disabled failures). Never
|
|
417
|
+
// overwrite an existing one.
|
|
418
|
+
const configPath = join(cwd, 'checkride.config.json');
|
|
419
|
+
if (!existsSync(configPath)) {
|
|
420
|
+
const checks = {};
|
|
421
|
+
for (const i of adopted) {
|
|
422
|
+
if (failing.has(i.slot))
|
|
423
|
+
checks[i.slot] = false;
|
|
424
|
+
else if (i.adapter)
|
|
425
|
+
checks[i.slot] = i.adapter;
|
|
426
|
+
}
|
|
427
|
+
await put(w, 'checkride.config.json', `${JSON.stringify({ checks }, null, 2)}\n`);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
skipped.push('checkride.config.json (exists)');
|
|
431
|
+
}
|
|
432
|
+
// .gitignore: ensure .check/ is ignored (append, never clobber).
|
|
433
|
+
const gitignorePath = join(cwd, '.gitignore');
|
|
434
|
+
const gi = await readIfExists(gitignorePath);
|
|
435
|
+
if (gi === null) {
|
|
436
|
+
await put(w, '.gitignore', '.check/\n');
|
|
437
|
+
}
|
|
438
|
+
else if (!/^\.check\/?\s*$/m.test(gi)) {
|
|
439
|
+
if (!w.dryRun)
|
|
440
|
+
await writeFile(gitignorePath, `${gi.replace(/\s*$/, '')}\n.check/\n`);
|
|
441
|
+
w.written.push('.gitignore (appended .check/)');
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
skipped.push('.gitignore (.check/ already ignored)');
|
|
445
|
+
}
|
|
446
|
+
// package.json: add the `check: checkride` alias (decision 8) if missing.
|
|
447
|
+
await addCheckAlias(w, skipped);
|
|
448
|
+
// AGENTS.md stanza (create or refresh, idempotent).
|
|
449
|
+
const agentsPath = join(cwd, 'AGENTS.md');
|
|
450
|
+
const existing = await readIfExists(agentsPath);
|
|
451
|
+
const stanza = buildStanza(adopted.map((i) => i.slot));
|
|
452
|
+
const nextAgents = applyStanza(existing ?? '', stanza);
|
|
453
|
+
if (nextAgents !== existing) {
|
|
454
|
+
if (!w.dryRun)
|
|
455
|
+
await writeFile(agentsPath, nextAgents);
|
|
456
|
+
w.written.push(existing === null ? 'AGENTS.md' : 'AGENTS.md (refreshed stanza)');
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
skipped.push('AGENTS.md (stanza unchanged)');
|
|
460
|
+
}
|
|
461
|
+
// CLAUDE.md pointer if absent.
|
|
462
|
+
const claudePath = join(cwd, 'CLAUDE.md');
|
|
463
|
+
if (!existsSync(claudePath)) {
|
|
464
|
+
await put(w, 'CLAUDE.md', claudeMd());
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
skipped.push('CLAUDE.md (exists)');
|
|
468
|
+
}
|
|
469
|
+
if (options.stdout) {
|
|
470
|
+
options.stdout.write(`checkride init: adopted ${adopted.length} slot(s); wrote ${w.written.length} file(s)${w.dryRun ? ' [dry run]' : ''}.\n`);
|
|
471
|
+
if (disabled.length > 0) {
|
|
472
|
+
options.stdout.write(` disabled failing slots (enable as you fix): ${disabled.join(', ')}\n`);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return { mode: 'existing', shape: null, written: w.written, skipped, disabled, exitCode: 0 };
|
|
476
|
+
}
|
|
477
|
+
// ----------------------------------------------------------------------------
|
|
478
|
+
// Entry
|
|
479
|
+
// ----------------------------------------------------------------------------
|
|
480
|
+
/** Detect new vs existing by the presence of a package.json. */
|
|
481
|
+
export function detectMode(cwd) {
|
|
482
|
+
return existsSync(join(cwd, 'package.json')) ? 'existing' : 'new';
|
|
483
|
+
}
|
|
484
|
+
/** Run `checkride init` against `cwd`. */
|
|
485
|
+
export async function runInit(options) {
|
|
486
|
+
const cwd = options.cwd ?? process.cwd();
|
|
487
|
+
return detectMode(cwd) === 'existing' ? initExisting(options, cwd) : initNew(options, cwd);
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
/** The shape every check (spawned or built-in) produces. */
|
|
15
|
+
export type CheckOutcome = {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
exit_code: number;
|
|
18
|
+
stdout: string;
|
|
19
|
+
stderr: string;
|
|
20
|
+
};
|
|
21
|
+
/** Run the links check against `cwd`; never throws on a per-file read failure. */
|
|
22
|
+
export declare function checkLinks(cwd: string): Promise<CheckOutcome>;
|
|
23
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,4DAA4D;AAC5D,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAsGF,kFAAkF;AAClF,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBnE"}
|