mewkit 1.12.1 → 1.14.0

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 (213) hide show
  1. package/README.md +37 -0
  2. package/dist/commands/migrate.d.ts +2 -0
  3. package/dist/commands/migrate.d.ts.map +1 -1
  4. package/dist/commands/migrate.js +2 -0
  5. package/dist/commands/migrate.js.map +1 -1
  6. package/dist/commands/validate.js +14 -7
  7. package/dist/commands/validate.js.map +1 -1
  8. package/dist/core/derived-index.d.ts +1 -1
  9. package/dist/core/derived-index.d.ts.map +1 -1
  10. package/dist/core/derived-index.js +3 -2
  11. package/dist/core/derived-index.js.map +1 -1
  12. package/dist/index.js +11 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/migrate/config-merger/merge-single-sections.d.ts.map +1 -1
  15. package/dist/migrate/config-merger/merge-single-sections.js +4 -2
  16. package/dist/migrate/config-merger/merge-single-sections.js.map +1 -1
  17. package/dist/migrate/converters/command-to-codex-skill.d.ts +10 -0
  18. package/dist/migrate/converters/command-to-codex-skill.d.ts.map +1 -0
  19. package/dist/migrate/converters/command-to-codex-skill.js +78 -0
  20. package/dist/migrate/converters/command-to-codex-skill.js.map +1 -0
  21. package/dist/migrate/converters/direct-copy.d.ts +4 -1
  22. package/dist/migrate/converters/direct-copy.d.ts.map +1 -1
  23. package/dist/migrate/converters/direct-copy.js +19 -22
  24. package/dist/migrate/converters/direct-copy.js.map +1 -1
  25. package/dist/migrate/converters/fm-strip.d.ts.map +1 -1
  26. package/dist/migrate/converters/fm-strip.js +5 -1
  27. package/dist/migrate/converters/fm-strip.js.map +1 -1
  28. package/dist/migrate/converters/fm-to-codex-toml.js +1 -1
  29. package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -1
  30. package/dist/migrate/converters/fm-to-fm.js +4 -4
  31. package/dist/migrate/converters/fm-to-fm.js.map +1 -1
  32. package/dist/migrate/converters/fm-to-json.d.ts.map +1 -1
  33. package/dist/migrate/converters/fm-to-json.js +2 -1
  34. package/dist/migrate/converters/fm-to-json.js.map +1 -1
  35. package/dist/migrate/converters/fm-to-yaml.js +1 -1
  36. package/dist/migrate/converters/fm-to-yaml.js.map +1 -1
  37. package/dist/migrate/converters/index.d.ts +7 -2
  38. package/dist/migrate/converters/index.d.ts.map +1 -1
  39. package/dist/migrate/converters/index.js +7 -7
  40. package/dist/migrate/converters/index.js.map +1 -1
  41. package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts +8 -0
  42. package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts.map +1 -0
  43. package/dist/migrate/converters/mcp-json-to-codex-toml.js +65 -0
  44. package/dist/migrate/converters/mcp-json-to-codex-toml.js.map +1 -0
  45. package/dist/migrate/converters/md-strip.d.ts +10 -1
  46. package/dist/migrate/converters/md-strip.d.ts.map +1 -1
  47. package/dist/migrate/converters/md-strip.js +27 -70
  48. package/dist/migrate/converters/md-strip.js.map +1 -1
  49. package/dist/migrate/converters/md-to-kiro-steering.js +1 -1
  50. package/dist/migrate/converters/md-to-kiro-steering.js.map +1 -1
  51. package/dist/migrate/converters/md-to-mdc.js +1 -1
  52. package/dist/migrate/converters/md-to-mdc.js.map +1 -1
  53. package/dist/migrate/converters/md-to-toml.js +1 -1
  54. package/dist/migrate/converters/md-to-toml.js.map +1 -1
  55. package/dist/migrate/hooks/codex-features-flag.d.ts.map +1 -1
  56. package/dist/migrate/hooks/codex-features-flag.js +21 -6
  57. package/dist/migrate/hooks/codex-features-flag.js.map +1 -1
  58. package/dist/migrate/hooks/codex-hook-wrapper.js +1 -1
  59. package/dist/migrate/hooks/codex-mcp-installer.d.ts +9 -0
  60. package/dist/migrate/hooks/codex-mcp-installer.d.ts.map +1 -0
  61. package/dist/migrate/hooks/codex-mcp-installer.js +65 -0
  62. package/dist/migrate/hooks/codex-mcp-installer.js.map +1 -0
  63. package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -1
  64. package/dist/migrate/hooks/codex-toml-installer.js +15 -6
  65. package/dist/migrate/hooks/codex-toml-installer.js.map +1 -1
  66. package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -1
  67. package/dist/migrate/hooks/hooks-settings-merger.js +5 -1
  68. package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -1
  69. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  70. package/dist/migrate/migrate-orchestrator.js +86 -9
  71. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  72. package/dist/migrate/migrate-ui-summary.d.ts +2 -0
  73. package/dist/migrate/migrate-ui-summary.d.ts.map +1 -1
  74. package/dist/migrate/migrate-ui-summary.js +26 -0
  75. package/dist/migrate/migrate-ui-summary.js.map +1 -1
  76. package/dist/migrate/portability-policy.d.ts +3 -1
  77. package/dist/migrate/portability-policy.d.ts.map +1 -1
  78. package/dist/migrate/portability-policy.js +5 -31
  79. package/dist/migrate/portability-policy.js.map +1 -1
  80. package/dist/migrate/portable-installer.d.ts +3 -0
  81. package/dist/migrate/portable-installer.d.ts.map +1 -1
  82. package/dist/migrate/portable-installer.js +67 -6
  83. package/dist/migrate/portable-installer.js.map +1 -1
  84. package/dist/migrate/provider-registry-utils.d.ts.map +1 -1
  85. package/dist/migrate/provider-registry-utils.js +5 -0
  86. package/dist/migrate/provider-registry-utils.js.map +1 -1
  87. package/dist/migrate/providers/codex/capabilities.d.ts +1 -1
  88. package/dist/migrate/providers/codex/capabilities.d.ts.map +1 -1
  89. package/dist/migrate/providers/codex/capabilities.js +56 -0
  90. package/dist/migrate/providers/codex/capabilities.js.map +1 -1
  91. package/dist/migrate/providers/codex/config.d.ts.map +1 -1
  92. package/dist/migrate/providers/codex/config.js +21 -8
  93. package/dist/migrate/providers/codex/config.js.map +1 -1
  94. package/dist/migrate/providers/codex/contract.d.ts.map +1 -1
  95. package/dist/migrate/providers/codex/contract.js +4 -3
  96. package/dist/migrate/providers/codex/contract.js.map +1 -1
  97. package/dist/migrate/providers/provider-config-types.d.ts +1 -1
  98. package/dist/migrate/providers/provider-config-types.d.ts.map +1 -1
  99. package/dist/migrate/reconcile/portable-manifest.d.ts +12 -12
  100. package/dist/migrate/reconcile/portable-registry.d.ts +24 -24
  101. package/dist/migrate/reconcile/process-lock.d.ts.map +1 -1
  102. package/dist/migrate/reconcile/process-lock.js +10 -1
  103. package/dist/migrate/reconcile/process-lock.js.map +1 -1
  104. package/dist/migrate/references/codex-command-skill-path.d.ts +12 -0
  105. package/dist/migrate/references/codex-command-skill-path.d.ts.map +1 -0
  106. package/dist/migrate/references/codex-command-skill-path.js +27 -0
  107. package/dist/migrate/references/codex-command-skill-path.js.map +1 -0
  108. package/dist/migrate/references/fence-aware-reference-rewriter.d.ts +30 -0
  109. package/dist/migrate/references/fence-aware-reference-rewriter.d.ts.map +1 -0
  110. package/dist/migrate/references/fence-aware-reference-rewriter.js +182 -0
  111. package/dist/migrate/references/fence-aware-reference-rewriter.js.map +1 -0
  112. package/dist/migrate/references/reference-classifier.d.ts +12 -0
  113. package/dist/migrate/references/reference-classifier.d.ts.map +1 -0
  114. package/dist/migrate/references/reference-classifier.js +144 -0
  115. package/dist/migrate/references/reference-classifier.js.map +1 -0
  116. package/dist/migrate/references/reference-target-registry.d.ts +42 -0
  117. package/dist/migrate/references/reference-target-registry.d.ts.map +1 -0
  118. package/dist/migrate/references/reference-target-registry.js +100 -0
  119. package/dist/migrate/references/reference-target-registry.js.map +1 -0
  120. package/dist/migrate/references/reference-types.d.ts +23 -0
  121. package/dist/migrate/references/reference-types.d.ts.map +1 -0
  122. package/dist/migrate/references/reference-types.js +5 -0
  123. package/dist/migrate/references/reference-types.js.map +1 -0
  124. package/dist/migrate/runtime-compat-audit.d.ts +2 -1
  125. package/dist/migrate/runtime-compat-audit.d.ts.map +1 -1
  126. package/dist/migrate/runtime-compat-audit.js +2 -2
  127. package/dist/migrate/runtime-compat-audit.js.map +1 -1
  128. package/dist/migrate/runtime-coupling-patterns.d.ts +2 -1
  129. package/dist/migrate/runtime-coupling-patterns.d.ts.map +1 -1
  130. package/dist/migrate/runtime-coupling-patterns.js +18 -3
  131. package/dist/migrate/runtime-coupling-patterns.js.map +1 -1
  132. package/dist/migrate/skill-directory-audit.d.ts +3 -0
  133. package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
  134. package/dist/migrate/skill-directory-audit.js +2 -1
  135. package/dist/migrate/skill-directory-audit.js.map +1 -1
  136. package/dist/migrate/skill-directory-installer.d.ts +2 -0
  137. package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
  138. package/dist/migrate/skill-directory-installer.js +17 -8
  139. package/dist/migrate/skill-directory-installer.js.map +1 -1
  140. package/dist/migrate/types.d.ts +20 -10
  141. package/dist/migrate/types.d.ts.map +1 -1
  142. package/dist/migrate/types.js +4 -0
  143. package/dist/migrate/types.js.map +1 -1
  144. package/dist/migrate/validation/migrate-conversion-report.d.ts +20 -0
  145. package/dist/migrate/validation/migrate-conversion-report.d.ts.map +1 -0
  146. package/dist/migrate/validation/migrate-conversion-report.js +105 -0
  147. package/dist/migrate/validation/migrate-conversion-report.js.map +1 -0
  148. package/dist/migrate/validation/unresolved-reference-scanner.d.ts +18 -0
  149. package/dist/migrate/validation/unresolved-reference-scanner.d.ts.map +1 -0
  150. package/dist/migrate/validation/unresolved-reference-scanner.js +47 -0
  151. package/dist/migrate/validation/unresolved-reference-scanner.js.map +1 -0
  152. package/dist/wiki/application/ports.d.ts +8 -0
  153. package/dist/wiki/application/ports.d.ts.map +1 -1
  154. package/dist/wiki/handoff/domain.d.ts +107 -0
  155. package/dist/wiki/handoff/domain.d.ts.map +1 -0
  156. package/dist/wiki/handoff/domain.js +31 -0
  157. package/dist/wiki/handoff/domain.js.map +1 -0
  158. package/dist/wiki/handoff/profile-factory.d.ts +26 -0
  159. package/dist/wiki/handoff/profile-factory.d.ts.map +1 -0
  160. package/dist/wiki/handoff/profile-factory.js +65 -0
  161. package/dist/wiki/handoff/profile-factory.js.map +1 -0
  162. package/dist/wiki/handoff/profiles/external.d.ts +3 -0
  163. package/dist/wiki/handoff/profiles/external.d.ts.map +1 -0
  164. package/dist/wiki/handoff/profiles/external.js +27 -0
  165. package/dist/wiki/handoff/profiles/external.js.map +1 -0
  166. package/dist/wiki/handoff/profiles/framework.d.ts +3 -0
  167. package/dist/wiki/handoff/profiles/framework.d.ts.map +1 -0
  168. package/dist/wiki/handoff/profiles/framework.js +83 -0
  169. package/dist/wiki/handoff/profiles/framework.js.map +1 -0
  170. package/dist/wiki/handoff/profiles/lifecycle.d.ts +3 -0
  171. package/dist/wiki/handoff/profiles/lifecycle.d.ts.map +1 -0
  172. package/dist/wiki/handoff/profiles/lifecycle.js +30 -0
  173. package/dist/wiki/handoff/profiles/lifecycle.js.map +1 -0
  174. package/dist/wiki/handoff/profiles/research.d.ts +3 -0
  175. package/dist/wiki/handoff/profiles/research.d.ts.map +1 -0
  176. package/dist/wiki/handoff/profiles/research.js +31 -0
  177. package/dist/wiki/handoff/profiles/research.js.map +1 -0
  178. package/dist/wiki/handoff/profiles/review.d.ts +3 -0
  179. package/dist/wiki/handoff/profiles/review.d.ts.map +1 -0
  180. package/dist/wiki/handoff/profiles/review.js +19 -0
  181. package/dist/wiki/handoff/profiles/review.js.map +1 -0
  182. package/dist/wiki/handoff/profiles/security.d.ts +3 -0
  183. package/dist/wiki/handoff/profiles/security.d.ts.map +1 -0
  184. package/dist/wiki/handoff/profiles/security.js +19 -0
  185. package/dist/wiki/handoff/profiles/security.js.map +1 -0
  186. package/dist/wiki/handoff/profiles.d.ts +13 -0
  187. package/dist/wiki/handoff/profiles.d.ts.map +1 -0
  188. package/dist/wiki/handoff/profiles.js +54 -0
  189. package/dist/wiki/handoff/profiles.js.map +1 -0
  190. package/dist/wiki/handoff/service.d.ts +49 -0
  191. package/dist/wiki/handoff/service.d.ts.map +1 -0
  192. package/dist/wiki/handoff/service.js +142 -0
  193. package/dist/wiki/handoff/service.js.map +1 -0
  194. package/dist/wiki/infrastructure/markdown-repository.d.ts +6 -1
  195. package/dist/wiki/infrastructure/markdown-repository.d.ts.map +1 -1
  196. package/dist/wiki/infrastructure/markdown-repository.js +5 -0
  197. package/dist/wiki/infrastructure/markdown-repository.js.map +1 -1
  198. package/dist/wiki/infrastructure/wiki-ingest.d.ts +2 -0
  199. package/dist/wiki/infrastructure/wiki-ingest.d.ts.map +1 -1
  200. package/dist/wiki/infrastructure/wiki-ingest.js +21 -1
  201. package/dist/wiki/infrastructure/wiki-ingest.js.map +1 -1
  202. package/dist/wiki/infrastructure/wiki-query.d.ts +4 -3
  203. package/dist/wiki/infrastructure/wiki-query.d.ts.map +1 -1
  204. package/dist/wiki/infrastructure/wiki-query.js +26 -11
  205. package/dist/wiki/infrastructure/wiki-query.js.map +1 -1
  206. package/dist/wiki/infrastructure/wiki-schema.d.ts +1 -0
  207. package/dist/wiki/infrastructure/wiki-schema.d.ts.map +1 -1
  208. package/dist/wiki/infrastructure/wiki-schema.js +17 -0
  209. package/dist/wiki/infrastructure/wiki-schema.js.map +1 -1
  210. package/dist/wiki/interface/cli.d.ts.map +1 -1
  211. package/dist/wiki/interface/cli.js +159 -8
  212. package/dist/wiki/interface/cli.js.map +1 -1
  213. package/package.json +1 -1
