@shrkcrft/inspector 0.1.0-alpha.8 → 0.1.0-alpha.9

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 (142) hide show
  1. package/README.md +1 -1
  2. package/dist/adoption-state.js +1 -1
  3. package/dist/agent-brief.d.ts.map +1 -1
  4. package/dist/agent-brief.js +10 -59
  5. package/dist/agent-task-prep.d.ts.map +1 -1
  6. package/dist/agent-task-prep.js +3 -1
  7. package/dist/ai-readiness.d.ts +9 -84
  8. package/dist/ai-readiness.d.ts.map +1 -1
  9. package/dist/ai-readiness.js +30 -161
  10. package/dist/apply-dispatch-trace.d.ts +2 -1
  11. package/dist/apply-dispatch-trace.d.ts.map +1 -1
  12. package/dist/apply-dispatch-trace.js +9 -0
  13. package/dist/area-explore.d.ts.map +1 -1
  14. package/dist/area-explore.js +5 -1
  15. package/dist/area-map.d.ts +19 -0
  16. package/dist/area-map.d.ts.map +1 -1
  17. package/dist/area-map.js +27 -0
  18. package/dist/ci-permissions-fix.d.ts +1 -1
  19. package/dist/ci-permissions-fix.d.ts.map +1 -1
  20. package/dist/ci-permissions-fix.js +182 -1
  21. package/dist/compliance-profiles.js +1 -1
  22. package/dist/construct-adoption-diff.d.ts.map +1 -1
  23. package/dist/construct-adoption-diff.js +1 -2
  24. package/dist/construct-adoption.d.ts.map +1 -1
  25. package/dist/construct-adoption.js +11 -10
  26. package/dist/construct-inference.d.ts.map +1 -1
  27. package/dist/construct-inference.js +1 -2
  28. package/dist/construct-registry.d.ts.map +1 -1
  29. package/dist/construct-registry.js +10 -2
  30. package/dist/contract-template-registry.d.ts.map +1 -1
  31. package/dist/contract-template-registry.js +10 -2
  32. package/dist/convention-registry.d.ts.map +1 -1
  33. package/dist/convention-registry.js +10 -2
  34. package/dist/decision-records.d.ts.map +1 -1
  35. package/dist/decision-records.js +9 -2
  36. package/dist/demo-script.d.ts +1 -0
  37. package/dist/demo-script.d.ts.map +1 -1
  38. package/dist/demo-script.js +43 -0
  39. package/dist/docs-check.js +1 -1
  40. package/dist/drift-baseline.d.ts.map +1 -1
  41. package/dist/drift-baseline.js +2 -5
  42. package/dist/feedback-ingestion.d.ts.map +1 -1
  43. package/dist/feedback-ingestion.js +16 -2
  44. package/dist/git-helpers.d.ts +12 -0
  45. package/dist/git-helpers.d.ts.map +1 -1
  46. package/dist/git-helpers.js +63 -0
  47. package/dist/helper-registry.d.ts +54 -27
  48. package/dist/helper-registry.d.ts.map +1 -1
  49. package/dist/helper-registry.js +517 -16
  50. package/dist/impact-analysis.d.ts.map +1 -1
  51. package/dist/impact-analysis.js +5 -4
  52. package/dist/impact-render.d.ts.map +1 -1
  53. package/dist/impact-render.js +9 -0
  54. package/dist/index.d.ts +3 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -1
  57. package/dist/ingest-drafts.js +4 -8
  58. package/dist/migration-profile-registry.d.ts.map +1 -1
  59. package/dist/migration-profile-registry.js +10 -2
  60. package/dist/monorepo-onboarding.js +2 -2
  61. package/dist/onboarding-drafts-merge.d.ts +71 -0
  62. package/dist/onboarding-drafts-merge.d.ts.map +1 -0
  63. package/dist/onboarding-drafts-merge.js +174 -0
  64. package/dist/onboarding-drafts.d.ts +14 -0
  65. package/dist/onboarding-drafts.d.ts.map +1 -1
  66. package/dist/onboarding-drafts.js +39 -5
  67. package/dist/onboarding-report.d.ts.map +1 -1
  68. package/dist/onboarding-report.js +1 -5
  69. package/dist/onboarding.d.ts +1 -1
  70. package/dist/onboarding.d.ts.map +1 -1
  71. package/dist/onboarding.js +64 -5
  72. package/dist/ownership.js +10 -2
  73. package/dist/pack-contributions-inventory.d.ts +1 -0
  74. package/dist/pack-contributions-inventory.d.ts.map +1 -1
  75. package/dist/pack-contributions-inventory.js +24 -0
  76. package/dist/pack-helper-registry.d.ts.map +1 -1
  77. package/dist/pack-helper-registry.js +10 -2
  78. package/dist/pack-release-check.d.ts.map +1 -1
  79. package/dist/pack-release-check.js +11 -4
  80. package/dist/pack-signature-status.d.ts.map +1 -1
  81. package/dist/pack-signature-status.js +1 -0
  82. package/dist/pack-symbol-compat.d.ts +17 -4
  83. package/dist/pack-symbol-compat.d.ts.map +1 -1
  84. package/dist/pack-symbol-compat.js +155 -7
  85. package/dist/pack-test-runner.js +10 -2
  86. package/dist/plan-simulation.d.ts.map +1 -1
  87. package/dist/plan-simulation.js +20 -3
  88. package/dist/playbook-registry.d.ts.map +1 -1
  89. package/dist/playbook-registry.js +10 -2
  90. package/dist/plugin-lifecycle-profile-registry.d.ts +52 -0
  91. package/dist/plugin-lifecycle-profile-registry.d.ts.map +1 -0
  92. package/dist/plugin-lifecycle-profile-registry.js +202 -0
  93. package/dist/plugin-lifecycle.d.ts +132 -0
  94. package/dist/plugin-lifecycle.d.ts.map +1 -0
  95. package/dist/plugin-lifecycle.js +477 -0
  96. package/dist/policy-engine.d.ts.map +1 -1
  97. package/dist/policy-engine.js +11 -3
  98. package/dist/policy-test.js +11 -3
  99. package/dist/product-coherence.js +5 -5
  100. package/dist/profile-registry.d.ts +1 -0
  101. package/dist/profile-registry.d.ts.map +1 -1
  102. package/dist/profile-registry.js +32 -4
  103. package/dist/quality-baseline.d.ts.map +1 -1
  104. package/dist/quality-baseline.js +1 -3
  105. package/dist/ranker-explainability.d.ts.map +1 -1
  106. package/dist/ranker-explainability.js +9 -3
  107. package/dist/registration-hint-registry.d.ts.map +1 -1
  108. package/dist/registration-hint-registry.js +10 -2
  109. package/dist/release-readiness.js +5 -5
  110. package/dist/reposet.js +1 -1
  111. package/dist/repository-knowledge-model.d.ts +1 -1
  112. package/dist/repository-knowledge-model.d.ts.map +1 -1
  113. package/dist/review-packet-v2.d.ts.map +1 -1
  114. package/dist/review-packet-v2.js +13 -3
  115. package/dist/rule-scaffold.d.ts.map +1 -1
  116. package/dist/rule-scaffold.js +4 -12
  117. package/dist/scaffold-patterns.js +10 -2
  118. package/dist/search-tuning-registry.d.ts.map +1 -1
  119. package/dist/search-tuning-registry.js +10 -2
  120. package/dist/self-config-doctor-v2.d.ts +1 -1
  121. package/dist/self-config-doctor-v2.d.ts.map +1 -1
  122. package/dist/self-config-doctor-v2.js +10 -6
  123. package/dist/self-config-doctor.d.ts.map +1 -1
  124. package/dist/self-config-doctor.js +13 -7
  125. package/dist/sharkcraft-inspector.d.ts.map +1 -1
  126. package/dist/sharkcraft-inspector.js +0 -1
  127. package/dist/start-here.d.ts +1 -1
  128. package/dist/start-here.js +1 -1
  129. package/dist/task-ranker.d.ts.map +1 -1
  130. package/dist/task-ranker.js +31 -1
  131. package/dist/task-routing-hint-registry.d.ts.map +1 -1
  132. package/dist/task-routing-hint-registry.js +10 -2
  133. package/dist/test-runner.d.ts.map +1 -1
  134. package/dist/test-runner.js +16 -8
  135. package/dist/universal-search.d.ts +1 -0
  136. package/dist/universal-search.d.ts.map +1 -1
  137. package/dist/universal-search.js +12 -0
  138. package/dist/upgrade-advisor.js +1 -1
  139. package/package.json +21 -22
  140. package/dist/synthesize-from-onboarding.d.ts +0 -68
  141. package/dist/synthesize-from-onboarding.d.ts.map +0 -1
  142. package/dist/synthesize-from-onboarding.js +0 -508
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -22,8 +22,8 @@ export * from "./test-runner.js";
22
22
  export * from "./plan-review.js";
