@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.
Files changed (55) hide show
  1. package/dist/commands/baseline.command.d.ts +25 -0
  2. package/dist/commands/baseline.command.d.ts.map +1 -1
  3. package/dist/commands/baseline.command.js +64 -17
  4. package/dist/commands/changelog-data.d.ts.map +1 -1
  5. package/dist/commands/changelog-data.js +46 -0
  6. package/dist/commands/check.command.d.ts.map +1 -1
  7. package/dist/commands/check.command.js +137 -12
  8. package/dist/commands/code-intel.command.d.ts.map +1 -1
  9. package/dist/commands/code-intel.command.js +5 -1
  10. package/dist/commands/command-catalog.d.ts.map +1 -1
  11. package/dist/commands/command-catalog.js +8 -0
  12. package/dist/commands/daily.commands.d.ts.map +1 -1
  13. package/dist/commands/daily.commands.js +11 -1
  14. package/dist/commands/docs-references.command.d.ts +7 -0
  15. package/dist/commands/docs-references.command.d.ts.map +1 -0
  16. package/dist/commands/docs-references.command.js +323 -0
  17. package/dist/commands/doctor.command.d.ts.map +1 -1
  18. package/dist/commands/doctor.command.js +3 -2
  19. package/dist/commands/gates.command.d.ts +13 -1
  20. package/dist/commands/gates.command.d.ts.map +1 -1
  21. package/dist/commands/gates.command.js +693 -26
  22. package/dist/commands/generated.command.d.ts +32 -0
  23. package/dist/commands/generated.command.d.ts.map +1 -1
  24. package/dist/commands/generated.command.js +214 -53
  25. package/dist/commands/graph-code-subverbs.d.ts.map +1 -1
  26. package/dist/commands/graph-code-subverbs.js +5 -1
  27. package/dist/commands/help.command.d.ts.map +1 -1
  28. package/dist/commands/help.command.js +64 -2
  29. package/dist/commands/policy-lint.command.d.ts.map +1 -1
  30. package/dist/commands/policy-lint.command.js +52 -10
  31. package/dist/commands/registry.command.d.ts.map +1 -1
  32. package/dist/commands/registry.command.js +34 -9
  33. package/dist/commands/wiring.command.d.ts.map +1 -1
  34. package/dist/commands/wiring.command.js +4 -3
  35. package/dist/exit-codes.d.ts +27 -7
  36. package/dist/exit-codes.d.ts.map +1 -1
  37. package/dist/exit-codes.js +47 -8
  38. package/dist/gates/gate-envelope.d.ts +64 -0
  39. package/dist/gates/gate-envelope.d.ts.map +1 -0
  40. package/dist/gates/gate-envelope.js +26 -0
  41. package/dist/gates/gate-rule-globs.d.ts +33 -0
  42. package/dist/gates/gate-rule-globs.d.ts.map +1 -0
  43. package/dist/gates/gate-rule-globs.js +101 -0
  44. package/dist/gates/gate-rule-view.d.ts +9 -3
  45. package/dist/gates/gate-rule-view.d.ts.map +1 -1
  46. package/dist/gates/gate-rule-view.js +18 -4
  47. package/dist/gates/rule-coverage.d.ts +39 -1
  48. package/dist/gates/rule-coverage.d.ts.map +1 -1
  49. package/dist/gates/rule-coverage.js +123 -8
  50. package/dist/gates/run-gate-planes.d.ts +44 -0
  51. package/dist/gates/run-gate-planes.d.ts.map +1 -0
  52. package/dist/gates/run-gate-planes.js +261 -0
  53. package/dist/main.d.ts.map +1 -1
  54. package/dist/main.js +7 -2
  55. 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
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;AAoZ/B,wBAAgB,aAAa,IAAI,eAAe,CAqZ/C;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CrE;AAwID;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAoDxE"}
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.28",
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.28",
51
- "@shrkcrft/compress": "^0.1.0-alpha.28",
52
- "@shrkcrft/config": "^0.1.0-alpha.28",
53
- "@shrkcrft/workspace": "^0.1.0-alpha.28",
54
- "@shrkcrft/knowledge": "^0.1.0-alpha.28",
55
- "@shrkcrft/context": "^0.1.0-alpha.28",
56
- "@shrkcrft/rules": "^0.1.0-alpha.28",
57
- "@shrkcrft/paths": "^0.1.0-alpha.28",
58
- "@shrkcrft/templates": "^0.1.0-alpha.28",
59
- "@shrkcrft/plugin-api": "^0.1.0-alpha.28",
60
- "@shrkcrft/dashboard": "^0.1.0-alpha.28",
61
- "@shrkcrft/dashboard-api": "^0.1.0-alpha.28",
62
- "@shrkcrft/pipelines": "^0.1.0-alpha.28",
63
- "@shrkcrft/presets": "^0.1.0-alpha.28",
64
- "@shrkcrft/boundaries": "^0.1.0-alpha.28",
65
- "@shrkcrft/graph": "^0.1.0-alpha.28",
66
- "@shrkcrft/rule-graph": "^0.1.0-alpha.28",
67
- "@shrkcrft/structural-search": "^0.1.0-alpha.28",
68
- "@shrkcrft/impact-engine": "^0.1.0-alpha.28",
69
- "@shrkcrft/context-planner": "^0.1.0-alpha.28",
70
- "@shrkcrft/architecture-guard": "^0.1.0-alpha.28",
71
- "@shrkcrft/framework-scanners": "^0.1.0-alpha.28",
72
- "@shrkcrft/api-surface-diff": "^0.1.0-alpha.28",
73
- "@shrkcrft/quality-gates": "^0.1.0-alpha.28",
74
- "@shrkcrft/migrate": "^0.1.0-alpha.28",
75
- "@shrkcrft/generator": "^0.1.0-alpha.28",
76
- "@shrkcrft/importer": "^0.1.0-alpha.28",
77
- "@shrkcrft/inspector": "^0.1.0-alpha.28",
78
- "@shrkcrft/ai": "^0.1.0-alpha.28",
79
- "@shrkcrft/embeddings": "^0.1.0-alpha.28",
80
- "@shrkcrft/shared": "^0.1.0-alpha.28",
81
- "@shrkcrft/mcp-server": "^0.1.0-alpha.28",
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": {