@shrkcrft/inspector 0.1.0-alpha.17 → 0.1.0-alpha.19

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 (60) hide show
  1. package/dist/agent-instructions.d.ts.map +1 -1
  2. package/dist/agent-instructions.js +11 -0
  3. package/dist/ai-readiness.d.ts.map +1 -1
  4. package/dist/ai-readiness.js +20 -5
  5. package/dist/changed-preflight.d.ts +7 -0
  6. package/dist/changed-preflight.d.ts.map +1 -1
  7. package/dist/changed-preflight.js +56 -9
  8. package/dist/check-guardrail-globs.d.ts +16 -0
  9. package/dist/check-guardrail-globs.d.ts.map +1 -0
  10. package/dist/check-guardrail-globs.js +38 -0
  11. package/dist/code-intelligence-doctor.js +25 -5
  12. package/dist/command-recommender.d.ts.map +1 -1
  13. package/dist/command-recommender.js +16 -4
  14. package/dist/contract-file-rule.d.ts +8 -0
  15. package/dist/contract-file-rule.d.ts.map +1 -1
  16. package/dist/contract-file-rule.js +8 -3
  17. package/dist/coverage-report.d.ts.map +1 -1
  18. package/dist/coverage-report.js +14 -1
  19. package/dist/delegate-catalog.d.ts +45 -0
  20. package/dist/delegate-catalog.d.ts.map +1 -0
  21. package/dist/delegate-catalog.js +50 -0
  22. package/dist/delegate-doctor.d.ts +15 -0
  23. package/dist/delegate-doctor.d.ts.map +1 -0
  24. package/dist/delegate-doctor.js +36 -0
  25. package/dist/delegate-pack-recipes.d.ts +29 -0
  26. package/dist/delegate-pack-recipes.d.ts.map +1 -0
  27. package/dist/delegate-pack-recipes.js +77 -0
  28. package/dist/git-helpers.d.ts +15 -0
  29. package/dist/git-helpers.d.ts.map +1 -1
  30. package/dist/git-helpers.js +41 -0
  31. package/dist/impact-analysis.d.ts.map +1 -1
  32. package/dist/impact-analysis.js +10 -2
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +5 -0
  36. package/dist/pack-contributions-inventory.d.ts.map +1 -1
  37. package/dist/pack-contributions-inventory.js +6 -0
  38. package/dist/pack-signature-status.d.ts.map +1 -1
  39. package/dist/pack-signature-status.js +18 -1
  40. package/dist/plan-simulation.d.ts +13 -0
  41. package/dist/plan-simulation.d.ts.map +1 -1
  42. package/dist/plan-simulation.js +1 -1
  43. package/dist/propose-knowledge.d.ts +15 -0
  44. package/dist/propose-knowledge.d.ts.map +1 -1
  45. package/dist/propose-knowledge.js +37 -4
  46. package/dist/resolve-verification-commands.d.ts +26 -0
  47. package/dist/resolve-verification-commands.d.ts.map +1 -0
  48. package/dist/resolve-verification-commands.js +55 -0
  49. package/dist/rule-drift.d.ts.map +1 -1
  50. package/dist/rule-drift.js +24 -9
  51. package/dist/sharkcraft-inspector.d.ts.map +1 -1
  52. package/dist/sharkcraft-inspector.js +7 -0
  53. package/dist/start-here.d.ts +1 -1
  54. package/dist/start-here.d.ts.map +1 -1
  55. package/dist/start-here.js +15 -0
  56. package/dist/task-packet.d.ts.map +1 -1
  57. package/dist/task-packet.js +13 -1
  58. package/dist/test-impact.d.ts.map +1 -1
  59. package/dist/test-impact.js +5 -2
  60. package/package.json +17 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-verification-commands.d.ts","sourceRoot":"","sources":["../src/resolve-verification-commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE;IACP,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C,GACL,MAAM,EAAE,CA2BV"}