23
23
  export * from "./onboarding.js";
24
24
  export * from "./onboarding-report.js";
25
- export * from "./synthesize-from-onboarding.js";
26
25
  export * from "./onboarding-drafts.js";
26
+ export * from "./onboarding-drafts-merge.js";
27
27
  export * from "./onboarding-diff.js";
28
28
  export * from "./onboarding-adoption.js";
29
29
  export * from "./adoption-state.js";
@@ -48,6 +48,7 @@ export * from "./dev-session-html.js";
48
48
  export * from "./dashboard/dashboard-data.js";
49
49
  export * from "./git-helpers.js";
50
50
  export * from "./boundaries-changed-only.js";
51
+ export * from "./plugin-lifecycle.js";
51
52
  export * from "./helper-registry.js";
52
53
  export * from "./pack-author-ux.js";
53
54
  export * from "./pack-test-runner.js";
@@ -174,6 +175,7 @@ export * from "./changes-summary.js";
174
175
  export * from "./pr-summary.js";
175
176
  export * from "./ci-integrity-report.js";
176
177
  export * from "./uncertainty.js";
178
+ export * from "./plugin-lifecycle-profile-registry.js";
177
179
  export * from "./contract-template-registry.js";
178
180
  export * from "./migration-profile-registry.js";
179
181
  export * from "./profile-registry.js";
@@ -341,8 +341,7 @@ function renderRulesDraft(model) {
341
341
  })`);
342
342
  }
343
343
  return `${header('Rules inferred from repository ingestion.')}
