@rpamis/comet 0.4.0-beta.3 → 0.4.0-beta.5
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/LICENSE +21 -21
- package/README.md +15 -1
- package/assets/manifest.json +2 -1
- package/assets/skills/comet/SKILL.md +54 -28
- package/assets/skills/comet/reference/auto-transition.md +1 -1
- package/assets/skills/comet/reference/comet-yaml-fields.md +11 -6
- package/assets/skills/comet/reference/context-recovery.md +12 -2
- package/assets/skills/comet/reference/decision-point.md +11 -0
- package/assets/skills/comet/reference/scripts.md +47 -15
- package/assets/skills/comet/reference/subagent-dispatch.md +6 -5
- package/assets/skills/comet/rules/comet-phase-guard.en.md +31 -28
- package/assets/skills/comet/rules/comet-phase-guard.md +31 -29
- package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
- package/assets/skills/comet/scripts/comet-runtime.mjs +1568 -476
- package/assets/skills/comet-any/SKILL.md +1 -1
- package/assets/skills/comet-any/reference/authored-zone-example.md +10 -5
- package/assets/skills/comet-any/reference/subagents/pause-points-author.md +14 -11
- package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +2 -0
- package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +5 -4
- package/assets/skills/comet-archive/SKILL.md +52 -18
- package/assets/skills/comet-build/SKILL.md +64 -45
- package/assets/skills/comet-design/SKILL.md +24 -22
- package/assets/skills/comet-hotfix/SKILL.md +37 -34
- package/assets/skills/comet-open/SKILL.md +106 -57
- package/assets/skills/comet-tweak/SKILL.md +23 -18
- package/assets/skills/comet-verify/SKILL.md +57 -72
- package/assets/skills-zh/comet/SKILL.md +54 -28
- package/assets/skills-zh/comet/reference/auto-transition.md +1 -1
- package/assets/skills-zh/comet/reference/comet-yaml-fields.md +11 -6
- package/assets/skills-zh/comet/reference/context-recovery.md +12 -2
- package/assets/skills-zh/comet/reference/decision-point.md +11 -0
- package/assets/skills-zh/comet/reference/scripts.md +47 -15
- package/assets/skills-zh/comet/reference/subagent-dispatch.md +6 -5
- package/assets/skills-zh/comet-any/SKILL.md +1 -1
- package/assets/skills-zh/comet-any/reference/authored-zone-example.md +10 -5
- package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +14 -12
- package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +2 -0
- package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +5 -4
- package/assets/skills-zh/comet-archive/SKILL.md +52 -18
- package/assets/skills-zh/comet-build/SKILL.md +64 -45
- package/assets/skills-zh/comet-design/SKILL.md +24 -22
- package/assets/skills-zh/comet-hotfix/SKILL.md +36 -33
- package/assets/skills-zh/comet-open/SKILL.md +105 -56
- package/assets/skills-zh/comet-tweak/SKILL.md +22 -17
- package/assets/skills-zh/comet-verify/SKILL.md +57 -72
- package/dist/app/cli/comet-banner.d.ts +25 -0
- package/dist/app/cli/comet-banner.d.ts.map +1 -0
- package/dist/app/cli/comet-banner.js +265 -0
- package/dist/app/cli/comet-banner.js.map +1 -0
- package/dist/app/cli/index.js +36 -2
- package/dist/app/cli/index.js.map +1 -1
- package/dist/app/commands/classic.d.ts +4 -0
- package/dist/app/commands/classic.d.ts.map +1 -0
- package/dist/app/commands/classic.js +11 -0
- package/dist/app/commands/classic.js.map +1 -0
- package/dist/app/commands/doctor.d.ts.map +1 -1
- package/dist/app/commands/doctor.js +99 -37
- package/dist/app/commands/doctor.js.map +1 -1
- package/dist/app/commands/eval.d.ts.map +1 -1
- package/dist/app/commands/eval.js +57 -20
- package/dist/app/commands/eval.js.map +1 -1
- package/dist/app/commands/i18n.d.ts +1 -1
- package/dist/app/commands/i18n.d.ts.map +1 -1
- package/dist/app/commands/i18n.js +12 -4
- package/dist/app/commands/i18n.js.map +1 -1
- package/dist/app/commands/init.d.ts +1 -1
- package/dist/app/commands/init.d.ts.map +1 -1
- package/dist/app/commands/init.js +72 -25
- package/dist/app/commands/init.js.map +1 -1
- package/dist/app/commands/project-scope-selection.d.ts +13 -0
- package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
- package/dist/app/commands/project-scope-selection.js +33 -0
- package/dist/app/commands/project-scope-selection.js.map +1 -0
- package/dist/app/commands/resume-probe.d.ts +11 -0
- package/dist/app/commands/resume-probe.d.ts.map +1 -0
- package/dist/app/commands/resume-probe.js +63 -0
- package/dist/app/commands/resume-probe.js.map +1 -0
- package/dist/app/commands/status.d.ts +31 -0
- package/dist/app/commands/status.d.ts.map +1 -1
- package/dist/app/commands/status.js +109 -20
- package/dist/app/commands/status.js.map +1 -1
- package/dist/app/commands/uninstall.d.ts +5 -0
- package/dist/app/commands/uninstall.d.ts.map +1 -1
- package/dist/app/commands/uninstall.js +264 -53
- package/dist/app/commands/uninstall.js.map +1 -1
- package/dist/app/commands/update.d.ts +6 -0
- package/dist/app/commands/update.d.ts.map +1 -1
- package/dist/app/commands/update.js +558 -86
- package/dist/app/commands/update.js.map +1 -1
- package/dist/config/repository-layout.json +4 -2
- package/dist/domains/bundle/bundle-platform.d.ts +1 -0
- package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
- package/dist/domains/bundle/bundle-platform.js +9 -3
- package/dist/domains/bundle/bundle-platform.js.map +1 -1
- package/dist/domains/bundle/eval-manifest-runtime.d.ts +6 -0
- package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
- package/dist/domains/bundle/eval-manifest-runtime.js +58 -0
- package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
- package/dist/domains/bundle/types.d.ts +1 -1
- package/dist/domains/bundle/types.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
- package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-archive.js +35 -38
- package/dist/domains/comet-classic/classic-archive.js.map +1 -1
- package/dist/domains/comet-classic/classic-cli.d.ts +1 -1
- package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-cli.js +3 -0
- package/dist/domains/comet-classic/classic-cli.js.map +1 -1
- package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
- package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-command-checks.js +97 -0
- package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
- package/dist/domains/comet-classic/classic-current-change.d.ts +19 -0
- package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-current-change.js +132 -0
- package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
- package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
- package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
- package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
- package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-evidence.js +4 -0
- package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
- package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-guard.js +83 -80
- package/dist/domains/comet-classic/classic-guard.js.map +1 -1
- package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-hook-guard.js +179 -42
- package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
- package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
- package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-project-config.js +40 -0
- package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
- package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-resolver.js +4 -4
- package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
- package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
- package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe-command.js +58 -0
- package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
- package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe.js +386 -0
- package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
- package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
- package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-runtime-run.js +38 -0
- package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
- package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-state-command.js +150 -25
- package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
- package/dist/domains/comet-classic/classic-state.d.ts +5 -2
- package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-state.js +17 -1
- package/dist/domains/comet-classic/classic-state.js.map +1 -1
- package/dist/domains/comet-classic/classic-store.d.ts +4 -1
- package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-store.js +4 -3
- package/dist/domains/comet-classic/classic-store.js.map +1 -1
- package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
- package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-transitions.js +36 -3
- package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
- package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-validate-command.js +8 -1
- package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
- package/dist/domains/comet-classic/index.d.ts +3 -0
- package/dist/domains/comet-classic/index.d.ts.map +1 -1
- package/dist/domains/comet-classic/index.js +3 -0
- package/dist/domains/comet-classic/index.js.map +1 -1
- package/dist/domains/dashboard/collector.js +10 -2
- package/dist/domains/dashboard/collector.js.map +1 -1
- package/dist/domains/dashboard/web/assets/_commonjsHelpers-CqkleIqs.js +1 -0
- package/dist/domains/dashboard/web/assets/arc-TGVUG2WN.js +1 -0
- package/dist/domains/dashboard/web/assets/architectureDiagram-3BPJPVTR-ASHmiHoP.js +36 -0
- package/dist/domains/dashboard/web/assets/blockDiagram-GPEHLZMM-CwASxBKe.js +132 -0
- package/dist/domains/dashboard/web/assets/c4Diagram-AAUBKEIU-BU8z_WNk.js +10 -0
- package/dist/domains/dashboard/web/assets/channel-kp6Ng2JJ.js +1 -0
- package/dist/domains/dashboard/web/assets/chunk-2J33WTMH-CBGlUx4_.js +1 -0
- package/dist/domains/dashboard/web/assets/chunk-4BX2VUAB-CS-iGcFz.js +1 -0
- package/dist/domains/dashboard/web/assets/chunk-55IACEB6-BUtCVJat.js +1 -0
- package/dist/domains/dashboard/web/assets/chunk-727SXJPM-C94tj_pf.js +206 -0
- package/dist/domains/dashboard/web/assets/chunk-AQP2D5EJ-BFOKcpdG.js +231 -0
- package/dist/domains/dashboard/web/assets/chunk-FMBD7UC4-Dmx8B-st.js +15 -0
- package/dist/domains/dashboard/web/assets/chunk-ND2GUHAM-DYV00CNn.js +1 -0
- package/dist/domains/dashboard/web/assets/chunk-QZHKN3VN-DMJJyQnw.js +1 -0
- package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-yBDjgMY_.js +1 -0
- package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-yBDjgMY_.js +1 -0
- package/dist/domains/dashboard/web/assets/cose-bilkent-S5V4N54A-P4nE2rea.js +1 -0
- package/dist/domains/dashboard/web/assets/cynefin-VYW2F7L2-C-R1HXDv.js +166 -0
- package/dist/domains/dashboard/web/assets/cytoscape.esm-D3_iZ_3b.js +321 -0
- package/dist/domains/dashboard/web/assets/dagre-BM42HDAG-BH8d-C9z.js +4 -0
- package/dist/domains/dashboard/web/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/domains/dashboard/web/assets/diagram-2AECGRRQ-DpXTgQIH.js +43 -0
- package/dist/domains/dashboard/web/assets/diagram-5GNKFQAL-DSiFJzSw.js +10 -0
- package/dist/domains/dashboard/web/assets/diagram-KO2AKTUF-DULMkben.js +3 -0
- package/dist/domains/dashboard/web/assets/diagram-LMA3HP47-Pi8m_NO9.js +24 -0
- package/dist/domains/dashboard/web/assets/diagram-OG6HWLK6-BSe6bCWm.js +24 -0
- package/dist/domains/dashboard/web/assets/erDiagram-TEJ5UH35-zb-FEcbq.js +85 -0
- package/dist/domains/dashboard/web/assets/flowDiagram-I6XJVG4X-Dr-Gk0z2.js +162 -0
- package/dist/domains/dashboard/web/assets/ganttDiagram-6RSMTGT7-qs6Zb2A6.js +292 -0
- package/dist/domains/dashboard/web/assets/gitGraphDiagram-PVQCEYII-BQ314orT.js +106 -0
- package/dist/domains/dashboard/web/assets/graph--OzhPTMs.js +1 -0
- package/dist/domains/dashboard/web/assets/index-BLAfkNTu.css +1 -0
- package/dist/domains/dashboard/web/assets/index-DlSYK56b.js +139 -0
- package/dist/domains/dashboard/web/assets/index-DtLUOcAW.js +24 -0
- package/dist/domains/dashboard/web/assets/index-QO0z6F4w.js +10 -0
- package/dist/domains/dashboard/web/assets/infoDiagram-5YYISTIA-O0bQp98A.js +2 -0
- package/dist/domains/dashboard/web/assets/init-Gi6I4Gst.js +1 -0
- package/dist/domains/dashboard/web/assets/ishikawaDiagram-YF4QCWOH-BPC7wbKh.js +70 -0
- package/dist/domains/dashboard/web/assets/journeyDiagram-JHISSGLW-ohViOd4b.js +139 -0
- package/dist/domains/dashboard/web/assets/kanban-definition-UN3LZRKU-CHleNdbG.js +89 -0
- package/dist/domains/dashboard/web/assets/katex-HP8lGamR.js +257 -0
- package/dist/domains/dashboard/web/assets/layout-SsrduOYp.js +1 -0
- package/dist/domains/dashboard/web/assets/linear-CyqiW--Q.js +1 -0
- package/dist/domains/dashboard/web/assets/marked.esm-DECB3bxB.js +64 -0
- package/dist/domains/dashboard/web/assets/mermaid.core-qS9XvtaK.js +301 -0
- package/dist/domains/dashboard/web/assets/mindmap-definition-RKZ34NQL-oaGkqO9l.js +96 -0
- package/dist/domains/dashboard/web/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/domains/dashboard/web/assets/pieDiagram-4H26LBE5-CPcB-AFh.js +30 -0
- package/dist/domains/dashboard/web/assets/purify.es-VaSPOPhr.js +3 -0
- package/dist/domains/dashboard/web/assets/quadrantDiagram-W4KKPZXB-LFy52Qtj.js +7 -0
- package/dist/domains/dashboard/web/assets/requirementDiagram-4Y6WPE33-BdjeaYP_.js +84 -0
- package/dist/domains/dashboard/web/assets/sankeyDiagram-5OEKKPKP-DDJ4styL.js +40 -0
- package/dist/domains/dashboard/web/assets/sequenceDiagram-3UESZ5HK-BL5bFNoz.js +162 -0
- package/dist/domains/dashboard/web/assets/stateDiagram-AJRCARHV-BNUfikui.js +1 -0
- package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-DGrsmWts.js +1 -0
- package/dist/domains/dashboard/web/assets/timeline-definition-PNZ67QCA--ps2uu6L.js +120 -0
- package/dist/domains/dashboard/web/assets/vennDiagram-CIIHVFJN-C2q8q26c.js +34 -0
- package/dist/domains/dashboard/web/assets/wardleyDiagram-YWT4CUSO-BUH9gXqd.js +78 -0
- package/dist/domains/dashboard/web/assets/xychartDiagram-2RQKCTM6-B-DielEy.js +7 -0
- package/dist/domains/dashboard/web/index.html +16 -16
- package/dist/domains/engine/types.d.ts +1 -1
- package/dist/domains/engine/types.d.ts.map +1 -1
- package/dist/domains/factory/package.d.ts.map +1 -1
- package/dist/domains/factory/package.js +20 -6
- package/dist/domains/factory/package.js.map +1 -1
- package/dist/domains/integrations/openspec.d.ts +4 -1
- package/dist/domains/integrations/openspec.d.ts.map +1 -1
- package/dist/domains/integrations/openspec.js +62 -10
- package/dist/domains/integrations/openspec.js.map +1 -1
- package/dist/domains/skill/find.d.ts.map +1 -1
- package/dist/domains/skill/find.js +1 -6
- package/dist/domains/skill/find.js.map +1 -1
- package/dist/domains/skill/json-object.d.ts +13 -0
- package/dist/domains/skill/json-object.d.ts.map +1 -0
- package/dist/domains/skill/json-object.js +24 -0
- package/dist/domains/skill/json-object.js.map +1 -0
- package/dist/domains/skill/managed-markdown.d.ts +14 -0
- package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
- package/dist/domains/skill/managed-markdown.js +126 -0
- package/dist/domains/skill/managed-markdown.js.map +1 -0
- package/dist/domains/skill/platform-inspect.d.ts +9 -0
- package/dist/domains/skill/platform-inspect.d.ts.map +1 -0
- package/dist/domains/skill/platform-inspect.js +149 -0
- package/dist/domains/skill/platform-inspect.js.map +1 -0
- package/dist/domains/skill/platform-install.d.ts +20 -9
- package/dist/domains/skill/platform-install.d.ts.map +1 -1
- package/dist/domains/skill/platform-install.js +356 -153
- package/dist/domains/skill/platform-install.js.map +1 -1
- package/dist/domains/skill/project-instructions.d.ts +22 -0
- package/dist/domains/skill/project-instructions.d.ts.map +1 -0
- package/dist/domains/skill/project-instructions.js +61 -0
- package/dist/domains/skill/project-instructions.js.map +1 -0
- package/dist/domains/skill/uninstall.d.ts +3 -1
- package/dist/domains/skill/uninstall.d.ts.map +1 -1
- package/dist/domains/skill/uninstall.js +259 -149
- package/dist/domains/skill/uninstall.js.map +1 -1
- package/dist/platform/fs/file-system.d.ts +3 -3
- package/dist/platform/fs/file-system.d.ts.map +1 -1
- package/dist/platform/fs/file-system.js +21 -11
- package/dist/platform/fs/file-system.js.map +1 -1
- package/dist/platform/install/detect.d.ts +2 -1
- package/dist/platform/install/detect.d.ts.map +1 -1
- package/dist/platform/install/detect.js +10 -1
- package/dist/platform/install/detect.js.map +1 -1
- package/dist/platform/install/platforms.d.ts +9 -1
- package/dist/platform/install/platforms.d.ts.map +1 -1
- package/dist/platform/install/platforms.js +23 -4
- package/dist/platform/install/platforms.js.map +1 -1
- package/dist/platform/install/project-registry.d.ts +38 -0
- package/dist/platform/install/project-registry.d.ts.map +1 -0
- package/dist/platform/install/project-registry.js +213 -0
- package/dist/platform/install/project-registry.js.map +1 -0
- package/dist/platform/install/skill-root-owner.d.ts +15 -0
- package/dist/platform/install/skill-root-owner.d.ts.map +1 -0
- package/dist/platform/install/skill-root-owner.js +68 -0
- package/dist/platform/install/skill-root-owner.js.map +1 -0
- package/eval/.env.example +52 -0
- package/eval/CLAUDE.md +43 -0
- package/eval/README.md +538 -0
- package/eval/langsmith/.env.example +16 -0
- package/eval/langsmith/README.md +93 -0
- package/eval/langsmith/skills/README.md +5 -0
- package/eval/langsmith/tasks/README.md +5 -0
- package/eval/langsmith/tests/conftest.py +187 -0
- package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
- package/eval/langsmith/treatments/README.md +5 -0
- package/eval/local/README.md +80 -0
- package/eval/local/regression_baseline.json +13 -0
- package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
- package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
- package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
- package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
- package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
- package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
- package/eval/local/report-style-demo.html +867 -0
- package/eval/local/scripts/compare_baselines.py +1018 -0
- package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
- package/eval/local/scripts/regression_check.py +171 -0
- package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
- package/eval/local/scripts/rescore_rubric.py +120 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
- package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
- package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
- package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
- package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
- package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
- package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
- package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
- package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
- package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
- package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
- package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
- package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
- package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
- package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +2 -0
- package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
- package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
- package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
- package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
- package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
- package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
- package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
- package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
- package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
- package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
- package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
- package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
- package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
- package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
- package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
- package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
- package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
- package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
- package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
- package/eval/local/tasks/comet-fix-median/environment/Dockerfile +50 -0
- package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
- package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
- package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
- package/eval/local/tasks/comet-fix-median/task.toml +24 -0
- package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
- package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
- package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
- package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
- package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
- package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
- package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +53 -0
- package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
- package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
- package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
- package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
- package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
- package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
- package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
- package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
- package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
- package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
- package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
- package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
- package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
- package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
- package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
- package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +20 -0
- package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
- package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
- package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
- package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
- package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
- package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
- package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
- package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
- package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
- package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
- package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
- package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
- package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
- package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
- package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
- package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
- package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
- package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
- package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
- package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
- package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
- package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
- package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
- package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
- package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
- package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
- package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
- package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
- package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
- package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
- package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
- package/eval/local/tasks/comet-robust-config/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
- package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
- package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
- package/eval/local/tasks/comet-robust-config/task.toml +24 -0
- package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
- package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +2 -0
- package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
- package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
- package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +36 -0
- package/eval/local/tasks/index.yaml +155 -0
- package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +5 -0
- package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
- package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
- package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
- package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +2 -0
- package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
- package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
- package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
- package/eval/local/tests/conftest.py +1148 -0
- package/eval/local/tests/scaffold/test_attribution.py +48 -0
- package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
- package/eval/local/tests/scaffold/test_conftest_helpers.py +534 -0
- package/eval/local/tests/scaffold/test_evidence.py +15 -0
- package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
- package/eval/local/tests/scaffold/test_logging.py +243 -0
- package/eval/local/tests/scaffold/test_manifests.py +132 -0
- package/eval/local/tests/scaffold/test_profiles.py +866 -0
- package/eval/local/tests/scaffold/test_regression_check.py +19 -0
- package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
- package/eval/local/tests/scaffold/test_sample_quality.py +211 -0
- package/eval/local/tests/scaffold/test_tasks.py +168 -0
- package/eval/local/tests/scaffold/test_treatments.py +244 -0
- package/eval/local/tests/scaffold/test_utils.py +139 -0
- package/eval/local/tests/tasks/test_tasks.py +445 -0
- package/eval/local/tests/tasks/test_validation_scripts.py +143 -0
- package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
- package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
- package/eval/local/treatments/common/control.yaml +4 -0
- package/eval/pyproject.toml +41 -0
- package/eval/report-html-config.json +6 -0
- package/eval/scaffold/__init__.py +67 -0
- package/eval/scaffold/python/__init__.py +95 -0
- package/eval/scaffold/python/attribution.py +43 -0
- package/eval/scaffold/python/evidence.py +38 -0
- package/eval/scaffold/python/external_data_handler.py +18 -0
- package/eval/scaffold/python/generic_llm_judge.py +235 -0
- package/eval/scaffold/python/judge_config.py +168 -0
- package/eval/scaffold/python/llm_judge.py +191 -0
- package/eval/scaffold/python/logging.py +705 -0
- package/eval/scaffold/python/manifests.py +129 -0
- package/eval/scaffold/python/paper_charts.py +25 -0
- package/eval/scaffold/python/pass_at_k.py +107 -0
- package/eval/scaffold/python/paths.py +56 -0
- package/eval/scaffold/python/profiles.py +127 -0
- package/eval/scaffold/python/report_outputs.py +1391 -0
- package/eval/scaffold/python/sample_quality.py +339 -0
- package/eval/scaffold/python/schema.py +39 -0
- package/eval/scaffold/python/skill_parser.py +469 -0
- package/eval/scaffold/python/tasks.py +330 -0
- package/eval/scaffold/python/treatments.py +271 -0
- package/eval/scaffold/python/utils.py +366 -0
- package/eval/scaffold/python/validation/__init__.py +21 -0
- package/eval/scaffold/python/validation/authoring_rubric.py +326 -0
- package/eval/scaffold/python/validation/comet_workflow.py +187 -0
- package/eval/scaffold/python/validation/core.py +264 -0
- package/eval/scaffold/python/validation/dataset.py +337 -0
- package/eval/scaffold/python/validation/docker.py +106 -0
- package/eval/scaffold/python/validation/evaluator.py +549 -0
- package/eval/scaffold/python/validation/generic_rubric.py +169 -0
- package/eval/scaffold/python/validation/rubric.py +740 -0
- package/eval/scaffold/python/validation/runner.py +237 -0
- package/eval/scaffold/python/validation/scripts.py +58 -0
- package/eval/scaffold/python/validation/tracing.py +313 -0
- package/eval/scaffold/shell/common.sh +126 -0
- package/eval/scaffold/shell/docker.sh +482 -0
- package/eval/scaffold/shell/run-claude-loop.sh +181 -0
- package/eval/scaffold/shell/setup.sh +259 -0
- package/eval/simulator-instruction.md +9 -0
- package/package.json +29 -2
- package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +0 -1
- package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +0 -22
|
@@ -4,8 +4,10 @@ import { readFile, writeFile, lstat, unlink, symlink, rm, readdir } from 'fs/pro
|
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { parseDocument } from 'yaml';
|
|
6
6
|
import { fileExists, readJson, copyFile, ensureDir } from '../../platform/fs/file-system.js';
|
|
7
|
-
import { getPlatformSkillsDir } from '../../platform/install/platforms.js';
|
|
7
|
+
import { getPlatformConfigDir, getPlatformSkillsDir, } from '../../platform/install/platforms.js';
|
|
8
8
|
import { formatSupportedArtifactLanguages, resolveArtifactLanguage } from './languages.js';
|
|
9
|
+
import { installCometProjectInstructions } from './project-instructions.js';
|
|
10
|
+
import { readJsonObjectFile } from './json-object.js';
|
|
9
11
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
12
|
const __dirname = path.dirname(__filename);
|
|
11
13
|
function planSkillDirectoryCopy(files, destinationRoot) {
|
|
@@ -32,6 +34,25 @@ function getManagedSkillReplacementPaths(manifest) {
|
|
|
32
34
|
}
|
|
33
35
|
return allowed;
|
|
34
36
|
}
|
|
37
|
+
function getManagedSkillTopLevelEntries(manifest) {
|
|
38
|
+
const entries = new Set();
|
|
39
|
+
for (const skillPath of getManagedSkillPaths(manifest)) {
|
|
40
|
+
const [topLevel] = skillPath.split('/').filter(Boolean);
|
|
41
|
+
if (topLevel)
|
|
42
|
+
entries.add(topLevel);
|
|
43
|
+
}
|
|
44
|
+
return [...entries].sort();
|
|
45
|
+
}
|
|
46
|
+
function getManagedEntriesForTopLevel(managedEntries, topLevelEntry) {
|
|
47
|
+
const scopedEntries = new Set();
|
|
48
|
+
const prefix = `${topLevelEntry}/`;
|
|
49
|
+
for (const entry of managedEntries) {
|
|
50
|
+
if (entry.startsWith(prefix)) {
|
|
51
|
+
scopedEntries.add(entry.slice(prefix.length));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return scopedEntries;
|
|
55
|
+
}
|
|
35
56
|
async function collectDirectoryEntryPaths(root, current = root) {
|
|
36
57
|
const entries = await readdir(current, { withFileTypes: true });
|
|
37
58
|
const paths = [];
|
|
@@ -112,10 +133,41 @@ async function createSymlink(target, linkPath, managedEntries) {
|
|
|
112
133
|
const type = process.platform === 'win32' ? 'junction' : 'dir';
|
|
113
134
|
await symlink(target, linkPath, type);
|
|
114
135
|
}
|
|
136
|
+
async function lstatOrNull(filePath) {
|
|
137
|
+
try {
|
|
138
|
+
return await lstat(filePath);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
if (err.code === 'ENOENT')
|
|
142
|
+
return null;
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function createSkillsSymlinks(targetRoot, linkRoot, managedEntries, topLevelEntries) {
|
|
147
|
+
const rootStat = await lstatOrNull(linkRoot);
|
|
148
|
+
if (!rootStat || rootStat.isSymbolicLink() || !rootStat.isDirectory()) {
|
|
149
|
+
await createSymlink(targetRoot, linkRoot, managedEntries);
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
let failed = 0;
|
|
153
|
+
for (const topLevelEntry of topLevelEntries) {
|
|
154
|
+
const targetEntry = path.join(targetRoot, topLevelEntry);
|
|
155
|
+
const linkEntry = path.join(linkRoot, topLevelEntry);
|
|
156
|
+
const managedEntryScope = getManagedEntriesForTopLevel(managedEntries, topLevelEntry);
|
|
157
|
+
try {
|
|
158
|
+
await createSymlink(targetEntry, linkEntry, managedEntryScope);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
failed++;
|
|
162
|
+
console.error(` Failed to create symlink ${linkEntry} -> ${targetEntry}: ${err.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return failed;
|
|
166
|
+
}
|
|
115
167
|
/**
|
|
116
168
|
* Install skills using symlink mode:
|
|
117
169
|
* 1. Copy skills to central store (.comet/skills/)
|
|
118
|
-
* 2. Create
|
|
170
|
+
* 2. Create symlinks from the platform skills dir to central store
|
|
119
171
|
*/
|
|
120
172
|
async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkillsDir = 'skills', scope = 'project') {
|
|
121
173
|
const centralDir = getCentralSkillsDir(baseDir, scope);
|
|
@@ -129,6 +181,7 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
|
|
|
129
181
|
throw new Error(`Invalid manifest at ${manifestPath}: "skills" must be an array`);
|
|
130
182
|
}
|
|
131
183
|
const managedSkillReplacementPaths = getManagedSkillReplacementPaths(manifest);
|
|
184
|
+
const managedSkillTopLevelEntries = getManagedSkillTopLevelEntries(manifest);
|
|
132
185
|
// Step 1: Copy skills to central store
|
|
133
186
|
let copied = 0;
|
|
134
187
|
let skippedCount = 0;
|
|
@@ -138,11 +191,11 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
|
|
|
138
191
|
const sourceDir = isScript ? 'skills' : languageSkillsDir;
|
|
139
192
|
const src = path.join(assetsDir, sourceDir, skillRelPath);
|
|
140
193
|
const centralDest = path.join(centralDir, 'skills', skillRelPath);
|
|
141
|
-
if (!overwrite && (await fileExists(centralDest))) {
|
|
142
|
-
skippedCount++;
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
194
|
try {
|
|
195
|
+
if (!overwrite && (await fileExists(centralDest))) {
|
|
196
|
+
skippedCount++;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
146
199
|
await copyFile(src, centralDest);
|
|
147
200
|
copied++;
|
|
148
201
|
}
|
|
@@ -151,11 +204,11 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
|
|
|
151
204
|
console.error(` Failed to copy ${skillRelPath} to central store: ${err.message}`);
|
|
152
205
|
}
|
|
153
206
|
}
|
|
154
|
-
// Step 2: Create
|
|
207
|
+
// Step 2: Create symlinks from platform dir to central store
|
|
155
208
|
const platformSkillsDir = path.join(baseDir, getPlatformSkillsDir(platform, scope), 'skills');
|
|
156
209
|
const centralSkillsDir = path.join(centralDir, 'skills');
|
|
157
210
|
try {
|
|
158
|
-
await
|
|
211
|
+
failedCount += await createSkillsSymlinks(centralSkillsDir, platformSkillsDir, managedSkillReplacementPaths, managedSkillTopLevelEntries);
|
|
159
212
|
}
|
|
160
213
|
catch (err) {
|
|
161
214
|
failedCount++;
|
|
@@ -166,12 +219,14 @@ async function installSkillsAsSymlink(baseDir, platform, overwrite, languageSkil
|
|
|
166
219
|
const result = await createOpenCodeCommands(baseDir, platform, manifest.skills, overwrite, scope, languageSkillsDir);
|
|
167
220
|
copied += result.copied;
|
|
168
221
|
skippedCount += result.skipped;
|
|
222
|
+
failedCount += result.failed;
|
|
169
223
|
}
|
|
170
224
|
// Handle Pi platform command extension
|
|
171
225
|
if (platform.id === 'pi') {
|
|
172
226
|
const result = await createPiCommandExtension(baseDir, platform, manifest.skills, overwrite, scope);
|
|
173
227
|
copied += result.copied;
|
|
174
228
|
skippedCount += result.skipped;
|
|
229
|
+
failedCount += result.failed;
|
|
175
230
|
}
|
|
176
231
|
return { copied, skipped: skippedCount, failed: failedCount };
|
|
177
232
|
}
|
|
@@ -196,11 +251,11 @@ async function copyCometSkillsForPlatform(baseDir, platform, overwrite, language
|
|
|
196
251
|
const sourceDir = isScript ? 'skills' : languageSkillsDir;
|
|
197
252
|
const src = path.join(assetsDir, sourceDir, skillRelPath);
|
|
198
253
|
const dest = path.join(baseDir, getPlatformSkillsDir(platform, scope), 'skills', skillRelPath);
|
|
199
|
-
if (!overwrite && (await fileExists(dest))) {
|
|
200
|
-
skippedCount++;
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
254
|
try {
|
|
255
|
+
if (!overwrite && (await fileExists(dest))) {
|
|
256
|
+
skippedCount++;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
204
259
|
await copyFile(src, dest);
|
|
205
260
|
copied++;
|
|
206
261
|
}
|
|
@@ -217,11 +272,13 @@ async function copyCometSkillsForPlatform(baseDir, platform, overwrite, language
|
|
|
217
272
|
const result = await createOpenCodeCommands(baseDir, platform, manifest.skills, overwrite, scope, languageSkillsDir);
|
|
218
273
|
copied += result.copied;
|
|
219
274
|
skippedCount += result.skipped;
|
|
275
|
+
failedCount += result.failed;
|
|
220
276
|
}
|
|
221
277
|
if (platform.id === 'pi') {
|
|
222
278
|
const result = await createPiCommandExtension(baseDir, platform, manifest.skills, overwrite, scope);
|
|
223
279
|
copied += result.copied;
|
|
224
280
|
skippedCount += result.skipped;
|
|
281
|
+
failedCount += result.failed;
|
|
225
282
|
}
|
|
226
283
|
return { copied, skipped: skippedCount, failed: failedCount };
|
|
227
284
|
}
|
|
@@ -252,37 +309,46 @@ async function createPiCommandExtension(baseDir, platform, skillPaths, overwrite
|
|
|
252
309
|
const platformBase = path.join(baseDir, getPlatformSkillsDir(platform, scope));
|
|
253
310
|
const settingsPath = path.join(platformBase, 'settings.json');
|
|
254
311
|
const extensionPath = path.join(platformBase, 'extensions', PI_COMMAND_EXTENSION_FILE);
|
|
255
|
-
let
|
|
256
|
-
|
|
257
|
-
|
|
312
|
+
let copied = 0;
|
|
313
|
+
let skipped = 0;
|
|
314
|
+
let failed = 0;
|
|
315
|
+
try {
|
|
316
|
+
let settings = {};
|
|
317
|
+
if (await fileExists(settingsPath)) {
|
|
258
318
|
const parsed = JSON.parse(await readFile(settingsPath, 'utf-8'));
|
|
259
319
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
260
320
|
throw new Error('expected a JSON object');
|
|
261
321
|
}
|
|
262
322
|
settings = parsed;
|
|
263
323
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
324
|
+
if (settings.enableSkillCommands !== true) {
|
|
325
|
+
settings.enableSkillCommands = true;
|
|
326
|
+
await ensureDir(path.dirname(settingsPath));
|
|
327
|
+
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
328
|
+
copied++;
|
|
268
329
|
}
|
|
269
330
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
331
|
+
catch (err) {
|
|
332
|
+
failed++;
|
|
333
|
+
console.error(` Failed to update Pi settings at ${settingsPath}: ${err.message}`);
|
|
334
|
+
}
|
|
335
|
+
if (failed > 0)
|
|
336
|
+
return { copied, skipped, failed };
|
|
337
|
+
try {
|
|
338
|
+
if (!overwrite && (await fileExists(extensionPath))) {
|
|
339
|
+
skipped++;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
await ensureDir(path.dirname(extensionPath));
|
|
343
|
+
await writeFile(extensionPath, renderPiCommandExtension(getTopLevelSkillNames(skillPaths)), 'utf-8');
|
|
344
|
+
copied++;
|
|
345
|
+
}
|
|
277
346
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
347
|
+
catch (err) {
|
|
348
|
+
failed++;
|
|
349
|
+
console.error(` Failed to write Pi command extension at ${extensionPath}: ${err.message}`);
|
|
281
350
|
}
|
|
282
|
-
|
|
283
|
-
await writeFile(extensionPath, renderPiCommandExtension(getTopLevelSkillNames(skillPaths)), 'utf-8');
|
|
284
|
-
copied++;
|
|
285
|
-
return { copied, skipped };
|
|
351
|
+
return { copied, skipped, failed };
|
|
286
352
|
}
|
|
287
353
|
function stripFrontmatter(content) {
|
|
288
354
|
if (!content.startsWith('---\n') && !content.startsWith('---\r\n')) {
|
|
@@ -297,6 +363,7 @@ function stripFrontmatter(content) {
|
|
|
297
363
|
async function createOpenCodeCommands(baseDir, platform, skillPaths, overwrite, scope, languageSkillsDir) {
|
|
298
364
|
let copied = 0;
|
|
299
365
|
let skipped = 0;
|
|
366
|
+
let failed = 0;
|
|
300
367
|
const assetsDir = getAssetsDir();
|
|
301
368
|
const commandsDir = path.join(baseDir, getPlatformSkillsDir(platform, scope), 'commands');
|
|
302
369
|
for (const skillPath of skillPaths) {
|
|
@@ -305,17 +372,18 @@ async function createOpenCodeCommands(baseDir, platform, skillPaths, overwrite,
|
|
|
305
372
|
continue;
|
|
306
373
|
const skillName = parts[0];
|
|
307
374
|
const dest = path.join(commandsDir, `${skillName}.md`);
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
375
|
+
try {
|
|
376
|
+
if (!overwrite && (await fileExists(dest))) {
|
|
377
|
+
skipped++;
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
await ensureDir(path.dirname(dest));
|
|
381
|
+
let skillSourcePath = path.join(assetsDir, languageSkillsDir, skillPath);
|
|
382
|
+
if (!(await fileExists(skillSourcePath))) {
|
|
383
|
+
skillSourcePath = path.join(assetsDir, 'skills', skillPath);
|
|
384
|
+
}
|
|
385
|
+
const skillBody = stripFrontmatter(await readFile(skillSourcePath, 'utf-8'));
|
|
386
|
+
const content = `${OPENCODE_COMMAND_HEADER.replace('{skillName}', skillName)}
|
|
319
387
|
Equivalent Comet skill: \`${skillName}\`
|
|
320
388
|
Command name: \`/${skillName}\`
|
|
321
389
|
|
|
@@ -327,10 +395,15 @@ $ARGUMENTS
|
|
|
327
395
|
|
|
328
396
|
${skillBody}
|
|
329
397
|
`;
|
|
330
|
-
|
|
331
|
-
|
|
398
|
+
await writeFile(dest, content, 'utf-8');
|
|
399
|
+
copied++;
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
failed++;
|
|
403
|
+
console.error(` Failed to create OpenCode command ${dest}: ${err.message}`);
|
|
404
|
+
}
|
|
332
405
|
}
|
|
333
|
-
return { copied, skipped };
|
|
406
|
+
return { copied, skipped, failed };
|
|
334
407
|
}
|
|
335
408
|
async function readManifest() {
|
|
336
409
|
const assetsDir = getAssetsDir();
|
|
@@ -377,12 +450,12 @@ function selectRulePathsForLanguage(rulePaths, languageId) {
|
|
|
377
450
|
}
|
|
378
451
|
async function copyCometRulesForPlatform(baseDir, platform, overwrite, languageId, scope = 'project') {
|
|
379
452
|
if (!platform.rulesDir || !platform.rulesFormat) {
|
|
380
|
-
return { copied: 0, skipped: 0 };
|
|
453
|
+
return { copied: 0, skipped: 0, failed: 0 };
|
|
381
454
|
}
|
|
382
455
|
const manifest = await readManifest();
|
|
383
456
|
const rulePaths = selectRulePathsForLanguage(manifest.rules ?? [], languageId);
|
|
384
457
|
if (!rulePaths || rulePaths.length === 0) {
|
|
385
|
-
return { copied: 0, skipped: 0 };
|
|
458
|
+
return { copied: 0, skipped: 0, failed: 0 };
|
|
386
459
|
}
|
|
387
460
|
const assetsDir = getAssetsDir();
|
|
388
461
|
// Support platforms whose rules live outside the skills config dir
|
|
@@ -394,22 +467,24 @@ async function copyCometRulesForPlatform(baseDir, platform, overwrite, languageI
|
|
|
394
467
|
: path.join(baseDir, getPlatformSkillsDir(platform, scope));
|
|
395
468
|
let copied = 0;
|
|
396
469
|
let skippedCount = 0;
|
|
470
|
+
let failed = 0;
|
|
397
471
|
for (const ruleRelPath of rulePaths) {
|
|
398
472
|
const src = path.join(assetsDir, 'skills', ruleRelPath);
|
|
399
|
-
if (!(await fileExists(src))) {
|
|
400
|
-
console.error(` Rule source not found: ${ruleRelPath}`);
|
|
401
|
-
continue;
|
|
402
|
-
}
|
|
403
|
-
// Normalize the `.en` infix away so the installed file name is the same
|
|
404
|
-
// regardless of which language variant was selected.
|
|
405
|
-
const ruleFileName = toRuleBaseName(path.basename(ruleRelPath));
|
|
406
|
-
const rulesDestDir = path.join(rulesBase, platform.rulesDir);
|
|
407
|
-
const dest = computeRuleDestPath(rulesDestDir, ruleFileName, platform.rulesFormat);
|
|
408
|
-
if (!overwrite && (await fileExists(dest))) {
|
|
409
|
-
skippedCount++;
|
|
410
|
-
continue;
|
|
411
|
-
}
|
|
412
473
|
try {
|
|
474
|
+
if (!(await fileExists(src))) {
|
|
475
|
+
console.error(` Rule source not found: ${ruleRelPath}`);
|
|
476
|
+
failed++;
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
// Normalize the `.en` infix away so the installed file name is the same
|
|
480
|
+
// regardless of which language variant was selected.
|
|
481
|
+
const ruleFileName = toRuleBaseName(path.basename(ruleRelPath));
|
|
482
|
+
const rulesDestDir = path.join(rulesBase, platform.rulesDir);
|
|
483
|
+
const dest = computeRuleDestPath(rulesDestDir, ruleFileName, platform.rulesFormat);
|
|
484
|
+
if (!overwrite && (await fileExists(dest))) {
|
|
485
|
+
skippedCount++;
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
413
488
|
const content = await readFile(src, 'utf-8');
|
|
414
489
|
await ensureDir(path.dirname(dest));
|
|
415
490
|
const formatted = formatRuleContent(content, ruleFileName, platform.rulesFormat);
|
|
@@ -418,9 +493,10 @@ async function copyCometRulesForPlatform(baseDir, platform, overwrite, languageI
|
|
|
418
493
|
}
|
|
419
494
|
catch (err) {
|
|
420
495
|
console.error(` Failed to copy rule ${ruleRelPath}: ${err.message}`);
|
|
496
|
+
failed++;
|
|
421
497
|
}
|
|
422
498
|
}
|
|
423
|
-
return { copied, skipped: skippedCount };
|
|
499
|
+
return { copied, skipped: skippedCount, failed };
|
|
424
500
|
}
|
|
425
501
|
function computeRuleDestPath(rulesDestDir, ruleFileName, rulesFormat) {
|
|
426
502
|
if (rulesFormat === 'mdc') {
|
|
@@ -457,47 +533,68 @@ ${content}`;
|
|
|
457
533
|
/**
|
|
458
534
|
* Install Comet hooks for platforms that support them.
|
|
459
535
|
* Supports multiple hook formats:
|
|
460
|
-
* 'claude-code' —
|
|
536
|
+
* 'claude-code' — Claude-shaped JSON with PreToolUse array; defaults to settings.local.json,
|
|
537
|
+
* with platform metadata able to override the filename
|
|
461
538
|
* 'qwen' — settings.json with PreToolUse/hooks array (Qwen Code)
|
|
462
539
|
* 'qoder' — settings.json with PreToolUse/hooks array (Qoder)
|
|
540
|
+
* 'codebuddy' — settings.json with PreToolUse/hooks array (CodeBuddy Code)
|
|
463
541
|
* 'gemini' — settings.json with hooks.BeforeTool array (Gemini CLI)
|
|
464
542
|
* 'windsurf' — hooks.json with pre_write_code array
|
|
465
543
|
* 'copilot' — hooks/*.json with preToolUse
|
|
466
544
|
* 'kiro' — hooks/*.kiro.hook JSON files
|
|
467
545
|
*/
|
|
468
546
|
async function installCometHooksForPlatform(baseDir, platform, scope = 'project') {
|
|
469
|
-
if (!platform.supportsHooks
|
|
470
|
-
return {
|
|
547
|
+
if (!platform.supportsHooks) {
|
|
548
|
+
return { status: 'skipped', reason: 'platform does not support hooks' };
|
|
471
549
|
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
550
|
+
if (!platform.hookFormat) {
|
|
551
|
+
return {
|
|
552
|
+
status: 'failed',
|
|
553
|
+
reason: 'hook-capable platform does not declare a hook format',
|
|
554
|
+
};
|
|
476
555
|
}
|
|
477
|
-
const hookFormat = platform.hookFormat;
|
|
478
|
-
const skillsDir = getPlatformSkillsDir(platform, scope);
|
|
479
|
-
const platformBase = path.join(baseDir, skillsDir);
|
|
480
556
|
try {
|
|
557
|
+
const manifest = await readManifest();
|
|
558
|
+
const hooksConfig = manifest.hooks;
|
|
559
|
+
if (!hooksConfig || Object.keys(hooksConfig).length === 0) {
|
|
560
|
+
return { status: 'skipped', reason: 'no hooks defined in manifest' };
|
|
561
|
+
}
|
|
562
|
+
const hookFormat = platform.hookFormat;
|
|
563
|
+
const skillsDir = getPlatformSkillsDir(platform, scope);
|
|
564
|
+
const platformBase = path.join(baseDir, getPlatformConfigDir(platform, scope));
|
|
481
565
|
switch (hookFormat) {
|
|
482
|
-
case 'claude-code':
|
|
483
|
-
|
|
566
|
+
case 'claude-code': {
|
|
567
|
+
const result = await installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.hookConfigFile ?? 'settings.local.json', platform.name);
|
|
568
|
+
if (result.status === 'installed') {
|
|
569
|
+
for (const legacyFile of platform.legacyHookConfigFiles ?? []) {
|
|
570
|
+
try {
|
|
571
|
+
await removeManagedHooksFromJsonFile(path.join(platformBase, legacyFile), Object.keys(hooksConfig));
|
|
572
|
+
}
|
|
573
|
+
catch {
|
|
574
|
+
// Historical Hook cleanup is best-effort after canonical install succeeds.
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return result;
|
|
579
|
+
}
|
|
484
580
|
case 'qwen':
|
|
485
581
|
case 'qoder':
|
|
486
|
-
|
|
582
|
+
case 'codebuddy':
|
|
583
|
+
return await installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.name);
|
|
487
584
|
case 'gemini':
|
|
488
|
-
return installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig);
|
|
585
|
+
return await installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.name);
|
|
489
586
|
case 'windsurf':
|
|
490
|
-
return installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig);
|
|
587
|
+
return await installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig, platform.name);
|
|
491
588
|
case 'copilot':
|
|
492
|
-
return installCopilotHooks(baseDir, platformBase, skillsDir, hooksConfig);
|
|
589
|
+
return await installCopilotHooks(baseDir, platformBase, skillsDir, hooksConfig);
|
|
493
590
|
case 'kiro':
|
|
494
|
-
return installKiroHooks(baseDir, platformBase, skillsDir, hooksConfig);
|
|
591
|
+
return await installKiroHooks(baseDir, platformBase, skillsDir, hooksConfig);
|
|
495
592
|
default:
|
|
496
|
-
return {
|
|
593
|
+
return { status: 'failed', reason: `unsupported hook format: ${hookFormat}` };
|
|
497
594
|
}
|
|
498
595
|
}
|
|
499
596
|
catch (err) {
|
|
500
|
-
return {
|
|
597
|
+
return { status: 'failed', reason: err.message };
|
|
501
598
|
}
|
|
502
599
|
}
|
|
503
600
|
function quoteCommandArg(value) {
|
|
@@ -509,34 +606,96 @@ function buildHookCommand(baseDir, skillsDir, scriptRelPath) {
|
|
|
509
606
|
const scriptPath = path.join(projectRoot, skillsDir, 'skills', ...scriptRelPath.split('/'));
|
|
510
607
|
return `node ${quoteCommandArg(scriptPath)} --project-root ${quoteCommandArg(projectRoot)}`;
|
|
511
608
|
}
|
|
609
|
+
function parseCommandTokens(command) {
|
|
610
|
+
const tokens = [];
|
|
611
|
+
let current = '';
|
|
612
|
+
let quote;
|
|
613
|
+
let tokenStarted = false;
|
|
614
|
+
let quoteClosed = false;
|
|
615
|
+
for (let index = 0; index < command.length; index++) {
|
|
616
|
+
const character = command[index];
|
|
617
|
+
if (quote) {
|
|
618
|
+
if (character === quote) {
|
|
619
|
+
quote = undefined;
|
|
620
|
+
quoteClosed = true;
|
|
621
|
+
}
|
|
622
|
+
else if (character === '\\' && command[index + 1] === quote) {
|
|
623
|
+
current += quote;
|
|
624
|
+
index++;
|
|
625
|
+
}
|
|
626
|
+
else {
|
|
627
|
+
current += character;
|
|
628
|
+
}
|
|
629
|
+
continue;
|
|
630
|
+
}
|
|
631
|
+
if (character === '\r' || character === '\n' || ';|&<>`'.includes(character)) {
|
|
632
|
+
return undefined;
|
|
633
|
+
}
|
|
634
|
+
if (/\s/u.test(character)) {
|
|
635
|
+
if (tokenStarted) {
|
|
636
|
+
tokens.push(current);
|
|
637
|
+
current = '';
|
|
638
|
+
tokenStarted = false;
|
|
639
|
+
quoteClosed = false;
|
|
640
|
+
}
|
|
641
|
+
continue;
|
|
642
|
+
}
|
|
643
|
+
if (quoteClosed)
|
|
644
|
+
return undefined;
|
|
645
|
+
if (character === '"' || character === "'") {
|
|
646
|
+
if (tokenStarted)
|
|
647
|
+
return undefined;
|
|
648
|
+
quote = character;
|
|
649
|
+
tokenStarted = true;
|
|
650
|
+
continue;
|
|
651
|
+
}
|
|
652
|
+
current += character;
|
|
653
|
+
tokenStarted = true;
|
|
654
|
+
}
|
|
655
|
+
if (quote)
|
|
656
|
+
return undefined;
|
|
657
|
+
if (tokenStarted)
|
|
658
|
+
tokens.push(current);
|
|
659
|
+
return tokens;
|
|
660
|
+
}
|
|
512
661
|
function isManagedHookCommand(command, scriptRelPaths) {
|
|
513
662
|
if (typeof command !== 'string')
|
|
514
663
|
return false;
|
|
515
664
|
// Match both the current `node .../comet-hook-guard.mjs` form and the legacy
|
|
516
665
|
// `bash .../comet-hook-guard.sh` form so uninstall also cleans up hooks
|
|
517
666
|
// written by older Comet releases. Compare basenames without extension.
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
.match(/^(?:node|bash|sh)\s+["']?([^"'\s]+)["']?(?:\s|$)/)?.[1]
|
|
521
|
-
?.replace(/\\/g, '/');
|
|
522
|
-
if (!commandPath)
|
|
667
|
+
const tokens = parseCommandTokens(command.trim());
|
|
668
|
+
if (!tokens || tokens.length < 2 || !['node', 'bash', 'sh'].includes(tokens[0]))
|
|
523
669
|
return false;
|
|
670
|
+
const commandPath = tokens[1].replace(/\\/g, '/');
|
|
524
671
|
const normalize = (value) => value.replace(/\.(?:sh|mjs)$/u, '');
|
|
525
672
|
return scriptRelPaths.some((scriptRelPath) => normalize(commandPath).endsWith(`/skills/${normalize(scriptRelPath.replace(/\\/g, '/'))}`));
|
|
526
673
|
}
|
|
527
674
|
function mergeHookGroups(existingGroups, newGroups, scriptRelPaths) {
|
|
528
|
-
const mergedGroups = existingGroups.
|
|
529
|
-
if (!Array.isArray(group
|
|
530
|
-
return
|
|
531
|
-
const
|
|
532
|
-
if (
|
|
533
|
-
return
|
|
534
|
-
|
|
675
|
+
const mergedGroups = existingGroups.map((group) => {
|
|
676
|
+
if (!group || typeof group !== 'object' || Array.isArray(group))
|
|
677
|
+
return group;
|
|
678
|
+
const record = group;
|
|
679
|
+
if (!Array.isArray(record.hooks))
|
|
680
|
+
return record;
|
|
681
|
+
const hooks = record.hooks.filter((hook) => {
|
|
682
|
+
const command = hook && typeof hook === 'object' ? hook.command : undefined;
|
|
683
|
+
return !isManagedHookCommand(command, scriptRelPaths);
|
|
684
|
+
});
|
|
685
|
+
return { ...record, hooks };
|
|
535
686
|
});
|
|
536
687
|
for (const newGroup of newGroups) {
|
|
537
|
-
const
|
|
538
|
-
|
|
539
|
-
|
|
688
|
+
const existingGroupIndex = mergedGroups.findIndex((group) => Boolean(group) &&
|
|
689
|
+
typeof group === 'object' &&
|
|
690
|
+
!Array.isArray(group) &&
|
|
691
|
+
group.matcher === newGroup.matcher &&
|
|
692
|
+
Array.isArray(group.hooks));
|
|
693
|
+
if (existingGroupIndex >= 0) {
|
|
694
|
+
const existingGroup = mergedGroups[existingGroupIndex];
|
|
695
|
+
mergedGroups[existingGroupIndex] = {
|
|
696
|
+
...existingGroup,
|
|
697
|
+
hooks: [...existingGroup.hooks, ...newGroup.hooks],
|
|
698
|
+
};
|
|
540
699
|
}
|
|
541
700
|
else {
|
|
542
701
|
mergedGroups.push(newGroup);
|
|
@@ -552,12 +711,77 @@ function mergeHookGroups(existingGroups, newGroups, scriptRelPaths) {
|
|
|
552
711
|
function asHookGroup(value) {
|
|
553
712
|
return Array.isArray(value) ? value : [];
|
|
554
713
|
}
|
|
714
|
+
async function removeManagedHooksFromJsonFile(settingsPath, scriptRelPaths) {
|
|
715
|
+
if (!(await fileExists(settingsPath)))
|
|
716
|
+
return { removed: 0, failed: 0 };
|
|
717
|
+
let source;
|
|
718
|
+
try {
|
|
719
|
+
source = await readFile(settingsPath, 'utf-8');
|
|
720
|
+
}
|
|
721
|
+
catch {
|
|
722
|
+
return { removed: 0, failed: 1 };
|
|
723
|
+
}
|
|
724
|
+
let settings;
|
|
725
|
+
try {
|
|
726
|
+
const parsed = JSON.parse(source);
|
|
727
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
728
|
+
return { removed: 0, failed: 1 };
|
|
729
|
+
}
|
|
730
|
+
settings = parsed;
|
|
731
|
+
}
|
|
732
|
+
catch {
|
|
733
|
+
return { removed: 0, failed: 1 };
|
|
734
|
+
}
|
|
735
|
+
const existingHooks = settings.hooks;
|
|
736
|
+
const existingPreToolUse = existingHooks?.PreToolUse;
|
|
737
|
+
if (!existingHooks || !Array.isArray(existingPreToolUse)) {
|
|
738
|
+
return { removed: 0, failed: 0 };
|
|
739
|
+
}
|
|
740
|
+
let removed = 0;
|
|
741
|
+
const filtered = existingPreToolUse.map((group) => {
|
|
742
|
+
if (!group || typeof group !== 'object')
|
|
743
|
+
return group;
|
|
744
|
+
const record = group;
|
|
745
|
+
if (!Array.isArray(record.hooks))
|
|
746
|
+
return record;
|
|
747
|
+
const handlers = record.hooks.filter((handler) => {
|
|
748
|
+
const command = handler && typeof handler === 'object'
|
|
749
|
+
? handler.command
|
|
750
|
+
: undefined;
|
|
751
|
+
const managed = isManagedHookCommand(command, scriptRelPaths);
|
|
752
|
+
if (managed)
|
|
753
|
+
removed++;
|
|
754
|
+
return !managed;
|
|
755
|
+
});
|
|
756
|
+
return { ...record, hooks: handlers };
|
|
757
|
+
});
|
|
758
|
+
if (removed === 0)
|
|
759
|
+
return { removed: 0, failed: 0 };
|
|
760
|
+
existingHooks.PreToolUse = filtered;
|
|
761
|
+
try {
|
|
762
|
+
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
763
|
+
}
|
|
764
|
+
catch {
|
|
765
|
+
return { removed: 0, failed: 1 };
|
|
766
|
+
}
|
|
767
|
+
return { removed, failed: 0 };
|
|
768
|
+
}
|
|
769
|
+
async function readSettingsJsonObject(settingsPath, platformName) {
|
|
770
|
+
const result = await readJsonObjectFile(settingsPath);
|
|
771
|
+
if (result.status === 'missing')
|
|
772
|
+
return {};
|
|
773
|
+
if (result.status === 'present')
|
|
774
|
+
return result.value;
|
|
775
|
+
throw new Error(`Invalid ${platformName} settings at ${settingsPath}: ${result.error.message}`, {
|
|
776
|
+
cause: result.error,
|
|
777
|
+
});
|
|
778
|
+
}
|
|
555
779
|
/**
|
|
556
|
-
* Claude Code, Codex, Amazon Q
|
|
557
|
-
*
|
|
780
|
+
* Claude-shaped JSON format used by Claude Code, Codex, and Amazon Q.
|
|
781
|
+
* Defaults to settings.local.json; platform metadata may override the filename.
|
|
558
782
|
*/
|
|
559
|
-
async function installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig) {
|
|
560
|
-
const settingsPath = path.join(platformBase,
|
|
783
|
+
async function installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksConfig, configFile, platformName) {
|
|
784
|
+
const settingsPath = path.join(platformBase, configFile);
|
|
561
785
|
// Group by matcher so hooks sharing the same matcher are merged
|
|
562
786
|
const matcherGroups = {};
|
|
563
787
|
for (const [scriptRelPath, config] of Object.entries(hooksConfig)) {
|
|
@@ -568,28 +792,20 @@ async function installClaudeCodeHooks(baseDir, platformBase, skillsDir, hooksCon
|
|
|
568
792
|
matcherGroups[config.matcher].push({ type: 'command', command });
|
|
569
793
|
}
|
|
570
794
|
const newEntries = Object.entries(matcherGroups).map(([matcher, hooks]) => ({ matcher, hooks }));
|
|
571
|
-
|
|
572
|
-
if (await fileExists(settingsPath)) {
|
|
573
|
-
try {
|
|
574
|
-
settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
|
|
575
|
-
}
|
|
576
|
-
catch {
|
|
577
|
-
settings = {};
|
|
578
|
-
}
|
|
579
|
-
}
|
|
795
|
+
const settings = await readSettingsJsonObject(settingsPath, platformName);
|
|
580
796
|
const existingHooks = settings.hooks ?? {};
|
|
581
797
|
const existingPreToolUse = asHookGroup(existingHooks.PreToolUse);
|
|
582
798
|
const merged = mergeHookGroups(existingPreToolUse, newEntries, Object.keys(hooksConfig));
|
|
583
799
|
settings.hooks = { ...existingHooks, PreToolUse: merged };
|
|
584
800
|
await ensureDir(path.dirname(settingsPath));
|
|
585
801
|
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
586
|
-
return {
|
|
802
|
+
return { status: 'installed' };
|
|
587
803
|
}
|
|
588
804
|
/**
|
|
589
|
-
* Qwen Code / Qoder format:
|
|
805
|
+
* Qwen Code / Qoder / CodeBuddy format:
|
|
590
806
|
* Writes to settings.json with { hooks: { PreToolUse: [{ matcher, hooks: [{ type, command }] }] } }
|
|
591
807
|
*/
|
|
592
|
-
async function installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig,
|
|
808
|
+
async function installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConfig, platformName) {
|
|
593
809
|
const settingsPath = path.join(platformBase, 'settings.json');
|
|
594
810
|
// Group by matcher
|
|
595
811
|
const matcherGroups = {};
|
|
@@ -607,28 +823,20 @@ async function installQwenStyleHooks(baseDir, platformBase, skillsDir, hooksConf
|
|
|
607
823
|
matcher,
|
|
608
824
|
hooks,
|
|
609
825
|
}));
|
|
610
|
-
|
|
611
|
-
if (await fileExists(settingsPath)) {
|
|
612
|
-
try {
|
|
613
|
-
settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
|
|
614
|
-
}
|
|
615
|
-
catch {
|
|
616
|
-
settings = {};
|
|
617
|
-
}
|
|
618
|
-
}
|
|
826
|
+
const settings = await readSettingsJsonObject(settingsPath, platformName);
|
|
619
827
|
const existingHooks = settings.hooks ?? {};
|
|
620
828
|
const existingPreToolUse = asHookGroup(existingHooks.PreToolUse);
|
|
621
829
|
const merged = mergeHookGroups(existingPreToolUse, preToolUseEntries, Object.keys(hooksConfig));
|
|
622
830
|
settings.hooks = { ...existingHooks, PreToolUse: merged };
|
|
623
831
|
await ensureDir(path.dirname(settingsPath));
|
|
624
832
|
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
625
|
-
return {
|
|
833
|
+
return { status: 'installed' };
|
|
626
834
|
}
|
|
627
835
|
/**
|
|
628
836
|
* Gemini CLI format:
|
|
629
837
|
* Writes to .gemini/settings.json with { hooks: { BeforeTool: [{ matcher, hooks: [{ type, command }] }] } }
|
|
630
838
|
*/
|
|
631
|
-
async function installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig) {
|
|
839
|
+
async function installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig, platformName) {
|
|
632
840
|
const settingsPath = path.join(platformBase, 'settings.json');
|
|
633
841
|
const entries = [];
|
|
634
842
|
for (const [scriptRelPath, config] of Object.entries(hooksConfig)) {
|
|
@@ -643,28 +851,20 @@ async function installGeminiHooks(baseDir, platformBase, skillsDir, hooksConfig)
|
|
|
643
851
|
],
|
|
644
852
|
});
|
|
645
853
|
}
|
|
646
|
-
|
|
647
|
-
if (await fileExists(settingsPath)) {
|
|
648
|
-
try {
|
|
649
|
-
settings = JSON.parse(await readFile(settingsPath, 'utf-8'));
|
|
650
|
-
}
|
|
651
|
-
catch {
|
|
652
|
-
settings = {};
|
|
653
|
-
}
|
|
654
|
-
}
|
|
854
|
+
const settings = await readSettingsJsonObject(settingsPath, platformName);
|
|
655
855
|
const existingHooks = settings.hooks ?? {};
|
|
656
856
|
const existingBeforeTool = asHookGroup(existingHooks.BeforeTool);
|
|
657
857
|
const merged = mergeHookGroups(existingBeforeTool, entries, Object.keys(hooksConfig));
|
|
658
858
|
settings.hooks = { ...existingHooks, BeforeTool: merged };
|
|
659
859
|
await ensureDir(path.dirname(settingsPath));
|
|
660
860
|
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
661
|
-
return {
|
|
861
|
+
return { status: 'installed' };
|
|
662
862
|
}
|
|
663
863
|
/**
|
|
664
864
|
* Windsurf format:
|
|
665
865
|
* Writes to .windsurf/hooks.json with { hooks: { pre_write_code: [{ command }] } }
|
|
666
866
|
*/
|
|
667
|
-
async function installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig) {
|
|
867
|
+
async function installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfig, platformName) {
|
|
668
868
|
const hooksPath = path.join(platformBase, 'hooks.json');
|
|
669
869
|
const entries = [];
|
|
670
870
|
for (const [scriptRelPath] of Object.entries(hooksConfig)) {
|
|
@@ -673,23 +873,18 @@ async function installWindsurfHooks(baseDir, platformBase, skillsDir, hooksConfi
|
|
|
673
873
|
show_output: true,
|
|
674
874
|
});
|
|
675
875
|
}
|
|
676
|
-
|
|
677
|
-
if (await fileExists(hooksPath)) {
|
|
678
|
-
try {
|
|
679
|
-
hooksFile = JSON.parse(await readFile(hooksPath, 'utf-8'));
|
|
680
|
-
}
|
|
681
|
-
catch {
|
|
682
|
-
hooksFile = {};
|
|
683
|
-
}
|
|
684
|
-
}
|
|
876
|
+
const hooksFile = await readSettingsJsonObject(hooksPath, platformName);
|
|
685
877
|
const existingHooks = hooksFile.hooks ?? {};
|
|
686
878
|
const existingPreWrite = asHookGroup(existingHooks.pre_write_code);
|
|
687
|
-
const merged = existingPreWrite.filter((entry) =>
|
|
879
|
+
const merged = existingPreWrite.filter((entry) => {
|
|
880
|
+
const command = entry && typeof entry === 'object' ? entry.command : undefined;
|
|
881
|
+
return !isManagedHookCommand(command, Object.keys(hooksConfig));
|
|
882
|
+
});
|
|
688
883
|
merged.push(...entries);
|
|
689
884
|
hooksFile.hooks = { ...existingHooks, pre_write_code: merged };
|
|
690
885
|
await ensureDir(path.dirname(hooksPath));
|
|
691
886
|
await writeFile(hooksPath, JSON.stringify(hooksFile, null, 2) + '\n', 'utf-8');
|
|
692
|
-
return {
|
|
887
|
+
return { status: 'installed' };
|
|
693
888
|
}
|
|
694
889
|
/**
|
|
695
890
|
* GitHub Copilot format:
|
|
@@ -712,7 +907,7 @@ async function installCopilotHooks(baseDir, platformBase, skillsDir, hooksConfig
|
|
|
712
907
|
};
|
|
713
908
|
await ensureDir(hooksDir);
|
|
714
909
|
await writeFile(hookFilePath, JSON.stringify(hookConfig, null, 2) + '\n', 'utf-8');
|
|
715
|
-
return {
|
|
910
|
+
return { status: 'installed' };
|
|
716
911
|
}
|
|
717
912
|
/**
|
|
718
913
|
* Kiro format:
|
|
@@ -742,7 +937,7 @@ async function installKiroHooks(baseDir, platformBase, skillsDir, hooksConfig) {
|
|
|
742
937
|
await ensureDir(hooksDir);
|
|
743
938
|
await writeFile(hookFilePath, JSON.stringify(hookConfig, null, 2) + '\n', 'utf-8');
|
|
744
939
|
}
|
|
745
|
-
return {
|
|
940
|
+
return { status: 'installed' };
|
|
746
941
|
}
|
|
747
942
|
function managedConfigFields(language = 'en') {
|
|
748
943
|
const artifactLanguage = resolveArtifactLanguage(language);
|
|
@@ -780,13 +975,20 @@ function parseProjectConfigOverrides(content) {
|
|
|
780
975
|
}
|
|
781
976
|
return out;
|
|
782
977
|
}
|
|
783
|
-
|
|
978
|
+
// `language` is null when the caller has no definitive language selection to assert (e.g.
|
|
979
|
+
// multiple platforms in the same scope disagree and no --language flag was given) — in that
|
|
980
|
+
// case the existing config's language is preserved, falling back to 'en' only when absent.
|
|
981
|
+
// A non-null language always overwrites the managed `language` field: init/update pass it
|
|
982
|
+
// specifically to persist the language the user just selected/installed.
|
|
983
|
+
function renderProjectConfig(existing, language = null) {
|
|
984
|
+
const resolvedLanguage = language ?? existing.language ?? 'en';
|
|
784
985
|
const lines = [];
|
|
785
|
-
const fields = getManagedConfigFields(
|
|
986
|
+
const fields = getManagedConfigFields(resolvedLanguage);
|
|
786
987
|
const managed = new Set(fields.map((f) => f.key));
|
|
787
988
|
for (const f of fields) {
|
|
788
989
|
lines.push(f.comment);
|
|
789
|
-
|
|
990
|
+
const value = f.key === 'language' ? resolvedLanguage : (existing[f.key] ?? f.def);
|
|
991
|
+
lines.push(`${f.key}: ${value}`);
|
|
790
992
|
}
|
|
791
993
|
for (const [k, v] of Object.entries(existing)) {
|
|
792
994
|
if (!managed.has(k))
|
|
@@ -795,7 +997,7 @@ function renderProjectConfig(existing, language = 'en') {
|
|
|
795
997
|
lines.push('');
|
|
796
998
|
return lines.join('\n');
|
|
797
999
|
}
|
|
798
|
-
async function mergeProjectConfig(projectPath, language =
|
|
1000
|
+
async function mergeProjectConfig(projectPath, language = null) {
|
|
799
1001
|
const configPath = path.join(projectPath, '.comet', 'config.yaml');
|
|
800
1002
|
let existing = {};
|
|
801
1003
|
if (await fileExists(configPath)) {
|
|
@@ -814,6 +1016,7 @@ async function createWorkingDirs(projectPath, language = 'en') {
|
|
|
814
1016
|
await ensureDir(dir);
|
|
815
1017
|
}
|
|
816
1018
|
await mergeProjectConfig(projectPath, language);
|
|
1019
|
+
await installCometProjectInstructions(projectPath, language === 'zh-CN' ? 'zh' : 'en');
|
|
817
1020
|
}
|
|
818
|
-
export { copyCometSkillsForPlatform, copyCometRulesForPlatform, installCometHooksForPlatform, readManifest, getManagedSkillPaths, getManifestSkills, getUserFacingSkillNames, createWorkingDirs, getAssetsDir, computeRuleDestPath, formatRuleContent, isManagedHookCommand, planSkillDirectoryCopy, mergeProjectConfig, parseProjectConfigOverrides, renderProjectConfig, getCentralSkillsDir, installSkillsAsSymlink, };
|
|
1021
|
+
export { copyCometSkillsForPlatform, copyCometRulesForPlatform, installCometHooksForPlatform, readManifest, getManagedSkillPaths, getManifestSkills, getUserFacingSkillNames, createWorkingDirs, getAssetsDir, computeRuleDestPath, formatRuleContent, isManagedHookCommand, buildHookCommand, removeManagedHooksFromJsonFile, planSkillDirectoryCopy, mergeProjectConfig, parseProjectConfigOverrides, renderProjectConfig, getCentralSkillsDir, installSkillsAsSymlink, };
|
|
819
1022
|
//# sourceMappingURL=platform-install.js.map
|