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.
- package/README.md +37 -0
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +2 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/validate.js +14 -7
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/derived-index.d.ts +1 -1
- package/dist/core/derived-index.d.ts.map +1 -1
- package/dist/core/derived-index.js +3 -2
- package/dist/core/derived-index.js.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/migrate/config-merger/merge-single-sections.d.ts.map +1 -1
- package/dist/migrate/config-merger/merge-single-sections.js +4 -2
- package/dist/migrate/config-merger/merge-single-sections.js.map +1 -1
- package/dist/migrate/converters/command-to-codex-skill.d.ts +10 -0
- package/dist/migrate/converters/command-to-codex-skill.d.ts.map +1 -0
- package/dist/migrate/converters/command-to-codex-skill.js +78 -0
- package/dist/migrate/converters/command-to-codex-skill.js.map +1 -0
- package/dist/migrate/converters/direct-copy.d.ts +4 -1
- package/dist/migrate/converters/direct-copy.d.ts.map +1 -1
- package/dist/migrate/converters/direct-copy.js +19 -22
- package/dist/migrate/converters/direct-copy.js.map +1 -1
- package/dist/migrate/converters/fm-strip.d.ts.map +1 -1
- package/dist/migrate/converters/fm-strip.js +5 -1
- package/dist/migrate/converters/fm-strip.js.map +1 -1
- package/dist/migrate/converters/fm-to-codex-toml.js +1 -1
- package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -1
- package/dist/migrate/converters/fm-to-fm.js +4 -4
- package/dist/migrate/converters/fm-to-fm.js.map +1 -1
- package/dist/migrate/converters/fm-to-json.d.ts.map +1 -1
- package/dist/migrate/converters/fm-to-json.js +2 -1
- package/dist/migrate/converters/fm-to-json.js.map +1 -1
- package/dist/migrate/converters/fm-to-yaml.js +1 -1
- package/dist/migrate/converters/fm-to-yaml.js.map +1 -1
- package/dist/migrate/converters/index.d.ts +7 -2
- package/dist/migrate/converters/index.d.ts.map +1 -1
- package/dist/migrate/converters/index.js +7 -7
- package/dist/migrate/converters/index.js.map +1 -1
- package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts +8 -0
- package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts.map +1 -0
- package/dist/migrate/converters/mcp-json-to-codex-toml.js +65 -0
- package/dist/migrate/converters/mcp-json-to-codex-toml.js.map +1 -0
- package/dist/migrate/converters/md-strip.d.ts +10 -1
- package/dist/migrate/converters/md-strip.d.ts.map +1 -1
- package/dist/migrate/converters/md-strip.js +27 -70
- package/dist/migrate/converters/md-strip.js.map +1 -1
- package/dist/migrate/converters/md-to-kiro-steering.js +1 -1
- package/dist/migrate/converters/md-to-kiro-steering.js.map +1 -1
- package/dist/migrate/converters/md-to-mdc.js +1 -1
- package/dist/migrate/converters/md-to-mdc.js.map +1 -1
- package/dist/migrate/converters/md-to-toml.js +1 -1
- package/dist/migrate/converters/md-to-toml.js.map +1 -1
- package/dist/migrate/hooks/codex-features-flag.d.ts.map +1 -1
- package/dist/migrate/hooks/codex-features-flag.js +21 -6
- package/dist/migrate/hooks/codex-features-flag.js.map +1 -1
- package/dist/migrate/hooks/codex-hook-wrapper.js +1 -1
- package/dist/migrate/hooks/codex-mcp-installer.d.ts +9 -0
- package/dist/migrate/hooks/codex-mcp-installer.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-mcp-installer.js +65 -0
- package/dist/migrate/hooks/codex-mcp-installer.js.map +1 -0
- package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -1
- package/dist/migrate/hooks/codex-toml-installer.js +15 -6
- package/dist/migrate/hooks/codex-toml-installer.js.map +1 -1
- package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -1
- package/dist/migrate/hooks/hooks-settings-merger.js +5 -1
- package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -1
- package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
- package/dist/migrate/migrate-orchestrator.js +86 -9
- package/dist/migrate/migrate-orchestrator.js.map +1 -1
- package/dist/migrate/migrate-ui-summary.d.ts +2 -0
- package/dist/migrate/migrate-ui-summary.d.ts.map +1 -1
- package/dist/migrate/migrate-ui-summary.js +26 -0
- package/dist/migrate/migrate-ui-summary.js.map +1 -1
- package/dist/migrate/portability-policy.d.ts +3 -1
- package/dist/migrate/portability-policy.d.ts.map +1 -1
- package/dist/migrate/portability-policy.js +5 -31
- package/dist/migrate/portability-policy.js.map +1 -1
- package/dist/migrate/portable-installer.d.ts +3 -0
- package/dist/migrate/portable-installer.d.ts.map +1 -1
- package/dist/migrate/portable-installer.js +67 -6
- package/dist/migrate/portable-installer.js.map +1 -1
- package/dist/migrate/provider-registry-utils.d.ts.map +1 -1
- package/dist/migrate/provider-registry-utils.js +5 -0
- package/dist/migrate/provider-registry-utils.js.map +1 -1
- package/dist/migrate/providers/codex/capabilities.d.ts +1 -1
- package/dist/migrate/providers/codex/capabilities.d.ts.map +1 -1
- package/dist/migrate/providers/codex/capabilities.js +56 -0
- package/dist/migrate/providers/codex/capabilities.js.map +1 -1
- package/dist/migrate/providers/codex/config.d.ts.map +1 -1
- package/dist/migrate/providers/codex/config.js +21 -8
- package/dist/migrate/providers/codex/config.js.map +1 -1
- package/dist/migrate/providers/codex/contract.d.ts.map +1 -1
- package/dist/migrate/providers/codex/contract.js +4 -3
- package/dist/migrate/providers/codex/contract.js.map +1 -1
- package/dist/migrate/providers/provider-config-types.d.ts +1 -1
- package/dist/migrate/providers/provider-config-types.d.ts.map +1 -1
- package/dist/migrate/reconcile/portable-manifest.d.ts +12 -12
- package/dist/migrate/reconcile/portable-registry.d.ts +24 -24
- package/dist/migrate/reconcile/process-lock.d.ts.map +1 -1
- package/dist/migrate/reconcile/process-lock.js +10 -1
- package/dist/migrate/reconcile/process-lock.js.map +1 -1
- package/dist/migrate/references/codex-command-skill-path.d.ts +12 -0
- package/dist/migrate/references/codex-command-skill-path.d.ts.map +1 -0
- package/dist/migrate/references/codex-command-skill-path.js +27 -0
- package/dist/migrate/references/codex-command-skill-path.js.map +1 -0
- package/dist/migrate/references/fence-aware-reference-rewriter.d.ts +30 -0
- package/dist/migrate/references/fence-aware-reference-rewriter.d.ts.map +1 -0
- package/dist/migrate/references/fence-aware-reference-rewriter.js +182 -0
- package/dist/migrate/references/fence-aware-reference-rewriter.js.map +1 -0
- package/dist/migrate/references/reference-classifier.d.ts +12 -0
- package/dist/migrate/references/reference-classifier.d.ts.map +1 -0
- package/dist/migrate/references/reference-classifier.js +144 -0
- package/dist/migrate/references/reference-classifier.js.map +1 -0
- package/dist/migrate/references/reference-target-registry.d.ts +42 -0
- package/dist/migrate/references/reference-target-registry.d.ts.map +1 -0
- package/dist/migrate/references/reference-target-registry.js +100 -0
- package/dist/migrate/references/reference-target-registry.js.map +1 -0
- package/dist/migrate/references/reference-types.d.ts +23 -0
- package/dist/migrate/references/reference-types.d.ts.map +1 -0
- package/dist/migrate/references/reference-types.js +5 -0
- package/dist/migrate/references/reference-types.js.map +1 -0
- package/dist/migrate/runtime-compat-audit.d.ts +2 -1
- package/dist/migrate/runtime-compat-audit.d.ts.map +1 -1
- package/dist/migrate/runtime-compat-audit.js +2 -2
- package/dist/migrate/runtime-compat-audit.js.map +1 -1
- package/dist/migrate/runtime-coupling-patterns.d.ts +2 -1
- package/dist/migrate/runtime-coupling-patterns.d.ts.map +1 -1
- package/dist/migrate/runtime-coupling-patterns.js +18 -3
- package/dist/migrate/runtime-coupling-patterns.js.map +1 -1
- package/dist/migrate/skill-directory-audit.d.ts +3 -0
- package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
- package/dist/migrate/skill-directory-audit.js +2 -1
- package/dist/migrate/skill-directory-audit.js.map +1 -1
- package/dist/migrate/skill-directory-installer.d.ts +2 -0
- package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
- package/dist/migrate/skill-directory-installer.js +17 -8
- package/dist/migrate/skill-directory-installer.js.map +1 -1
- package/dist/migrate/types.d.ts +20 -10
- package/dist/migrate/types.d.ts.map +1 -1
- package/dist/migrate/types.js +4 -0
- package/dist/migrate/types.js.map +1 -1
- package/dist/migrate/validation/migrate-conversion-report.d.ts +20 -0
- package/dist/migrate/validation/migrate-conversion-report.d.ts.map +1 -0
- package/dist/migrate/validation/migrate-conversion-report.js +105 -0
- package/dist/migrate/validation/migrate-conversion-report.js.map +1 -0
- package/dist/migrate/validation/unresolved-reference-scanner.d.ts +18 -0
- package/dist/migrate/validation/unresolved-reference-scanner.d.ts.map +1 -0
- package/dist/migrate/validation/unresolved-reference-scanner.js +47 -0
- package/dist/migrate/validation/unresolved-reference-scanner.js.map +1 -0
- package/dist/wiki/application/ports.d.ts +8 -0
- package/dist/wiki/application/ports.d.ts.map +1 -1
- package/dist/wiki/handoff/domain.d.ts +107 -0
- package/dist/wiki/handoff/domain.d.ts.map +1 -0
- package/dist/wiki/handoff/domain.js +31 -0
- package/dist/wiki/handoff/domain.js.map +1 -0
- package/dist/wiki/handoff/profile-factory.d.ts +26 -0
- package/dist/wiki/handoff/profile-factory.d.ts.map +1 -0
- package/dist/wiki/handoff/profile-factory.js +65 -0
- package/dist/wiki/handoff/profile-factory.js.map +1 -0
- package/dist/wiki/handoff/profiles/external.d.ts +3 -0
- package/dist/wiki/handoff/profiles/external.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles/external.js +27 -0
- package/dist/wiki/handoff/profiles/external.js.map +1 -0
- package/dist/wiki/handoff/profiles/framework.d.ts +3 -0
- package/dist/wiki/handoff/profiles/framework.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles/framework.js +83 -0
- package/dist/wiki/handoff/profiles/framework.js.map +1 -0
- package/dist/wiki/handoff/profiles/lifecycle.d.ts +3 -0
- package/dist/wiki/handoff/profiles/lifecycle.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles/lifecycle.js +30 -0
- package/dist/wiki/handoff/profiles/lifecycle.js.map +1 -0
- package/dist/wiki/handoff/profiles/research.d.ts +3 -0
- package/dist/wiki/handoff/profiles/research.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles/research.js +31 -0
- package/dist/wiki/handoff/profiles/research.js.map +1 -0
- package/dist/wiki/handoff/profiles/review.d.ts +3 -0
- package/dist/wiki/handoff/profiles/review.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles/review.js +19 -0
- package/dist/wiki/handoff/profiles/review.js.map +1 -0
- package/dist/wiki/handoff/profiles/security.d.ts +3 -0
- package/dist/wiki/handoff/profiles/security.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles/security.js +19 -0
- package/dist/wiki/handoff/profiles/security.js.map +1 -0
- package/dist/wiki/handoff/profiles.d.ts +13 -0
- package/dist/wiki/handoff/profiles.d.ts.map +1 -0
- package/dist/wiki/handoff/profiles.js +54 -0
- package/dist/wiki/handoff/profiles.js.map +1 -0
- package/dist/wiki/handoff/service.d.ts +49 -0
- package/dist/wiki/handoff/service.d.ts.map +1 -0
- package/dist/wiki/handoff/service.js +142 -0
- package/dist/wiki/handoff/service.js.map +1 -0
- package/dist/wiki/infrastructure/markdown-repository.d.ts +6 -1
- package/dist/wiki/infrastructure/markdown-repository.d.ts.map +1 -1
- package/dist/wiki/infrastructure/markdown-repository.js +5 -0
- package/dist/wiki/infrastructure/markdown-repository.js.map +1 -1
- package/dist/wiki/infrastructure/wiki-ingest.d.ts +2 -0
- package/dist/wiki/infrastructure/wiki-ingest.d.ts.map +1 -1
- package/dist/wiki/infrastructure/wiki-ingest.js +21 -1
- package/dist/wiki/infrastructure/wiki-ingest.js.map +1 -1
- package/dist/wiki/infrastructure/wiki-query.d.ts +4 -3
- package/dist/wiki/infrastructure/wiki-query.d.ts.map +1 -1
- package/dist/wiki/infrastructure/wiki-query.js +26 -11
- package/dist/wiki/infrastructure/wiki-query.js.map +1 -1
- package/dist/wiki/infrastructure/wiki-schema.d.ts +1 -0
- package/dist/wiki/infrastructure/wiki-schema.d.ts.map +1 -1
- package/dist/wiki/infrastructure/wiki-schema.js +17 -0
- package/dist/wiki/infrastructure/wiki-schema.js.map +1 -1
- package/dist/wiki/interface/cli.d.ts.map +1 -1
- package/dist/wiki/interface/cli.js +159 -8
- package/dist/wiki/interface/cli.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Lifecycle + root-cause profile family. Skills that orchestrate a full run or
|
|
2
|
+
// diagnose a defect — their terminal report is high-value recall for later agents.
|
|
3
|
+
import { defineGroup } from "../profile-factory.js";
|
|
4
|
+
export const lifecycleProfiles = [
|
|
5
|
+
...defineGroup({
|
|
6
|
+
handoffClass: "required",
|
|
7
|
+
profile: "lifecycle-run",
|
|
8
|
+
defaultReuseScope: "lifecycle",
|
|
9
|
+
artifactPatterns: ["tasks/reports/*.md", "tasks/reviews/*.md", "tasks/autobuild-runs/*"],
|
|
10
|
+
salienceBase: {
|
|
11
|
+
verified_outcome: 2,
|
|
12
|
+
source_quality: 2,
|
|
13
|
+
future_reuse_likelihood: 2,
|
|
14
|
+
blast_radius: 1,
|
|
15
|
+
},
|
|
16
|
+
}, ["mk:autobuild", "mk:benchmark", "mk:cook", "mk:loop", "mk:trace-analyze", "mk:workflow-orchestrator"]),
|
|
17
|
+
...defineGroup({
|
|
18
|
+
handoffClass: "required",
|
|
19
|
+
profile: "root-cause",
|
|
20
|
+
defaultReuseScope: "debugging",
|
|
21
|
+
artifactPatterns: ["docs/journal/*.md", "tasks/reports/*.md"],
|
|
22
|
+
salienceBase: {
|
|
23
|
+
verified_outcome: 2,
|
|
24
|
+
recurrence_or_friction: 1,
|
|
25
|
+
future_reuse_likelihood: 2,
|
|
26
|
+
source_quality: 2,
|
|
27
|
+
},
|
|
28
|
+
}, ["mk:build-fix", "mk:fix", "mk:investigate", "mk:problem-solving"]),
|
|
29
|
+
];
|
|
30
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/lifecycle.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mFAAmF;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,MAAM,iBAAiB,GAA0B;IACvD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,eAAe;QACxB,iBAAiB,EAAE,WAAW;QAC9B,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,wBAAwB,CAAC;QACxF,YAAY,EAAE;YACb,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,uBAAuB,EAAE,CAAC;YAC1B,YAAY,EAAE,CAAC;SACf;KACD,EACD,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,0BAA0B,CAAC,CACtG;IACD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,YAAY;QACrB,iBAAiB,EAAE,WAAW;QAC9B,gBAAgB,EAAE,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;QAC7D,YAAY,EAAE;YACb,gBAAgB,EAAE,CAAC;YACnB,sBAAsB,EAAE,CAAC;YACzB,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;SACjB;KACD,EACD,CAAC,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAClE;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/research.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,gBAAgB,EAAE,mBAAmB,EAgCjD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Planning + decision profile family. Skills that set scope or record a chosen
|
|
2
|
+
// direction — the kind of context whose absence makes a later agent repeat a debate.
|
|
3
|
+
import { defineGroup } from "../profile-factory.js";
|
|
4
|
+
export const researchProfiles = [
|
|
5
|
+
...defineGroup({
|
|
6
|
+
handoffClass: "required",
|
|
7
|
+
profile: "planning-report",
|
|
8
|
+
defaultReuseScope: "planning",
|
|
9
|
+
artifactPatterns: ["tasks/plans/*/plan.md", "tasks/reports/*.md"],
|
|
10
|
+
salienceBase: {
|
|
11
|
+
explicit_user_intent: 1,
|
|
12
|
+
verified_outcome: 1,
|
|
13
|
+
future_reuse_likelihood: 2,
|
|
14
|
+
source_quality: 2,
|
|
15
|
+
blast_radius: 1,
|
|
16
|
+
},
|
|
17
|
+
}, ["mk:brainstorming", "mk:plan-ceo-review", "mk:plan-creator", "mk:planning-engine", "mk:sprint-contract", "mk:story-sizer"]),
|
|
18
|
+
...defineGroup({
|
|
19
|
+
handoffClass: "required",
|
|
20
|
+
profile: "decision-record",
|
|
21
|
+
defaultReuseScope: "decisions",
|
|
22
|
+
artifactPatterns: ["docs/architecture/adr/*.md", "tasks/reports/*.md"],
|
|
23
|
+
salienceBase: {
|
|
24
|
+
explicit_user_intent: 2,
|
|
25
|
+
future_reuse_likelihood: 2,
|
|
26
|
+
source_quality: 2,
|
|
27
|
+
blast_radius: 1,
|
|
28
|
+
},
|
|
29
|
+
}, ["mk:office-hours", "mk:party", "mk:retro"]),
|
|
30
|
+
];
|
|
31
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/research.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qFAAqF;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,MAAM,gBAAgB,GAA0B;IACtD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,iBAAiB;QAC1B,iBAAiB,EAAE,UAAU;QAC7B,gBAAgB,EAAE,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;QACjE,YAAY,EAAE;YACb,oBAAoB,EAAE,CAAC;YACvB,gBAAgB,EAAE,CAAC;YACnB,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;SACf;KACD,EACD,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAC3H;IACD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,iBAAiB;QAC1B,iBAAiB,EAAE,WAAW;QAC9B,gBAAgB,EAAE,CAAC,4BAA4B,EAAE,oBAAoB,CAAC;QACtE,YAAY,EAAE;YACb,oBAAoB,EAAE,CAAC;YACvB,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;SACf;KACD,EACD,CAAC,iBAAiB,EAAE,UAAU,EAAE,UAAU,CAAC,CAC3C;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/review.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,cAAc,EAAE,mBAAmB,EAgB/C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Review-verdict profile family. Skills that produce a graded verdict or
|
|
2
|
+
// re-examined finding — WARN/FAIL patterns and accepted policy are worth recall;
|
|
3
|
+
// routine clean PASS is not (gated by salience, not by class).
|
|
4
|
+
import { defineGroup } from "../profile-factory.js";
|
|
5
|
+
export const reviewProfiles = [
|
|
6
|
+
...defineGroup({
|
|
7
|
+
handoffClass: "required",
|
|
8
|
+
profile: "review-verdict",
|
|
9
|
+
defaultReuseScope: "review",
|
|
10
|
+
artifactPatterns: ["tasks/reviews/*.md", "tasks/reports/*.md"],
|
|
11
|
+
salienceBase: {
|
|
12
|
+
verified_outcome: 2,
|
|
13
|
+
source_quality: 2,
|
|
14
|
+
future_reuse_likelihood: 2,
|
|
15
|
+
blast_radius: 1,
|
|
16
|
+
},
|
|
17
|
+
}, ["mk:elicit", "mk:evaluate", "mk:respond-pr", "mk:review", "mk:review-pr", "mk:validate-plan"]),
|
|
18
|
+
];
|
|
19
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/review.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iFAAiF;AACjF,+DAA+D;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,MAAM,cAAc,GAA0B;IACpD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,gBAAgB;QACzB,iBAAiB,EAAE,QAAQ;QAC3B,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QAC9D,YAAY,EAAE;YACb,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,uBAAuB,EAAE,CAAC;YAC1B,YAAY,EAAE,CAAC;SACf;KACD,EACD,CAAC,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAC9F;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/security.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,eAAO,MAAM,gBAAgB,EAAE,mBAAmB,EAiBjD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Security-posture profile family. Findings and remediation roadmaps with high
|
|
2
|
+
// blast radius — stronger redaction and a review-after window are warranted.
|
|
3
|
+
import { defineGroup } from "../profile-factory.js";
|
|
4
|
+
export const securityProfiles = [
|
|
5
|
+
...defineGroup({
|
|
6
|
+
handoffClass: "required",
|
|
7
|
+
profile: "security-posture",
|
|
8
|
+
defaultReuseScope: "security",
|
|
9
|
+
artifactPatterns: ["tasks/reports/*.md", "tasks/reviews/*.md"],
|
|
10
|
+
salienceBase: {
|
|
11
|
+
verified_outcome: 2,
|
|
12
|
+
source_quality: 2,
|
|
13
|
+
future_reuse_likelihood: 2,
|
|
14
|
+
blast_radius: 2,
|
|
15
|
+
security_risk_penalty: -1,
|
|
16
|
+
},
|
|
17
|
+
}, ["mk:cso", "mk:vulnerability-scanner"]),
|
|
18
|
+
];
|
|
19
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../../src/wiki/handoff/profiles/security.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,MAAM,gBAAgB,GAA0B;IACtD,GAAG,WAAW,CACb;QACC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,kBAAkB;QAC3B,iBAAiB,EAAE,UAAU;QAC7B,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QAC9D,YAAY,EAAE;YACb,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,uBAAuB,EAAE,CAAC;YAC1B,YAAY,EAAE,CAAC;YACf,qBAAqB,EAAE,CAAC,CAAC;SACzB;KACD,EACD,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CACtC;CACD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ArtifactSignal, SkillHandoffProfile } from "./domain.js";
|
|
2
|
+
/** The fail-quiet default for any unregistered skill: class "none", never suggests. */
|
|
3
|
+
export declare const NONE_PROFILE: SkillHandoffProfile;
|
|
4
|
+
/** Resolve a skill's profile by name. Unknown/unregistered skills get the `none`
|
|
5
|
+
* default (carrying the queried name) — never throws, never touches the filesystem. */
|
|
6
|
+
export declare function lookupProfile(skillName: string): SkillHandoffProfile;
|
|
7
|
+
/** All registered (class A/B) profiles, sorted by skill name. Unregistered skills
|
|
8
|
+
* are class "none" by default and are not listed individually. */
|
|
9
|
+
export declare function listProfiles(): SkillHandoffProfile[];
|
|
10
|
+
/** Convenience: does this skill carry a non-`none` registered profile? */
|
|
11
|
+
export declare function isRegistered(skillName: string): boolean;
|
|
12
|
+
export type { ArtifactSignal };
|
|
13
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/wiki/handoff/profiles.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAyBvE,uFAAuF;AACvF,eAAO,MAAM,YAAY,EAAE,mBAOzB,CAAC;AAEH;uFACuF;AACvF,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAIpE;AAED;kEACkE;AAClE,wBAAgB,YAAY,IAAI,mBAAmB,EAAE,CAEpD;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Per-skill handoff profile registry. Assembled from the profile-family files;
|
|
2
|
+
// lookup is a name-keyed map read with a fail-quiet `none` default. The registry
|
|
3
|
+
// NEVER reads .claude/skills or plugin/skills at runtime — a downstream project
|
|
4
|
+
// whose installed skill set differs from the source repo still resolves cleanly
|
|
5
|
+
// (unknown skill → class "none", no suggestion).
|
|
6
|
+
import { makeSkillProfile } from "./profile-factory.js";
|
|
7
|
+
import { lifecycleProfiles } from "./profiles/lifecycle.js";
|
|
8
|
+
import { researchProfiles } from "./profiles/research.js";
|
|
9
|
+
import { reviewProfiles } from "./profiles/review.js";
|
|
10
|
+
import { securityProfiles } from "./profiles/security.js";
|
|
11
|
+
import { externalProfiles } from "./profiles/external.js";
|
|
12
|
+
import { frameworkProfiles } from "./profiles/framework.js";
|
|
13
|
+
const ALL_PROFILES = [
|
|
14
|
+
...lifecycleProfiles,
|
|
15
|
+
...researchProfiles,
|
|
16
|
+
...reviewProfiles,
|
|
17
|
+
...securityProfiles,
|
|
18
|
+
...externalProfiles,
|
|
19
|
+
...frameworkProfiles,
|
|
20
|
+
];
|
|
21
|
+
const REGISTRY = new Map();
|
|
22
|
+
for (const entry of ALL_PROFILES) {
|
|
23
|
+
if (REGISTRY.has(entry.skillName)) {
|
|
24
|
+
throw new Error(`duplicate handoff profile for skill: ${entry.skillName}`);
|
|
25
|
+
}
|
|
26
|
+
REGISTRY.set(entry.skillName, entry);
|
|
27
|
+
}
|
|
28
|
+
/** The fail-quiet default for any unregistered skill: class "none", never suggests. */
|
|
29
|
+
export const NONE_PROFILE = makeSkillProfile({
|
|
30
|
+
skillName: "*",
|
|
31
|
+
handoffClass: "none",
|
|
32
|
+
profile: "none",
|
|
33
|
+
defaultReuseScope: "",
|
|
34
|
+
artifactPatterns: [],
|
|
35
|
+
salienceBase: {},
|
|
36
|
+
});
|
|
37
|
+
/** Resolve a skill's profile by name. Unknown/unregistered skills get the `none`
|
|
38
|
+
* default (carrying the queried name) — never throws, never touches the filesystem. */
|
|
39
|
+
export function lookupProfile(skillName) {
|
|
40
|
+
const found = REGISTRY.get(skillName);
|
|
41
|
+
if (found)
|
|
42
|
+
return found;
|
|
43
|
+
return { ...NONE_PROFILE, skillName };
|
|
44
|
+
}
|
|
45
|
+
/** All registered (class A/B) profiles, sorted by skill name. Unregistered skills
|
|
46
|
+
* are class "none" by default and are not listed individually. */
|
|
47
|
+
export function listProfiles() {
|
|
48
|
+
return [...REGISTRY.values()].sort((a, b) => a.skillName.localeCompare(b.skillName));
|
|
49
|
+
}
|
|
50
|
+
/** Convenience: does this skill carry a non-`none` registered profile? */
|
|
51
|
+
export function isRegistered(skillName) {
|
|
52
|
+
return REGISTRY.has(skillName);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../src/wiki/handoff/profiles.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,iDAAiD;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,YAAY,GAA0B;IAC3C,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,gBAAgB;IACnB,GAAG,iBAAiB;CACpB,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;AACxD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;IAClC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,MAAM,YAAY,GAAwB,gBAAgB,CAAC;IACjE,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,MAAM;IACpB,OAAO,EAAE,MAAM;IACf,iBAAiB,EAAE,EAAE;IACrB,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH;uFACuF;AACvF,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC;AAED;kEACkE;AAClE,MAAM,UAAU,YAAY;IAC3B,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC7C,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { WikiSlug, WikiWriteDecision } from "../domain/index.js";
|
|
2
|
+
import type { ProposeInput, ProposeResult, Scanner } from "../application/ports.js";
|
|
3
|
+
import type { ArtifactSignal, WikiHandoffPacket, WikiHandoffRecord } from "./domain.js";
|
|
4
|
+
/** Narrow write port — segregated from WikiRepository so the handoff service depends only
|
|
5
|
+
* on what it uses (and to avoid a ports↔handoff/domain type cycle). */
|
|
6
|
+
export interface HandoffRepository {
|
|
7
|
+
appendHandoff(slug: WikiSlug, record: WikiHandoffRecord): void;
|
|
8
|
+
}
|
|
9
|
+
export interface HandoffServiceDeps {
|
|
10
|
+
/** Project root — artifact reads are confined under it (SEC2). */
|
|
11
|
+
projectRoot: string;
|
|
12
|
+
scanner: Scanner;
|
|
13
|
+
repo: HandoffRepository;
|
|
14
|
+
/** The ONLY write-to-candidate path (WikiService.proposeCandidate). */
|
|
15
|
+
proposeCandidate: (input: ProposeInput) => ProposeResult;
|
|
16
|
+
/** Injectable clock for deterministic timestamps in tests. */
|
|
17
|
+
now: () => string;
|
|
18
|
+
/** Injectable artifact reader (defaults to a project-root-confined fs read). */
|
|
19
|
+
readArtifact?: (absPath: string) => string;
|
|
20
|
+
}
|
|
21
|
+
export interface SuggestResult {
|
|
22
|
+
packet: WikiHandoffPacket;
|
|
23
|
+
decision: WikiWriteDecision;
|
|
24
|
+
}
|
|
25
|
+
export interface ProfileListing {
|
|
26
|
+
skillName: string;
|
|
27
|
+
handoffClass: string;
|
|
28
|
+
profile: string;
|
|
29
|
+
artifactPatterns: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare class HandoffService {
|
|
32
|
+
private readonly deps;
|
|
33
|
+
constructor(deps: HandoffServiceDeps);
|
|
34
|
+
/** Read-only: build the packet + decision for an artifact. Writes NOTHING. */
|
|
35
|
+
suggest(skillName: string, artifactPath: string, slug: WikiSlug, overrides?: Partial<ArtifactSignal>): SuggestResult;
|
|
36
|
+
/** Scan → (clean + eligible) propose a candidate → append exactly one handoff outcome
|
|
37
|
+
* record. Dirty or non-suggested artifacts create no candidate; a metadata-only record
|
|
38
|
+
* (never raw content) is still appended for provenance. */
|
|
39
|
+
propose(skillName: string, artifactPath: string, slug: WikiSlug, overrides?: Partial<ArtifactSignal>): {
|
|
40
|
+
record: WikiHandoffRecord;
|
|
41
|
+
result?: ProposeResult;
|
|
42
|
+
};
|
|
43
|
+
/** Registry listing for the CLI — class A/B + profile + artifact patterns. */
|
|
44
|
+
profiles(): ProfileListing[];
|
|
45
|
+
/** Shared prelude for suggest + propose: gate path → read → hash → signal → profile →
|
|
46
|
+
* salience/shouldSuggest → scan → packet + decision. Pure of writes. */
|
|
47
|
+
private build;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/wiki/handoff/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGpF,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAgB3G;uEACuE;AACvE,MAAM,WAAW,iBAAiB;IACjC,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,kBAAkB;IAClC,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,iBAAiB,CAAC;IACxB,uEAAuE;IACvE,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,aAAa,CAAC;IACzD,8DAA8D;IAC9D,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,gFAAgF;IAChF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B;AAoBD,qBAAa,cAAc;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,kBAAkB;IAErD,8EAA8E;IAC9E,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,aAAa;IAKxH;;+DAE2D;IAC3D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG;QAAE,MAAM,EAAE,iBAAiB,CAAC;QAAC,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE;IA+ChK,8EAA8E;IAC9E,QAAQ,IAAI,cAAc,EAAE;IAS5B;4EACwE;IACxE,OAAO,CAAC,KAAK;CAgDb"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { decideWrite, scoreSalience } from "../domain/index.js";
|
|
5
|
+
import { lookupProfile, listProfiles } from "./profiles.js";
|
|
6
|
+
import { toProposeInput } from "./domain.js";
|
|
7
|
+
const SENSITIVE_BASENAME = /^\.env(\.|$)|\.(pem|key|keystore)$/;
|
|
8
|
+
/** SEC2 gate: resolve `artifactPath` under the project root and reject traversal-out or any
|
|
9
|
+
* sensitive-file pattern (injection-rules.md Rule 4) BEFORE any read. Returns the safe path. */
|
|
10
|
+
function assertSafeArtifactPath(projectRoot, artifactPath) {
|
|
11
|
+
const root = path.resolve(projectRoot);
|
|
12
|
+
const resolved = path.resolve(root, artifactPath);
|
|
13
|
+
if (resolved !== root && !resolved.startsWith(root + path.sep)) {
|
|
14
|
+
throw new Error("artifact path escapes the project root: " + JSON.stringify(artifactPath));
|
|
15
|
+
}
|
|
16
|
+
const lower = resolved.toLowerCase();
|
|
17
|
+
const base = path.basename(lower);
|
|
18
|
+
if (SENSITIVE_BASENAME.test(base) || lower.includes("credentials") || lower.includes("secret")) {
|
|
19
|
+
throw new Error("artifact path matches a sensitive-file pattern (injection-rules.md R4): " + JSON.stringify(artifactPath));
|
|
20
|
+
}
|
|
21
|
+
return resolved;
|
|
22
|
+
}
|
|
23
|
+
export class HandoffService {
|
|
24
|
+
deps;
|
|
25
|
+
constructor(deps) {
|
|
26
|
+
this.deps = deps;
|
|
27
|
+
}
|
|
28
|
+
/** Read-only: build the packet + decision for an artifact. Writes NOTHING. */
|
|
29
|
+
suggest(skillName, artifactPath, slug, overrides = {}) {
|
|
30
|
+
const built = this.build(skillName, artifactPath, slug, overrides);
|
|
31
|
+
return { packet: built.packet, decision: built.decision };
|
|
32
|
+
}
|
|
33
|
+
/** Scan → (clean + eligible) propose a candidate → append exactly one handoff outcome
|
|
34
|
+
* record. Dirty or non-suggested artifacts create no candidate; a metadata-only record
|
|
35
|
+
* (never raw content) is still appended for provenance. */
|
|
36
|
+
propose(skillName, artifactPath, slug, overrides = {}) {
|
|
37
|
+
const built = this.build(skillName, artifactPath, slug, overrides);
|
|
38
|
+
const { packet, scanClean, shouldSuggest } = built;
|
|
39
|
+
let status;
|
|
40
|
+
let decisionKind;
|
|
41
|
+
let candidateId;
|
|
42
|
+
let result;
|
|
43
|
+
if (!shouldSuggest) {
|
|
44
|
+
status = "skipped";
|
|
45
|
+
decisionKind = "skipped";
|
|
46
|
+
}
|
|
47
|
+
else if (!scanClean) {
|
|
48
|
+
status = "quarantined";
|
|
49
|
+
decisionKind = "quarantine";
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
result = this.deps.proposeCandidate(toProposeInput(packet));
|
|
53
|
+
decisionKind = result.decision.kind;
|
|
54
|
+
candidateId = result.candidate?.id;
|
|
55
|
+
status = result.candidate ? "proposed" : decisionKind === "quarantine" ? "quarantined" : "skipped";
|
|
56
|
+
}
|
|
57
|
+
const record = {
|
|
58
|
+
id: slug + "/ho-" + packet.artifactHash.slice(0, 12),
|
|
59
|
+
slug,
|
|
60
|
+
skillName: packet.skillName,
|
|
61
|
+
handoffClass: packet.handoffClass,
|
|
62
|
+
profile: packet.profile,
|
|
63
|
+
artifactPath: packet.artifactPath,
|
|
64
|
+
artifactHash: packet.artifactHash,
|
|
65
|
+
title: packet.title,
|
|
66
|
+
whySave: packet.whySave,
|
|
67
|
+
evidence: packet.evidence,
|
|
68
|
+
reuseScope: packet.reuseScope,
|
|
69
|
+
verificationState: packet.verificationState,
|
|
70
|
+
riskScore: packet.riskScore,
|
|
71
|
+
salience: scoreSalience(packet.salience),
|
|
72
|
+
decisionKind,
|
|
73
|
+
candidateId,
|
|
74
|
+
status,
|
|
75
|
+
createdAt: packet.createdAt,
|
|
76
|
+
reviewAfter: packet.reviewAfter,
|
|
77
|
+
};
|
|
78
|
+
this.deps.repo.appendHandoff(slug, record);
|
|
79
|
+
return { record, result };
|
|
80
|
+
}
|
|
81
|
+
/** Registry listing for the CLI — class A/B + profile + artifact patterns. */
|
|
82
|
+
profiles() {
|
|
83
|
+
return listProfiles().map((p) => ({
|
|
84
|
+
skillName: p.skillName,
|
|
85
|
+
handoffClass: p.handoffClass,
|
|
86
|
+
profile: p.profile,
|
|
87
|
+
artifactPatterns: p.artifactPatterns,
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
/** Shared prelude for suggest + propose: gate path → read → hash → signal → profile →
|
|
91
|
+
* salience/shouldSuggest → scan → packet + decision. Pure of writes. */
|
|
92
|
+
build(skillName, artifactPath, slug, overrides) {
|
|
93
|
+
const safePath = assertSafeArtifactPath(this.deps.projectRoot, artifactPath);
|
|
94
|
+
const read = this.deps.readArtifact ?? ((p) => fs.readFileSync(p, "utf-8"));
|
|
95
|
+
const content = read(safePath);
|
|
96
|
+
const artifactHash = createHash("sha256").update(content).digest("hex");
|
|
97
|
+
const profile = lookupProfile(skillName);
|
|
98
|
+
const signal = {
|
|
99
|
+
skillName,
|
|
100
|
+
artifactPath,
|
|
101
|
+
artifactHash,
|
|
102
|
+
contentBytes: Buffer.byteLength(content, "utf-8"),
|
|
103
|
+
producedAt: this.deps.now(),
|
|
104
|
+
...overrides,
|
|
105
|
+
};
|
|
106
|
+
const salience = profile.defaultSalience(signal);
|
|
107
|
+
const shouldSuggest = profile.shouldSuggest(signal);
|
|
108
|
+
const packet = {
|
|
109
|
+
slug,
|
|
110
|
+
skillName,
|
|
111
|
+
handoffClass: profile.handoffClass,
|
|
112
|
+
profile: profile.profile,
|
|
113
|
+
artifactPath,
|
|
114
|
+
artifactHash,
|
|
115
|
+
title: deriveTitle(artifactPath),
|
|
116
|
+
content,
|
|
117
|
+
origin: "agent",
|
|
118
|
+
whySave: profile.profile + " handoff from " + skillName,
|
|
119
|
+
evidence: artifactPath,
|
|
120
|
+
sourceIds: [],
|
|
121
|
+
reuseScope: profile.defaultReuseScope,
|
|
122
|
+
verificationState: signal.verifiedOutcome ? "verified" : "unverified",
|
|
123
|
+
riskScore: 0,
|
|
124
|
+
noveltyDelta: signal.noveltyDelta ?? salience.novelty_vs_existing_wiki,
|
|
125
|
+
salience,
|
|
126
|
+
createdAt: signal.producedAt,
|
|
127
|
+
};
|
|
128
|
+
const scan = this.deps.scanner.scan({ content, origin: "agent" });
|
|
129
|
+
const scanClean = scan.verdict.status === "clean" && scan.verdict.passes >= 2;
|
|
130
|
+
const score = scoreSalience(salience);
|
|
131
|
+
const decision = shouldSuggest
|
|
132
|
+
? decideWrite(score, scan.verdict, { isHighDuplicate: false })
|
|
133
|
+
: { kind: "discard", reason: "profile does not suggest a handoff for this artifact signal" };
|
|
134
|
+
return { packet, decision, scanClean, shouldSuggest };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Best-effort human title from an artifact filename (provenance display only). */
|
|
138
|
+
function deriveTitle(artifactPath) {
|
|
139
|
+
const base = path.basename(artifactPath).replace(/\.[a-z0-9]+$/i, "");
|
|
140
|
+
return base.replace(/[-_]+/g, " ").trim() || artifactPath;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/wiki/handoff/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { InjectionVerdict, WikiCandidate, WikiIntervention, WikiPage, WikiSeed, WikiSlug, WikiSource } from "../domain/index.js";
|
|
2
2
|
import type { ApprovedWrite, WikiRepository } from "../application/ports.js";
|
|
3
|
-
|
|
3
|
+
import type { HandoffRepository } from "../handoff/service.js";
|
|
4
|
+
import type { WikiHandoffRecord } from "../handoff/domain.js";
|
|
5
|
+
export declare class MarkdownWikiRepository implements WikiRepository, HandoffRepository {
|
|
4
6
|
private readonly projectRoot;
|
|
5
7
|
constructor(projectRoot: string);
|
|
6
8
|
private wikiDir;
|
|
@@ -16,6 +18,9 @@ export declare class MarkdownWikiRepository implements WikiRepository {
|
|
|
16
18
|
appendIntervention(slug: WikiSlug, intervention: WikiIntervention): void;
|
|
17
19
|
appendSeed(slug: WikiSlug, seed: WikiSeed): void;
|
|
18
20
|
appendSource(slug: WikiSlug, source: WikiSource): void;
|
|
21
|
+
/** Append-only handoff outcome record → tasks/wikis/<slug>/handoffs.jsonl (ingested by
|
|
22
|
+
* reindex into wiki_handoff). The record never carries raw artifact content. */
|
|
23
|
+
appendHandoff(slug: WikiSlug, record: WikiHandoffRecord): void;
|
|
19
24
|
listCandidates(slug: WikiSlug): WikiCandidate[];
|
|
20
25
|
getCandidate(slug: WikiSlug, id: string): WikiCandidate | null;
|
|
21
26
|
quarantine(slug: WikiSlug, content: string, verdict: InjectionVerdict): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-repository.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/markdown-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-repository.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/markdown-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAwC9D,qBAAa,sBAAuB,YAAW,cAAc,EAAE,iBAAiB;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAEhD,OAAO,CAAC,OAAO;IAIf,+EAA+E;IAC/E,OAAO,CAAC,aAAa;IAUrB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/C,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAqBrC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAwBvD,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE;IAMnC,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,SAAS;IAgBjB,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAI/C,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,GAAG,IAAI;IAIxE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAIhD,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAItD;oFACgF;IAChF,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI9D,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,EAAE;IAM/C,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAI9D,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM;CAQ9E"}
|
|
@@ -148,6 +148,11 @@ export class MarkdownWikiRepository {
|
|
|
148
148
|
appendSource(slug, source) {
|
|
149
149
|
this.appendJsonl(slug, "sources.jsonl", source);
|
|
150
150
|
}
|
|
151
|
+
/** Append-only handoff outcome record → tasks/wikis/<slug>/handoffs.jsonl (ingested by
|
|
152
|
+
* reindex into wiki_handoff). The record never carries raw artifact content. */
|
|
153
|
+
appendHandoff(slug, record) {
|
|
154
|
+
this.appendJsonl(slug, "handoffs.jsonl", record);
|
|
155
|
+
}
|
|
151
156
|
listCandidates(slug) {
|
|
152
157
|
// Runtime shape guard at the store boundary — candidates.jsonl gains an untrusted
|
|
153
158
|
// producer (fetched→candidate), so malformed records are skipped, not cast blind.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-repository.js","sourceRoot":"","sources":["../../../src/wiki/infrastructure/markdown-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,SAAS,CAAC;AAU3B,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-repository.js","sourceRoot":"","sources":["../../../src/wiki/infrastructure/markdown-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ export interface WikiIngestCounts {
|
|
|
8
8
|
seeds: number;
|
|
9
9
|
interventions: number;
|
|
10
10
|
links: number;
|
|
11
|
+
handoffs: number;
|
|
12
|
+
candidateSources: number;
|
|
11
13
|
}
|
|
12
14
|
/** Clear and rebuild every wiki table from the canonical tree. Returns row counts. */
|
|
13
15
|
export declare function ingestWiki(db: DatabaseSync, projectRoot: string): WikiIngestCounts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-ingest.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-ingest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-ingest.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-ingest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAsLD,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAUlF"}
|
|
@@ -107,6 +107,10 @@ function ingestSlug(db, root, slug, c) {
|
|
|
107
107
|
}
|
|
108
108
|
const candStmt = db.prepare("INSERT OR REPLACE INTO wiki_candidate (id, slug, origin, title, content, why_save, evidence, novelty_delta, reuse_scope, verification_state, risk_score, salience_total, state, created_at, review_after) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
109
109
|
const salStmt = db.prepare("INSERT OR REPLACE INTO wiki_salience (candidate_id, explicit_user_intent, verified_outcome, recurrence_or_friction, novelty_vs_existing_wiki, future_reuse_likelihood, source_quality, blast_radius, security_risk_penalty, staleness_penalty, total) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
110
|
+
// v3 relation: candidate↔source, backfilled from each candidate's sourceIds array.
|
|
111
|
+
// OR IGNORE + gate on .changes keeps re-ingest idempotent; an empty/missing sourceIds
|
|
112
|
+
// list yields zero rows and is NOT an error (the Aspire-shaped data has no sources).
|
|
113
|
+
const candSrcStmt = db.prepare("INSERT OR IGNORE INTO wiki_candidate_source (candidate_id, source_id) VALUES (?, ?)");
|
|
110
114
|
for (const o of readJsonl(path.join(dir, "candidates.jsonl"))) {
|
|
111
115
|
const id = s(o["id"]);
|
|
112
116
|
const sal = (o["salience"] && typeof o["salience"] === "object" ? o["salience"] : {});
|
|
@@ -114,6 +118,12 @@ function ingestSlug(db, root, slug, c) {
|
|
|
114
118
|
candStmt.run(id, s(o["slug"]) ?? slug, s(o["origin"]) ?? "agent", s(o["title"]) ?? "", s(o["content"]) ?? "", s(o["whySave"]), s(o["evidence"]), n(o["noveltyDelta"]), s(o["reuseScope"]), s(o["verificationState"]), n(o["riskScore"]), n(sal["total"]), s(o["state"]) ?? "proposed", s(o["createdAt"]), s(o["reviewAfter"]));
|
|
115
119
|
if (id) {
|
|
116
120
|
salStmt.run(id, n(comp["explicit_user_intent"]), n(comp["verified_outcome"]), n(comp["recurrence_or_friction"]), n(comp["novelty_vs_existing_wiki"]), n(comp["future_reuse_likelihood"]), n(comp["source_quality"]), n(comp["blast_radius"]), n(comp["security_risk_penalty"]), n(comp["staleness_penalty"]), n(sal["total"]));
|
|
121
|
+
const sourceIds = Array.isArray(o["sourceIds"]) ? o["sourceIds"] : [];
|
|
122
|
+
for (const src of sourceIds) {
|
|
123
|
+
const srcId = s(src);
|
|
124
|
+
if (srcId && candSrcStmt.run(id, srcId).changes > 0)
|
|
125
|
+
c.candidateSources += 1;
|
|
126
|
+
}
|
|
117
127
|
}
|
|
118
128
|
c.candidates += 1;
|
|
119
129
|
}
|
|
@@ -122,10 +132,20 @@ function ingestSlug(db, root, slug, c) {
|
|
|
122
132
|
intStmt.run(s(o["id"]), s(o["kind"]), s(o["candidateId"]), s(o["reason"]), s(o["actor"]), s(o["createdAt"]));
|
|
123
133
|
c.interventions += 1;
|
|
124
134
|
}
|
|
135
|
+
// v3: handoff outcome records. salience is flattened to a total column + a
|
|
136
|
+
// JSON blob (red-team S1 — no per-component child table). OR IGNORE + .changes
|
|
137
|
+
// gate keeps re-ingest idempotent. Absent handoffs.jsonl yields zero rows.
|
|
138
|
+
const hoStmt = db.prepare("INSERT OR IGNORE INTO wiki_handoff (id, slug, skill_name, skill_owner, handoff_class, profile, artifact_path, artifact_hash, title, why_save, evidence, reuse_scope, verification_state, risk_score, salience_total, salience_json, decision_kind, candidate_id, page_id, status, created_at, review_after) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
139
|
+
for (const o of readJsonl(path.join(dir, "handoffs.jsonl"))) {
|
|
140
|
+
const sal = (o["salience"] && typeof o["salience"] === "object" ? o["salience"] : {});
|
|
141
|
+
const inserted = hoStmt.run(s(o["id"]), s(o["slug"]) ?? slug, s(o["skillName"]) ?? "", s(o["skillOwner"]), s(o["handoffClass"]) ?? "none", s(o["profile"]) ?? "none", s(o["artifactPath"]) ?? "", s(o["artifactHash"]) ?? "", s(o["title"]) ?? "", s(o["whySave"]), s(o["evidence"]), s(o["reuseScope"]), s(o["verificationState"]), n(o["riskScore"]), n(sal["total"]), JSON.stringify(o["salience"] ?? {}), s(o["decisionKind"]), s(o["candidateId"]), s(o["pageId"]), s(o["status"]) ?? "suggested", s(o["createdAt"]), s(o["reviewAfter"])).changes > 0;
|
|
142
|
+
if (inserted)
|
|
143
|
+
c.handoffs += 1;
|
|
144
|
+
}
|
|
125
145
|
}
|
|
126
146
|
/** Clear and rebuild every wiki table from the canonical tree. Returns row counts. */
|
|
127
147
|
export function ingestWiki(db, projectRoot) {
|
|
128
|
-
const counts = { wikis: 0, pages: 0, sources: 0, claims: 0, candidates: 0, seeds: 0, interventions: 0, links: 0 };
|
|
148
|
+
const counts = { wikis: 0, pages: 0, sources: 0, claims: 0, candidates: 0, seeds: 0, interventions: 0, links: 0, handoffs: 0, candidateSources: 0 };
|
|
129
149
|
for (const table of WIKI_TABLES) {
|
|
130
150
|
db.exec("DELETE FROM " + table); // table is a constant from WIKI_TABLES, never user input
|
|
131
151
|
}
|