@@ -0,0 +1,55 @@
1
+ import { PipelineStepType } from '@shrkcrft/pipelines';
2
+ /**
3
+ * Resolve the verification commands an agent should run after a task, grounded
4
+ * in the pack rather than a generic default. Precedence (first non-empty wins):
5
+ *
6
+ * 1. The matched pipeline's command-type gate steps — the gates the pipeline
7
+ * author actually declared for this class of work (e.g. the engine
8
+ * `feature-dev` pipeline's `bun x tsc … --noEmit` + `bun test`).
9
+ * 2. The project's `sharkcraft.config.ts verificationCommands[]` — the
10
+ * trusted, repo-wide gate set (the same source `apply --validate` runs).
11
+ * 3. The caller-supplied knowledge action-hint defaults — today's behaviour,
12
+ * used only when neither of the above declares anything.
13
+ *
14
+ * A pipeline gate is a `command`-type step that is required and carries a
15
+ * concrete command (no `<placeholder>` tokens) — this excludes optional review
16
+ * steps, context builds, and generative/spec steps (which take arguments) while
17
+ * keeping the real post-change gates. Rules carry no verification field, so
18
+ * they are intentionally not a source here.
19
+ *
20
+ * Deterministic, order-preserving, deduped. No commands are executed.
21
+ */
22
+ export function resolveVerificationCommands(inspection, options = {}) {
23
+ const fromPipelines = [];
24
+ for (const id of options.pipelineIds ?? []) {
25
+ const pipeline = inspection.pipelineRegistry.get(id);
26
+ if (!pipeline)
27
+ continue;
28
+ for (const step of pipeline.steps) {
29
+ if (step.type !== PipelineStepType.Command)
30
+ continue;
31
+ if (step.required === false)
32
+ continue;
33
+ for (const raw of step.cliCommands ?? []) {
34
+ const cmd = raw.trim();
35
+ if (cmd.length > 0 && !cmd.includes('<'))
36
+ fromPipelines.push(cmd);
37
+ }
38
+ }
39
+ }
40
+ if (fromPipelines.length > 0)
41
+ return dedupe(fromPipelines);
42
+ const cfg = inspection.config;
43
+ const fromConfig = [];
44
+ for (const vc of cfg?.verificationCommands ?? []) {
45
+ const cmd = vc?.command?.trim();
46
+ if (cmd && cmd.length > 0)
47
+ fromConfig.push(cmd);
48
+ }
49
+ if (fromConfig.length > 0)
50
+ return dedupe(fromConfig);
51
+ return dedupe(options.knowledgeDefaults ?? []);
52
+ }
53
+ function dedupe(items) {
54
+ return [...new Set(items)];
55
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"rule-drift.d.ts","sourceRoot":"","sources":["../src/rule-drift.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D,oBAAY,oBAAoB;IAC9B,QAAQ,aAAa;IACrB,iBAAiB,uBAAuB;IACxC,UAAU,gBAAgB;IAC1B,YAAY,iBAAiB;IAC7B,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;IACzD,sEAAsE;IACtE,QAAQ,CAAC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;IACzD,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAiDD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,qBAAqB,GAChC,gBAAgB,CAuFlB"}
1
+ {"version":3,"file":"rule-drift.d.ts","sourceRoot":"","sources":["../src/rule-drift.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D,oBAAY,oBAAoB;IAC9B,QAAQ,aAAa;IACrB,iBAAiB,uBAAuB;IACxC,UAAU,gBAAgB;IAC1B,YAAY,iBAAiB;IAC7B,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;IACzD,sEAAsE;IACtE,QAAQ,CAAC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAC;IACzD,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AA6DD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,qBAAqB,GAChC,gBAAgB,CAyFlB"}
@@ -20,14 +20,27 @@ export var RuleEnforcementState;
20
20
  RuleEnforcementState["Stale"] = "stale";
21
21
  RuleEnforcementState["Unknown"] = "unknown";
22
22
  })(RuleEnforcementState || (RuleEnforcementState = {}));
