@shrkcrft/cli 0.1.0-alpha.28 → 0.1.0-alpha.30
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/dist/commands/baseline.command.d.ts +25 -0
- package/dist/commands/baseline.command.d.ts.map +1 -1
- package/dist/commands/baseline.command.js +64 -17
- package/dist/commands/changelog-data.d.ts.map +1 -1
- package/dist/commands/changelog-data.js +46 -0
- package/dist/commands/check.command.d.ts.map +1 -1
- package/dist/commands/check.command.js +137 -12
- package/dist/commands/code-intel.command.d.ts.map +1 -1
- package/dist/commands/code-intel.command.js +5 -1
- package/dist/commands/command-catalog.d.ts.map +1 -1
- package/dist/commands/command-catalog.js +8 -0
- package/dist/commands/daily.commands.d.ts.map +1 -1
- package/dist/commands/daily.commands.js +11 -1
- package/dist/commands/docs-references.command.d.ts +7 -0
- package/dist/commands/docs-references.command.d.ts.map +1 -0
- package/dist/commands/docs-references.command.js +323 -0
- package/dist/commands/doctor.command.d.ts.map +1 -1
- package/dist/commands/doctor.command.js +3 -2
- package/dist/commands/gates.command.d.ts +13 -1
- package/dist/commands/gates.command.d.ts.map +1 -1
- package/dist/commands/gates.command.js +693 -26
- package/dist/commands/generated.command.d.ts +32 -0
- package/dist/commands/generated.command.d.ts.map +1 -1
- package/dist/commands/generated.command.js +214 -53
- package/dist/commands/graph-code-subverbs.d.ts.map +1 -1
- package/dist/commands/graph-code-subverbs.js +5 -1
- package/dist/commands/help.command.d.ts.map +1 -1
- package/dist/commands/help.command.js +64 -2
- package/dist/commands/policy-lint.command.d.ts.map +1 -1
- package/dist/commands/policy-lint.command.js +52 -10
- package/dist/commands/registry.command.d.ts.map +1 -1
- package/dist/commands/registry.command.js +34 -9
- package/dist/commands/wiring.command.d.ts.map +1 -1
- package/dist/commands/wiring.command.js +4 -3
- package/dist/exit-codes.d.ts +27 -7
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +47 -8
- package/dist/gates/gate-envelope.d.ts +64 -0
- package/dist/gates/gate-envelope.d.ts.map +1 -0
- package/dist/gates/gate-envelope.js +26 -0
- package/dist/gates/gate-rule-globs.d.ts +33 -0
- package/dist/gates/gate-rule-globs.d.ts.map +1 -0
- package/dist/gates/gate-rule-globs.js +101 -0
- package/dist/gates/gate-rule-view.d.ts +9 -3
- package/dist/gates/gate-rule-view.d.ts.map +1 -1
- package/dist/gates/gate-rule-view.js +18 -4
- package/dist/gates/rule-coverage.d.ts +39 -1
- package/dist/gates/rule-coverage.d.ts.map +1 -1
- package/dist/gates/rule-coverage.js +123 -8
- package/dist/gates/run-gate-planes.d.ts +44 -0
- package/dist/gates/run-gate-planes.d.ts.map +1 -0
- package/dist/gates/run-gate-planes.js +261 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +7 -2
- package/package.json +33 -33
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { resolveSourceGlobs } from '@shrkcrft/core';
|
|
2
|
+
import { checkDocReferences } from '@shrkcrft/inspector';
|
|
3
|
+
import { buildRegistrationGraph, matchesAny, registrationOrphans, registrationUnprovided, registryDuplicates, runPolicyLint, runWiring, scanRegistry, } from '@shrkcrft/boundaries';
|
|
4
|
+
import { evaluateBaselineRule } from "../commands/baseline.command.js";
|
|
5
|
+
import { evaluateGeneratedRule, generatedHintFor } from "../commands/generated.command.js";
|
|
6
|
+
/** Evaluate the given rules, dispatching each to its plane's real engine. */
|
|
7
|
+
export function runGatePlanes(rules, options) {
|
|
8
|
+
const results = [];
|
|
9
|
+
const diagnostics = [];
|
|
10
|
+
const byPlane = (plane) => rules.filter((r) => r.plane === plane).map((r) => r.raw);
|
|
11
|
+
results.push(...runWiringPlane(byPlane('wiring'), options, diagnostics));
|
|
12
|
+
results.push(...runPolicyPlane(byPlane('policy'), options));
|
|
13
|
+
results.push(...runRegistryPlane(byPlane('registry'), options));
|
|
14
|
+
results.push(...runRegistrationPlane(byPlane('registration'), options));
|
|
15
|
+
results.push(...runBaselinePlane(byPlane('baseline'), options));
|
|
16
|
+
results.push(...runGeneratedPlane(byPlane('generated'), options));
|
|
17
|
+
results.push(...runDocReferencePlane(byPlane('doc-reference'), options));
|
|
18
|
+
return { results, diagnostics };
|
|
19
|
+
}
|
|
20
|
+
function runWiringPlane(rules, options, diagnostics) {
|
|
21
|
+
if (rules.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const report = runWiring(options.cwd, rules, { excludeDirs: options.excludeDirs });
|
|
24
|
+
diagnostics.push(...report.diagnostics);
|
|
25
|
+
return report.rules.map((r) => {
|
|
26
|
+
const skip = report.skipped.find((s) => s.ruleId === r.ruleId);
|
|
27
|
+
return {
|
|
28
|
+
id: r.ruleId,
|
|
29
|
+
type: 'wiring',
|
|
30
|
+
status: r.status,
|
|
31
|
+
severity: r.severity,
|
|
32
|
+
counts: { declared: r.declaredCount, registered: r.registeredCount },
|
|
33
|
+
violations: r.violations.map((v) => ({
|
|
34
|
+
id: v.token,
|
|
35
|
+
...(v.file ? { file: v.file } : {}),
|
|
36
|
+
...(v.line !== undefined ? { line: v.line } : {}),
|
|
37
|
+
...(v.message ? { message: v.message } : {}),
|
|
38
|
+
...(v.hint ? { hint: v.hint } : {}),
|
|
39
|
+
})),
|
|
40
|
+
...(skip ? { skipReason: skip.reason } : {}),
|
|
41
|
+
...(r.error ? { error: r.error } : {}),
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function runPolicyPlane(rules, options) {
|
|
46
|
+
if (rules.length === 0)
|
|
47
|
+
return [];
|
|
48
|
+
const report = runPolicyLint(options.cwd, rules, { excludeDirs: options.excludeDirs });
|
|
49
|
+
return report.rules.map((r) => {
|
|
50
|
+
const rule = rules.find((x) => x.id === r.ruleId);
|
|
51
|
+
const findings = report.findings.filter((f) => f.ruleId === r.ruleId);
|
|
52
|
+
const skip = report.skipped.find((s) => s.ruleId === r.ruleId);
|
|
53
|
+
return {
|
|
54
|
+
id: r.ruleId,
|
|
55
|
+
type: 'policy',
|
|
56
|
+
status: r.status,
|
|
57
|
+
severity: r.severity,
|
|
58
|
+
counts: { units: r.unitsScanned, findings: r.findingCount, suppressed: r.suppressedCount },
|
|
59
|
+
violations: findings.map((f) => ({
|
|
60
|
+
id: f.file,
|
|
61
|
+
file: f.file,
|
|
62
|
+
line: f.line,
|
|
63
|
+
message: f.message,
|
|
64
|
+
...(f.suggest ?? rule?.suggest ? { hint: f.suggest ?? rule.suggest } : {}),
|
|
65
|
+
})),
|
|
66
|
+
...(skip ? { skipReason: skip.reason } : {}),
|
|
67
|
+
...(r.error ? { error: r.error } : {}),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The registry plane's violation check is DUPLICATES: two roots claiming one id
|
|
73
|
+
* compile fine, and whichever registration wins at runtime is an accident of
|
|
74
|
+
* load order. (Presence queries are lookups, not gates, so they are not run.)
|
|
75
|
+
*/
|
|
76
|
+
function runRegistryPlane(decls, options) {
|
|
77
|
+
return decls.map((decl) => {
|
|
78
|
+
const inventory = scanRegistry(options.cwd, decl, { excludeDirs: options.excludeDirs });
|
|
79
|
+
const dupes = registryDuplicates(inventory);
|
|
80
|
+
const empty = inventory.entries.length === 0;
|
|
81
|
+
return {
|
|
82
|
+
id: decl.name,
|
|
83
|
+
type: 'registry',
|
|
84
|
+
status: empty ? 'skipped' : dupes.length > 0 ? 'failed' : 'passed',
|
|
85
|
+
severity: 'warning',
|
|
86
|
+
counts: { ids: inventory.entries.length, duplicates: dupes.length },
|
|
87
|
+
violations: dupes.map((d) => ({
|
|
88
|
+
id: d.id,
|
|
89
|
+
...(d.sites[0] ? { file: d.sites[0].file, line: d.sites[0].line } : {}),
|
|
90
|
+
message: `declared in ${d.sites.length} places: ${d.sites.map((s) => `${s.file}:${s.line}`).join(', ')}`,
|
|
91
|
+
hint: 'remove the duplicate declaration — which one wins is load-order roulette',
|
|
92
|
+
})),
|
|
93
|
+
...(empty ? { skipReason: 'matched 0 ids — the source selector is probably stale' } : {}),
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The registration plane's violation check is UNPROVIDED: a token declared or
|
|
99
|
+
* consumed but provided by nothing resolves to nothing at runtime — invisible
|
|
100
|
+
* to the compiler, which is the entire reason this plane exists. Orphans (a
|
|
101
|
+
* provider nothing consumes) are COUNTED but do not fail: a registration ahead
|
|
102
|
+
* of its consumer is a normal intermediate state, not a defect.
|
|
103
|
+
*/
|
|
104
|
+
function runRegistrationPlane(idioms, options) {
|
|
105
|
+
if (idioms.length === 0)
|
|
106
|
+
return [];
|
|
107
|
+
// The graph is built from EVERY idiom at once (that is what makes a
|
|
108
|
+
// declared→provided→consumed chain traceable across them), so a finding has
|
|
109
|
+
// to be attributed back by matching its sites against each idiom's own globs.
|
|
110
|
+
// Dumping every finding on the first idiom would leave the others reading
|
|
111
|
+
// `passed` while their tokens resolve to nothing — a green that means nothing.
|
|
112
|
+
const graph = buildRegistrationGraph(options.cwd, idioms, { excludeDirs: options.excludeDirs });
|
|
113
|
+
const unprovided = registrationUnprovided(graph, options.changedFiles);
|
|
114
|
+
const orphans = registrationOrphans(graph, options.changedFiles);
|
|
115
|
+
const ownsFile = (idiom, file) => matchesAny(file, [
|
|
116
|
+
...resolveSourceGlobs(idiom.declared),
|
|
117
|
+
...resolveSourceGlobs(idiom.consumed),
|
|
118
|
+
...resolveSourceGlobs(idiom.provided),
|
|
119
|
+
]);
|
|
120
|
+
return idioms.map((idiom) => {
|
|
121
|
+
const mine = unprovided.filter((t) => [...t.declared, ...t.consumed].some((site) => ownsFile(idiom, site.file)));
|
|
122
|
+
const myOrphans = orphans.filter((t) => t.provided.some((site) => ownsFile(idiom, site.file)));
|
|
123
|
+
const empty = graph.tokens.length === 0;
|
|
124
|
+
return {
|
|
125
|
+
id: idiom.name,
|
|
126
|
+
type: 'registration',
|
|
127
|
+
status: empty
|
|
128
|
+
? 'skipped'
|
|
129
|
+
: mine.length > 0
|
|
130
|
+
? 'failed'
|
|
131
|
+
: 'passed',
|
|
132
|
+
severity: 'warning',
|
|
133
|
+
counts: { tokens: graph.tokens.length, unprovided: mine.length, orphans: myOrphans.length },
|
|
134
|
+
violations: mine.map((t) => ({
|
|
135
|
+
id: t.token,
|
|
136
|
+
...(t.declared[0] ? { file: t.declared[0].file, line: t.declared[0].line } : {}),
|
|
137
|
+
message: 'declared/consumed but provided by nothing — resolves to nothing at runtime',
|
|
138
|
+
hint: `trace it with \`shrk wiring chain ${t.token}\``,
|
|
139
|
+
})),
|
|
140
|
+
...(empty ? { skipReason: 'registration graph matched 0 tokens' } : {}),
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function runBaselinePlane(rules, options) {
|
|
145
|
+
return rules.map((rule) => {
|
|
146
|
+
// A `command` compute spawns a shell. Under --no-spawn it is reported as
|
|
147
|
+
// skipped WITH the reason, never silently treated as clean.
|
|
148
|
+
if (options.noSpawn && rule.compute.kind === 'command') {
|
|
149
|
+
return {
|
|
150
|
+
id: rule.id,
|
|
151
|
+
type: 'baseline',
|
|
152
|
+
status: 'skipped',
|
|
153
|
+
severity: rule.severity ?? 'error',
|
|
154
|
+
counts: { committed: 0, current: 0 },
|
|
155
|
+
violations: [],
|
|
156
|
+
skipReason: '`command` compute skipped by --no-spawn',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const o = evaluateBaselineRule(options.cwd, rule, options.excludeDirs, options.changedFiles);
|
|
160
|
+
return {
|
|
161
|
+
id: o.rule.id,
|
|
162
|
+
type: 'baseline',
|
|
163
|
+
status: o.status,
|
|
164
|
+
severity: o.rule.severity ?? 'error',
|
|
165
|
+
counts: { committed: o.committedCount, current: o.currentCount },
|
|
166
|
+
violations: [
|
|
167
|
+
...(o.diff?.added ?? []).map((e) => ({ id: e, message: 'gained since the baseline was blessed' })),
|
|
168
|
+
...(o.diff?.removed ?? []).map((e) => ({ id: e, message: 'LOST since the baseline was blessed' })),
|
|
169
|
+
].map((v) => ({ ...v, hint: rule.hint ?? `bless with \`shrk baseline update --id ${rule.id}\`` })),
|
|
170
|
+
...(o.skipReason ? { skipReason: o.skipReason } : {}),
|
|
171
|
+
...(o.error ? { error: o.error } : {}),
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* The doc-reference plane's violation check: an id cited in prose that resolves
|
|
177
|
+
* to nothing. Skipped honestly when the registries were not loaded — claiming a
|
|
178
|
+
* pass without having checked is the failure mode this whole surface exists to
|
|
179
|
+
* prevent.
|
|
180
|
+
*/
|
|
181
|
+
function runDocReferencePlane(rules, options) {
|
|
182
|
+
if (rules.length === 0)
|
|
183
|
+
return [];
|
|
184
|
+
const inspection = options.inspection;
|
|
185
|
+
if (!inspection) {
|
|
186
|
+
return rules.map((rule) => ({
|
|
187
|
+
id: rule.id,
|
|
188
|
+
type: 'doc-reference',
|
|
189
|
+
status: 'skipped',
|
|
190
|
+
severity: rule.severity ?? 'error',
|
|
191
|
+
counts: { files: 0, tokens: 0 },
|
|
192
|
+
violations: [],
|
|
193
|
+
skipReason: 'registries not loaded — doc references were not resolved',
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
return rules.map((rule) => {
|
|
197
|
+
const res = checkDocReferences(options.cwd, rule, inspection, options.excludeDirs);
|
|
198
|
+
return {
|
|
199
|
+
id: res.ruleId,
|
|
200
|
+
type: 'doc-reference',
|
|
201
|
+
status: res.status,
|
|
202
|
+
severity: res.severity,
|
|
203
|
+
counts: { files: res.filesScanned, tokens: res.tokensChecked, skipped: res.tokensSkipped },
|
|
204
|
+
violations: res.findings.map((f) => ({
|
|
205
|
+
id: f.token,
|
|
206
|
+
file: f.file,
|
|
207
|
+
line: f.line,
|
|
208
|
+
message: f.message,
|
|
209
|
+
...(f.didYouMean.length > 0 ? { hint: `did you mean: ${f.didYouMean.join(', ')}` } : {}),
|
|
210
|
+
})),
|
|
211
|
+
...(res.skipReason ? { skipReason: res.skipReason } : {}),
|
|
212
|
+
...(res.error ? { error: res.error } : {}),
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function runGeneratedPlane(rules, options) {
|
|
217
|
+
return rules.map((rule) => {
|
|
218
|
+
// --no-spawn keeps the header + classification halves (pure reads) and
|
|
219
|
+
// drops only the regen diff, which is reported as a partial run.
|
|
220
|
+
const headersOnly = options.noSpawn === true;
|
|
221
|
+
const o = evaluateGeneratedRule(options.cwd, rule, options.excludeDirs, headersOnly);
|
|
222
|
+
const spawnSkipped = headersOnly && (rule.regen !== undefined || (rule.sources?.length ?? 0) > 0);
|
|
223
|
+
// A rule whose DRIFT half was skipped has not passed — it partially ran. A
|
|
224
|
+
// header contract holding proves nothing about whether the file was
|
|
225
|
+
// hand-edited, so reporting `passed` here would be the exact false green
|
|
226
|
+
// this plane exists to prevent. Findings still fail; the clean case
|
|
227
|
+
// downgrades to `skipped` so the aggregate exit is 2, not 0.
|
|
228
|
+
const status = spawnSkipped && o.status === 'passed' ? 'skipped' : o.status;
|
|
229
|
+
return {
|
|
230
|
+
id: o.rule.id,
|
|
231
|
+
type: 'generated',
|
|
232
|
+
status,
|
|
233
|
+
severity: o.rule.severity ?? 'error',
|
|
234
|
+
counts: {
|
|
235
|
+
files: o.committedCount,
|
|
236
|
+
differences: o.treeDiff?.differences.length ?? 0,
|
|
237
|
+
provenance: o.provenance.length,
|
|
238
|
+
},
|
|
239
|
+
violations: [
|
|
240
|
+
...(o.treeDiff?.differences ?? []).map((d) => ({
|
|
241
|
+
id: d.file,
|
|
242
|
+
file: d.file,
|
|
243
|
+
message: d.kind,
|
|
244
|
+
hint: generatedHintFor(o.rule),
|
|
245
|
+
})),
|
|
246
|
+
...o.provenance.map((f) => ({
|
|
247
|
+
id: f.file,
|
|
248
|
+
file: f.file,
|
|
249
|
+
message: f.message,
|
|
250
|
+
hint: generatedHintFor(o.rule),
|
|
251
|
+
})),
|
|
252
|
+
],
|
|
253
|
+
...(o.skipReason
|
|
254
|
+
? { skipReason: o.skipReason }
|
|
255
|
+
: spawnSkipped
|
|
256
|
+
? { skipReason: 'regen drift check skipped by --no-spawn (headers + classification still ran)' }
|
|
257
|
+
: {}),
|
|
258
|
+
...(o.error ? { error: o.error } : {}),
|
|
259
|
+
};
|
|
260
|
+
});
|
|
261
|
+
}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;AA6Z/B,wBAAgB,aAAa,IAAI,eAAe,CAwZ/C;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDrE;AAwID;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAoDxE"}
|
package/dist/main.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { loadDotenv } from "./env/load-dotenv.js";
|
|
3
3
|
import { CommandRegistry, extractGlobalCompress, extractGlobalCwd, extractGlobalExitTrailer, parseArgs, } from "./command-registry.js";
|
|
4
|
-
import { argvHasExitTrailer, argvHasStrict, emitPipeExitSignal, promoteForStrict } from "./exit-codes.js";
|
|
4
|
+
import { argvHasExitTrailer, argvHasNoHints, argvHasStrict, emitPipeExitSignal, promoteForStrict, } from "./exit-codes.js";
|
|
5
5
|
import { runCommandWithCompression } from "./output/output-compression.js";
|
|
6
6
|
import { initCommand } from "./commands/init.command.js";
|
|
7
7
|
import { inspectCommand } from "./commands/inspect.command.js";
|
|
@@ -37,7 +37,7 @@ import { gateCommand } from "./commands/gate.command.js";
|
|
|
37
37
|
import { policyLintCommand, policyLintExplainCommand } from "./commands/policy-lint.command.js";
|
|
38
38
|
import { baselineCheckCommand, baselineCommand, baselineDiffCommand, baselineExplainCommand, baselineListCommand, baselineUpdateCommand, } from "./commands/baseline.command.js";
|
|
39
39
|
import { generatedCheckCommand, generatedExplainCommand, generatedListCommand, generatedUpdateCommand, } from "./commands/generated.command.js";
|
|
40
|
-
import { gatesCommand, gatesCoverageCommand, gatesExplainCommand, gatesListCommand, } from "./commands/gates.command.js";
|
|
40
|
+
import { gatesCheckCommand, gatesCommand, gatesCoverageCommand, gatesExplainCommand, gatesListCommand, gatesTryCommand, } from "./commands/gates.command.js";
|
|
41
41
|
import { wiringCommand } from "./commands/wiring.command.js";
|
|
42
42
|
import { reuseCommand } from "./commands/reuse.command.js";
|
|
43
43
|
import { migrateCommand } from "./commands/migrate.command.js";
|
|
@@ -106,6 +106,7 @@ import { briefCommand } from "./commands/brief.command.js";
|
|
|
106
106
|
import { releaseCommand, installSmokeCommand } from "./commands/release.command.js";
|
|
107
107
|
import { startHereCommand } from "./commands/start-here.command.js";
|
|
108
108
|
import { docsCheckCommand, examplesCheckCommand } from "./commands/docs.command.js";
|
|
109
|
+
import { docsReferencesCommand } from "./commands/docs-references.command.js";
|
|
109
110
|
import { selfAuditCommand } from "./commands/self.command.js";
|
|
110
111
|
import { diagnosticsListCommand } from "./commands/diagnostics.command.js";
|
|
111
112
|
import { architectureMapCommand } from "./commands/architecture.command.js";
|
|
@@ -227,8 +228,10 @@ export function buildRegistry() {
|
|
|
227
228
|
registry.registerSubcommand('generated', generatedExplainCommand);
|
|
228
229
|
registry.register(gatesCommand);
|
|
229
230
|
registry.registerSubcommand('gates', gatesListCommand);
|
|
231
|
+
registry.registerSubcommand('gates', gatesCheckCommand);
|
|
230
232
|
registry.registerSubcommand('gates', gatesCoverageCommand);
|
|
231
233
|
registry.registerSubcommand('gates', gatesExplainCommand);
|
|
234
|
+
registry.registerSubcommand('gates', gatesTryCommand);
|
|
232
235
|
registry.register(wiringCommand);
|
|
233
236
|
registry.register(reuseCommand);
|
|
234
237
|
registry.register(migrateCommand);
|
|
@@ -339,6 +342,7 @@ export function buildRegistry() {
|
|
|
339
342
|
registry.registerSubcommand('memory', memorySnapshotsCommand);
|
|
340
343
|
registry.register(languagesCommand);
|
|
341
344
|
registry.registerSubcommand('docs', docsCheckCommand);
|
|
345
|
+
registry.registerSubcommand('docs', docsReferencesCommand);
|
|
342
346
|
registry.registerSubcommand('examples', examplesCheckCommand);
|
|
343
347
|
registry.registerSubcommand('self', selfAuditCommand);
|
|
344
348
|
registry.registerSubcommand('install', installSmokeCommand);
|
|
@@ -555,6 +559,7 @@ export async function runCli(argv) {
|
|
|
555
559
|
emitPipeExitSignal(command, exitCode, {
|
|
556
560
|
piped: !process.stdout.isTTY,
|
|
557
561
|
trailer: argvHasExitTrailer(argv),
|
|
562
|
+
noHints: argvHasNoHints(argv),
|
|
558
563
|
});
|
|
559
564
|
}
|
|
560
565
|
return exitCode;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shrkcrft/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.30",
|
|
4
4
|
"description": "SharkCraft CLI (`shrk`): structured project intelligence for AI coding agents.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "SharkCraft contributors",
|
|
@@ -47,38 +47,38 @@
|
|
|
47
47
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@shrkcrft/core": "^0.1.0-alpha.
|
|
51
|
-
"@shrkcrft/compress": "^0.1.0-alpha.
|
|
52
|
-
"@shrkcrft/config": "^0.1.0-alpha.
|
|
53
|
-
"@shrkcrft/workspace": "^0.1.0-alpha.
|
|
54
|
-
"@shrkcrft/knowledge": "^0.1.0-alpha.
|
|
55
|
-
"@shrkcrft/context": "^0.1.0-alpha.
|
|
56
|
-
"@shrkcrft/rules": "^0.1.0-alpha.
|
|
57
|
-
"@shrkcrft/paths": "^0.1.0-alpha.
|
|
58
|
-
"@shrkcrft/templates": "^0.1.0-alpha.
|
|
59
|
-
"@shrkcrft/plugin-api": "^0.1.0-alpha.
|
|
60
|
-
"@shrkcrft/dashboard": "^0.1.0-alpha.
|
|
61
|
-
"@shrkcrft/dashboard-api": "^0.1.0-alpha.
|
|
62
|
-
"@shrkcrft/pipelines": "^0.1.0-alpha.
|
|
63
|
-
"@shrkcrft/presets": "^0.1.0-alpha.
|
|
64
|
-
"@shrkcrft/boundaries": "^0.1.0-alpha.
|
|
65
|
-
"@shrkcrft/graph": "^0.1.0-alpha.
|
|
66
|
-
"@shrkcrft/rule-graph": "^0.1.0-alpha.
|
|
67
|
-
"@shrkcrft/structural-search": "^0.1.0-alpha.
|
|
68
|
-
"@shrkcrft/impact-engine": "^0.1.0-alpha.
|
|
69
|
-
"@shrkcrft/context-planner": "^0.1.0-alpha.
|
|
70
|
-
"@shrkcrft/architecture-guard": "^0.1.0-alpha.
|
|
71
|
-
"@shrkcrft/framework-scanners": "^0.1.0-alpha.
|
|
72
|
-
"@shrkcrft/api-surface-diff": "^0.1.0-alpha.
|
|
73
|
-
"@shrkcrft/quality-gates": "^0.1.0-alpha.
|
|
74
|
-
"@shrkcrft/migrate": "^0.1.0-alpha.
|
|
75
|
-
"@shrkcrft/generator": "^0.1.0-alpha.
|
|
76
|
-
"@shrkcrft/importer": "^0.1.0-alpha.
|
|
77
|
-
"@shrkcrft/inspector": "^0.1.0-alpha.
|
|
78
|
-
"@shrkcrft/ai": "^0.1.0-alpha.
|
|
79
|
-
"@shrkcrft/embeddings": "^0.1.0-alpha.
|
|
80
|
-
"@shrkcrft/shared": "^0.1.0-alpha.
|
|
81
|
-
"@shrkcrft/mcp-server": "^0.1.0-alpha.
|
|
50
|
+
"@shrkcrft/core": "^0.1.0-alpha.30",
|
|
51
|
+
"@shrkcrft/compress": "^0.1.0-alpha.30",
|
|
52
|
+
"@shrkcrft/config": "^0.1.0-alpha.30",
|
|
53
|
+
"@shrkcrft/workspace": "^0.1.0-alpha.30",
|
|
54
|
+
"@shrkcrft/knowledge": "^0.1.0-alpha.30",
|
|
55
|
+
"@shrkcrft/context": "^0.1.0-alpha.30",
|
|
56
|
+
"@shrkcrft/rules": "^0.1.0-alpha.30",
|
|
57
|
+
"@shrkcrft/paths": "^0.1.0-alpha.30",
|
|
58
|
+
"@shrkcrft/templates": "^0.1.0-alpha.30",
|
|
59
|
+
"@shrkcrft/plugin-api": "^0.1.0-alpha.30",
|
|
60
|
+
"@shrkcrft/dashboard": "^0.1.0-alpha.30",
|
|
61
|
+
"@shrkcrft/dashboard-api": "^0.1.0-alpha.30",
|
|
62
|
+
"@shrkcrft/pipelines": "^0.1.0-alpha.30",
|
|
63
|
+
"@shrkcrft/presets": "^0.1.0-alpha.30",
|
|
64
|
+
"@shrkcrft/boundaries": "^0.1.0-alpha.30",
|
|
65
|
+
"@shrkcrft/graph": "^0.1.0-alpha.30",
|
|
66
|
+
"@shrkcrft/rule-graph": "^0.1.0-alpha.30",
|
|
67
|
+
"@shrkcrft/structural-search": "^0.1.0-alpha.30",
|
|
68
|
+
"@shrkcrft/impact-engine": "^0.1.0-alpha.30",
|
|
69
|
+
"@shrkcrft/context-planner": "^0.1.0-alpha.30",
|
|
70
|
+
"@shrkcrft/architecture-guard": "^0.1.0-alpha.30",
|
|
71
|
+
"@shrkcrft/framework-scanners": "^0.1.0-alpha.30",
|
|
72
|
+
"@shrkcrft/api-surface-diff": "^0.1.0-alpha.30",
|
|
73
|
+
"@shrkcrft/quality-gates": "^0.1.0-alpha.30",
|
|
74
|
+
"@shrkcrft/migrate": "^0.1.0-alpha.30",
|
|
75
|
+
"@shrkcrft/generator": "^0.1.0-alpha.30",
|
|
76
|
+
"@shrkcrft/importer": "^0.1.0-alpha.30",
|
|
77
|
+
"@shrkcrft/inspector": "^0.1.0-alpha.30",
|
|
78
|
+
"@shrkcrft/ai": "^0.1.0-alpha.30",
|
|
79
|
+
"@shrkcrft/embeddings": "^0.1.0-alpha.30",
|
|
80
|
+
"@shrkcrft/shared": "^0.1.0-alpha.30",
|
|
81
|
+
"@shrkcrft/mcp-server": "^0.1.0-alpha.30",
|
|
82
82
|
"@huggingface/transformers": "^3.7.5"
|
|
83
83
|
},
|
|
84
84
|
"publishConfig": {
|