344
- // Local helper keep this file self-contained (no @shrkcrft/* imports).
345
- function defineRule<T>(rule: T): T { return rule; }
344
+ import { defineRule } from '@shrkcrft/rules';
346
345
 
347
346
  export const ingestedRules = [
348
347
  ${entries.join(',\n')}
@@ -359,8 +358,7 @@ function renderPathsDraft(model) {
359
358
  patterns: ${JSON.stringify(p.patterns)},
360
359
  })`);
361
360
  return `${header('Path conventions inferred from repository ingestion.')}
362
- // Local helper keep this file self-contained (no @shrkcrft/* imports).
363
- function definePath<T>(path: T): T { return path; }
361
+ import { definePath } from '@shrkcrft/paths';
364
362
 
365
363
  export const ingestedPaths = [
366
364
  ${entries.join(',\n')}
@@ -380,8 +378,7 @@ function renderBoundariesDraft(model) {
380
378
  suggestedFix: ${JSON.stringify(b.suggestedFix)},
381
379
  })`);
382
380
  return `${header('Dependency-boundary rules inferred from repository ingestion.')}
383
- // Local helper keep this file self-contained (no @shrkcrft/* imports).
384
- function defineBoundary<T>(rule: T): T { return rule; }
381
+ import { defineBoundary } from '@shrkcrft/boundaries';
385
382
 
386
383
  export const ingestedBoundaries = [
387
384
  ${entries.join(',\n')}
@@ -398,8 +395,7 @@ function renderConstructsDraft(model) {
398
395
  files: ${JSON.stringify(c.paths)},
399
396
  })`);
400
397
  return `${header('Constructs inferred from repository ingestion.')}
401
- // Local helper keep this file self-contained (no @shrkcrft/* imports).
402
- function defineConstruct<T>(construct: T): T { return construct; }
398
+ import { defineConstruct } from '@shrkcrft/plugin-api';
403
399
 
404
400
  export const ingestedConstructs = [
405
401
  ${entries.join(',\n')}
@@ -1 +1 @@
1
- {"version":3,"file":"migration-profile-registry.d.ts","sourceRoot":"","sources":["../src/migration-profile-registry.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,eAAO,MAAM,iCAAiC,6CAA6C,CAAC;AAE5F,oBAAY,sBAAsB;IAChC,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkCD,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IACT,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,MAAM,EAAE,SAAS,8BAA8B,EAAE,CAAC;CACnD,CAAC,CAkFD;AAED,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAGvC"}
1
+ {"version":3,"file":"migration-profile-registry.d.ts","sourceRoot":"","sources":["../src/migration-profile-registry.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,iCAAiC,6CAA6C,CAAC;AAE5F,oBAAY,sBAAsB;IAChC,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkCD,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IACT,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,MAAM,EAAE,SAAS,8BAA8B,EAAE,CAAC;CACnD,CAAC,CAkFD;AAED,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAGvC"}
@@ -1,10 +1,18 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
1
9
  /**
2
10
  * Migration profile registry. Loads pack-contributed migration profiles
3
11
  * via `migrationProfileFiles` on pack manifests. Engine ships zero built-ins.
4
12
  */
5
13
  import { existsSync } from 'node:fs';
6
14
  import * as nodePath from 'node:path';
7
- import { importModuleViaLoader } from '@shrkcrft/core';
15
+ import { pathToFileURL } from 'node:url';
8
16
  export const MIGRATION_PROFILE_REGISTRY_SCHEMA = 'sharkcraft.migration-profile-registry/v1';
9
17
  export var MigrationProfileSource;
10
18
  (function (MigrationProfileSource) {
@@ -12,7 +20,7 @@ export var MigrationProfileSource;
12
20
  MigrationProfileSource["Pack"] = "pack";
13
21
  })(MigrationProfileSource || (MigrationProfileSource = {}));
14
22
  async function importDefault(file) {
15
- const mod = (await importModuleViaLoader(file));
23
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(file).href)));
16
24
  if (Array.isArray(mod.default))
17
25
  return mod.default;
18
26
  if (mod.default && typeof mod.default === 'object')
@@ -181,7 +181,7 @@ function buildBoundaryCandidates(groups) {
181
181
  title: 'packages/* must not import from apps/*',
182
182
  from: ['packages/**'],
183
183
  forbiddenImports: ['apps/**'],
184
- reason: 'packages/ + apps/ both present; packages depending on apps inverts the expected dependency direction',
184
+ reason: 'packages/ + apps/ both present; packages depending on apps inverts the layer order',
185
185
  });
186
186
  }
187
187
  // Standard rule: libs/* should not import from apps/*.
@@ -191,7 +191,7 @@ function buildBoundaryCandidates(groups) {
191
191
  title: 'libs/* must not import from apps/*',
192
192
  from: ['libs/**'],
193
193
  forbiddenImports: ['apps/**'],
194
- reason: 'libs/ + apps/ both present; libs depending on apps inverts the expected dependency direction',
194
+ reason: 'libs/ + apps/ both present; libs depending on apps inverts the layer order',
195
195
  });
196
196
  }
197
197
  return out;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Three-way merge for onboarding drafts.