23
- function configuredVerificationCommandIds(inspection) {
23
+ /**
24
+ * The set of verification references a rule can match against to count as
25
+ * "wired" in `sharkcraft.config.ts`. A rule declares its verification commands
26
+ * as runnable command strings (e.g. `bun test`), while the config declares
27
+ * them as `{ id, command }` records (e.g. `{ id: 'unit-tests', command: 'bun
28
+ * test' }`). A rule is enforced when its declared command matches the config
29
+ * BY id OR BY command string, so we collect both — otherwise a rule that ships
30
+ * a genuinely-runnable, genuinely-wired command (matching by `command`) is
31
+ * mis-classified as unenforced just because it doesn't reference the config's
32
+ * short id.
33
+ */
34
+ function configuredVerificationRefs(inspection) {
24
35
  const cfg = inspection.config;
25
- const ids = new Set();
36
+ const refs = new Set();
26
37
  for (const entry of cfg?.verificationCommands ?? []) {
27
38
  if (entry?.id)
28
- ids.add(entry.id);
39
+ refs.add(entry.id.trim());
40
+ if (entry?.command)
41
+ refs.add(entry.command.trim());
29
42
  }
30
- return ids;
43
+ return refs;
31
44
  }
32
45
  function isRule(entry) {
33
46
  return entry.type === KnowledgeType.Rule;
@@ -60,13 +73,15 @@ function staleReason(entry, inspection) {
60
73
  return null;
61
74
  }
62
75
  export function classifyRuleDrift(inspection) {
63
- const wiredIds = configuredVerificationCommandIds(inspection);
76
+ const wiredRefs = configuredVerificationRefs(inspection);
64
77
  const entries = [];
65
78
  for (const entry of inspection.knowledgeEntries) {
66
79
  if (!isRule(entry))
67
80
  continue;
68
81
  const declared = entry.actionHints?.verificationCommands ?? [];
69
- const enforced = declared.filter((id) => wiredIds.has(id));
82
+ // A declared command counts as enforced when it is wired in the config
83
+ // BY id OR BY command string (the config carries both).
84
+ const enforced = declared.filter((ref) => wiredRefs.has(ref.trim()));
70
85
  const advisory = isAdvisory(entry);
71
86
  const stale = staleReason(entry, inspection);
72
87
  const hasHints = hasMeaningfulActionHints(entry);
@@ -82,15 +97,15 @@ export function classifyRuleDrift(inspection) {
82
97
  }
83
98
  else if (declared.length > 0 && enforced.length === declared.length) {
84
99
  state = RuleEnforcementState.Enforced;
85
- reason = `all ${declared.length} verification command(s) wired in sharkcraft.config.ts`;
100
+ reason = `all ${declared.length} verification command(s) wired (by id or command) in sharkcraft.config.ts`;
86
101
  }
87
102
  else if (declared.length > 0 && enforced.length > 0) {
88
103
  state = RuleEnforcementState.PartiallyEnforced;
89
- reason = `${enforced.length}/${declared.length} verification command(s) wired in sharkcraft.config.ts`;
104
+ reason = `${enforced.length}/${declared.length} verification command(s) wired (by id or command) in sharkcraft.config.ts`;
90
105
  }
91
106
  else if (declared.length > 0) {
92
107
  state = RuleEnforcementState.PartiallyEnforced;
93
- reason = `${declared.length} verification command(s) declared but none wired in sharkcraft.config.ts`;
108
+ reason = `${declared.length} verification command(s) declared but none wired (by id or command) in sharkcraft.config.ts`;
94
109
  }
95
110
  else if (hasHints) {
96
111
  state = RuleEnforcementState.ManualOnly;
@@ -1 +1 @@
1
- {"version":3,"file":"sharkcraft-inspector.d.ts","sourceRoot":"","sources":["../src/sharkcraft-inspector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sharkcraft-inspector.d.ts","sourceRoot":"","sources":["../src/sharkcraft-inspector.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ import { BoundaryRegistry, loadBoundaryRulesFromFile } from '@shrkcrft/boundarie
14
14
  import { DoctorSeverity } from "./doctor-result.js";
15
15
  import { diagnoseActionHints } from "./action-hint-diagnostics.js";
16
16
  import { buildCodeIntelligenceChecks } from "./code-intelligence-doctor.js";
17
+ import { buildDelegateRecipeChecks } from "./delegate-doctor.js";
17
18
  import { computeFileFingerprint, createInspectorCache, } from "./inspector-cache.js";
18
19
  import { DEFAULT_SLOW_LOADER_THRESHOLD_MS, LARGE_FILE_THRESHOLD_BYTES, } from "./loader-diagnostics.js";
19
20
  import { suggestSurfaceProfile } from "./surface-profile-detect.js";
@@ -801,6 +802,12 @@ export function runDoctor(inspection) {
801
802
  for (const c of buildCodeIntelligenceChecks(inspection.projectRoot)) {
802
803
  checks.push(c);
803
804
  }
805
+ // Delegate-worker recipe health: surface any recipe that isn't safely
806
+ // delegatable (unbound / missing verification). Silent when the repo hasn't
807
+ // opted into a `delegation` block.
808
+ for (const c of buildDelegateRecipeChecks(inspection.config)) {
809
+ checks.push(c);
810
+ }
804
811
  const summary = { ok: 0, info: 0, warnings: 0, errors: 0, advisoryCount: 0 };
805
812
  for (const c of checks) {
806
813
  if (c.severity === DoctorSeverity.Ok)
@@ -12,7 +12,7 @@
12
12
  */
13
13
  export declare const START_HERE_SCHEMA = "sharkcraft.start-here/v1";
14
14
  export declare const PRIMARY_COMMANDS_SCHEMA = "sharkcraft.primary-commands/v1";
15
- export type StartHereFlow = 'onboard' | 'brief' | 'dev' | 'review' | 'governance' | 'packs' | 'release';
15
+ export type StartHereFlow = 'onboard' | 'investigate' | 'brief' | 'dev' | 'review' | 'governance' | 'packs' | 'release';
16
16
  export type SafetyLevel = 'read-only' | 'writes-drafts' | 'writes-source';
17
17
  export interface IStartHereFlow {
18
18
  id: StartHereFlow;
@@ -1 +1 @@
1
- {"version":3,"file":"start-here.d.ts","sourceRoot":"","sources":["../src/start-here.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAC5D,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AAExE,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,OAAO,GACP,KAAK,GACL,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,eAAe,GAAG,eAAe,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC,aAAa,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,uBAAuB,CAAC;IACvC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CACrC;AAwLD,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,gBAAgB,CAiBlF;AAED,wBAAgB,0BAA0B,IAAI,sBAAsB,CAEnE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkCpE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAQhF"}
1
+ {"version":3,"file":"start-here.d.ts","sourceRoot":"","sources":["../src/start-here.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAC5D,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AAExE,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,aAAa,GACb,OAAO,GACP,KAAK,GACL,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,eAAe,GAAG,eAAe,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC,aAAa,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,uBAAuB,CAAC;IACvC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CACrC;AAwMD,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,gBAAgB,CAiBlF;AAED,wBAAgB,0BAA0B,IAAI,sBAAsB,CAEnE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkCpE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAQhF"}
@@ -27,6 +27,21 @@ const FLOWS_PRIMARY = [
27
27
  docsLink: 'docs/onboarding.md',
28
28
  nextCommand: 'shrk brief "<first task you want the agent to handle>"',
29
29
  },
30
+ {
31
+ id: 'investigate',
32
+ title: 'Understand existing code (before you edit)',
33
+ whenToUse: 'You need to know who calls a symbol, where it is used (file:line), what breaks if you change a file, whether code A is wired to code B, or who implements an interface — use the graph instead of grep.',
34
+ commands: [
35
+ 'shrk graph index',
36
+ 'shrk graph callers <symbol>',
37
+ 'shrk graph path <from> <to>',
38
+ 'shrk graph context <file-or-symbol>',
39
+ 'shrk graph impact <file-or-symbol> --full',
40
+ ],
41
+ safety: 'read-only',
42
+ docsLink: 'docs/overview.md',
43
+ nextCommand: 'shrk graph callers <symbol>',
44
+ },
30
45
  {
31
46
  id: 'brief',
32
47
  title: 'Prepare an AI agent brief',
@@ -1 +1 @@
1
- {"version":3,"file":"task-packet.d.ts","sourceRoot":"","sources":["../src/task-packet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-packet.d.ts","sourceRoot":"","sources":["../src/task-packet.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { buildContext } from '@shrkcrft/context';
2
2
  import { aggregateActionHints, } from '@shrkcrft/knowledge';
3
3
  import { rankAll } from "./task-ranker.js";
4
4
  import { buildProjectOverview, renderOverviewText } from "./project-overview.js";
5
+ import { resolveVerificationCommands } from "./resolve-verification-commands.js";
5
6
  /**
6
7
  * Per-field caps applied to the packet when `compact: true`.
7
8
  * Keeps the JSON small while still covering the highest-signal hits.
@@ -130,6 +131,17 @@ export function buildTaskPacket(inspection, task, options = {}) {
130
131
  confidence: (r.score >= 15 ? 'high' : r.score >= 9 ? 'medium' : 'low'),
131
132
  reasons: r.reasons,
132
133
  }));
134
+ // Verification commands: prefer the matched pipeline's declared gates, then
135
+ // the config's trusted gate set, then the knowledge action-hint defaults —
136
+ // so the packet tells the agent to run the gates the pack actually declares
137
+ // (e.g. `bun test` / `bun x tsc … --noEmit`) instead of a generic fallback.
138
+ const resolvedVerification = resolveVerificationCommands(inspection, {
139
+ pipelineIds: recommendedPipelines.map((p) => p.pipelineId),
140
+ knowledgeDefaults: actionHints.verificationCommands,
141
+ });
142
+ const verificationCommands = compact
143
+ ? resolvedVerification.slice(0, COMPACT_CAPS.verificationCommands)
144
+ : resolvedVerification;
133
145
  const tokenEstimate = contextResult.totalTokens +
134
146
  Math.ceil((actionHints.commands.length + actionHints.mcpTools.length + actionHints.verificationCommands.length) *
135
147
  4);
@@ -185,7 +197,7 @@ export function buildTaskPacket(inspection, task, options = {}) {
185
197
  recommendedMcpTools: actionHints.mcpTools.map((t) => t.tool),
186
198
  recommendedCliCommands: actionHints.commands.map((c) => typeof c === 'string' ? c : c.command),
187
199
  forbiddenActions: actionHints.forbiddenActions,
188
- verificationCommands: actionHints.verificationCommands,
200
+ verificationCommands,
189
201
  humanReviewPoints,
190
202
  tokenEstimate,
191
203
  };
@@ -1 +1 @@
1
- {"version":3,"file":"test-impact.d.ts","sourceRoot":"","sources":["../src/test-impact.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,kBAAkB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,qEAAqE;IACrE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oCAAoC;IACpC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,0DAA0D;IAC1D,eAAe,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACjF,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAiCD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,gBAAgB,GACtB,WAAW,CAyEb;AAoDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD"}
1
+ {"version":3,"file":"test-impact.d.ts","sourceRoot":"","sources":["../src/test-impact.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,kBAAkB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,qEAAqE;IACrE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oCAAoC;IACpC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,0DAA0D;IAC1D,eAAe,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACjF,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAoCD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,gBAAgB,GACtB,WAAW,CAyEb;AAoDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD"}
@@ -7,8 +7,11 @@ const TEST_PATTERNS = [
7
7
  (f) => f.replace(/^src\//, 'tests/').replace(/\.(ts|tsx|js|jsx)$/, '.test.$1'),
8
8
  (f) => f.replace(/\.([tj]s)$/, '.spec.$1'),
9
9
  (f) => f.replace(/\.([tj]s)$/, '.test.$1'),
10
- (f) => f.replace(/\.tsx$/, '.test.tsx'),
11
- (f) => f.replace(/\.tsx$/, '.spec.tsx'),
10
+ // Guard on `.tsx`: a bare `.replace(/\.tsx$/, )` is a no-op on a `.ts`
11
+ // file, so it would echo the input source file back as its own "test"
12
+ // (existing on disk → falsely confidence 100%, runs zero tests).
13
+ (f) => (/\.tsx$/.test(f) ? f.replace(/\.tsx$/, '.test.tsx') : null),
14
+ (f) => (/\.tsx$/.test(f) ? f.replace(/\.tsx$/, '.spec.tsx') : null),
12
15
  (f) => {
13
16
  const parsed = nodePath.parse(f);
14
17
  if (!parsed.name)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shrkcrft/inspector",
3
- "version": "0.1.0-alpha.17",
3
+ "version": "0.1.0-alpha.19",
4
4
  "description": "SharkCraft inspector: project overview, doctor checks, AI-agent instructions.",
5
5
  "license": "MIT",
6
6
  "author": "SharkCraft contributors",
@@ -42,22 +42,22 @@
42
42
  "typecheck": "tsc --noEmit -p tsconfig.json"
43
43
  },
44
44
  "dependencies": {
45
- "@shrkcrft/core": "^0.1.0-alpha.17",
46
- "@shrkcrft/config": "^0.1.0-alpha.17",
47
- "@shrkcrft/workspace": "^0.1.0-alpha.17",
48
- "@shrkcrft/knowledge": "^0.1.0-alpha.17",
49
- "@shrkcrft/rules": "^0.1.0-alpha.17",
50
- "@shrkcrft/paths": "^0.1.0-alpha.17",
51
- "@shrkcrft/templates": "^0.1.0-alpha.17",
52
- "@shrkcrft/context": "^0.1.0-alpha.17",
53
- "@shrkcrft/pipelines": "^0.1.0-alpha.17",
54
- "@shrkcrft/packs": "^0.1.0-alpha.17",
55
- "@shrkcrft/presets": "^0.1.0-alpha.17",
56
- "@shrkcrft/boundaries": "^0.1.0-alpha.17",
57
- "@shrkcrft/generator": "^0.1.0-alpha.17",
58
- "@shrkcrft/importer": "^0.1.0-alpha.17",
59
- "@shrkcrft/plugin-api": "^0.1.0-alpha.17",
60
- "@shrkcrft/dashboard-api": "^0.1.0-alpha.17",
45
+ "@shrkcrft/core": "^0.1.0-alpha.19",
46
+ "@shrkcrft/config": "^0.1.0-alpha.19",
47
+ "@shrkcrft/workspace": "^0.1.0-alpha.19",
48
+ "@shrkcrft/knowledge": "^0.1.0-alpha.19",
49
+ "@shrkcrft/rules": "^0.1.0-alpha.19",
50
+ "@shrkcrft/paths": "^0.1.0-alpha.19",
51
+ "@shrkcrft/templates": "^0.1.0-alpha.19",
52
+ "@shrkcrft/context": "^0.1.0-alpha.19",
53
+ "@shrkcrft/pipelines": "^0.1.0-alpha.19",
54
+ "@shrkcrft/packs": "^0.1.0-alpha.19",
55
+ "@shrkcrft/presets": "^0.1.0-alpha.19",
56
+ "@shrkcrft/boundaries": "^0.1.0-alpha.19",
57
+ "@shrkcrft/generator": "^0.1.0-alpha.19",
58
+ "@shrkcrft/importer": "^0.1.0-alpha.19",
59
+ "@shrkcrft/plugin-api": "^0.1.0-alpha.19",
60
+ "@shrkcrft/dashboard-api": "^0.1.0-alpha.19",
61
61
  "typescript": "^5.6.0"
62
62
  },
63
63
  "publishConfig": {