@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
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Plan-only plugin lifecycle helpers driven by a resolved profile.
3
+ *
4
+ * Lifecycle helpers never write source directly. They emit a structured plan
5
+ * containing:
6
+ * - replaceOps: safe `replace` plan operations against the profile's
7
+ * key-table file, barrels, and other registry files.
8
+ * - manualSteps: things the planned-operation model cannot do today
9
+ * (rename a folder, delete a folder) when folder ops are
10
+ * not requested or not safe.
11
+ * - conflicts: anchors that could not be found — surfaced as advisory
12
+ * hints (no failure).
13
+ * - destructive: `true` for remove; `true` for rename when files need to
14
+ * be renamed on disk.
15
+ *
16
+ * The engine has no project-specific knowledge: every path / key style / barrel
17
+ * comes from the supplied `IPluginLifecycleProfile`. A pack contributes the
18
+ * profile via `pluginLifecycleProfileFiles` on the manifest.
19
+ */
20
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
21
+ import { checkFolderOpSafety } from '@shrkcrft/generator';
22
+ import { join } from 'node:path';
23
+ import { CaseStyle, } from '@shrkcrft/plugin-api';
24
+ export var PluginLifecycleAction;
25
+ (function (PluginLifecycleAction) {
26
+ PluginLifecycleAction["Rename"] = "rename";
27
+ PluginLifecycleAction["Remove"] = "remove";
28
+ })(PluginLifecycleAction || (PluginLifecycleAction = {}));
29
+ function readFileSafe(absPath) {
30
+ if (!existsSync(absPath))
31
+ return null;
32
+ try {
33
+ return readFileSync(absPath, 'utf8');
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function escapeRegex(s) {
40
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
41
+ }
42
+ /**
43
+ * Build a global regex that matches `${segment}/${name}` only when
44
+ * `name` ends at a true token boundary (the next character is NOT an
45
+ * identifier-continuation: kebab `-`, underscore `_`, digit, letter, or
46
+ * dot). Prevents `data` from matching inside `dataflow`, `data-flow`, or
47
+ * `data.foo`.
48
+ */
49
+ function segmentBoundaryRegex(segment, name) {
50
+ return new RegExp(`${escapeRegex(segment)}/${escapeRegex(name)}(?![A-Za-z0-9_\\-.])`, 'g');
51
+ }
52
+ function splitWords(input) {
53
+ if (!input)
54
+ return [];
55
+ // kebab / snake split
56
+ if (input.includes('-') || input.includes('_')) {
57
+ return input.split(/[-_]/).filter(Boolean);
58
+ }
59
+ // camel / pascal split on case boundaries
60
+ return input.split(/(?=[A-Z])/).map((w) => w.toLowerCase()).filter(Boolean);
61
+ }
62
+ function toCase(input, style) {
63
+ const words = splitWords(input);
64
+ if (words.length === 0)
65
+ return input;
66
+ switch (style) {
67
+ case CaseStyle.Kebab:
68
+ return words.map((w) => w.toLowerCase()).join('-');
69
+ case CaseStyle.UpperSnake:
70
+ return words.map((w) => w.toUpperCase()).join('_');
71
+ case CaseStyle.Pascal:
72
+ return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');
73
+ case CaseStyle.Camel: {
74
+ return words
75
+ .map((w, i) => i === 0
76
+ ? w.toLowerCase()
77
+ : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
78
+ .join('');
79
+ }
80
+ default:
81
+ return input;
82
+ }
83
+ }
84
+ function pluginKeysEntryRegex(keyTable, name) {
85
+ const key = toCase(name, keyTable.keyCase);
86
+ const value = toCase(name, keyTable.valueCase);
87
+ return new RegExp(`\\s*${escapeRegex(key)}:\\s*['"]${escapeRegex(value)}['"],?\\n`);
88
+ }
89
+ function findFirstMatch(content, re) {
90
+ if (!content)
91
+ return null;
92
+ const m = content.match(re);
93
+ return m ? m[0] : null;
94
+ }
95
+ function loadProfileContext(projectRoot, profile) {
96
+ const keyTablePath = profile.keyTable?.path ? join(projectRoot, profile.keyTable.path) : null;
97
+ const keyTableContent = keyTablePath ? readFileSafe(keyTablePath) : null;
98
+ const barrels = (profile.barrels ?? []).map((b) => {
99
+ const absPath = join(projectRoot, b.path);
100
+ return { barrel: b, absPath, content: readFileSafe(absPath) };
101
+ });
102
+ return { projectRoot, keyTablePath, keyTableContent, barrels };
103
+ }
104
+ export function buildPluginRenamePlan(input) {
105
+ const { projectRoot, profile, oldName, newName } = input;
106
+ const ctx = loadProfileContext(projectRoot, profile);
107
+ const replaceOps = [];
108
+ const manualSteps = [];
109
+ const conflicts = [];
110
+ // Key-table entry rename
111
+ if (profile.keyTable && ctx.keyTableContent) {
112
+ const keyTablePath = profile.keyTable.path;
113
+ const keysFind = findFirstMatch(ctx.keyTableContent, pluginKeysEntryRegex(profile.keyTable, oldName));
114
+ if (keysFind) {
115
+ const oldKey = toCase(oldName, profile.keyTable.keyCase);
116
+ const newKey = toCase(newName, profile.keyTable.keyCase);
117
+ const oldValue = toCase(oldName, profile.keyTable.valueCase);
118
+ const newValue = toCase(newName, profile.keyTable.valueCase);
119
+ replaceOps.push({
120
+ targetPath: keyTablePath,
121
+ operation: {
122
+ kind: 'replace',
123
+ find: keysFind,
124
+ replaceWith: keysFind
125
+ .replace(new RegExp(escapeRegex(oldKey)), newKey)
126
+ .replace(new RegExp(`['"]${escapeRegex(oldValue)}['"]`), `'${newValue}'`),
127
+ description: `Rename key-table entry ${oldKey} → ${newKey}; '${oldValue}' → '${newValue}'.`,
128
+ },
129
+ });
130
+ }
131
+ else {
132
+ conflicts.push(`Key-table entry for "${oldName}" not found in ${keyTablePath}.`);
133
+ }
134
+ }
135
+ // Barrel exports: word/token-bounded matching prevents substring
136
+ // overlap (e.g. `data` matching inside `dataflow`). A segment match is
137
+ // valid only when the character after `${segment}/${name}` is NOT a
138
+ // kebab/identifier continuation character (so `data` doesn't pre-match
139
+ // `dataflow`, `data-flow`, or `data_flow`).
140
+ for (const { barrel, content } of ctx.barrels) {
141
+ if (!content)
142
+ continue;
143
+ const segment = barrel.exportSegment ?? 'plugins';
144
+ const segmentMatchRe = segmentBoundaryRegex(segment, oldName);
145
+ if (segmentMatchRe.test(content)) {
146
+ const lines = content.split('\n');
147
+ for (const line of lines) {
148
+ // Reset lastIndex so the global regex doesn't skip lines.
149
+ segmentMatchRe.lastIndex = 0;
150
+ if (segmentMatchRe.test(line)) {
151
+ replaceOps.push({
152
+ targetPath: barrel.path,
153
+ operation: {
154
+ kind: 'replace',
155
+ find: line + '\n',
156
+ replaceWith: line.replace(segmentBoundaryRegex(segment, oldName), `${segment}/${newName}`) + '\n',
157
+ description: `Update barrel export from ${segment}/${oldName} to ${segment}/${newName}.`,
158
+ },
159
+ });
160
+ }
161
+ }
162
+ }
163
+ else {
164
+ conflicts.push(`No barrel export referencing "${segment}/${oldName}" in ${barrel.path}.`);
165
+ }
166
+ }
167
+ // Plugin folder renames — manual unless folder ops requested at the caller
168
+ const folderOps = [];
169
+ for (const root of profile.pluginRoots) {
170
+ const oldDir = join(projectRoot, root.path, oldName);
171
+ if (existsSync(oldDir)) {
172
+ if (input.emitFolderOps) {
173
+ const safety = checkFolderOpSafety(projectRoot, `${root.path}/${oldName}`, 'rename-folder');
174
+ folderOps.push({
175
+ kind: 'rename-folder',
176
+ targetPath: `${root.path}/${oldName}`,
177
+ newPath: `${root.path}/${newName}`,
178
+ safety: safety.safety,
179
+ ...(safety.reason ? { safetyReason: safety.reason } : {}),
180
+ reason: 'Structured rename-folder op. Apply rejects unsafe paths automatically; humans still review.',
181
+ });
182
+ }
183
+ else {
184
+ manualSteps.push({
185
+ kind: 'rename-folder',
186
+ targetPath: `${root.path}/${oldName}`,
187
+ newPath: `${root.path}/${newName}`,
188
+ reason: 'Rename plugin folder. Plan v2 has no rename-folder op by default; pass `--emit-folder-ops` to include them in the plan.',
189
+ });
190
+ }
191
+ }
192
+ }
193
+ return {
194
+ schema: 'sharkcraft.plugin-lifecycle/v1',
195
+ action: PluginLifecycleAction.Rename,
196
+ profile: profile.id,
197
+ oldName,
198
+ newName,
199
+ destructive: manualSteps.length > 0 || folderOps.length > 0,
200
+ humanApprovalRequired: true,
201
+ replaceOps,
202
+ manualSteps,
203
+ ...(folderOps.length > 0 ? { folderOps } : {}),
204
+ conflicts,
205
+ validationCommands: profile.validationCommands ?? [
206
+ 'shrk check boundaries --changed-only',
207
+ 'shrk doctor',
208
+ ],
209
+ };
210
+ }
211
+ export function buildPluginRemovePlan(input) {
212
+ const { projectRoot, profile, oldName } = input;
213
+ const ctx = loadProfileContext(projectRoot, profile);
214
+ const replaceOps = [];
215
+ const manualSteps = [];
216
+ const folderOps = [];
217
+ const conflicts = [];
218
+ if (profile.keyTable && ctx.keyTableContent) {
219
+ const keyTablePath = profile.keyTable.path;
220
+ const keysFind = findFirstMatch(ctx.keyTableContent, pluginKeysEntryRegex(profile.keyTable, oldName));
221
+ if (keysFind) {
222
+ const oldKey = toCase(oldName, profile.keyTable.keyCase);
223
+ replaceOps.push({
224
+ targetPath: keyTablePath,
225
+ operation: {
226
+ kind: 'replace',
227
+ find: keysFind,
228
+ replaceWith: '',
229
+ description: `Remove key-table entry ${oldKey}.`,
230
+ },
231
+ });
232
+ }
233
+ else {
234
+ conflicts.push(`Key-table entry for "${oldName}" not found in ${keyTablePath}.`);
235
+ }
236
+ }
237
+ for (const { barrel, content } of ctx.barrels) {
238
+ if (!content)
239
+ continue;
240
+ const segment = barrel.exportSegment ?? 'plugins';
241
+ const segmentMatchRe = segmentBoundaryRegex(segment, oldName);
242
+ const lines = content.split('\n');
243
+ for (const line of lines) {
244
+ segmentMatchRe.lastIndex = 0;
245
+ if (segmentMatchRe.test(line)) {
246
+ replaceOps.push({
247
+ targetPath: barrel.path,
248
+ operation: {
249
+ kind: 'replace',
250
+ find: line + '\n',
251
+ replaceWith: '',
252
+ description: `Remove barrel export referencing ${segment}/${oldName} from ${barrel.path}.`,
253
+ },
254
+ });
255
+ }
256
+ }
257
+ }
258
+ for (const root of profile.pluginRoots) {
259
+ const oldDir = join(projectRoot, root.path, oldName);
260
+ if (existsSync(oldDir)) {
261
+ if (input.emitFolderOps) {
262
+ const safety = checkFolderOpSafety(projectRoot, `${root.path}/${oldName}`, 'delete-folder');
263
+ folderOps.push({
264
+ kind: 'delete-folder',
265
+ targetPath: `${root.path}/${oldName}`,
266
+ safety: safety.safety,
267
+ ...(safety.reason ? { safetyReason: safety.reason } : {}),
268
+ reason: 'Structured delete-folder op. Apply rejects unsafe paths and requires `--allow-delete-folder`.',
269
+ });
270
+ }
271
+ else {
272
+ manualSteps.push({
273
+ kind: 'delete-folder',
274
+ targetPath: `${root.path}/${oldName}`,
275
+ reason: 'Delete plugin folder. Destructive; plan v2 has no delete-folder op by default. Use `git rm -r` after the plan is applied, or pass `--emit-folder-ops`.',
276
+ });
277
+ }
278
+ }
279
+ }
280
+ return {
281
+ schema: 'sharkcraft.plugin-lifecycle/v1',
282
+ action: PluginLifecycleAction.Remove,
283
+ profile: profile.id,
284
+ oldName,
285
+ destructive: true,
286
+ humanApprovalRequired: true,
287
+ replaceOps,
288
+ manualSteps,
289
+ ...(folderOps.length > 0 ? { folderOps } : {}),
290
+ conflicts,
291
+ validationCommands: profile.validationCommands ?? [
292
+ 'shrk check boundaries --changed-only',
293
+ 'shrk doctor',
294
+ ],
295
+ };
296
+ }
297
+ /**
298
+ * Convert a plugin-lifecycle plan into a saved plan (synthetic
299
+ * templateId) so it can flow through `shrk apply`. ReplaceOps become
300
+ * `expectedChanges` carrying their operation intent; folderOps[] is copied
301
+ * through. The plan is unsigned by this helper; call `signPlan` separately.
302
+ */
303
+ export const PLUGIN_LIFECYCLE_SYNTHETIC_TEMPLATE = '__plugin-lifecycle__';
304
+ export function pluginLifecyclePlanToSavedPlan(plan, projectRoot) {
305
+ // Drop redundant no-op replace entries (find == replaceWith).
306
+ const seen = new Set();
307
+ const filteredReplaceOps = plan.replaceOps.filter((op) => {
308
+ if (op.operation.find === op.operation.replaceWith)
309
+ return false;
310
+ const key = `${op.targetPath}::${op.operation.find}`;
311
+ if (seen.has(key))
312
+ return false;
313
+ seen.add(key);
314
+ return true;
315
+ });
316
+ // Compute the post-apply file size for each replace op against the
317
+ // current file, so apply-time divergence detection doesn't false-positive
318
+ // size-changes against a sentinel value.
319
+ const expectedChanges = filteredReplaceOps.map((op) => {
320
+ const abs = join(projectRoot, op.targetPath);
321
+ let sizeBytes = Buffer.byteLength(op.operation.replaceWith, 'utf8');
322
+ const existing = readFileSafe(abs);
323
+ if (existing !== null) {
324
+ // Compute the size as the file would look after the replace at save
325
+ // time. Apply will re-evaluate against the (potentially newer) file
326
+ // and `diffPlanChanges` compares this to the size produced by the
327
+ // live evaluator.
328
+ const findCount = (existing.match(new RegExp(escapeRegex(op.operation.find), 'g')) ?? []).length;
329
+ if (findCount === 1) {
330
+ const next = existing.replace(op.operation.find, op.operation.replaceWith);
331
+ sizeBytes = Buffer.byteLength(next, 'utf8');
332
+ }
333
+ else {
334
+ sizeBytes = Buffer.byteLength(existing, 'utf8');
335
+ }
336
+ }
337
+ return {
338
+ type: 'replace',
339
+ relativePath: op.targetPath,
340
+ sizeBytes,
341
+ operation: op.operation,
342
+ };
343
+ });
344
+ const out = {
345
+ schema: 'sharkcraft.plan/v2',
346
+ templateId: PLUGIN_LIFECYCLE_SYNTHETIC_TEMPLATE,
347
+ variables: {
348
+ profile: plan.profile,
349
+ oldName: plan.oldName,
350
+ ...(plan.newName ? { newName: plan.newName } : {}),
351
+ action: plan.action,
352
+ },
353
+ projectRoot,
354
+ createdAt: new Date().toISOString(),
355
+ expectedChanges,
356
+ };
357
+ if (plan.folderOps && plan.folderOps.length > 0) {
358
+ out.folderOps = plan.folderOps.map((fo) => {
359
+ const entry = {
360
+ kind: fo.kind,
361
+ targetPath: fo.targetPath,
362
+ reason: fo.reason,
363
+ };
364
+ if (fo.newPath !== undefined)
365
+ entry.newPath = fo.newPath;
366
+ return entry;
367
+ });
368
+ }
369
+ return out;
370
+ }
371
+ export function renderPluginLifecyclePlanText(plan) {
372
+ const lines = [];
373
+ lines.push(`=== Plugin ${plan.action} (${plan.profile} profile) ===`);
374
+ lines.push(` oldName ${plan.oldName}`);
375
+ if (plan.newName)
376
+ lines.push(` newName ${plan.newName}`);
377
+ lines.push(` destructive ${plan.destructive ? 'YES' : 'no'}`);
378
+ lines.push(` approval ${plan.humanApprovalRequired ? 'human review required' : 'auto'}`);
379
+ lines.push('');
380
+ lines.push(`Planned replace ops (${plan.replaceOps.length}):`);
381
+ for (const op of plan.replaceOps) {
382
+ lines.push(` • ${op.targetPath}`);
383
+ lines.push(` ${op.operation.description}`);
384
+ }
385
+ if (plan.manualSteps.length > 0) {
386
+ lines.push('');
387
+ lines.push(`Manual steps required (${plan.manualSteps.length}):`);
388
+ for (const step of plan.manualSteps) {
389
+ lines.push(` • [${step.kind}] ${step.targetPath}${step.newPath ? ` → ${step.newPath}` : ''}`);
390
+ lines.push(` ${step.reason}`);
391
+ }
392
+ }
393
+ if (plan.conflicts.length > 0) {
394
+ lines.push('');
395
+ lines.push(`Conflicts (${plan.conflicts.length}):`);
396
+ for (const c of plan.conflicts)
397
+ lines.push(` • ${c}`);
398
+ }
399
+ lines.push('');
400
+ lines.push(`Validation commands:`);
401
+ for (const c of plan.validationCommands)
402
+ lines.push(` $ ${c}`);
403
+ return lines.join('\n') + '\n';
404
+ }
405
+ export function buildPluginLifecycleListing(input) {
406
+ const { projectRoot, profile } = input;
407
+ const layers = {};
408
+ for (const root of profile.pluginRoots) {
409
+ const dir = join(projectRoot, root.path);
410
+ if (!existsSync(dir))
411
+ continue;
412
+ let entries;
413
+ try {
414
+ entries = readdirSync(dir, { withFileTypes: true });
415
+ }
416
+ catch {
417
+ continue;
418
+ }
419
+ layers[root.path] = entries
420
+ .filter((e) => e.isDirectory())
421
+ .map((e) => String(e.name));
422
+ }
423
+ const pluginKeys = [];
424
+ if (profile.keyTable) {
425
+ const keyTableContent = readFileSafe(join(projectRoot, profile.keyTable.path));
426
+ if (keyTableContent) {
427
+ const re = /(^|\n)\s*([A-Za-z_][A-Za-z0-9_]*):\s*'([A-Za-z_][A-Za-z0-9_-]*)'/g;
428
+ let match;
429
+ while ((match = re.exec(keyTableContent)) !== null) {
430
+ pluginKeys.push({ key: match[2], value: match[3] });
431
+ }
432
+ }
433
+ }
434
+ return { pluginsByLayer: layers, pluginKeys };
435
+ }
436
+ export function checkPluginLifecycleProfileHealth(projectRoot, profile) {
437
+ const out = [];
438
+ if (profile.keyTable) {
439
+ const abs = join(projectRoot, profile.keyTable.path);
440
+ if (!existsSync(abs)) {
441
+ out.push({
442
+ id: 'missing-key-table',
443
+ severity: 'warning',
444
+ path: profile.keyTable.path,
445
+ message: `keyTable.path "${profile.keyTable.path}" not found in this workspace.`,
446
+ });
447
+ }
448
+ }
449
+ for (const b of profile.barrels ?? []) {
450
+ if (!existsSync(join(projectRoot, b.path))) {
451
+ out.push({
452
+ id: 'missing-barrel',
453
+ severity: 'warning',
454
+ path: b.path,
455
+ message: `Barrel "${b.id}" path "${b.path}" not found.`,
456
+ });
457
+ }
458
+ }
459
+ for (const r of profile.pluginRoots) {
460
+ if (!existsSync(join(projectRoot, r.path))) {
461
+ out.push({
462
+ id: 'missing-plugin-root',
463
+ severity: 'warning',
464
+ path: r.path,
465
+ message: `Plugin root "${r.id}" path "${r.path}" not found.`,
466
+ });
467
+ }
468
+ }
469
+ if (out.length === 0) {
470
+ out.push({
471
+ id: 'ok',
472
+ severity: 'info',
473
+ message: `Profile "${profile.id}" looks healthy in this workspace.`,
474
+ });
475
+ }
476
+ return out;
477
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../src/policy-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../src/policy-engine.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,16 @@
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
  import { existsSync, readFileSync } from 'node:fs';
2
10
  import * as nodePath from 'node:path';
11
+ import { pathToFileURL } from 'node:url';
3
12
  import { evaluateBoundaries, loadTsconfigPaths, scanImports } from '@shrkcrft/boundaries';
4
13
  import { impactFor, loadOwnershipRules } from "./ownership.js";
5
- import { importModuleViaLoader } from '@shrkcrft/core';
6
14
  export const POLICY_REPORT_SCHEMA = 'sharkcraft.policy-report/v1';
7
15
  export var PolicySeverity;
8
16
  (function (PolicySeverity) {
@@ -184,7 +192,7 @@ export async function evaluatePolicy(inspection, input = {}) {
184
192
  if (!existsSync(full))
185
193
  continue;
186
194
  try {
187
- const mod = (await importModuleViaLoader(full));
195
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(full).href)));
188
196
  const decls = mod.default ?? mod.policyChecks ?? [];
189
197
  for (const d of decls) {
190
198
  runDecl(d, {
@@ -242,7 +250,7 @@ export async function evaluatePolicy(inspection, input = {}) {
242
250
  if (!existsSync(full))
243
251
  continue;
244
252
  try {
245
- const mod = (await importModuleViaLoader(full));
253
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(full).href)));
246
254
  const decls = mod.default ?? mod.policyChecks ?? [];
247
255
  for (const d of decls) {
248
256
  runDecl(d, {
@@ -1,7 +1,15 @@
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
  import { createHash } from 'node:crypto';
2
10
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
11
  import * as nodePath from 'node:path';
4
- import { importModuleViaLoader } from '@shrkcrft/core';
12
+ import { pathToFileURL } from 'node:url';
5
13
  import { evaluatePolicy, PolicySeverity, } from "./policy-engine.js";
6
14
  export const POLICY_TEST_SCHEMA = 'sharkcraft.policy-test/v1';
7
15
  export const POLICY_SNAPSHOT_SCHEMA = 'sharkcraft.policy-snapshot/v1';
@@ -52,7 +60,7 @@ async function loadLocalPolicyChecks(inspection, localFiles) {
52
60
  if (!existsSync(file))
53
61
  continue;
54
62
  try {
55
- const mod = (await importModuleViaLoader(file));
63
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(file).href)));
56
64
  const decls = mod.default ?? mod.policyChecks ?? [];
57
65
  for (const d of decls)
58
66
  out.push({ check: d, sourceFile: file, isLocal: true });
@@ -69,7 +77,7 @@ async function loadLocalPolicyChecks(inspection, localFiles) {
69
77
  if (!existsSync(file))
70
78
  continue;
71
79
  try {
72
- const mod = (await importModuleViaLoader(file));
80
+ const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(file).href)));
73
81
  const decls = mod.default ?? mod.policyChecks ?? [];
74
82
  for (const d of decls)
75
83
  out.push({ check: d, sourceFile: file, isLocal: false });
@@ -9,7 +9,7 @@
9
9
  * - README links to release notes / limitations / external quickstart.
10
10
  * - docs/commands-taxonomy.md presence (when expected).
11
11
  * - docs/public-alpha-checklist.md mentions final validation gates.
12
- * - docs/releases/0.1.0-alpha.2.md states "not production stable" or equivalent.
12
+ * - docs/releases/0.1.0-alpha.9.md states "not production stable" or equivalent.
13
13
  *
14
14
  * `--strict` converts warnings to errors.
15
15
  *
@@ -21,7 +21,7 @@ export const PRODUCT_COHERENCE_SCHEMA = 'sharkcraft.product-coherence/v1';
21
21
  const REQUIRED_DOCS = [
22
22
  'README.md',
23
23
  'docs/safety-model.md',
24
- 'docs/releases/0.1.0-alpha.2.md',
24
+ 'docs/releases/0.1.0-alpha.9.md',
25
25
  'docs/public-alpha-limitations.md',
26
26
  'docs/external-repo-quickstart.md',
27
27
  'CHANGELOG.md',
@@ -38,7 +38,7 @@ const README_RECOMMENDED_LINKS = [
38
38
  {
39
39
  phrase: /docs\/releases\/[^\s\)]+|release[-\s]?notes/i,
40
40
  id: 'readme-link-release-notes',
41
- message: 'README should link to release notes (e.g. docs/releases/0.1.0-alpha.2.md).',
41
+ message: 'README should link to release notes (e.g. docs/releases/0.1.0-alpha.9.md).',
42
42
  },
43
43
  {
44
44
  phrase: /docs\/public[-\s]?alpha[-\s]?limitations/i,
@@ -77,14 +77,14 @@ function checkChangelog(root, findings) {
77
77
  }
78
78
  }
79
79
  function checkReleaseNotes(root, findings) {
80
- const rel = readFileText(root, 'docs/releases/0.1.0-alpha.2.md');
80
+ const rel = readFileText(root, 'docs/releases/0.1.0-alpha.9.md');
81
81
  if (!rel)
82
82
  return;
83
83
  if (!/not\s+production[-\s]?stable|public[-\s]?alpha|preview|early[-\s]?stage/i.test(rel)) {
84
84
  findings.push({
85
85
  id: 'release-notes-stability-disclaimer',
86
86
  severity: 'warning',
87
- message: 'docs/releases/0.1.0-alpha.2.md should state the release is not production-stable (or equivalent).',
87
+ message: 'docs/releases/0.1.0-alpha.9.md should state the release is not production-stable (or equivalent).',
88
88
  });
89
89
  }
90
90
  }
@@ -1,6 +1,7 @@
1
1
  import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
2
2
  export declare const PROFILE_REGISTRY_SCHEMA = "sharkcraft.profile-registry/v1";
3
3
  export declare enum ProfileKind {
4
+ PluginLifecycle = "plugin-lifecycle",
4
5
  Migration = "migration"
5
6
  }
6
7
  export declare enum ProfileSource {
@@ -1 +1 @@
1
- {"version":3,"file":"profile-registry.d.ts","sourceRoot":"","sources":["../src/profile-registry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AAExE,oBAAY,WAAW;IACrB,SAAS,cAAc;CAExB;AAED,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,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,IAAI,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IACT,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC1C,CAAC,CAsCD;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,GACnC,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAInC;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,qBAAqB,EACjC,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAK/B;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAAC,CAG3C"}
1
+ {"version":3,"file":"profile-registry.d.ts","sourceRoot":"","sources":["../src/profile-registry.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AAExE,oBAAY,WAAW;IACrB,eAAe,qBAAqB;IACpC,SAAS,cAAc;CAExB;AAED,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,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,IAAI,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IACT,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC1C,CAAC,CAgED;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,GACnC,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAInC;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,qBAAqB,EACjC,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAK/B;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAAC,CAG3C"}