3
+ *
4
+ * When `shrk onboard --write-drafts` re-runs against a project that has
5
+ * hand-edited drafts, the safe behaviour is to merge the new proposal
6
+ * against the user's current file and the snapshot we wrote last time:
7
+ *
8
+ * - base : `.sharkcraft/onboarding-drafts-snapshots/<file>` (what we
9
+ * wrote last). When absent, the merge degrades to a strict
10
+ * "matches proposal → no-op, otherwise conflict" rule.
11
+ * - ours : the current `sharkcraft/onboarding/<file>` content.
12
+ * - theirs : the freshly rendered proposal we are about to write.
13
+ *
14
+ * The merge always returns an intended `body`. The caller decides whether
15
+ * to write it (e.g. `abortOnConflict` keeps the file unchanged).
16
+ */
17
+ export declare enum DraftMergeStatus {
18
+ /** File did not exist; the proposal was written verbatim. */
19
+ Created = "created",
20
+ /** Current file already matches the proposal — nothing to do. */
21
+ Unchanged = "unchanged",
22
+ /** Current file matches the snapshot; the proposal was applied. */
23
+ CleanUpdate = "clean-update",
24
+ /** Proposal matches the snapshot; the user's edits were kept. */
25
+ UserKept = "user-kept",
26
+ /** Disjoint single-region edits on both sides; auto-merged. */
27
+ AutoMerged = "auto-merged",
28
+ /** Both sides changed the same region — conflict markers emitted. */
29
+ Conflict = "conflict",
30
+ /** Both sides changed but `abortOnConflict` was set — file untouched. */
31
+ Aborted = "aborted"
32
+ }
33
+ export interface IDraftMergeOptions {
34
+ /** When true, return status=Aborted and leave the file unchanged on conflict. */
35
+ abortOnConflict?: boolean;
36
+ /** Header line in the `<<<<<<< ours` marker. Default 'ours'. */
37
+ oursLabel?: string;
38
+ /** Header line in the `>>>>>>> theirs` marker. Default 'incoming proposal'. */
39
+ theirsLabel?: string;
40
+ }
41
+ export interface IDraftMergeResult {
42
+ status: DraftMergeStatus;
43
+ /** What should be written. For Aborted, this is the unchanged `ours`. */
44
+ body: string;
45
+ /** Number of conflict regions in `body` (0 unless status=Conflict). */
46
+ conflictRegions: number;
47
+ }
48
+ /**
49
+ * Resolve the snapshot path for a given draft file.
50
+ *
51
+ * @param projectRoot Absolute repo root.
52
+ * @param draftPath Absolute path of the draft file.
53
+ */
54
+ export declare function snapshotPathFor(projectRoot: string, draftPath: string): string;
55
+ export declare function readSnapshot(snapshotPath: string): string | null;
56
+ export declare function writeSnapshot(snapshotPath: string, body: string): void;
57
+ /**
58
+ * Three-way merge a single draft file.
59
+ *
60
+ * Truth table:
61
+ * - !exists(ours) → Created (body = theirs)
62
+ * - ours === theirs → Unchanged
63
+ * - base === null:
64
+ * - ours === theirs → Unchanged
65
+ * - otherwise → Conflict (or Aborted)
66
+ * - ours === base → CleanUpdate (body = theirs)
67
+ * - theirs === base → UserKept (body = ours)
68
+ * - otherwise → diff3Lines → AutoMerged | Conflict | Aborted
69
+ */
70
+ export declare function threeWayMergeDraft(base: string | null, ours: string | null, theirs: string, options?: IDraftMergeOptions): IDraftMergeResult;
71
+ //# sourceMappingURL=onboarding-drafts-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-drafts-merge.d.ts","sourceRoot":"","sources":["../src/onboarding-drafts-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,oBAAY,gBAAgB;IAC1B,6DAA6D;IAC7D,OAAO,YAAY;IACnB,iEAAiE;IACjE,SAAS,cAAc;IACvB,mEAAmE;IACnE,WAAW,iBAAiB;IAC5B,iEAAiE;IACjE,QAAQ,cAAc;IACtB,+DAA+D;IAC/D,UAAU,gBAAgB;IAC1B,qEAAqE;IACrE,QAAQ,aAAa;IACrB,yEAAyE;IACzE,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOhE;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAiBnB"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Three-way merge for onboarding drafts.
3
+ *
4
+ * When `shrk onboard --write-drafts` re-runs against a project that has
5
+ * hand-edited drafts, the safe behaviour is to merge the new proposal
6
+ * against the user's current file and the snapshot we wrote last time:
7
+ *
8
+ * - base : `.sharkcraft/onboarding-drafts-snapshots/<file>` (what we
9
+ * wrote last). When absent, the merge degrades to a strict
10
+ * "matches proposal → no-op, otherwise conflict" rule.
11
+ * - ours : the current `sharkcraft/onboarding/<file>` content.
12
+ * - theirs : the freshly rendered proposal we are about to write.
13
+ *
14
+ * The merge always returns an intended `body`. The caller decides whether
15
+ * to write it (e.g. `abortOnConflict` keeps the file unchanged).
16
+ */
17
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
18
+ import * as nodePath from 'node:path';
19
+ export var DraftMergeStatus;
20
+ (function (DraftMergeStatus) {
21
+ /** File did not exist; the proposal was written verbatim. */
22
+ DraftMergeStatus["Created"] = "created";
23
+ /** Current file already matches the proposal — nothing to do. */
24
+ DraftMergeStatus["Unchanged"] = "unchanged";
25
+ /** Current file matches the snapshot; the proposal was applied. */
26
+ DraftMergeStatus["CleanUpdate"] = "clean-update";
27
+ /** Proposal matches the snapshot; the user's edits were kept. */
28
+ DraftMergeStatus["UserKept"] = "user-kept";
29
+ /** Disjoint single-region edits on both sides; auto-merged. */
30
+ DraftMergeStatus["AutoMerged"] = "auto-merged";
31
+ /** Both sides changed the same region — conflict markers emitted. */
32
+ DraftMergeStatus["Conflict"] = "conflict";
33
+ /** Both sides changed but `abortOnConflict` was set — file untouched. */
34
+ DraftMergeStatus["Aborted"] = "aborted";
35
+ })(DraftMergeStatus || (DraftMergeStatus = {}));
36
+ /**
37
+ * Resolve the snapshot path for a given draft file.
38
+ *
39
+ * @param projectRoot Absolute repo root.
40
+ * @param draftPath Absolute path of the draft file.
41
+ */
42
+ export function snapshotPathFor(projectRoot, draftPath) {
43
+ const rel = nodePath.relative(nodePath.join(projectRoot, 'sharkcraft', 'onboarding'), draftPath);
44
+ return nodePath.join(projectRoot, '.sharkcraft', 'onboarding-drafts-snapshots', rel);
45
+ }
46
+ export function readSnapshot(snapshotPath) {
47
+ if (!existsSync(snapshotPath))
48
+ return null;
49
+ try {
50
+ return readFileSync(snapshotPath, 'utf8');
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ export function writeSnapshot(snapshotPath, body) {
57
+ mkdirSync(nodePath.dirname(snapshotPath), { recursive: true });
58
+ writeFileSync(snapshotPath, body, 'utf8');
59
+ }
60
+ /**
61
+ * Three-way merge a single draft file.
62
+ *
63
+ * Truth table:
64
+ * - !exists(ours) → Created (body = theirs)
65
+ * - ours === theirs → Unchanged
66
+ * - base === null:
67
+ * - ours === theirs → Unchanged
68
+ * - otherwise → Conflict (or Aborted)
69
+ * - ours === base → CleanUpdate (body = theirs)
70
+ * - theirs === base → UserKept (body = ours)
71
+ * - otherwise → diff3Lines → AutoMerged | Conflict | Aborted
72
+ */
73
+ export function threeWayMergeDraft(base, ours, theirs, options = {}) {
74
+ if (ours === null) {
75
+ return { status: DraftMergeStatus.Created, body: theirs, conflictRegions: 0 };
76
+ }
77
+ if (ours === theirs) {
78
+ return { status: DraftMergeStatus.Unchanged, body: ours, conflictRegions: 0 };
79
+ }
80
+ if (base === null) {
81
+ return wholeFileConflict(ours, theirs, options);
82
+ }
83
+ if (ours === base) {
84
+ return { status: DraftMergeStatus.CleanUpdate, body: theirs, conflictRegions: 0 };
85
+ }
86
+ if (theirs === base) {
87
+ return { status: DraftMergeStatus.UserKept, body: ours, conflictRegions: 0 };
88
+ }
89
+ return diff3Lines(base, ours, theirs, options);
90
+ }
91
+ /**
92
+ * Coarse-grained line-level three-way merge.
93
+ *
94
+ * Strips the common prefix and suffix lines, then inspects the centre:
95
+ * - centre(ours) === centre(base) → take theirs
96
+ * - centre(theirs) === centre(base) → take ours
97
+ * - centre(ours) === centre(theirs) → take either
98
+ * - otherwise → emit conflict markers around the centre
99
+ *
100
+ * Multiple disjoint edit regions fall through to conflict; that's a
101
+ * deliberate trade-off — anything subtler than a single contiguous edit
102
+ * is exactly the case a human should review.
103
+ */
104
+ function diff3Lines(base, ours, theirs, options) {
105
+ const baseLines = base.split('\n');
106
+ const oursLines = ours.split('\n');
107
+ const theirsLines = theirs.split('\n');
108
+ let prefix = 0;
109
+ const maxPrefix = Math.min(baseLines.length, oursLines.length, theirsLines.length);
110
+ while (prefix < maxPrefix &&
111
+ baseLines[prefix] === oursLines[prefix] &&
112
+ baseLines[prefix] === theirsLines[prefix]) {
113
+ prefix += 1;
114
+ }
115
+ let suffix = 0;
116
+ const maxSuffix = Math.min(baseLines.length, oursLines.length, theirsLines.length) - prefix;
117
+ while (suffix < maxSuffix &&
118
+ baseLines[baseLines.length - 1 - suffix] === oursLines[oursLines.length - 1 - suffix] &&
119
+ baseLines[baseLines.length - 1 - suffix] === theirsLines[theirsLines.length - 1 - suffix]) {
120
+ suffix += 1;
121
+ }
122
+ const baseCentre = baseLines.slice(prefix, baseLines.length - suffix).join('\n');
123
+ const oursCentre = oursLines.slice(prefix, oursLines.length - suffix).join('\n');
124
+ const theirsCentre = theirsLines.slice(prefix, theirsLines.length - suffix).join('\n');
125
+ const headLines = oursLines.slice(0, prefix);
126
+ const tailLines = oursLines.slice(oursLines.length - suffix);
127
+ if (oursCentre === baseCentre) {
128
+ // Only theirs diverged.
129
+ const merged = [...headLines, ...theirsLines.slice(prefix, theirsLines.length - suffix), ...tailLines].join('\n');
130
+ return { status: DraftMergeStatus.AutoMerged, body: merged, conflictRegions: 0 };
131
+ }
132
+ if (theirsCentre === baseCentre) {
133
+ // Only ours diverged.
134
+ return { status: DraftMergeStatus.UserKept, body: ours, conflictRegions: 0 };
135
+ }
136
+ if (oursCentre === theirsCentre) {
137
+ // Both sides made identical changes.
138
+ const merged = [...headLines, ...oursLines.slice(prefix, oursLines.length - suffix), ...tailLines].join('\n');
139
+ return { status: DraftMergeStatus.AutoMerged, body: merged, conflictRegions: 0 };
140
+ }
141
+ if (options.abortOnConflict) {
142
+ return { status: DraftMergeStatus.Aborted, body: ours, conflictRegions: 1 };
143
+ }
144
+ const oursLabel = options.oursLabel ?? 'ours';
145
+ const theirsLabel = options.theirsLabel ?? 'incoming proposal';
146
+ const markerOpen = `<<<<<<< ${oursLabel}`;
147
+ const markerMid = '=======';
148
+ const markerClose = `>>>>>>> ${theirsLabel}`;
149
+ const conflictBlock = [
150
+ markerOpen,
151
+ oursCentre,
152
+ markerMid,
153
+ theirsCentre,
154
+ markerClose,
155
+ ];
156
+ const body = [...headLines, ...conflictBlock, ...tailLines].join('\n');
157
+ return { status: DraftMergeStatus.Conflict, body, conflictRegions: 1 };
158
+ }
159
+ function wholeFileConflict(ours, theirs, options) {
160
+ if (options.abortOnConflict) {
161
+ return { status: DraftMergeStatus.Aborted, body: ours, conflictRegions: 1 };
162
+ }
163
+ const oursLabel = options.oursLabel ?? 'ours';
164
+ const theirsLabel = options.theirsLabel ?? 'incoming proposal';
165
+ const body = [
166
+ `<<<<<<< ${oursLabel}`,
167
+ ours.replace(/\n$/, ''),
168
+ '=======',
169
+ theirs.replace(/\n$/, ''),
170
+ `>>>>>>> ${theirsLabel}`,
171
+ '',
172
+ ].join('\n');
173
+ return { status: DraftMergeStatus.Conflict, body, conflictRegions: 1 };
174
+ }
@@ -1,8 +1,13 @@
1
1
  import type { IOnboardingPlan } from './onboarding.js';
2
2
  import type { IImportedAgentRulesBundle } from './onboarding-agent-import.js';
3
+ import { DraftMergeStatus } from './onboarding-drafts-merge.js';
3
4
  export interface IWrittenDraft {
4
5
  path: string;
5
6
  bytes: number;
7
+ /** Three-way merge status for this draft. */
8
+ mergeStatus: DraftMergeStatus;
9
+ /** Number of conflict regions emitted into `path` (0 unless status=Conflict). */
10
+ conflictRegions: number;
6
11
  }
7
12
  export interface IWriteOnboardingDraftsOptions {
8
13
  projectRoot: string;
@@ -14,10 +19,19 @@ export interface IWriteOnboardingDraftsOptions {
14
19
  * The file is still under the onboarding/ subdir — never written to rules.ts.
15
20
  */
16
21
  importedAgentRules?: IImportedAgentRulesBundle;
22
+ /**
23
+ * When true, conflicts leave the existing file unchanged and report status
24
+ * via the result. Useful for CI gates.
25
+ */
26
+ abortOnConflict?: boolean;
17
27
  }
18
28
  export interface IWriteOnboardingDraftsResult {
19
29
  outDir: string;
20
30
  files: IWrittenDraft[];
31
+ /** Total number of draft files that ended in a Conflict status. */
32
+ conflicts: number;
33
+ /** Total number of draft files left untouched because abortOnConflict was set. */
34
+ aborted: number;
21
35
  }
22
36
  /**
23
37
  * Write onboarding drafts under sharkcraft/onboarding/. This function NEVER
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-drafts.d.ts","sourceRoot":"","sources":["../src/onboarding-drafts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,iBAAiB,CAAC;AAEnF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CAChD;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,6BAA6B,GACrC,4BAA4B,CA+B9B"}
1
+ {"version":3,"file":"onboarding-drafts.d.ts","sourceRoot":"","sources":["../src/onboarding-drafts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,iBAAiB,CAAC;AAEnF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EACL,gBAAgB,EAMjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,gBAAgB,CAAC;IAC9B,iFAAiF;IACjF,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,6BAA6B,GACrC,4BAA4B,CA+C9B"}
@@ -1,6 +1,7 @@
1
- import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import * as nodePath from 'node:path';
3
3
  import { renderOnboardingReport } from "./onboarding-report.js";
4
+ import { DraftMergeStatus, readSnapshot, snapshotPathFor, threeWayMergeDraft, writeSnapshot, } from "./onboarding-drafts-merge.js";
4
5
  /**
5
6
  * Write onboarding drafts under sharkcraft/onboarding/. This function NEVER
6
7
  * writes outside that subdirectory (the caller can override the location, but
@@ -11,14 +12,24 @@ export function writeOnboardingDrafts(plan, options) {
11
12
  nodePath.join(options.projectRoot, 'sharkcraft', 'onboarding'));
12
13
  ensureDir(outDir);
13
14
  const files = [];
14
- const write = (name, body) => {
15
+ const write = (name, proposal) => {
15
16
  const full = nodePath.join(outDir, name);
16
17
  // Belt-and-braces: refuse anything that escapes outDir.
17
18
  if (!full.startsWith(outDir + nodePath.sep)) {
18
19
  throw new Error(`draft path escapes outDir: ${name}`);
19
20
  }
20
- writeFileSync(full, body, 'utf8');
21
- files.push({ path: full, bytes: Buffer.byteLength(body, 'utf8') });
21
+ const merge = mergeDraft(options.projectRoot, full, proposal, options);
22
+ if (merge.status !== DraftMergeStatus.Aborted) {
23
+ writeFileSync(full, merge.body, 'utf8');
24
+ // Snapshot what we just wrote so the next run has a fresh `base`.
25
+ writeSnapshot(snapshotPathFor(options.projectRoot, full), merge.body);
26
+ }
27
+ files.push({
28
+ path: full,
29
+ bytes: Buffer.byteLength(merge.body, 'utf8'),
30
+ mergeStatus: merge.status,
31
+ conflictRegions: merge.conflictRegions,
32
+ });
22
33
  };
23
34
  write('onboarding-report.md', renderOnboardingReport(plan));
24
35
  write('inferred-rules.draft.ts', renderInferredRulesDraft(plan));
@@ -29,7 +40,30 @@ export function writeOnboardingDrafts(plan, options) {
29
40
  if (options.importedAgentRules && options.importedAgentRules.entries.length > 0) {
30
41
  write('imported-agent-rules.draft.ts', renderImportedAgentRulesDraft(options.importedAgentRules));
31
42
  }
32
- return { outDir, files };
43
+ let conflicts = 0;
44
+ let aborted = 0;
45
+ for (const f of files) {
46
+ if (f.mergeStatus === DraftMergeStatus.Conflict)
47
+ conflicts += 1;
48
+ else if (f.mergeStatus === DraftMergeStatus.Aborted)
49
+ aborted += 1;
50
+ }
51
+ return { outDir, files, conflicts, aborted };
52
+ }
53
+ function mergeDraft(projectRoot, draftPath, proposal, options) {
54
+ const ours = existsSync(draftPath) ? safeRead(draftPath) : null;
55
+ const base = readSnapshot(snapshotPathFor(projectRoot, draftPath));
56
+ return threeWayMergeDraft(base, ours, proposal, {
57
+ abortOnConflict: options.abortOnConflict ?? false,
58
+ });
59
+ }
60
+ function safeRead(path) {
61
+ try {
62
+ return readFileSync(path, 'utf8');
63
+ }
64
+ catch {
65
+ return null;
66
+ }
33
67
  }
34
68
  // ─── Renderers ───────────────────────────────────────────────────────────────
35
69
  function renderInferredRulesDraft(plan) {
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-report.d.ts","sourceRoot":"","sources":["../src/onboarding-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA6PpE"}
1
+ {"version":3,"file":"onboarding-report.d.ts","sourceRoot":"","sources":["../src/onboarding-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA0PpE"}
@@ -1,4 +1,3 @@
1
- import * as nodePath from 'node:path';
2
1
  /**
3
2
  * Render an onboarding plan as a Markdown report. The output is intentionally
4
3
  * stable and human-readable: it is the artifact a user reads when deciding
@@ -12,10 +11,7 @@ export function renderOnboardingReport(plan) {
12
11
  out.push('## Project summary');
13
12
  out.push('');
14
13
  const s = plan.projectSummary;
15
- // Repo basename only — the onboarding report is meant to be
16
- // committed and reviewed; leaking the author's filesystem layout
17
- // (e.g. `/Users/<name>/...`) into a public repo is pointless noise.
18
- out.push(`- Project root: \`${nodePath.basename(s.projectRoot)}\``);
14
+ out.push(`- Project root: \`${s.projectRoot}\``);
19
15
  if (s.projectName)
20
16
  out.push(`- Name: \`${s.projectName}\``);
21
17
  if (s.description)
@@ -123,7 +123,7 @@ export interface IBuildOnboardingPlanOptions {
123
123
  export declare function buildOnboardingPlan(inspection: ISharkcraftInspection, options?: IBuildOnboardingPlanOptions): IOnboardingPlan;
124
124
  export declare function inferPathConventions(ws: IWorkspaceSummary, subDirs: ReadonlyMap<string, readonly string[]>): IInferredPathConvention[];
125
125
  export declare function inferVerificationCommands(ws: IWorkspaceSummary): IInferredVerificationCommand[];
126
- export declare function inferBoundaryRules(_ws: IWorkspaceSummary, _subDirs: ReadonlyMap<string, readonly string[]>): IInferredBoundaryRule[];
126
+ export declare function inferBoundaryRules(ws: IWorkspaceSummary, subDirs: ReadonlyMap<string, readonly string[]>): IInferredBoundaryRule[];
127
127
  export interface IInferTemplateCandidatesOptions {
128
128
  scaffoldTemplates?: boolean;
129
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,yBAAyB,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,MAAM,EACF,cAAc,GACd,UAAU,GACV,kBAAkB,GAClB,SAAS,GACT,WAAW,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;IACjD,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,yBAAyB,CAAC;IAC1C,yDAAyD;IACzD,kBAAkB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACrD,gDAAgD;IAChD,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,uBAAuB,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC5D,4BAA4B,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACtE,qBAAqB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACxD,0BAA0B,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAClE,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,iBAAiB,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,0EAA0E;IAC1E,wBAAwB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC9D,sEAAsE;IACtE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,2BAA2B;IAC1C,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,2BAAgC,GACxC,eAAe,CAuEjB;AA8ED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAC9C,uBAAuB,EAAE,CA2C3B;AAoBD,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,iBAAiB,GACpB,4BAA4B,EAAE,CAqBhC;AAsCD,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAC9C,qBAAqB,EAAE,CAyCzB;AAqDD,MAAM,WAAW,+BAA+B;IAC9C,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,+BAAoC,GAC5C,0BAA0B,EAAE,CAmC9B;AAID,wBAAgB,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,aAAa,EAAE,CAqGjE;AAID,wBAAgB,cAAc,CAC5B,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,SAAS,4BAA4B,EAAE,GACpD,iBAAiB,EAAE,CA4DrB;AAID,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAClB,wBAAwB,EAAE,CAyB5B"}
@@ -220,11 +220,59 @@ function packageManagerRunPrefix(manager) {
220
220
  }
221
221
  }
222
222
  // ─── Boundary rule candidates ────────────────────────────────────────────────
223
- export function inferBoundaryRules(_ws, _subDirs) {
224
- // SharkCraft does not guess your boundary rules. Author them
225
- // explicitly in `sharkcraft/boundaries.ts` once the repo's actual
226
- // import directions are known.
227
- return [];
223
+ const LAYER_ORDER = [
224
+ 'core',
225
+ 'common',
226
+ 'runtime',
227
+ 'kernel',
228
+ 'plugin',
229
+ 'adapter',
230
+ 'ui',
231
+ ];
232
+ export function inferBoundaryRules(ws, subDirs) {
233
+ const out = [];
234
+ // Detect layer prefixes in libs/* and packages/* and (top-level) layer dirs.
235
+ const layerHits = new Map(); // layer → from-pattern
236
+ for (const layer of LAYER_ORDER) {
237
+ if (ws.topLevelDirs.includes(layer)) {
238
+ layerHits.set(layer, `${layer}/**`);
239
+ }
240
+ }
241
+ for (const parent of ['libs', 'packages']) {
242
+ const children = subDirs.get(parent) ?? [];
243
+ for (const layer of LAYER_ORDER) {
244
+ if (children.includes(layer)) {
245
+ layerHits.set(layer, `${parent}/${layer}/**`);
246
+ }
247
+ }
248
+ }
249
+ if (layerHits.size < 3)
250
+ return out;
251
+ // Build one rule per detected layer that forbids importing from any higher
252
+ // layer.
253
+ for (let i = 0; i < LAYER_ORDER.length; i += 1) {
254
+ const layer = LAYER_ORDER[i];
255
+ if (!layerHits.has(layer))
256
+ continue;
257
+ const higher = LAYER_ORDER.slice(i + 1).filter((l) => layerHits.has(l));
258
+ if (higher.length === 0)
259
+ continue;
260
+ const forbiddenImports = higher.flatMap((l) => {
261
+ const from = layerHits.get(l);
262
+ const prefix = from.replace(/\/\*\*$/, '');
263
+ return [prefix, `${prefix}/**`];
264
+ });
265
+ out.push({
266
+ id: `architecture.${layer}.no-imports-up`,
267
+ title: `${layer} must not import higher layers`,
268
+ severity: 'error',
269
+ from: [layerHits.get(layer)],
270
+ forbiddenImports,
271
+ suggestedFix: `Move shared contracts down to ${layer}/ or invert the dependency so the higher layer depends on a contract defined in ${layer}/.`,
272
+ reason: `${layer}/ + ${higher.length} higher layer(s) detected`,
273
+ });
274
+ }
275
+ return out;
228
276
  }
229
277
  const TEMPLATE_PATTERNS = [
230
278
  {
@@ -366,6 +414,17 @@ export function inferRules(ws) {
366
414
  reason: 'jest dependency',
367
415
  });
368
416
  }
417
+ // Monorepo layering.
418
+ if (ws.profiles.includes(WorkspaceProfile.IsMonorepo)) {
419
+ out.push({
420
+ id: 'architecture.layer-order',
421
+ title: 'Respect monorepo layer order',
422
+ content: 'Lower layers (core, common, runtime) must not import from higher layers (kernel, plugin, ui, apps). Run `shrk check boundaries` after touching cross-layer code.',
423
+ priority: 'high',
424
+ source: 'folder-structure',
425
+ reason: 'monorepo layout detected',
426
+ });
427
+ }
369
428
  // ESLint.
370
429
  if (ws.profiles.includes(WorkspaceProfile.HasEslint)) {
371
430
  out.push({