@@ -0,0 +1,105 @@
1
+ // Builds the pre-install conversion report: converts every planned item
2
+ // in-memory (plus portable skill markdown), aggregates classifier decisions,
3
+ // and runs the unresolved-reference scanner. Console/in-memory only — nothing
4
+ // here writes into the target project.
5
+ import { readFileSync, readdirSync, statSync } from "node:fs";
6
+ import { join, relative } from "node:path";
7
+ import { convertItem } from "../converters/index.js";
8
+ import { providers } from "../provider-registry.js";
9
+ import { combineIntegrityIndexes, createReferenceIntegrityIndex, rewriteSourceReferences, } from "../references/fence-aware-reference-rewriter.js";
10
+ import { scanUnresolvedReferences } from "./unresolved-reference-scanner.js";
11
+ const TYPE_KEY = {
12
+ agent: "agents",
13
+ command: "commands",
14
+ skill: "skills",
15
+ config: "config",
16
+ rules: "rules",
17
+ hooks: "hooks",
18
+ };
19
+ function collectMarkdownFiles(dir) {
20
+ const files = [];
21
+ for (const entry of readdirSync(dir)) {
22
+ const full = join(dir, entry);
23
+ if (statSync(full).isDirectory())
24
+ files.push(...collectMarkdownFiles(full));
25
+ else if (entry.toLowerCase().endsWith(".md"))
26
+ files.push(full);
27
+ }
28
+ return files;
29
+ }
30
+ export function buildConversionReport(input) {
31
+ const outputs = [];
32
+ const occurrences = [];
33
+ const conversionWarnings = new Set();
34
+ const budgetByTarget = new Map();
35
+ for (const action of input.actions) {
36
+ if (action.action !== "install" && action.action !== "update" && action.action !== "conflict")
37
+ continue;
38
+ const provider = action.provider;
39
+ const pathConfig = providers[provider]?.[TYPE_KEY[action.type]];
40
+ if (!pathConfig)
41
+ continue;
42
+ const item = input.itemsByType[action.type]?.find((i) => i.name === action.item);
43
+ if (!item)
44
+ continue;
45
+ const conversion = convertItem(item, pathConfig.format, provider, { migratedRefs: input.migratedRefs });
46
+ if (conversion.error)
47
+ continue;
48
+ const file = `${provider}/${action.type}/${action.item}`;
49
+ outputs.push({ file, content: conversion.content, occurrences: conversion.occurrences ?? [] });
50
+ occurrences.push(...(conversion.occurrences ?? []).map((o) => ({ ...o, file: o.file || file })));
51
+ for (const warning of conversion.warnings)
52
+ conversionWarnings.add(warning);
53
+ if (pathConfig.writeStrategy === "merge-single" && pathConfig.totalCharLimit) {
54
+ const key = `${provider}:${pathConfig.projectPath ?? pathConfig.globalPath ?? ""}`;
55
+ const entry = budgetByTarget.get(key) ?? { bytes: 0, budget: pathConfig.totalCharLimit };
56
+ entry.bytes += Buffer.byteLength(conversion.content, "utf-8");
57
+ budgetByTarget.set(key, entry);
58
+ }
59
+ }
60
+ for (const [provider, skills] of input.skillsByProvider) {
61
+ if (!providers[provider]?.skills)
62
+ continue;
63
+ for (const skill of skills) {
64
+ const selfIndex = createReferenceIntegrityIndex([`.claude/skills/${skill.dirName}/`]);
65
+ const index = combineIntegrityIndexes(selfIndex, input.migratedRefs);
66
+ let files;
67
+ try {
68
+ files = collectMarkdownFiles(skill.sourcePath);
69
+ }
70
+ catch {
71
+ continue;
72
+ }
73
+ for (const filePath of files) {
74
+ const relName = relative(skill.sourcePath, filePath);
75
+ const file = `${provider}/skill/${skill.name}/${relName}`;
76
+ let content;
77
+ try {
78
+ content = readFileSync(filePath, "utf-8");
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ const rewritten = rewriteSourceReferences(content, { provider, file, migratedRefs: index });
84
+ outputs.push({ file, content: rewritten.content, occurrences: rewritten.occurrences });
85
+ occurrences.push(...rewritten.occurrences);
86
+ }
87
+ }
88
+ }
89
+ const warnedReferences = occurrences
90
+ .filter((o) => o.decision === "preserve-warn")
91
+ .map((o) => `${o.file}:${o.line} — ${o.original}${o.reason ? ` (${o.reason})` : ""}`);
92
+ const budgetLines = Array.from(budgetByTarget.entries()).map(([key, { bytes, budget }]) => {
93
+ const status = bytes > budget ? "OVER budget — the runtime truncates at the cap" : "within budget";
94
+ return `${key}: projected ~${bytes} B of ${budget} B (${status})`;
95
+ });
96
+ const findings = scanUnresolvedReferences(outputs);
97
+ const validationErrors = findings.map((f) => `${f.file}:${f.line} — ${f.message}`);
98
+ return {
99
+ warnedReferences,
100
+ conversionWarnings: Array.from(conversionWarnings),
101
+ budgetLines,
102
+ validationErrors,
103
+ };
104
+ }
105
+ //# sourceMappingURL=migrate-conversion-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-conversion-report.js","sourceRoot":"","sources":["../../../src/migrate/validation/migrate-conversion-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ReferenceOccurrence } from "../references/reference-types.js";
2
+ export interface ScannedOutput {
3
+ /** Display name for the output (e.g. "codex/config/CLAUDE" or a file path) */
4
+ file: string;
5
+ content: string;
6
+ occurrences: ReferenceOccurrence[];
7
+ }
8
+ export interface ValidationFinding {
9
+ severity: "error" | "warning";
10
+ file: string;
11
+ line: number;
12
+ reference: string;
13
+ message: string;
14
+ }
15
+ /** True when a surviving source reference is covered by a classifier decision. */
16
+ export declare function isExplainedReference(reference: string, occurrences: ReferenceOccurrence[]): boolean;
17
+ export declare function scanUnresolvedReferences(outputs: ScannedOutput[]): ValidationFinding[];
18
+ //# sourceMappingURL=unresolved-reference-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unresolved-reference-scanner.d.ts","sourceRoot":"","sources":["../../../src/migrate/validation/unresolved-reference-scanner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC7B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB;AAUD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CASnG;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,iBAAiB,EAAE,CAoBtF"}
@@ -0,0 +1,47 @@
1
+ // Post-conversion invariant check: every source reference surviving in
2
+ // generated output must be explained by a classifier decision (preserve,
3
+ // preserve-warn, or a rewrite whose target legitimately still matches the
4
+ // source pattern). An unexplained survivor means the rewriter missed a case —
5
+ // that is an internal error, not a user-content warning.
6
+ import { sourceReferencePattern } from "../references/reference-target-registry.js";
7
+ function lineNumberAt(content, offset) {
8
+ let line = 1;
9
+ for (let i = 0; i < offset && i < content.length; i++) {
10
+ if (content[i] === "\n")
11
+ line++;
12
+ }
13
+ return line;
14
+ }
15
+ /** True when a surviving source reference is covered by a classifier decision. */
16
+ export function isExplainedReference(reference, occurrences) {
17
+ return occurrences.some((occurrence) => {
18
+ if (occurrence.decision === "preserve" || occurrence.decision === "preserve-warn") {
19
+ return occurrence.original.toLowerCase() === reference.toLowerCase();
20
+ }
21
+ // A rewrite target can itself match the source pattern (e.g. a provider
22
+ // that reads skills from the source tree) — that survivor is legitimate.
23
+ return occurrence.rewrittenTo?.toLowerCase().includes(reference.toLowerCase()) ?? false;
24
+ });
25
+ }
26
+ export function scanUnresolvedReferences(outputs) {
27
+ const findings = [];
28
+ for (const output of outputs) {
29
+ const pattern = sourceReferencePattern();
30
+ for (const match of output.content.matchAll(pattern)) {
31
+ if (match.index === undefined)
32
+ continue;
33
+ const reference = match[0];
34
+ if (isExplainedReference(reference, output.occurrences))
35
+ continue;
36
+ findings.push({
37
+ severity: "error",
38
+ file: output.file,
39
+ line: lineNumberAt(output.content, match.index),
40
+ reference,
41
+ message: `unexplained source reference "${reference}" survived conversion — the reference rewriter missed this case`,
42
+ });
43
+ }
44
+ }
45
+ return findings;
46
+ }
47
+ //# sourceMappingURL=unresolved-reference-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unresolved-reference-scanner.js","sourceRoot":"","sources":["../../../src/migrate/validation/unresolved-reference-scanner.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,0EAA0E;AAC1E,8EAA8E;AAC9E,yDAAyD;AAEzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAkBpF,SAAS,YAAY,CAAC,OAAe,EAAE,MAAc;IACpD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,WAAkC;IACzF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;QACtC,IAAI,UAAU,CAAC,QAAQ,KAAK,UAAU,IAAI,UAAU,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YACnF,OAAO,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;QACtE,CAAC;QACD,wEAAwE;QACxE,yEAAyE;QACzE,OAAO,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;IACzF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAwB;IAChE,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAS;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;gBAAE,SAAS;YAClE,QAAQ,CAAC,IAAI,CAAC;gBACb,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;gBAC/C,SAAS;gBACT,OAAO,EAAE,iCAAiC,SAAS,iEAAiE;aACpH,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -65,6 +65,14 @@ export interface WikiSearchHit {
65
65
  title: string;
66
66
  snippet: string;
67
67
  tokenEstimate: number;
68
+ /** DB slug-relative page path (e.g. "pages/backend-infra.md"). Populated by the
69
+ * query layer; optional so synthetic hits (tests/mocks) need not supply it. */
70
+ pagePath?: string;
71
+ /** Project-root-readable path composed from the slug + pagePath
72
+ * (e.g. "tasks/wikis/<slug>/pages/backend-infra.md"). The agent-facing file target. */
73
+ path?: string;
74
+ /** Full page body — present only when the caller explicitly opts in (context --include-content). */
75
+ content?: string;
68
76
  }
