@outfitter/tooling 0.2.2 → 0.2.4
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/README.md +23 -0
- package/dist/cli/check-boundary-invocations.d.ts +34 -0
- package/dist/cli/check-boundary-invocations.js +14 -0
- package/dist/cli/check-bunup-registry.d.ts +36 -0
- package/dist/cli/check-bunup-registry.js +12 -0
- package/dist/cli/check-changeset.d.ts +64 -0
- package/dist/cli/check-changeset.js +14 -0
- package/dist/cli/check-clean-tree.d.ts +36 -0
- package/dist/cli/check-clean-tree.js +14 -0
- package/dist/cli/check-exports.d.ts +2 -0
- package/dist/cli/check-exports.js +14 -0
- package/dist/cli/check-readme-imports.d.ts +61 -0
- package/dist/cli/check-readme-imports.js +198 -0
- package/dist/cli/check.js +1 -0
- package/dist/cli/fix.js +1 -0
- package/dist/cli/index.js +625 -30
- package/dist/cli/init.js +1 -0
- package/dist/cli/pre-push.js +1 -0
- package/dist/cli/upgrade-bun.js +1 -0
- package/dist/index.d.ts +2 -33
- package/dist/index.js +5 -2
- package/dist/registry/build.js +1 -0
- package/dist/registry/index.js +1 -0
- package/dist/registry/schema.js +1 -0
- package/dist/shared/@outfitter/tooling-1y8w5ahg.js +70 -0
- package/dist/shared/@outfitter/tooling-3w8vr2w3.js +94 -0
- package/dist/shared/@outfitter/tooling-9vs606gq.d.ts +3 -0
- package/dist/shared/@outfitter/tooling-ctmgnap5.js +19 -0
- package/dist/shared/@outfitter/tooling-dvwh9qve.js +4 -0
- package/dist/shared/@outfitter/tooling-enjcenja.js +229 -0
- package/dist/shared/@outfitter/tooling-r9976n43.js +100 -0
- package/dist/shared/@outfitter/tooling-t17gnh9b.js +78 -0
- package/dist/shared/@outfitter/tooling-wesswf21.d.ts +59 -0
- package/dist/shared/chunk-3s189drz.js +4 -0
- package/dist/shared/chunk-7tdgbqb0.js +197 -0
- package/dist/shared/chunk-8aenrm6f.js +18 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +8 -0
- package/package.json +25 -22
- package/registry/registry.json +1 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/tooling/src/cli/check-bunup-registry.ts
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
function extractBunupFilterName(script) {
|
|
5
|
+
const match = script.match(/bunup\s+--filter\s+(\S+)/);
|
|
6
|
+
return match?.[1] ?? null;
|
|
7
|
+
}
|
|
8
|
+
function findUnregisteredPackages(packagesWithFilter, registeredNames) {
|
|
9
|
+
const registered = new Set(registeredNames);
|
|
10
|
+
const missing = packagesWithFilter.filter((name) => !registered.has(name)).sort();
|
|
11
|
+
return {
|
|
12
|
+
ok: missing.length === 0,
|
|
13
|
+
missing
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
var COLORS = {
|
|
17
|
+
reset: "\x1B[0m",
|
|
18
|
+
red: "\x1B[31m",
|
|
19
|
+
green: "\x1B[32m",
|
|
20
|
+
yellow: "\x1B[33m",
|
|
21
|
+
blue: "\x1B[34m",
|
|
22
|
+
dim: "\x1B[2m"
|
|
23
|
+
};
|
|
24
|
+
async function runCheckBunupRegistry() {
|
|
25
|
+
const cwd = process.cwd();
|
|
26
|
+
const configPath = resolve(cwd, "bunup.config.ts");
|
|
27
|
+
let registeredNames;
|
|
28
|
+
try {
|
|
29
|
+
const configModule = await import(configPath);
|
|
30
|
+
const rawConfig = configModule.default;
|
|
31
|
+
if (!Array.isArray(rawConfig)) {
|
|
32
|
+
process.stderr.write(`bunup.config.ts must export a workspace array
|
|
33
|
+
`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
registeredNames = rawConfig.map((entry) => entry.name);
|
|
37
|
+
} catch {
|
|
38
|
+
process.stderr.write(`Could not load bunup.config.ts from ${cwd}
|
|
39
|
+
`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const packagesWithFilter = [];
|
|
43
|
+
const glob = new Bun.Glob("{packages,apps}/*/package.json");
|
|
44
|
+
for (const match of glob.scanSync({ cwd })) {
|
|
45
|
+
const pkgPath = resolve(cwd, match);
|
|
46
|
+
try {
|
|
47
|
+
const pkg = await Bun.file(pkgPath).json();
|
|
48
|
+
const buildScript = pkg.scripts?.["build"];
|
|
49
|
+
if (!buildScript)
|
|
50
|
+
continue;
|
|
51
|
+
const filterName = extractBunupFilterName(buildScript);
|
|
52
|
+
if (filterName) {
|
|
53
|
+
packagesWithFilter.push(filterName);
|
|
54
|
+
}
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
const result = findUnregisteredPackages(packagesWithFilter, registeredNames);
|
|
58
|
+
if (result.ok) {
|
|
59
|
+
process.stdout.write(`${COLORS.green}All ${packagesWithFilter.length} packages with bunup --filter are registered in bunup.config.ts.${COLORS.reset}
|
|
60
|
+
`);
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
process.stderr.write(`${COLORS.red}${result.missing.length} package(s) have bunup --filter build scripts but are not registered in bunup.config.ts:${COLORS.reset}
|
|
64
|
+
|
|
65
|
+
`);
|
|
66
|
+
for (const name of result.missing) {
|
|
67
|
+
process.stderr.write(` ${COLORS.yellow}${name}${COLORS.reset} ${COLORS.dim}(missing from workspace array)${COLORS.reset}
|
|
68
|
+
`);
|
|
69
|
+
}
|
|
70
|
+
process.stderr.write(`
|
|
71
|
+
Add the missing entries to ${COLORS.blue}bunup.config.ts${COLORS.reset} defineWorkspace array.
|
|
72
|
+
`);
|
|
73
|
+
process.stderr.write(`Without registration, ${COLORS.dim}bunup --filter <name>${COLORS.reset} silently exits with no output.
|
|
74
|
+
`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { extractBunupFilterName, findUnregisteredPackages, runCheckBunupRegistry };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** A package.json map: keys are subpaths, values are conditions or strings */
|
|
2
|
+
type ExportMap = Record<string, unknown>;
|
|
3
|
+
/** Describes drift between expected and actual exports for a single package */
|
|
4
|
+
interface ExportDrift {
|
|
5
|
+
readonly package: string;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly added: string[];
|
|
8
|
+
readonly removed: string[];
|
|
9
|
+
readonly changed: Array<{
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly expected: unknown;
|
|
12
|
+
readonly actual: unknown;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
/** Per-package comparison result */
|
|
16
|
+
interface PackageResult {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly status: "ok" | "drift";
|
|
19
|
+
readonly drift?: ExportDrift;
|
|
20
|
+
}
|
|
21
|
+
/** Aggregated result across all checked packages */
|
|
22
|
+
interface CheckResult {
|
|
23
|
+
readonly ok: boolean;
|
|
24
|
+
readonly packages: PackageResult[];
|
|
25
|
+
}
|
|
26
|
+
/** Input for comparing a single package's exports */
|
|
27
|
+
interface CompareInput {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly actual: ExportMap;
|
|
30
|
+
readonly expected: ExportMap;
|
|
31
|
+
readonly path?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Convert a source entry file path to its subpath.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* entryToSubpath("src/index.ts") // "."
|
|
38
|
+
* entryToSubpath("src/branded.ts") // "./branded"
|
|
39
|
+
* entryToSubpath("src/cli/index.ts") // "./cli"
|
|
40
|
+
* entryToSubpath("src/cli/check.ts") // "./cli/check"
|
|
41
|
+
*/
|
|
42
|
+
declare function entryToSubpath(entry: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Compare actual vs expected exports for a single package.
|
|
45
|
+
*
|
|
46
|
+
* Returns a PackageResult with status "ok" or "drift" and detailed diff.
|
|
47
|
+
*/
|
|
48
|
+
declare function compareExports(input: CompareInput): PackageResult;
|
|
49
|
+
interface CheckExportsOptions {
|
|
50
|
+
readonly json?: boolean;
|
|
51
|
+
}
|
|
52
|
+
declare function resolveJsonMode(options?: CheckExportsOptions): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Run check-exports across all workspace packages.
|
|
55
|
+
*
|
|
56
|
+
* Reads the bunup workspace config to discover packages and their * settings, then compares expected vs actual exports in each package.json.
|
|
57
|
+
*/
|
|
58
|
+
declare function runCheckExports(options?: CheckExportsOptions): Promise<void>;
|
|
59
|
+
export { ExportMap, ExportDrift, PackageResult, CheckResult, CompareInput, entryToSubpath, compareExports, CheckExportsOptions, resolveJsonMode, runCheckExports };
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import"./chunk-3s189drz.js";
|
|
2
|
+
|
|
3
|
+
// src/cli/check-readme-imports.ts
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
function parseSpecifier(specifier) {
|
|
6
|
+
if (!specifier.startsWith("@outfitter/")) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const parts = specifier.split("/");
|
|
10
|
+
if (parts.length < 2) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const packageName = `${parts[0]}/${parts[1]}`;
|
|
14
|
+
const rest = parts.slice(2);
|
|
15
|
+
if (rest.length === 0) {
|
|
16
|
+
return { packageName, subpath: "." };
|
|
17
|
+
}
|
|
18
|
+
return { packageName, subpath: `./${rest.join("/")}` };
|
|
19
|
+
}
|
|
20
|
+
function extractImports(content, file) {
|
|
21
|
+
const lines = content.split(`
|
|
22
|
+
`);
|
|
23
|
+
const results = [];
|
|
24
|
+
const seen = new Set;
|
|
25
|
+
const CODE_FENCE_OPEN = /^```(?:typescript|ts|javascript|js)\s*$/;
|
|
26
|
+
const CODE_FENCE_CLOSE = /^```\s*$/;
|
|
27
|
+
const IMPORT_RE = /from\s+["'](@outfitter\/[^"']+)["']/;
|
|
28
|
+
const NON_CONTRACTUAL = /<!--\s*non-contractual\s*-->/;
|
|
29
|
+
let inCodeBlock = false;
|
|
30
|
+
let skipBlock = false;
|
|
31
|
+
for (let i = 0;i < lines.length; i++) {
|
|
32
|
+
const line = lines[i];
|
|
33
|
+
if (!inCodeBlock) {
|
|
34
|
+
if (CODE_FENCE_OPEN.test(line)) {
|
|
35
|
+
inCodeBlock = true;
|
|
36
|
+
skipBlock = false;
|
|
37
|
+
for (let j = i - 1;j >= 0; j--) {
|
|
38
|
+
const prev = lines[j].trim();
|
|
39
|
+
if (prev === "")
|
|
40
|
+
continue;
|
|
41
|
+
if (NON_CONTRACTUAL.test(prev)) {
|
|
42
|
+
skipBlock = true;
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (CODE_FENCE_CLOSE.test(line) && !CODE_FENCE_OPEN.test(line)) {
|
|
50
|
+
inCodeBlock = false;
|
|
51
|
+
skipBlock = false;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (skipBlock)
|
|
55
|
+
continue;
|
|
56
|
+
const match = IMPORT_RE.exec(line);
|
|
57
|
+
if (!match?.[1])
|
|
58
|
+
continue;
|
|
59
|
+
const fullSpecifier = match[1];
|
|
60
|
+
if (seen.has(fullSpecifier))
|
|
61
|
+
continue;
|
|
62
|
+
seen.add(fullSpecifier);
|
|
63
|
+
const parsed = parseSpecifier(fullSpecifier);
|
|
64
|
+
if (!parsed)
|
|
65
|
+
continue;
|
|
66
|
+
results.push({
|
|
67
|
+
packageName: parsed.packageName,
|
|
68
|
+
subpath: parsed.subpath,
|
|
69
|
+
fullSpecifier,
|
|
70
|
+
file,
|
|
71
|
+
line: i + 1
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
function isExportedSubpath(subpath, exports) {
|
|
77
|
+
return subpath in exports;
|
|
78
|
+
}
|
|
79
|
+
var COLORS = {
|
|
80
|
+
reset: "\x1B[0m",
|
|
81
|
+
red: "\x1B[31m",
|
|
82
|
+
green: "\x1B[32m",
|
|
83
|
+
yellow: "\x1B[33m",
|
|
84
|
+
blue: "\x1B[34m",
|
|
85
|
+
dim: "\x1B[2m"
|
|
86
|
+
};
|
|
87
|
+
function resolveJsonMode(options = {}) {
|
|
88
|
+
return options.json ?? process.env["OUTFITTER_JSON"] === "1";
|
|
89
|
+
}
|
|
90
|
+
async function runCheckReadmeImports(options = {}) {
|
|
91
|
+
const cwd = process.cwd();
|
|
92
|
+
const readmeGlob = new Bun.Glob("**/README.md");
|
|
93
|
+
const readmeDirs = ["packages", "docs/packages"];
|
|
94
|
+
const readmePaths = [];
|
|
95
|
+
for (const dir of readmeDirs) {
|
|
96
|
+
const fullDir = resolve(cwd, dir);
|
|
97
|
+
try {
|
|
98
|
+
for (const match of readmeGlob.scanSync({ cwd: fullDir, dot: false })) {
|
|
99
|
+
const segments = match.split("/");
|
|
100
|
+
if (segments.length === 2 && segments[1] === "README.md") {
|
|
101
|
+
readmePaths.push(resolve(fullDir, match));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
} catch {}
|
|
105
|
+
}
|
|
106
|
+
if (readmePaths.length === 0) {
|
|
107
|
+
process.stdout.write(`No README.md files found.
|
|
108
|
+
`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const exportsCache = new Map;
|
|
112
|
+
async function getExportsForPackage(packageName) {
|
|
113
|
+
if (exportsCache.has(packageName)) {
|
|
114
|
+
return exportsCache.get(packageName) ?? null;
|
|
115
|
+
}
|
|
116
|
+
const shortName = packageName.replace("@outfitter/", "");
|
|
117
|
+
const pkgPath = resolve(cwd, "packages", shortName, "package.json");
|
|
118
|
+
try {
|
|
119
|
+
const pkg = await Bun.file(pkgPath).json();
|
|
120
|
+
const exports = typeof pkg.exports === "object" && pkg.exports !== null ? pkg.exports : {};
|
|
121
|
+
exportsCache.set(packageName, exports);
|
|
122
|
+
return exports;
|
|
123
|
+
} catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const results = [];
|
|
128
|
+
let hasInvalid = false;
|
|
129
|
+
for (const readmePath of readmePaths.sort()) {
|
|
130
|
+
const content = await Bun.file(readmePath).text();
|
|
131
|
+
const relativePath = readmePath.replace(`${cwd}/`, "");
|
|
132
|
+
const imports = extractImports(content, relativePath);
|
|
133
|
+
if (imports.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
const valid = [];
|
|
136
|
+
const invalid = [];
|
|
137
|
+
for (const imp of imports) {
|
|
138
|
+
const exports = await getExportsForPackage(imp.packageName);
|
|
139
|
+
if (exports === null) {
|
|
140
|
+
invalid.push(imp);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (isExportedSubpath(imp.subpath, exports)) {
|
|
144
|
+
valid.push(imp);
|
|
145
|
+
} else {
|
|
146
|
+
invalid.push(imp);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (valid.length > 0 || invalid.length > 0) {
|
|
150
|
+
results.push({ file: relativePath, valid, invalid });
|
|
151
|
+
}
|
|
152
|
+
if (invalid.length > 0) {
|
|
153
|
+
hasInvalid = true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (resolveJsonMode(options)) {
|
|
157
|
+
const output = {
|
|
158
|
+
ok: !hasInvalid,
|
|
159
|
+
files: results
|
|
160
|
+
};
|
|
161
|
+
process.stdout.write(`${JSON.stringify(output, null, 2)}
|
|
162
|
+
`);
|
|
163
|
+
} else {
|
|
164
|
+
const totalValid = results.reduce((n, r) => n + r.valid.length, 0);
|
|
165
|
+
const totalInvalid = results.reduce((n, r) => n + r.invalid.length, 0);
|
|
166
|
+
if (!hasInvalid) {
|
|
167
|
+
process.stdout.write(`${COLORS.green}All ${totalValid} README import examples match package exports.${COLORS.reset}
|
|
168
|
+
`);
|
|
169
|
+
} else {
|
|
170
|
+
process.stderr.write(`${COLORS.red}Invalid README import examples found:${COLORS.reset}
|
|
171
|
+
|
|
172
|
+
`);
|
|
173
|
+
for (const result of results) {
|
|
174
|
+
if (result.invalid.length === 0)
|
|
175
|
+
continue;
|
|
176
|
+
process.stderr.write(` ${COLORS.yellow}${result.file}${COLORS.reset}
|
|
177
|
+
`);
|
|
178
|
+
for (const imp of result.invalid) {
|
|
179
|
+
process.stderr.write(` ${COLORS.red}line ${imp.line}:${COLORS.reset} ${imp.fullSpecifier} ${COLORS.dim}(subpath ${imp.subpath} not in ${imp.packageName} exports)${COLORS.reset}
|
|
180
|
+
`);
|
|
181
|
+
}
|
|
182
|
+
process.stderr.write(`
|
|
183
|
+
`);
|
|
184
|
+
}
|
|
185
|
+
process.stderr.write(`${totalInvalid} invalid, ${totalValid} valid across ${results.length} file(s).
|
|
186
|
+
`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
process.exit(hasInvalid ? 1 : 0);
|
|
190
|
+
}
|
|
191
|
+
export {
|
|
192
|
+
runCheckReadmeImports,
|
|
193
|
+
resolveJsonMode,
|
|
194
|
+
parseSpecifier,
|
|
195
|
+
isExportedSubpath,
|
|
196
|
+
extractImports
|
|
197
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/version.ts
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
var DEFAULT_VERSION = "0.0.0";
|
|
5
|
+
function readPackageVersion() {
|
|
6
|
+
try {
|
|
7
|
+
const require2 = createRequire(import.meta.url);
|
|
8
|
+
const pkgPath = require2.resolve("@outfitter/tooling/package.json");
|
|
9
|
+
const packageJson = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
10
|
+
if (typeof packageJson.version === "string" && packageJson.version.length > 0) {
|
|
11
|
+
return packageJson.version;
|
|
12
|
+
}
|
|
13
|
+
} catch {}
|
|
14
|
+
return DEFAULT_VERSION;
|
|
15
|
+
}
|
|
16
|
+
var VERSION = readPackageVersion();
|
|
17
|
+
|
|
18
|
+
export { VERSION };
|
package/dist/version.js
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outfitter/tooling",
|
|
3
3
|
"description": "Dev tooling configuration presets for Outfitter projects (biome, typescript, lefthook, markdownlint)",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -21,16 +21,14 @@
|
|
|
21
21
|
"default": "./dist/index.js"
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
},
|
|
30
|
-
"./cli/init": {
|
|
24
|
+
"./.markdownlint-cli2": "./.markdownlint-cli2.jsonc",
|
|
25
|
+
"./.markdownlint-cli2.jsonc": "./.markdownlint-cli2.jsonc",
|
|
26
|
+
"./biome": "./biome.json",
|
|
27
|
+
"./biome.json": "./biome.json",
|
|
28
|
+
"./cli/check": {
|
|
31
29
|
"import": {
|
|
32
|
-
"types": "./dist/cli/
|
|
33
|
-
"default": "./dist/cli/
|
|
30
|
+
"types": "./dist/cli/check.d.ts",
|
|
31
|
+
"default": "./dist/cli/check.js"
|
|
34
32
|
}
|
|
35
33
|
},
|
|
36
34
|
"./cli/fix": {
|
|
@@ -39,23 +37,25 @@
|
|
|
39
37
|
"default": "./dist/cli/fix.js"
|
|
40
38
|
}
|
|
41
39
|
},
|
|
42
|
-
"./cli/
|
|
40
|
+
"./cli/init": {
|
|
43
41
|
"import": {
|
|
44
|
-
"types": "./dist/cli/
|
|
45
|
-
"default": "./dist/cli/
|
|
42
|
+
"types": "./dist/cli/init.d.ts",
|
|
43
|
+
"default": "./dist/cli/init.js"
|
|
46
44
|
}
|
|
47
45
|
},
|
|
46
|
+
"./lefthook": "./lefthook.yml",
|
|
47
|
+
"./lefthook.yml": "./lefthook.yml",
|
|
48
48
|
"./package.json": "./package.json",
|
|
49
|
-
"./
|
|
50
|
-
|
|
49
|
+
"./registry": {
|
|
50
|
+
"import": {
|
|
51
|
+
"types": "./dist/registry/index.d.ts",
|
|
52
|
+
"default": "./dist/registry/index.js"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
51
55
|
"./tsconfig": "./tsconfig.preset.json",
|
|
52
|
-
"./tsconfig.preset.json": "./tsconfig.preset.json",
|
|
53
56
|
"./tsconfig-bun": "./tsconfig.preset.bun.json",
|
|
54
57
|
"./tsconfig.preset.bun.json": "./tsconfig.preset.bun.json",
|
|
55
|
-
"./
|
|
56
|
-
"./lefthook.yml": "./lefthook.yml",
|
|
57
|
-
"./.markdownlint-cli2": "./.markdownlint-cli2.jsonc",
|
|
58
|
-
"./.markdownlint-cli2.jsonc": "./.markdownlint-cli2.jsonc"
|
|
58
|
+
"./tsconfig.preset.json": "./tsconfig.preset.json"
|
|
59
59
|
},
|
|
60
60
|
"bin": {
|
|
61
61
|
"tooling": "./dist/cli/index.js"
|
|
@@ -64,16 +64,19 @@
|
|
|
64
64
|
"scripts": {
|
|
65
65
|
"build:registry": "bun run src/registry/build.ts",
|
|
66
66
|
"sync:exports": "bun run scripts/sync-exports.ts",
|
|
67
|
-
"
|
|
67
|
+
"sync:exports:check": "bun run scripts/sync-exports.ts --check",
|
|
68
|
+
"prebuild": "bun run build:registry && bun run sync:exports:check",
|
|
68
69
|
"build": "bunup --filter @outfitter/tooling",
|
|
69
70
|
"prepack": "bun run sync:exports",
|
|
70
71
|
"lint": "biome lint ./src",
|
|
71
72
|
"lint:fix": "biome lint --write ./src",
|
|
72
73
|
"test": "bun test",
|
|
73
74
|
"typecheck": "tsc --noEmit",
|
|
74
|
-
"clean": "rm -rf dist registry"
|
|
75
|
+
"clean": "rm -rf dist registry",
|
|
76
|
+
"prepublishOnly": "bun ../../scripts/check-publish-manifest.ts"
|
|
75
77
|
},
|
|
76
78
|
"dependencies": {
|
|
79
|
+
"@outfitter/cli": "0.5.1",
|
|
77
80
|
"commander": "^14.0.2",
|
|
78
81
|
"zod": "^3.25.17"
|
|
79
82
|
},
|
package/registry/registry.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
9
9
|
"path": ".claude/settings.json",
|
|
10
|
-
"content": "{\n \"hooks\": {\n \"SessionStart\": [\n {\n \"matcher\": \"*\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \"bash \\\"$CLAUDE_PROJECT_DIR/scripts/bootstrap.sh\\\"\",\n \"timeout\": 120\n }\n ]\n }\n ],\n \"Stop\": [\n {\n \"matcher\": \"*\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \"bash \\\"$CLAUDE_PROJECT_DIR/.claude/hooks/format-code-on-stop.sh\\\"\",\n \"timeout\": 60\n }\n ]\n }\n ]\n },\n \"enabledPlugins\": {
|
|
10
|
+
"content": "{\n \"hooks\": {\n \"SessionStart\": [\n {\n \"matcher\": \"*\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \"bash \\\"$CLAUDE_PROJECT_DIR/scripts/bootstrap.sh\\\"\",\n \"timeout\": 120\n }\n ]\n }\n ],\n \"Stop\": [\n {\n \"matcher\": \"*\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \"bash \\\"$CLAUDE_PROJECT_DIR/.claude/hooks/format-code-on-stop.sh\\\"\",\n \"timeout\": 60\n }\n ]\n }\n ]\n },\n \"enabledPlugins\": {},\n \"extraKnownMarketplaces\": {}\n}\n"
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"path": ".claude/hooks/format-code-on-stop.sh",
|