@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.
- package/README.md +1 -1
- package/dist/adoption-state.js +1 -1
- package/dist/agent-brief.d.ts.map +1 -1
- package/dist/agent-brief.js +10 -59
- package/dist/agent-task-prep.d.ts.map +1 -1
- package/dist/agent-task-prep.js +3 -1
- package/dist/ai-readiness.d.ts +9 -84
- package/dist/ai-readiness.d.ts.map +1 -1
- package/dist/ai-readiness.js +30 -161
- package/dist/apply-dispatch-trace.d.ts +2 -1
- package/dist/apply-dispatch-trace.d.ts.map +1 -1
- package/dist/apply-dispatch-trace.js +9 -0
- package/dist/area-explore.d.ts.map +1 -1
- package/dist/area-explore.js +5 -1
- package/dist/area-map.d.ts +19 -0
- package/dist/area-map.d.ts.map +1 -1
- package/dist/area-map.js +27 -0
- package/dist/ci-permissions-fix.d.ts +1 -1
- package/dist/ci-permissions-fix.d.ts.map +1 -1
- package/dist/ci-permissions-fix.js +182 -1
- package/dist/compliance-profiles.js +1 -1
- package/dist/construct-adoption-diff.d.ts.map +1 -1
- package/dist/construct-adoption-diff.js +1 -2
- package/dist/construct-adoption.d.ts.map +1 -1
- package/dist/construct-adoption.js +11 -10
- package/dist/construct-inference.d.ts.map +1 -1
- package/dist/construct-inference.js +1 -2
- package/dist/construct-registry.d.ts.map +1 -1
- package/dist/construct-registry.js +10 -2
- package/dist/contract-template-registry.d.ts.map +1 -1
- package/dist/contract-template-registry.js +10 -2
- package/dist/convention-registry.d.ts.map +1 -1
- package/dist/convention-registry.js +10 -2
- package/dist/decision-records.d.ts.map +1 -1
- package/dist/decision-records.js +9 -2
- package/dist/demo-script.d.ts +1 -0
- package/dist/demo-script.d.ts.map +1 -1
- package/dist/demo-script.js +43 -0
- package/dist/docs-check.js +1 -1
- package/dist/drift-baseline.d.ts.map +1 -1
- package/dist/drift-baseline.js +2 -5
- package/dist/feedback-ingestion.d.ts.map +1 -1
- package/dist/feedback-ingestion.js +16 -2
- package/dist/git-helpers.d.ts +12 -0
- package/dist/git-helpers.d.ts.map +1 -1
- package/dist/git-helpers.js +63 -0
- package/dist/helper-registry.d.ts +54 -27
- package/dist/helper-registry.d.ts.map +1 -1
- package/dist/helper-registry.js +517 -16
- package/dist/impact-analysis.d.ts.map +1 -1
- package/dist/impact-analysis.js +5 -4
- package/dist/impact-render.d.ts.map +1 -1
- package/dist/impact-render.js +9 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/ingest-drafts.js +4 -8
- package/dist/migration-profile-registry.d.ts.map +1 -1
- package/dist/migration-profile-registry.js +10 -2
- package/dist/monorepo-onboarding.js +2 -2
- package/dist/onboarding-drafts-merge.d.ts +71 -0
- package/dist/onboarding-drafts-merge.d.ts.map +1 -0
- package/dist/onboarding-drafts-merge.js +174 -0
- package/dist/onboarding-drafts.d.ts +14 -0
- package/dist/onboarding-drafts.d.ts.map +1 -1
- package/dist/onboarding-drafts.js +39 -5
- package/dist/onboarding-report.d.ts.map +1 -1
- package/dist/onboarding-report.js +1 -5
- package/dist/onboarding.d.ts +1 -1
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +64 -5
- package/dist/ownership.js +10 -2
- package/dist/pack-contributions-inventory.d.ts +1 -0
- package/dist/pack-contributions-inventory.d.ts.map +1 -1
- package/dist/pack-contributions-inventory.js +24 -0
- package/dist/pack-helper-registry.d.ts.map +1 -1
- package/dist/pack-helper-registry.js +10 -2
- package/dist/pack-release-check.d.ts.map +1 -1
- package/dist/pack-release-check.js +11 -4
- package/dist/pack-signature-status.d.ts.map +1 -1
- package/dist/pack-signature-status.js +1 -0
- package/dist/pack-symbol-compat.d.ts +17 -4
- package/dist/pack-symbol-compat.d.ts.map +1 -1
- package/dist/pack-symbol-compat.js +155 -7
- package/dist/pack-test-runner.js +10 -2
- package/dist/plan-simulation.d.ts.map +1 -1
- package/dist/plan-simulation.js +20 -3
- package/dist/playbook-registry.d.ts.map +1 -1
- package/dist/playbook-registry.js +10 -2
- package/dist/plugin-lifecycle-profile-registry.d.ts +52 -0
- package/dist/plugin-lifecycle-profile-registry.d.ts.map +1 -0
- package/dist/plugin-lifecycle-profile-registry.js +202 -0
- package/dist/plugin-lifecycle.d.ts +132 -0
- package/dist/plugin-lifecycle.d.ts.map +1 -0
- package/dist/plugin-lifecycle.js +477 -0
- package/dist/policy-engine.d.ts.map +1 -1
- package/dist/policy-engine.js +11 -3
- package/dist/policy-test.js +11 -3
- package/dist/product-coherence.js +5 -5
- package/dist/profile-registry.d.ts +1 -0
- package/dist/profile-registry.d.ts.map +1 -1
- package/dist/profile-registry.js +32 -4
- package/dist/quality-baseline.d.ts.map +1 -1
- package/dist/quality-baseline.js +1 -3
- package/dist/ranker-explainability.d.ts.map +1 -1
- package/dist/ranker-explainability.js +9 -3
- package/dist/registration-hint-registry.d.ts.map +1 -1
- package/dist/registration-hint-registry.js +10 -2
- package/dist/release-readiness.js +5 -5
- package/dist/reposet.js +1 -1
- package/dist/repository-knowledge-model.d.ts +1 -1
- package/dist/repository-knowledge-model.d.ts.map +1 -1
- package/dist/review-packet-v2.d.ts.map +1 -1
- package/dist/review-packet-v2.js +13 -3
- package/dist/rule-scaffold.d.ts.map +1 -1
- package/dist/rule-scaffold.js +4 -12
- package/dist/scaffold-patterns.js +10 -2
- package/dist/search-tuning-registry.d.ts.map +1 -1
- package/dist/search-tuning-registry.js +10 -2
- package/dist/self-config-doctor-v2.d.ts +1 -1
- package/dist/self-config-doctor-v2.d.ts.map +1 -1
- package/dist/self-config-doctor-v2.js +10 -6
- package/dist/self-config-doctor.d.ts.map +1 -1
- package/dist/self-config-doctor.js +13 -7
- package/dist/sharkcraft-inspector.d.ts.map +1 -1
- package/dist/sharkcraft-inspector.js +0 -1
- package/dist/start-here.d.ts +1 -1
- package/dist/start-here.js +1 -1
- package/dist/task-ranker.d.ts.map +1 -1
- package/dist/task-ranker.js +31 -1
- package/dist/task-routing-hint-registry.d.ts.map +1 -1
- package/dist/task-routing-hint-registry.js +10 -2
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +16 -8
- package/dist/universal-search.d.ts +1 -0
- package/dist/universal-search.d.ts.map +1 -1
- package/dist/universal-search.js +12 -0
- package/dist/upgrade-advisor.js +1 -1
- package/package.json +21 -22
- package/dist/synthesize-from-onboarding.d.ts +0 -68
- package/dist/synthesize-from-onboarding.d.ts.map +0 -1
- package/dist/synthesize-from-onboarding.js +0 -508
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,2BAA2B,CAAC;AAE1C,cAAc,wBAAwB,CAAC;AAEvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,wCAAwC,CAAC;AAEvD,cAAc,gCAAgC,CAAC;AAE/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,eAAe,CAAC"}
|
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";
|
package/dist/ingest-drafts.js
CHANGED
|
@@ -341,8 +341,7 @@ function renderRulesDraft(model) {
|
|
|
341
341
|
})`);
|
|
342
342
|
}
|
|
343
343
|
return `${header('Rules inferred from repository ingestion.')}
|
|
344
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
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,
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
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)
|
package/dist/onboarding.d.ts
CHANGED
|
@@ -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(
|
|
126
|
+
export declare function inferBoundaryRules(ws: IWorkspaceSummary, subDirs: ReadonlyMap<string, readonly string[]>): IInferredBoundaryRule[];
|
|
127
127
|
export interface IInferTemplateCandidatesOptions {
|
|
128
128
|
scaffoldTemplates?: boolean;
|
|
129
129
|
}
|
package/dist/onboarding.d.ts.map
CHANGED
|
@@ -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":"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"}
|
package/dist/onboarding.js
CHANGED
|
@@ -220,11 +220,59 @@ function packageManagerRunPrefix(manager) {
|
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
222
|
// ─── Boundary rule candidates ────────────────────────────────────────────────
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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({
|