69
77
  export interface WikiIndex {
70
78
  upsertPage(page: WikiPage): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/wiki/application/ports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/wiki/application/ports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { SalienceComponents, SalienceScore, VerificationState, WikiOrigin, WikiSlug, WikiWriteDecision } from "../domain/index.js";
2
+ import type { ProposeInput } from "../application/ports.js";
3
+ /** How eagerly a skill hands knowledge off. `required` runs the advisory at the
4
+ * end of every flow (still gated by salience); `conditional` only when the run
5
+ * produced a project-specific artifact; `none` never auto-suggests. */
6
+ export type WikiHandoffClass = "required" | "conditional" | "none";
7
+ /** The knowledge family a skill's artifact belongs to. Drives default salience
8
+ * emphasis. Adding a skill = adding a registry row, never editing a switch. */
9
+ export type WikiHandoffProfile = "lifecycle-run" | "root-cause" | "review-verdict" | "planning-report" | "decision-record" | "security-posture" | "external-spec" | "architecture-analysis" | "workflow-recipe" | "project-convention";
10
+ /** Profile tag as stored — a concrete profile, or "none" for the default entry. */
11
+ export type WikiHandoffProfileTag = WikiHandoffProfile | "none";
12
+ /** Terminal state of a handoff attempt. */
13
+ export type WikiHandoffStatus = "suggested" | "proposed" | "skipped" | "quarantined";
14
+ /** Signals extracted from a skill's terminal artifact. The inputs to a profile's
15
+ * `defaultSalience` / `shouldSuggest`. Deterministic — every time-dependent value
16
+ * such as `producedAt` is passed in by the caller; the domain never reads the clock. */
17
+ export interface ArtifactSignal {
18
+ skillName: string;
19
+ /** Artifact location (provenance only here; path-gating happens in the service). */
20
+ artifactPath: string;
21
+ /** SHA-256 of the artifact content (computed by the service; provenance here). */
22
+ artifactHash: string;
23
+ /** Artifact size in bytes — a weak proxy for substance. */
24
+ contentBytes: number;
25
+ /** ISO timestamp the artifact was produced. Passed in; never Date.now() here. */
26
+ producedAt: string;
27
+ /** The user explicitly asked to capture/keep this knowledge. */
28
+ explicitUserIntent?: boolean;
29
+ /** A verified outcome backs the artifact: accepted verdict, green tests, shipped fix. */
30
+ verifiedOutcome?: boolean;
31
+ /** Addresses a recurring problem/friction (observed at least twice). */
32
+ recurringFriction?: boolean;
33
+ /** Caller-supplied novelty vs the existing wiki (0..2); profile default otherwise. */
34
+ noveltyDelta?: number;
35
+ /** Caller-supplied security-risk penalty (<= 0). */
36
+ securityRiskPenalty?: number;
37
+ /** Caller-supplied staleness penalty (<= 0). */
38
+ stalenessPenalty?: number;
39
+ }
40
+ /** A skill's knowledge handoff. Superset of ProposeInput: the extra fields are
41
+ * provenance the wiki_handoff store records; the rest map onto ProposeInput. */
42
+ export interface WikiHandoffPacket {
43
+ slug: WikiSlug;
44
+ skillName: string;
45
+ skillOwner?: string;
46
+ handoffClass: WikiHandoffClass;
47
+ profile: WikiHandoffProfileTag;
48
+ artifactPath: string;
49
+ artifactHash: string;
50
+ title: string;
51
+ content: string;
52
+ origin: WikiOrigin;
53
+ whySave: string;
54
+ evidence: string;
55
+ sourceIds: string[];
56
+ reuseScope: string;
57
+ verificationState: VerificationState;
58
+ riskScore: number;
59
+ noveltyDelta: number;
60
+ salience: SalienceComponents;
61
+ createdAt: string;
62
+ reviewAfter?: string;
63
+ }
64
+ /** The append-only outcome record written to handoffs.jsonl and ingested into
65
+ * wiki_handoff. It captures the decision (and candidate id, if one was created)
66
+ * — NEVER raw artifact content. */
67
+ export interface WikiHandoffRecord {
68
+ id: string;
69
+ slug: WikiSlug;
70
+ skillName: string;
71
+ skillOwner?: string;
72
+ handoffClass: WikiHandoffClass;
73
+ profile: WikiHandoffProfileTag;
74
+ artifactPath: string;
75
+ artifactHash: string;
76
+ title: string;
77
+ whySave: string;
78
+ evidence: string;
79
+ reuseScope: string;
80
+ verificationState: VerificationState;
81
+ riskScore: number;
82
+ salience: SalienceScore;
83
+ decisionKind: WikiWriteDecision["kind"] | "skipped";
84
+ candidateId?: string;
85
+ pageId?: string;
86
+ status: WikiHandoffStatus;
87
+ createdAt: string;
88
+ reviewAfter?: string;
89
+ }
90
+ /** One row in the per-skill registry. `defaultSalience` and `shouldSuggest` are
91
+ * pure functions of an ArtifactSignal — the salience GATE itself stays single-
92
+ * sourced in the domain (scoreSalience + SALIENCE_THRESHOLDS); a profile only
93
+ * supplies default component values, never new threshold logic. */
94
+ export interface SkillHandoffProfile {
95
+ skillName: string;
96
+ handoffClass: WikiHandoffClass;
97
+ profile: WikiHandoffProfileTag;
98
+ defaultReuseScope: string;
99
+ artifactPatterns: string[];
100
+ defaultSalience(signal: ArtifactSignal): SalienceComponents;
101
+ shouldSuggest(signal: ArtifactSignal): boolean;
102
+ }
103
+ /** Map a handoff packet onto the application ProposeInput contract. The provenance-
104
+ * only fields (skill, profile, artifact hash) are dropped — they live in wiki_handoff,
105
+ * not in the candidate. The result is assignable to ProposeInput by construction. */
106
+ export declare function toProposeInput(packet: WikiHandoffPacket): ProposeInput;
107
+ //# sourceMappingURL=domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/wiki/handoff/domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ // Handoff domain. Pure vocabulary + mapper — no IO, no fs, no DB, no network.
2
+ // A knowledge-producing skill describes its terminal artifact as a WikiHandoffPacket;
3
+ // `toProposeInput` maps that packet onto the existing application ProposeInput contract,
4
+ // so the handoff path reuses the single decideWrite/scoreSalience gate rather than
5
+ // re-implementing one. The packet is a SUPERSET of ProposeInput: it adds skill/artifact
6
+ // provenance that the gate does not need but the wiki_handoff store records.
7
+ // Construction helpers (salienceComponents / makeSkillProfile / defineGroup /
8
+ // defaultShouldSuggest / ProfileSpec) live in `profile-factory.ts` so this file stays
9
+ // pure type vocabulary + the mapper.
10
+ // --- Mapper -----------------------------------------------------------------
11
+ /** Map a handoff packet onto the application ProposeInput contract. The provenance-
12
+ * only fields (skill, profile, artifact hash) are dropped — they live in wiki_handoff,
13
+ * not in the candidate. The result is assignable to ProposeInput by construction. */
14
+ export function toProposeInput(packet) {
15
+ return {
16
+ slug: packet.slug,
17
+ title: packet.title,
18
+ content: packet.content,
19
+ origin: packet.origin,
20
+ whySave: packet.whySave,
21
+ evidence: packet.evidence,
22
+ sourceIds: packet.sourceIds,
23
+ salience: packet.salience,
24
+ noveltyDelta: packet.noveltyDelta,
25
+ reuseScope: packet.reuseScope,
26
+ verificationState: packet.verificationState,
27
+ riskScore: packet.riskScore,
28
+ reviewAfter: packet.reviewAfter,
29
+ };
30
+ }
31
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../../src/wiki/handoff/domain.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sFAAsF;AACtF,yFAAyF;AACzF,mFAAmF;AACnF,wFAAwF;AACxF,6EAA6E;AA0I7E,8EAA8E;AAC9E,sFAAsF;AACtF,qCAAqC;AAErC,+EAA+E;AAE/E;;qFAEqF;AACrF,MAAM,UAAU,cAAc,CAAC,MAAyB;IACvD,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;KAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { SalienceComponents } from "../domain/index.js";
2
+ import type { ArtifactSignal, SkillHandoffProfile, WikiHandoffClass, WikiHandoffProfileTag } from "./domain.js";
3
+ /** Build a full SalienceComponents from a partial, zero-filling the rest. */
4
+ export declare function salienceComponents(overrides?: Partial<SalienceComponents>): SalienceComponents;
5
+ /** Declarative spec for a registry row. Family files supply data; `makeSkillProfile`
6
+ * derives the `defaultSalience`/`shouldSuggest` behavior from the class + base. */
7
+ export interface ProfileSpec {
8
+ skillName: string;
9
+ handoffClass: WikiHandoffClass;
10
+ profile: WikiHandoffProfileTag;
11
+ defaultReuseScope: string;
12
+ artifactPatterns: string[];
13
+ /** Profile-typical salience emphasis before signal nudges. */
14
+ salienceBase: Partial<SalienceComponents>;
15
+ }
16
+ /** Class-driven suggestion policy. `none` never suggests; `required` suggests for any
17
+ * substantive artifact; `conditional` suggests only on a project-specific signal. */
18
+ export declare function defaultShouldSuggest(handoffClass: WikiHandoffClass, signal: ArtifactSignal): boolean;
19
+ /** Turn a declarative spec into a registry row. The salience function starts from the
20
+ * profile base and lets concrete signals raise intent/verified/recurrence and override
21
+ * novelty + the two penalties. */
22
+ export declare function makeSkillProfile(spec: ProfileSpec): SkillHandoffProfile;
23
+ /** Expand a shared profile spec across many skill names — one registry row each.
24
+ * Keeps family files declarative: a profile group is a `common` spec plus a name list. */
25
+ export declare function defineGroup(common: Omit<ProfileSpec, "skillName">, skillNames: string[]): SkillHandoffProfile[];
26
+ //# sourceMappingURL=profile-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-factory.d.ts","sourceRoot":"","sources":["../../../src/wiki/handoff/profile-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEhH,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAAG,kBAAkB,CAalG;AAED;mFACmF;AACnF,MAAM,WAAW,WAAW;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,8DAA8D;IAC9D,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC1C;AAED;qFACqF;AACrF,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAUpG;AAED;;kCAEkC;AAClC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAuBvE;AAED;0FAC0F;AAC1F,wBAAgB,WAAW,CAC1B,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EACtC,UAAU,EAAE,MAAM,EAAE,GAClB,mBAAmB,EAAE,CAEvB"}
@@ -0,0 +1,65 @@
1
+ // Construction helpers for the handoff profile registry. Separated from domain.ts so the
2
+ // domain file stays pure type vocabulary; this file holds the (still pure, no-IO) logic that
3
+ // turns declarative specs into registry rows and derives salience/suggestion from a signal.
4
+ /** Build a full SalienceComponents from a partial, zero-filling the rest. */
5
+ export function salienceComponents(overrides = {}) {
6
+ return {
7
+ explicit_user_intent: 0,
8
+ verified_outcome: 0,
9
+ recurrence_or_friction: 0,
10
+ novelty_vs_existing_wiki: 0,
11
+ future_reuse_likelihood: 0,
12
+ source_quality: 0,
13
+ blast_radius: 0,
14
+ security_risk_penalty: 0,
15
+ staleness_penalty: 0,
16
+ ...overrides,
17
+ };
18
+ }
19
+ /** Class-driven suggestion policy. `none` never suggests; `required` suggests for any
20
+ * substantive artifact; `conditional` suggests only on a project-specific signal. */
21
+ export function defaultShouldSuggest(handoffClass, signal) {
22
+ if (handoffClass === "none")
23
+ return false;
24
+ if (signal.contentBytes <= 0)
25
+ return false;
26
+ if (handoffClass === "required")
27
+ return true;
28
+ return Boolean(signal.verifiedOutcome ||
29
+ signal.explicitUserIntent ||
30
+ signal.recurringFriction ||
31
+ (signal.noveltyDelta ?? 0) > 0);
32
+ }
33
+ /** Turn a declarative spec into a registry row. The salience function starts from the
34
+ * profile base and lets concrete signals raise intent/verified/recurrence and override
35
+ * novelty + the two penalties. */
36
+ export function makeSkillProfile(spec) {
37
+ return {
38
+ skillName: spec.skillName,
39
+ handoffClass: spec.handoffClass,
40
+ profile: spec.profile,
41
+ defaultReuseScope: spec.defaultReuseScope,
42
+ artifactPatterns: spec.artifactPatterns,
43
+ defaultSalience(signal) {
44
+ const base = salienceComponents(spec.salienceBase);
45
+ return salienceComponents({
46
+ ...spec.salienceBase,
47
+ explicit_user_intent: signal.explicitUserIntent ? 3 : base.explicit_user_intent,
48
+ verified_outcome: signal.verifiedOutcome ? 3 : base.verified_outcome,
49
+ recurrence_or_friction: signal.recurringFriction ? 2 : base.recurrence_or_friction,
50
+ novelty_vs_existing_wiki: signal.noveltyDelta ?? base.novelty_vs_existing_wiki,
51
+ security_risk_penalty: signal.securityRiskPenalty ?? base.security_risk_penalty,
52
+ staleness_penalty: signal.stalenessPenalty ?? base.staleness_penalty,
53
+ });
54
+ },
55
+ shouldSuggest(signal) {
56
+ return defaultShouldSuggest(spec.handoffClass, signal);
57
+ },
58
+ };
59
+ }
60
+ /** Expand a shared profile spec across many skill names — one registry row each.
61
+ * Keeps family files declarative: a profile group is a `common` spec plus a name list. */
62
+ export function defineGroup(common, skillNames) {
63
+ return skillNames.map((skillName) => makeSkillProfile({ ...common, skillName }));
64
+ }
65
+ //# sourceMappingURL=profile-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-factory.js","sourceRoot":"","sources":["../../../src/wiki/handoff/profile-factory.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,6FAA6F;AAC7F,4FAA4F;AAK5F,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,YAAyC,EAAE;IAC7E,OAAO;QACN,oBAAoB,EAAE,CAAC;QACvB,gBAAgB,EAAE,CAAC;QACnB,sBAAsB,EAAE,CAAC;QACzB,wBAAwB,EAAE,CAAC;QAC3B,uBAAuB,EAAE,CAAC;QAC1B,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,qBAAqB,EAAE,CAAC;QACxB,iBAAiB,EAAE,CAAC;QACpB,GAAG,SAAS;KACZ,CAAC;AACH,CAAC;AAcD;qFACqF;AACrF,MAAM,UAAU,oBAAoB,CAAC,YAA8B,EAAE,MAAsB;IAC1F,IAAI,YAAY,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,YAAY,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,OAAO,CACb,MAAM,CAAC,eAAe;QACrB,MAAM,CAAC,kBAAkB;QACzB,MAAM,CAAC,iBAAiB;QACxB,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAC/B,CAAC;AACH,CAAC;AAED;;kCAEkC;AAClC,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IACjD,OAAO;QACN,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,eAAe,CAAC,MAAsB;YACrC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnD,OAAO,kBAAkB,CAAC;gBACzB,GAAG,IAAI,CAAC,YAAY;gBACpB,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB;gBAC/E,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB;gBACpE,sBAAsB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB;gBAClF,wBAAwB,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,wBAAwB;gBAC9E,qBAAqB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC,qBAAqB;gBAC/E,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,iBAAiB;aACpE,CAAC,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,MAAsB;YACnC,OAAO,oBAAoB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;KACD,CAAC;AACH,CAAC;AAED;0FAC0F;AAC1F,MAAM,UAAU,WAAW,CAC1B,MAAsC,EACtC,UAAoB;IAEpB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillHandoffProfile } from "../domain.js";
2
+ export declare const externalProfiles: SkillHandoffProfile[];
3
+ //# sourceMappingURL=external.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/external.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,gBAAgB,EAAE,mBAAmB,EAwBjD,CAAC"}
@@ -0,0 +1,27 @@
1
+ // External-spec profile family. Knowledge sourced from outside the repo (specs,
2
+ // tickets, fetched docs). Conditional: only worth saving with source provenance
3
+ // and a clean scan — never a single-use lookup.
4
+ import { defineGroup } from "../profile-factory.js";
5
+ export const externalProfiles = [
6
+ ...defineGroup({
7
+ handoffClass: "conditional",
8
+ profile: "external-spec",
9
+ defaultReuseScope: "external-spec",
10
+ artifactPatterns: ["tasks/reports/*.md", "tasks/wikis/*/sources.jsonl"],
11
+ salienceBase: {
12
+ source_quality: 2,
13
+ future_reuse_likelihood: 2,
14
+ novelty_vs_existing_wiki: 1,
15
+ },
16
+ }, [
17
+ "mk:confluence-spec-analyst",
18
+ "mk:docs-finder",
19
+ "mk:jira-analyst",
20
+ "mk:jira-estimator",
21
+ "mk:jira-evaluator",
22
+ "mk:pack",
23
+ "mk:web-to-markdown",
24
+ "mk:wiki-research",
25
+ ]),
26
+ ];
27
+ //# sourceMappingURL=external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/external.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,MAAM,gBAAgB,GAA0B;IACtD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,eAAe;QACxB,iBAAiB,EAAE,eAAe;QAClC,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,6BAA6B,CAAC;QACvE,YAAY,EAAE;YACb,cAAc,EAAE,CAAC;YACjB,uBAAuB,EAAE,CAAC;YAC1B,wBAAwB,EAAE,CAAC;SAC3B;KACD,EACD;QACC,4BAA4B;QAC5B,gBAAgB;QAChB,iBAAiB;QACjB,mBAAmB;QACnB,mBAAmB;QACnB,SAAS;QACT,oBAAoB;QACpB,kBAAkB;KAClB,CACD;CACD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillHandoffProfile } from "../domain.js";
2
+ export declare const frameworkProfiles: SkillHandoffProfile[];
3
+ //# sourceMappingURL=framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/framework.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,EAyFlD,CAAC"}
@@ -0,0 +1,83 @@
1
+ // Framework family: architecture analysis, project conventions, and operational
2
+ // workflow recipes. Mostly conditional — generic framework knowledge is NOT worth
3
+ // saving; only repo-specific decisions, conventions, and reusable recipes are.
4
+ import { defineGroup } from "../profile-factory.js";
5
+ export const frameworkProfiles = [
6
+ // Structured architecture candidates / ADR linkage — always advisory.
7
+ ...defineGroup({
8
+ handoffClass: "required",
9
+ profile: "architecture-analysis",
10
+ defaultReuseScope: "architecture",
11
+ artifactPatterns: ["docs/architecture/*.md", "docs/architecture/adr/*.md", "tasks/reports/*.md"],
12
+ salienceBase: {
13
+ verified_outcome: 1,
14
+ future_reuse_likelihood: 2,
15
+ source_quality: 2,
16
+ blast_radius: 2,
17
+ },
18
+ }, ["mk:improve-codebase-architecture"]),
19
+ // Design / data decisions — saved only when a project standard is chosen.
20
+ ...defineGroup({
21
+ handoffClass: "conditional",
22
+ profile: "architecture-analysis",
23
+ defaultReuseScope: "architecture",
24
+ artifactPatterns: ["docs/architecture/*.md", "docs/design-guidelines.md"],
25
+ salienceBase: {
26
+ future_reuse_likelihood: 2,
27
+ source_quality: 1,
28
+ blast_radius: 1,
29
+ novelty_vs_existing_wiki: 1,
30
+ },
31
+ }, ["mk:api-design", "mk:database", "mk:frontend-design", "mk:stitch", "mk:tech-graph", "mk:ui-design-system"]),
32
+ // Repo-specific conventions and reusable strategies.
33
+ ...defineGroup({
34
+ handoffClass: "conditional",
35
+ profile: "project-convention",
36
+ defaultReuseScope: "convention",
37
+ artifactPatterns: ["docs/code-standards.md", "docs/project-context.md", "tasks/reports/*.md"],
38
+ salienceBase: {
39
+ future_reuse_likelihood: 2,
40
+ source_quality: 1,
41
+ novelty_vs_existing_wiki: 1,
42
+ },
43
+ }, [
44
+ "mk:angular",
45
+ "mk:ask-me",
46
+ "mk:clean-code",
47
+ "mk:context-audit",
48
+ "mk:decision-framework",
49
+ "mk:docs-init",
50
+ "mk:document-release",
51
+ "mk:grill",
52
+ "mk:intake",
53
+ "mk:nyquist",
54
+ "mk:preview",
55
+ "mk:project-context",
56
+ "mk:prompt-enhancer",
57
+ "mk:qa",
58
+ "mk:qa-manual",
59
+ "mk:react-patterns",
60
+ "mk:resolving-merge-conflicts",
61
+ "mk:scout",
62
+ "mk:ship",
63
+ "mk:skill-creator",
64
+ "mk:typescript",
65
+ "mk:visual-plan",
66
+ "mk:vue",
67
+ "mk:vue-best-practices",
68
+ "mk:vue-testing-best-practices",
69
+ ]),
70
+ // Operational recipes — saved only when they cut future operational friction.
71
+ ...defineGroup({
72
+ handoffClass: "conditional",
73
+ profile: "workflow-recipe",
74
+ defaultReuseScope: "workflow-recipe",
75
+ artifactPatterns: ["tasks/reports/*.md"],
76
+ salienceBase: {
77
+ recurrence_or_friction: 1,
78
+ future_reuse_likelihood: 2,
79
+ source_quality: 1,
80
+ },
81
+ }, ["mk:agent-browser", "mk:ghpm", "mk:jira-agile", "mk:jira-bulk", "mk:jira-lifecycle"]),
82
+ ];
83
+ //# sourceMappingURL=framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.js","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/framework.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAClF,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,MAAM,iBAAiB,GAA0B;IACvD,sEAAsE;IACtE,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,uBAAuB;QAChC,iBAAiB,EAAE,cAAc;QACjC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,4BAA4B,EAAE,oBAAoB,CAAC;QAChG,YAAY,EAAE;YACb,gBAAgB,EAAE,CAAC;YACnB,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;SACf;KACD,EACD,CAAC,kCAAkC,CAAC,CACpC;IACD,0EAA0E;IAC1E,GAAG,WAAW,CACb;QACC,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,uBAAuB;QAChC,iBAAiB,EAAE,cAAc;QACjC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,2BAA2B,CAAC;QACzE,YAAY,EAAE;YACb,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,wBAAwB,EAAE,CAAC;SAC3B;KACD,EACD,CAAC,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAC3G;IACD,qDAAqD;IACrD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,oBAAoB;QAC7B,iBAAiB,EAAE,YAAY;QAC/B,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,yBAAyB,EAAE,oBAAoB,CAAC;QAC7F,YAAY,EAAE;YACb,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,wBAAwB,EAAE,CAAC;SAC3B;KACD,EACD;QACC,YAAY;QACZ,WAAW;QACX,eAAe;QACf,kBAAkB;QAClB,uBAAuB;QACvB,cAAc;QACd,qBAAqB;QACrB,UAAU;QACV,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,oBAAoB;QACpB,oBAAoB;QACpB,OAAO;QACP,cAAc;QACd,mBAAmB;QACnB,8BAA8B;QAC9B,UAAU;QACV,SAAS;QACT,kBAAkB;QAClB,eAAe;QACf,gBAAgB;QAChB,QAAQ;QACR,uBAAuB;QACvB,+BAA+B;KAC/B,CACD;IACD,8EAA8E;IAC9E,GAAG,WAAW,CACb;QACC,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,iBAAiB;QAC1B,iBAAiB,EAAE,iBAAiB;QACpC,gBAAgB,EAAE,CAAC,oBAAoB,CAAC;QACxC,YAAY,EAAE;YACb,sBAAsB,EAAE,CAAC;YACzB,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;SACjB;KACD,EACD,CAAC,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,CAAC,CACrF;CACD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillHandoffProfile } from "../domain.js";
2
+ export declare const lifecycleProfiles: SkillHandoffProfile[];
3
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,EA+BlD,CAAC"}