@runfusion/fusion 0.73.0-beta.2 → 0.73.0-beta.4
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/agent-browser.mjs +8 -0
- package/dist/bin.js +7664 -11386
- package/dist/child-process-worker.js +4292 -8374
- package/dist/client/.vite/manifest.json +266 -256
- package/dist/client/assets/{AgentDetailView-CUoHZPZr.js → AgentDetailView-BBOL6AgZ.js} +3 -3
- package/dist/client/assets/{AgentPermissionPolicyEditor-DKoHJIlF.js → AgentPermissionPolicyEditor-DV7OPUhR.js} +1 -1
- package/dist/client/assets/{AgentsView-CaBo-FHV.js → AgentsView-B6xoAHyV.js} +4 -4
- package/dist/client/assets/ChatView-DwVjnxM8.js +8 -0
- package/dist/client/assets/{CommandCenter-wgiEIVuC.js → CommandCenter-DYWaoYFD.js} +9 -9
- package/dist/client/assets/DevServerView-BY5up-NA.js +1 -0
- package/dist/client/assets/{DirectoryPicker-B7YwgF53.js → DirectoryPicker-fM8MJa2r.js} +1 -1
- package/dist/client/assets/DocumentsView-D2KxsPG_.js +1 -0
- package/dist/client/assets/{EvalsView-BjyqxMS_.js → EvalsView-U8dOvTRM.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-_PMSa_gN.js → ExperimentalAgentOnboardingModal-C27y8Y-1.js} +1 -1
- package/dist/client/assets/{GoalsView-BzLA8GX9.js → GoalsView-D-2wmy-O.js} +1 -1
- package/dist/client/assets/{InsightsView-Cb_tUr1V.js → InsightsView-zLyuQL_l.js} +2 -2
- package/dist/client/assets/{MemoryView-CRxOPCQq.js → MemoryView-D-tSn48u.js} +2 -2
- package/dist/client/assets/{PiExtensionsManager-XQ5rWJT3.js → PiExtensionsManager-DvwmvGEY.js} +2 -2
- package/dist/client/assets/PluginManager-BACOwQAN.js +1 -0
- package/dist/client/assets/{PullRequestView-CX6fScVe.js → PullRequestView-DULyv21u.js} +2 -2
- package/dist/client/assets/{ReportModal-BSCk5ER1.css → ReportModal-BuhhqtXJ.css} +1 -1
- package/dist/client/assets/ReportModal-CUlKMFWa.js +21 -0
- package/dist/client/assets/{ResearchView-DgKzxRUL.js → ResearchView-DM_O3IFc.js} +2 -2
- package/dist/client/assets/{SecretsView-C83SIrjR.js → SecretsView-Bq3u_nAf.js} +1 -1
- package/dist/client/assets/SessionTerminal-D00ByR6U.js +2 -0
- package/dist/client/assets/SettingsModal-Bb3pIxiX.js +21 -0
- package/dist/client/assets/SettingsModal-CMLHZBhX.css +1 -0
- package/dist/client/assets/SettingsModal-QRaBE1ds.js +1 -0
- package/dist/client/assets/{SettingsTextareaRow-BKGsmZ7C.js → SettingsTextareaRow-CHOJ-qHz.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-DIb4q-VT.js → SetupWizardModal-DriQyd81.js} +2 -2
- package/dist/client/assets/{SkillsView-D1Zxh1iX.js → SkillsView-BtDyujiZ.js} +1 -1
- package/dist/client/assets/{TodoView-CGIcE6Yr.js → TodoView-BNHUnz50.js} +2 -2
- package/dist/client/assets/{WorkflowNodeEditor-BtWrziOX.css → WorkflowNodeEditor-BNgkFJ_P.css} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-BXikFpra.js +8 -0
- package/dist/client/assets/agent-import-generation-B2kYEm1O.js +1 -0
- package/dist/client/assets/app-B_HrdDXZ.js +13 -0
- package/dist/client/assets/{app-BsIXfnu-.js → app-C6yo-M_n.js} +1 -1
- package/dist/client/assets/{app-B-IdUeIu.js → app-CH8ZgPm4.js} +1 -1
- package/dist/client/assets/{app-D9ktpVhR.js → app-D4DpgDss.js} +1 -1
- package/dist/client/assets/{app-nBTNvNKK.js → app-Qv0blCyY.js} +1 -1
- package/dist/client/assets/{app-C8muVNUU.js → app-kFdtajPy.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-Dv83GkUE.js → architectureDiagram-3BPJPVTR-B-Efjj4Z.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-B_j-RJOz.js → blockDiagram-GPEHLZMM-CaOVxrlM.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Cy3f-SD1.js → c4Diagram-AAUBKEIU-D8aYt5F1.js} +1 -1
- package/dist/client/assets/channel-5bPK6pTS.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CPolddUJ.js → chunk-2J33WTMH-VSDT0J0r.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BAGPgwkc.js → chunk-4BX2VUAB-Chx1wQgD.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-dzYFOH0q.js → chunk-55IACEB6-MlqjhIJg.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-ul9hGhiR.js → chunk-727SXJPM-BheQNUi8.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-C75yqe4-.js → chunk-AQP2D5EJ-C5EoJhfJ.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BwiLAyup.js → chunk-FMBD7UC4-B8_8qP3j.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-CVv1sLhy.js → chunk-ND2GUHAM-BuglCGRx.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-D1c-k3xL.js → chunk-QZHKN3VN-B7_06dxp.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Dv9RQDqG.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Dv9RQDqG.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DosMsFd6.js → cose-bilkent-S5V4N54A-Cm-ZOycx.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-9os-QBXe.js → dagre-BM42HDAG-Dj_Gwjpv.js} +1 -1
- package/dist/client/assets/{dashboard-view-CNVTxyWE.js → dashboard-view-B4CRL5Fy.js} +1 -1
- package/dist/client/assets/{dashboard-view-Bn7iL770.js → dashboard-view-noD9p0Zs.js} +1 -1
- package/dist/client/assets/{dashboard-view-iwAS1HTp.js → dashboard-view-pXXSUxG9.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-ChjuJgA6.js → diagram-2AECGRRQ-C_9BfShy.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-Cq10aB4z.js → diagram-5GNKFQAL-Cmg2qpCj.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CKjyrzjg.js → diagram-KO2AKTUF-2FNo2HXb.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DxCc1BsH.js → diagram-LMA3HP47-DgnVeCp-.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DJWEkDsR.js → diagram-OG6HWLK6-iAIR50HH.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-gVkDYC92.js → erDiagram-TEJ5UH35-Da4I04eN.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-1lw1mQRQ.js → flowDiagram-I6XJVG4X-Bv9r2T0m.js} +1 -1
- package/dist/client/assets/{folder-open-Nmr7nRmN.js → folder-open-CwWtrDh6.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-Yzq4WZRo.js → ganttDiagram-6RSMTGT7-BMeO84U_.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-cFR9Gv8n.js → gitGraphDiagram-PVQCEYII-CWDh_RIb.js} +1 -1
- package/dist/client/assets/index-CB3mYxAB.css +1 -0
- package/dist/client/assets/index-CE7C_XsS.js +2661 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BbRiTnD3.js → infoDiagram-5YYISTIA-BAE4KtCL.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DD4i2Znk.js → ishikawaDiagram-YF4QCWOH-C_iXAuOy.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-qHPO2M-C.js → journeyDiagram-JHISSGLW-BnxSHwDo.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-EuFfgxUv.js → kanban-definition-UN3LZRKU-DYNRm3Nu.js} +1 -1
- package/dist/client/assets/{mermaid.core-Cru9Vzsy.js → mermaid.core-B3hvDDep.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-mCvtfapj.js → mindmap-definition-RKZ34NQL-s7KBEuPD.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-BSc_a5Dz.js → pieDiagram-4H26LBE5-Cy1_IPUD.js} +1 -1
- package/dist/client/assets/{puzzle-Cz66CEWW.js → puzzle-DWc6gFQ7.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Um2SLb_d.js → quadrantDiagram-W4KKPZXB-DqgVGp41.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-B94evN7g.js → requirementDiagram-4Y6WPE33-CA5-TDeF.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BH7NLX-K.js → sankeyDiagram-5OEKKPKP-Cuvi3RgE.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DusrBGQp.js → sequenceDiagram-3UESZ5HK-Da3GfmGP.js} +1 -1
- package/dist/client/assets/{shield-alert-CcQuaRHN.js → shield-alert-_iY63ED4.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CVnY93Xy.js → standing-instructions-template-CCd2YY9c.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-GRjL9YlX.js → stateDiagram-AJRCARHV-CZ_I9ENR.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BBsv6ppQ.js → stateDiagram-v2-BHNVJYJU-BomoRVhY.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DC6UeqjY.js → timeline-definition-PNZ67QCA-C3CYvIuR.js} +1 -1
- package/dist/client/assets/{upload-CjJp7lEX.js → upload-D0RrO65v.js} +1 -1
- package/dist/client/assets/{users-DgimRYHz.js → users-CGszBY2v.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-C272zK9h.js → vennDiagram-CIIHVFJN-By9fi8NW.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-KkRF-2j9.js → wardley-L42UT6IY-DErnXPkI.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B4brtKRt.js → wardleyDiagram-YWT4CUSO-DFfXZVPk.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6--PFSKt1s.js → xychartDiagram-2RQKCTM6-9Y5oZ5mi.js} +1 -1
- package/dist/client/index.html +4 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +4516 -8539
- package/dist/migrations/0000_initial.sql +2 -0
- package/dist/migrations/0026_bigint_counters.sql +85 -14
- package/dist/migrations/0033_fn-8505_wedge_notification.sql +5 -0
- package/dist/plugin-sdk/index.js +1 -0
- package/dist/plugins/.fusion-ce-agents/.fusion-ce-upstream-provenance.json +7 -0
- package/dist/plugins/.fusion-ce-agents/ce-adversarial-document-reviewer.md +115 -0
- package/dist/plugins/.fusion-ce-agents/ce-adversarial-reviewer.md +111 -0
- package/dist/plugins/.fusion-ce-agents/ce-agent-native-planning-strategist.md +71 -0
- package/dist/plugins/.fusion-ce-agents/ce-agent-native-reviewer.md +181 -0
- package/dist/plugins/.fusion-ce-agents/ce-ankane-readme-writer.md +50 -0
- package/dist/plugins/.fusion-ce-agents/ce-api-contract-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-architecture-strategist.md +53 -0
- package/dist/plugins/.fusion-ce-agents/ce-best-practices-researcher.md +122 -0
- package/dist/plugins/.fusion-ce-agents/ce-code-simplicity-reviewer.md +87 -0
- package/dist/plugins/.fusion-ce-agents/ce-coherence-reviewer.md +73 -0
- package/dist/plugins/.fusion-ce-agents/ce-correctness-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-data-integrity-guardian.md +75 -0
- package/dist/plugins/.fusion-ce-agents/ce-data-migration-reviewer.md +119 -0
- package/dist/plugins/.fusion-ce-agents/ce-deployment-verification-agent.md +164 -0
- package/dist/plugins/.fusion-ce-agents/ce-design-implementation-reviewer.md +94 -0
- package/dist/plugins/.fusion-ce-agents/ce-design-iterator.md +197 -0
- package/dist/plugins/.fusion-ce-agents/ce-design-lens-reviewer.md +56 -0
- package/dist/plugins/.fusion-ce-agents/ce-feasibility-reviewer.md +65 -0
- package/dist/plugins/.fusion-ce-agents/ce-figma-design-sync.md +172 -0
- package/dist/plugins/.fusion-ce-agents/ce-framework-docs-researcher.md +100 -0
- package/dist/plugins/.fusion-ce-agents/ce-git-history-analyzer.md +47 -0
- package/dist/plugins/.fusion-ce-agents/ce-issue-intelligence-analyst.md +207 -0
- package/dist/plugins/.fusion-ce-agents/ce-julik-frontend-races-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-learnings-researcher.md +254 -0
- package/dist/plugins/.fusion-ce-agents/ce-maintainability-reviewer.md +77 -0
- package/dist/plugins/.fusion-ce-agents/ce-pattern-recognition-specialist.md +62 -0
- package/dist/plugins/.fusion-ce-agents/ce-performance-oracle.md +115 -0
- package/dist/plugins/.fusion-ce-agents/ce-performance-reviewer.md +54 -0
- package/dist/plugins/.fusion-ce-agents/ce-pr-comment-resolver.md +63 -0
- package/dist/plugins/.fusion-ce-agents/ce-previous-comments-reviewer.md +68 -0
- package/dist/plugins/.fusion-ce-agents/ce-product-lens-reviewer.md +92 -0
- package/dist/plugins/.fusion-ce-agents/ce-project-standards-reviewer.md +84 -0
- package/dist/plugins/.fusion-ce-agents/ce-reliability-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-repo-research-analyst.md +263 -0
- package/dist/plugins/.fusion-ce-agents/ce-scope-guardian-reviewer.md +79 -0
- package/dist/plugins/.fusion-ce-agents/ce-security-lens-reviewer.md +48 -0
- package/dist/plugins/.fusion-ce-agents/ce-security-reviewer.md +54 -0
- package/dist/plugins/.fusion-ce-agents/ce-security-sentinel.md +98 -0
- package/dist/plugins/.fusion-ce-agents/ce-session-historian.md +89 -0
- package/dist/plugins/.fusion-ce-agents/ce-slack-researcher.md +133 -0
- package/dist/plugins/.fusion-ce-agents/ce-spec-flow-analyzer.md +87 -0
- package/dist/plugins/.fusion-ce-agents/ce-swift-ios-reviewer.md +107 -0
- package/dist/plugins/.fusion-ce-agents/ce-testing-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-web-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/.fusion-ce-upstream-provenance.json +7 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/SKILL.md +318 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/brainstorm-sections.md +354 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/handoff.md +172 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/html-rendering.md +662 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/markdown-rendering.md +236 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/synthesis-summary.md +271 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/universal-brainstorming.md +71 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/visual-probes.md +128 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/scripts/visual-probe-server.js +419 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/SKILL.md +821 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/action-class-rubric.md +26 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/bulk-preview.md +112 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/cross-model-review.md +63 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/diff-scope.md +41 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/findings-schema.json +137 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/persona-catalog.md +63 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/adversarial-reviewer.md +102 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/agent-native-reviewer.md +173 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/api-contract-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/correctness-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/data-migration-reviewer.md +111 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/deployment-verification-agent.md +157 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/julik-frontend-races-reviewer.md +44 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/learnings-researcher.md +247 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/maintainability-reviewer.md +68 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/performance-reviewer.md +45 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/previous-comments-reviewer.md +59 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/project-standards-reviewer.md +75 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/reliability-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/security-reviewer.md +45 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/swift-ios-reviewer.md +99 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/testing-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/review-output-template.md +170 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/subagent-template.md +199 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/tracker-defer.md +149 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/validator-template.md +89 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/walkthrough.md +249 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/scripts/cross-model-adversarial-review.sh +218 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit/SKILL.md +105 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit-push-pr/SKILL.md +134 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit-push-pr/references/branch-creation.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit-push-pr/references/pr-description-writing.md +115 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/SKILL.md +712 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/assets/resolution-template.md +94 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/performance-oracle.md +108 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/security-sentinel.md +91 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/session-historian.md +83 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/concepts-vocabulary.md +78 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/schema.yaml +231 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/yaml-schema.md +118 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/discover-sessions.sh +130 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/extract-errors.py +254 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/extract-metadata.py +456 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/extract-skeleton.py +570 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/validate-frontmatter.py +137 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/SKILL.md +257 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/references/anti-patterns.md +91 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/references/defense-in-depth.md +35 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/references/investigation-techniques.md +374 -0
- package/dist/plugins/.fusion-ce-skills/ce-doc-review/SKILL.md +70 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/SKILL.md +401 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/issue-intelligence-analyst.md +200 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/slack-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/web-researcher.md +121 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/divergent-ideation.md +89 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/html-rendering.md +662 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/ideation-sections.md +191 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/markdown-rendering.md +236 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/post-ideation-workflow.md +166 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/universal-ideation.md +107 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/web-research-cache.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/SKILL.md +858 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/agent-native-planning-strategist.md +62 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/architecture-strategist.md +46 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/best-practices-researcher.md +114 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/data-migration-reviewer.md +103 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/deployment-verification-agent.md +157 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/framework-docs-researcher.md +93 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/learnings-researcher.md +247 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/performance-oracle.md +108 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/repo-research-analyst.md +256 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/security-sentinel.md +91 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/slack-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/spec-flow-analyzer.md +80 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/web-researcher.md +121 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/approach-altitude.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/deepening-workflow.md +259 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/html-rendering.md +668 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/markdown-rendering.md +236 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/plan-handoff.md +126 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/plan-sections.md +405 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/synthesis-summary.md +396 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/universal-planning.md +168 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/SKILL.md +53 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/agents/pr-comment-resolver.md +56 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/evaluation-rubric.md +106 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/full-mode.md +283 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/targeted-mode.md +45 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/get-pr-comments +159 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/get-thread-for-comment +76 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/reply-to-pr-thread +33 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/resolve-pr-thread +23 -0
- package/dist/plugins/.fusion-ce-skills/ce-strategy/SKILL.md +97 -0
- package/dist/plugins/.fusion-ce-skills/ce-strategy/references/interview.md +143 -0
- package/dist/plugins/.fusion-ce-skills/ce-strategy/references/strategy-template.md +89 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/SKILL.md +429 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/agents/figma-design-sync.md +165 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/execution-engines.md +85 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/non-code-execution.md +23 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/review-findings-followup.md +104 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/shipping-workflow.md +133 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/tracker-defer.md +149 -0
- package/dist/plugins/fusion-plugin-compound-engineering/.bundled.reload-3.js +11266 -0
- package/dist/plugins/fusion-plugin-compound-engineering/.bundled.reload-4.js +11266 -0
- package/dist/plugins/fusion-plugin-dependency-graph/.bundled.reload-1.js +8206 -0
- package/dist/plugins/fusion-plugin-grok-runtime/.bundled.reload-2.js +26623 -0
- package/package.json +6 -3
- package/skill/fusion/references/engine-tools.md +6 -2
- package/dist/client/assets/ChatView-Bv0J5p5U.js +0 -8
- package/dist/client/assets/DevServerView-Ue9XG_4H.js +0 -1
- package/dist/client/assets/DocumentsView-C1Ptwcv5.js +0 -1
- package/dist/client/assets/PluginManager-CXPSlWxs.js +0 -1
- package/dist/client/assets/ReportModal-JhZZXZlj.js +0 -21
- package/dist/client/assets/SessionTerminal-BrK3psiC.js +0 -2
- package/dist/client/assets/SettingsModal-Bby9vLGx.js +0 -21
- package/dist/client/assets/SettingsModal-DVLqY1-7.js +0 -1
- package/dist/client/assets/SettingsModal-DXArgTTx.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-BXUC0lim.js +0 -8
- package/dist/client/assets/app-DUszvars.js +0 -13
- package/dist/client/assets/channel-BuhC8kaT.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-vpRR5WOg.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-vpRR5WOg.js +0 -1
- package/dist/client/assets/index-Cg9ahVtV.js +0 -2661
- package/dist/client/assets/index-uhXHk1ek.css +0 -1
package/dist/plugins/.fusion-ce-skills/ce-code-review/scripts/cross-model-adversarial-review.sh
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# cross-model-adversarial-review.sh
|
|
3
|
+
#
|
|
4
|
+
# Runs the adversarial review through a DIFFERENT model family (the "peer") in a
|
|
5
|
+
# separate, read-only process, and writes its findings as JSON into the run dir.
|
|
6
|
+
# The peer gets the same canonical adversarial brief the in-process reviewer uses
|
|
7
|
+
# (references/personas/adversarial-reviewer.md) so it is genuinely "the adversarial
|
|
8
|
+
# persona, on a different model."
|
|
9
|
+
#
|
|
10
|
+
# Usage: cross-model-adversarial-review.sh <peer: codex|claude> <base-ref> <run-dir>
|
|
11
|
+
# <peer> codex -> use Codex (when the host is Claude or Cursor)
|
|
12
|
+
# claude -> use Claude (when the host is Codex)
|
|
13
|
+
# <base-ref> the diff base (e.g. a merge-base SHA or branch); the peer reviews
|
|
14
|
+
# only `git diff <base-ref>` in the current repository
|
|
15
|
+
# <run-dir> an existing dir; output is written to <run-dir>/adversarial-<peer>.json
|
|
16
|
+
#
|
|
17
|
+
# Self-locates its sibling reference files via BASH_SOURCE (NOT the CWD, which is
|
|
18
|
+
# the user's project on every host), and derives the repo root from git. The agent
|
|
19
|
+
# only has to pass the three values above.
|
|
20
|
+
#
|
|
21
|
+
# NON-BLOCKING BY DESIGN: every failure logs to stderr and exits 0 without an output
|
|
22
|
+
# file. The cross-model pass is additive and must never fail the review; the caller
|
|
23
|
+
# detects success purely by the presence of <run-dir>/adversarial-<peer>.json.
|
|
24
|
+
|
|
25
|
+
set -uo pipefail
|
|
26
|
+
|
|
27
|
+
PEER="${1:-}"
|
|
28
|
+
BASE="${2:-}"
|
|
29
|
+
RUN_DIR="${3:-}"
|
|
30
|
+
|
|
31
|
+
log() { printf '[cross-model] %s\n' "$*" >&2; }
|
|
32
|
+
skip() { log "$*"; exit 0; } # non-blocking: announce reason, exit clean, no output
|
|
33
|
+
|
|
34
|
+
# --- validate inputs -------------------------------------------------------
|
|
35
|
+
case "$PEER" in codex|claude) ;; *) skip "invalid peer '${PEER:-<empty>}' (want codex|claude); skipping cross-model pass" ;; esac
|
|
36
|
+
[ -n "$BASE" ] || skip "no base ref given; skipping"
|
|
37
|
+
[ -n "$RUN_DIR" ] && [ -d "$RUN_DIR" ] || skip "run-dir '${RUN_DIR:-<empty>}' is not a directory; skipping"
|
|
38
|
+
command -v "$PEER" >/dev/null 2>&1 || skip "$PEER CLI not installed; skipping"
|
|
39
|
+
command -v jq >/dev/null 2>&1 || skip "jq not installed; skipping"
|
|
40
|
+
|
|
41
|
+
# --- self-locate skill root + canonical sibling files ----------------------
|
|
42
|
+
SKILL_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" || skip "cannot resolve skill root; skipping"
|
|
43
|
+
PERSONA="$SKILL_ROOT/references/personas/adversarial-reviewer.md"
|
|
44
|
+
SCHEMA="$SKILL_ROOT/references/findings-schema.json"
|
|
45
|
+
[ -f "$PERSONA" ] || skip "persona brief not found at $PERSONA; skipping"
|
|
46
|
+
[ -f "$SCHEMA" ] || skip "findings schema not found at $SCHEMA; skipping"
|
|
47
|
+
|
|
48
|
+
# --- derive repo root (read-only) ------------------------------------------
|
|
49
|
+
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || skip "not inside a git repository; skipping"
|
|
50
|
+
|
|
51
|
+
OUT="$RUN_DIR/adversarial-$PEER.json"
|
|
52
|
+
PROMPT_FILE="$(mktemp "${TMPDIR:-/tmp}/xmodel-prompt-XXXXXX")"
|
|
53
|
+
PEERLOG="$(mktemp "${TMPDIR:-/tmp}/xmodel-log-XXXXXX")"
|
|
54
|
+
trap 'rm -f "$PROMPT_FILE" "$PEERLOG"' EXIT
|
|
55
|
+
|
|
56
|
+
# --- compose the peer prompt from the canonical persona (single source) ----
|
|
57
|
+
# The full findings schema is embedded so BOTH peers know every required field
|
|
58
|
+
# (why_it_matters, confidence, evidence, routing) -- Codex gets no --output-schema
|
|
59
|
+
# (its strict mode rejects the permissive draft-07 schema), so the prompt is its
|
|
60
|
+
# only schema signal. Verified to produce complete, schema-shaped findings.
|
|
61
|
+
{
|
|
62
|
+
cat "$PERSONA"
|
|
63
|
+
printf '\n\n---\n\n'
|
|
64
|
+
printf 'This is an authorized review of the maintainer\047s own repository.\n'
|
|
65
|
+
printf 'Think like an attacker and a chaos engineer: find the ways this change fails in production.\n'
|
|
66
|
+
printf 'Return ONE JSON object and nothing else (no prose, no code fence) matching this schema:\n\n'
|
|
67
|
+
cat "$SCHEMA"
|
|
68
|
+
printf '\n\nSet the top-level "reviewer" field to "adversarial-%s".\n' "$PEER"
|
|
69
|
+
} > "$PROMPT_FILE"
|
|
70
|
+
# Per-peer diff delivery (composed below): codex fetches its own diff inside its
|
|
71
|
+
# read-only sandbox; claude is hard-denied shell (see below), so it gets the diff
|
|
72
|
+
# embedded and needs no git.
|
|
73
|
+
if [ "$PEER" = codex ]; then
|
|
74
|
+
printf '\nRun: git diff %q — review ONLY the changes in that diff, in this repository (read-only).\n' "$BASE" >> "$PROMPT_FILE"
|
|
75
|
+
else
|
|
76
|
+
{ printf '\nReview ONLY the change below (the output of `git diff %q`). You may Read repository files for context but cannot run shell commands.\n' "$BASE"
|
|
77
|
+
printf '\n=== BEGIN DIFF ===\n'; git -C "$REPO_ROOT" diff "$BASE"; printf '\n=== END DIFF ===\n'; } >> "$PROMPT_FILE"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# --- run the peer: idle-timeout for streaming codex, hard cap for claude ----
|
|
81
|
+
# codex exec streams its reasoning to stdout, so a productive long run is allowed to
|
|
82
|
+
# continue and is killed only when its output STALLS for IDLE_SECS (the cross-model
|
|
83
|
+
# "second opinion" idle-timeout pattern), with HARD_SECS as an absolute backstop.
|
|
84
|
+
# claude's --output-format json is single-shot, so it gets a hard cap only.
|
|
85
|
+
#
|
|
86
|
+
# Orphan safety: codex runs in its OWN process group (set -m) and the watchdog reaps the
|
|
87
|
+
# whole group (TERM then KILL) on idle/hard -- we do NOT signal a (g)timeout wrapper for
|
|
88
|
+
# this, because an external kill of (g)timeout forwards only TERM (its -k escalates only
|
|
89
|
+
# on gtimeout's OWN expiry), so a peer that defers SIGTERM could survive `wait` and write
|
|
90
|
+
# $OUT after Stage 5 skipped it. claude keeps the (g)timeout wrapper: it is single-shot
|
|
91
|
+
# and gtimeout's own timeout (with -k) escalates to KILL correctly; perl(alarm) is the
|
|
92
|
+
# fallback when neither (g)timeout exists.
|
|
93
|
+
IDLE_SECS="${CROSS_MODEL_IDLE_SECS:-180}" # reap codex if its streamed output stalls this long
|
|
94
|
+
HARD_SECS="${CROSS_MODEL_HARD_SECS:-600}" # absolute ceiling (backstop) for either peer
|
|
95
|
+
TO_BIN="$(command -v gtimeout || command -v timeout || true)"
|
|
96
|
+
|
|
97
|
+
# Reap a backgrounded job's whole process group: TERM, then KILL after a short grace if
|
|
98
|
+
# anything is still alive. The grace loop tests GROUP liveness (kill -0 on the negative
|
|
99
|
+
# pgid), not just the leader pid -- otherwise a leader that exits while a child defers TERM
|
|
100
|
+
# would let reap() return before the group KILL, leaking the child. Falls back to the bare
|
|
101
|
+
# pid only when group signaling isn't accepted at all.
|
|
102
|
+
reap() {
|
|
103
|
+
local pid="$1" grp
|
|
104
|
+
if kill -TERM -- -"$pid" 2>/dev/null; then grp=1; else kill -TERM "$pid" 2>/dev/null; grp=0; fi
|
|
105
|
+
for _ in 1 2 3 4 5; do
|
|
106
|
+
if [ "$grp" = 1 ]; then kill -0 -- -"$pid" 2>/dev/null || return 0
|
|
107
|
+
else kill -0 "$pid" 2>/dev/null || return 0; fi
|
|
108
|
+
sleep 1
|
|
109
|
+
done
|
|
110
|
+
if [ "$grp" = 1 ]; then kill -KILL -- -"$pid" 2>/dev/null; else kill -KILL "$pid" 2>/dev/null; fi
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
# Run codex in its own process group; stream to PEERLOG; reap the group on idle stall or
|
|
114
|
+
# hard cap. This watchdog owns both bounds and the kill -- no (g)timeout wrapper to signal.
|
|
115
|
+
run_codex() {
|
|
116
|
+
local prev; case "$-" in *m*) prev=1;; *) prev=0;; esac
|
|
117
|
+
set -m # background job becomes a process-group leader (pgid == pid) so reap() kills the tree
|
|
118
|
+
# Force reasoning output on for THIS subprocess (overriding a user's hide_agent_reasoning
|
|
119
|
+
# = true), so the streamed reasoning keeps PEERLOG growing and gives the idle watchdog a
|
|
120
|
+
# liveness signal -- otherwise a long, quiet reasoning phase on a big diff could be
|
|
121
|
+
# misread as a stall and reaped.
|
|
122
|
+
codex exec - -C "$REPO_ROOT" -s read-only -o "$OUT" \
|
|
123
|
+
-c 'model_reasoning_effort="high"' -c 'hide_agent_reasoning=false' < "$PROMPT_FILE" > "$PEERLOG" 2>&1 &
|
|
124
|
+
local pid=$!
|
|
125
|
+
[ "$prev" = 0 ] && set +m # group is already assigned; restoring silences job-control noise
|
|
126
|
+
local start last=-1 lastchg now size
|
|
127
|
+
start="$(date +%s)"; lastchg="$start"
|
|
128
|
+
while kill -0 "$pid" 2>/dev/null; do
|
|
129
|
+
sleep 5; now="$(date +%s)"; size="$(wc -c <"$PEERLOG" 2>/dev/null || echo 0)"
|
|
130
|
+
[ "$size" != "$last" ] && { last="$size"; lastchg="$now"; }
|
|
131
|
+
if [ $(( now - lastchg )) -ge "$IDLE_SECS" ]; then
|
|
132
|
+
log "codex output idle ${IDLE_SECS}s; reaping peer process group"; reap "$pid"; break
|
|
133
|
+
fi
|
|
134
|
+
if [ $(( now - start )) -ge "$HARD_SECS" ]; then
|
|
135
|
+
log "codex exceeded hard cap ${HARD_SECS}s; reaping peer process group"; reap "$pid"; break
|
|
136
|
+
fi
|
|
137
|
+
done
|
|
138
|
+
wait "$pid" 2>/dev/null || true
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
log "running $PEER adversarial review against base $BASE (read-only; idle ${IDLE_SECS}s / hard ${HARD_SECS}s)"
|
|
142
|
+
case "$PEER" in
|
|
143
|
+
codex)
|
|
144
|
+
run_codex
|
|
145
|
+
# Fallback: codex's -o write is CLI-level and works under -s read-only, but if it
|
|
146
|
+
# ever fails to materialize, recover the same JSON from the stdout we already
|
|
147
|
+
# captured (codex prints the final message to stdout too). Belt-and-suspenders.
|
|
148
|
+
if { [ ! -s "$OUT" ] || ! jq -e . "$OUT" >/dev/null 2>&1; } && [ -s "$PEERLOG" ] && command -v python3 >/dev/null 2>&1; then
|
|
149
|
+
python3 - "$PEERLOG" "$OUT" <<'PY' 2>/dev/null && [ -s "$OUT" ] && log "recovered codex JSON from stdout (-o file unavailable)"
|
|
150
|
+
import sys, json
|
|
151
|
+
txt = open(sys.argv[1], encoding="utf-8", errors="replace").read()
|
|
152
|
+
best, depth, start = None, 0, None
|
|
153
|
+
for i, ch in enumerate(txt):
|
|
154
|
+
if ch == '{':
|
|
155
|
+
if depth == 0: start = i
|
|
156
|
+
depth += 1
|
|
157
|
+
elif ch == '}' and depth > 0:
|
|
158
|
+
depth -= 1
|
|
159
|
+
if depth == 0 and start is not None:
|
|
160
|
+
try:
|
|
161
|
+
obj = json.loads(txt[start:i+1])
|
|
162
|
+
if isinstance(obj, dict) and "findings" in obj: best = obj
|
|
163
|
+
except Exception: pass
|
|
164
|
+
if best is not None: open(sys.argv[2], "w").write(json.dumps(best))
|
|
165
|
+
PY
|
|
166
|
+
fi
|
|
167
|
+
;;
|
|
168
|
+
claude)
|
|
169
|
+
# Single-shot output -> hard cap only. Disallowed tools as SEPARATE variadic args
|
|
170
|
+
# (unambiguous; a single quoted "Edit Write NotebookEdit" is risky since tool names
|
|
171
|
+
# can contain spaces). We deny the built-in mutators (Edit/Write/NotebookEdit/Bash)
|
|
172
|
+
# AND `mcp__*` (a user's pre-approved MCP write/deploy tools would otherwise run under
|
|
173
|
+
# dontAsk) AND `Task` (a subagent would bypass this deny list) -- so the peer stays
|
|
174
|
+
# read-only even with MCP servers configured. claude can't write a file under those
|
|
175
|
+
# perms, so it emits the JSON envelope on stdout (captured to PEERLOG); we extract it.
|
|
176
|
+
if [ -n "$TO_BIN" ]; then
|
|
177
|
+
"$TO_BIN" -k 10 "$HARD_SECS" claude -p --model opus --permission-mode dontAsk \
|
|
178
|
+
--disallowedTools Edit Write NotebookEdit Bash Task 'mcp__*' --max-turns 15 --no-session-persistence \
|
|
179
|
+
--json-schema "$(cat "$SCHEMA")" --output-format json \
|
|
180
|
+
< "$PROMPT_FILE" > "$PEERLOG" 2>/dev/null \
|
|
181
|
+
|| log "claude exited non-zero or timed out"
|
|
182
|
+
else
|
|
183
|
+
perl -e 'alarm shift; exec @ARGV' "$HARD_SECS" claude -p --model opus --permission-mode dontAsk \
|
|
184
|
+
--disallowedTools Edit Write NotebookEdit Bash Task 'mcp__*' --max-turns 15 --no-session-persistence \
|
|
185
|
+
--json-schema "$(cat "$SCHEMA")" --output-format json \
|
|
186
|
+
< "$PROMPT_FILE" > "$PEERLOG" 2>/dev/null \
|
|
187
|
+
|| log "claude exited non-zero or timed out"
|
|
188
|
+
fi
|
|
189
|
+
jq -e '.structured_output' "$PEERLOG" > "$OUT" 2>/dev/null \
|
|
190
|
+
|| jq -r '.result // empty' "$PEERLOG" | jq -e '.' > "$OUT" 2>/dev/null \
|
|
191
|
+
|| { log "could not parse Claude output"; rm -f "$OUT"; }
|
|
192
|
+
;;
|
|
193
|
+
esac
|
|
194
|
+
|
|
195
|
+
# --- normalize the reviewer name -------------------------------------------
|
|
196
|
+
# The persona's example JSON uses reviewer:"adversarial"; if the peer echoed that
|
|
197
|
+
# instead of "adversarial-<peer>", Stage 5 would fold it as the in-process reviewer
|
|
198
|
+
# and lose the cross-model agreement signal. Force the distinct name.
|
|
199
|
+
if [ -s "$OUT" ]; then
|
|
200
|
+
_norm="$(mktemp "${TMPDIR:-/tmp}/xmodel-norm-XXXXXX")"
|
|
201
|
+
# Force the distinct reviewer name AND satisfy Stage 5's full top-level contract
|
|
202
|
+
# (reviewer string + findings/residual_risks/testing_gaps arrays). Backfill the two
|
|
203
|
+
# soft arrays if the peer omitted them; drop the return entirely if findings is not
|
|
204
|
+
# an array (empty output -> the validation below removes the file -> clean skip).
|
|
205
|
+
if jq --arg r "adversarial-$PEER" \
|
|
206
|
+
'if (.findings|type)=="array" then {reviewer:$r, findings, residual_risks:(.residual_risks // []), testing_gaps:(.testing_gaps // [])} else empty end' \
|
|
207
|
+
"$OUT" > "$_norm" 2>/dev/null; then mv "$_norm" "$OUT"; else rm -f "$_norm"; fi
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# --- validate the output against the Stage 5 reviewer-return contract -------
|
|
211
|
+
if [ -s "$OUT" ] && jq -e '(.reviewer|type=="string") and (.findings|type=="array") and (.residual_risks|type=="array") and (.testing_gaps|type=="array")' "$OUT" >/dev/null 2>&1; then
|
|
212
|
+
n="$(jq '.findings | length' "$OUT" 2>/dev/null || echo '?')"
|
|
213
|
+
log "wrote $n finding(s) to $OUT (reviewer adversarial-$PEER)"
|
|
214
|
+
else
|
|
215
|
+
log "$PEER produced no usable schema-shaped output; skipping fold-in"
|
|
216
|
+
rm -f "$OUT"
|
|
217
|
+
fi
|
|
218
|
+
exit 0
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ce-commit
|
|
3
|
+
description: Create a git commit with a clear, value-communication message. Use when the user asks to commit/save staged or unstaged changes with a repo-appropriate, value-communicating message.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Git Commit
|
|
7
|
+
|
|
8
|
+
Create a single, well-crafted git commit from the current working tree changes.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
**On platforms other than Claude Code**, skip to the "Context fallback" section below and run the command there to gather context.
|
|
13
|
+
|
|
14
|
+
**In Claude Code**, the five labeled sections below (Git status, Working tree diff, Current branch, Recent commits, Remote default branch) contain pre-populated data. Use them directly throughout this skill -- do not re-run these commands.
|
|
15
|
+
|
|
16
|
+
**Git status:**
|
|
17
|
+
!`git status`
|
|
18
|
+
|
|
19
|
+
**Working tree diff:**
|
|
20
|
+
!`git diff HEAD`
|
|
21
|
+
|
|
22
|
+
**Current branch:**
|
|
23
|
+
!`git branch --show-current`
|
|
24
|
+
|
|
25
|
+
**Recent commits:**
|
|
26
|
+
!`git log --oneline -10`
|
|
27
|
+
|
|
28
|
+
**Remote default branch:**
|
|
29
|
+
!`git rev-parse --abbrev-ref origin/HEAD 2>/dev/null || echo '__DEFAULT_BRANCH_UNRESOLVED__'`
|
|
30
|
+
|
|
31
|
+
### Context fallback
|
|
32
|
+
|
|
33
|
+
**In Claude Code, skip this section — the data above is already available.**
|
|
34
|
+
|
|
35
|
+
Run this single command to gather all context:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
printf '=== STATUS ===\n'; git status; printf '\n=== DIFF ===\n'; git diff HEAD; printf '\n=== BRANCH ===\n'; git branch --show-current; printf '\n=== LOG ===\n'; git log --oneline -10; printf '\n=== DEFAULT_BRANCH ===\n'; git rev-parse --abbrev-ref origin/HEAD 2>/dev/null || echo '__DEFAULT_BRANCH_UNRESOLVED__'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Workflow
|
|
44
|
+
|
|
45
|
+
### Step 1: Gather context
|
|
46
|
+
|
|
47
|
+
Use the context above (git status, working tree diff, current branch, recent commits, remote default branch). All data needed for this step is already available -- do not re-run those commands.
|
|
48
|
+
|
|
49
|
+
The remote default branch value returns something like `origin/main`. Strip the `origin/` prefix to get the branch name. If it returned `__DEFAULT_BRANCH_UNRESOLVED__` or a bare `HEAD`, try:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
If both fail, fall back to `main`.
|
|
56
|
+
|
|
57
|
+
If the git status from the context above shows a clean working tree (no staged, modified, or untracked files), report that there is nothing to commit and stop.
|
|
58
|
+
|
|
59
|
+
If the current branch from the context above is empty, the repository is in detached HEAD state. Explain that a branch is required before committing if the user wants this work attached to a branch. Ask whether to create a feature branch now. Use the platform's blocking question tool: `AskUserQuestion` in Claude Code (call `ToolSearch` with `select:AskUserQuestion` first if its schema isn't loaded), `request_user_input` in Codex, `ask_question` in Antigravity CLI (`agy`), `ask_user` in Pi (requires the `pi-ask-user` extension). Fall back to presenting options in chat only when no blocking tool exists in the harness or the call errors (e.g., Codex edit modes) — not because a schema load is required. Never silently skip the question.
|
|
60
|
+
|
|
61
|
+
- If the user chooses to create a branch, derive the name from the change content, create it with `git checkout -b <branch-name>`, then run `git branch --show-current` again and use that result as the current branch name for the rest of the workflow.
|
|
62
|
+
- If the user declines, continue with the detached HEAD commit.
|
|
63
|
+
|
|
64
|
+
### Step 2: Determine commit message convention
|
|
65
|
+
|
|
66
|
+
Follow this priority order:
|
|
67
|
+
|
|
68
|
+
1. **Repo conventions already in context** -- If project instructions (AGENTS.md, CLAUDE.md, or similar) are already loaded and specify commit message conventions, follow those. Do not re-read these files; they are loaded at session start.
|
|
69
|
+
2. **Recent commit history** -- If no explicit convention is documented, examine the 10 most recent commits from Step 1. If a clear pattern emerges (e.g., conventional commits, ticket prefixes, emoji prefixes), match that pattern.
|
|
70
|
+
3. **Default: conventional commits** -- If neither source provides a pattern, use conventional commit format: `type(scope): description` where type is one of `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, `perf`, `ci`, `style`, `build`.
|
|
71
|
+
|
|
72
|
+
When using conventional commits, choose the type that most precisely describes the change (the type list above). Where `fix:` and `feat:` both seem to fit, default to `fix:`: a change that remedies broken or missing behavior is `fix:` even when implemented by adding code. Reserve `feat:` for capabilities the user could not previously accomplish. Other types remain primary when they fit better. The user may override for a specific change.
|
|
73
|
+
|
|
74
|
+
### Step 3: Consider logical commits
|
|
75
|
+
|
|
76
|
+
Before staging everything together, scan the changed files for naturally distinct concerns. If modified files clearly group into separate logical changes (e.g., a refactor in one directory and a new feature in another, or test files for a different change than source files), create separate commits for each group.
|
|
77
|
+
|
|
78
|
+
Keep this lightweight:
|
|
79
|
+
- Group at the **file level only** -- do not use `git add -p` or try to split hunks within a file.
|
|
80
|
+
- If the separation is obvious (different features, unrelated fixes), split. If it's ambiguous, one commit is fine.
|
|
81
|
+
- Two or three logical commits is the sweet spot. Do not over-slice into many tiny commits.
|
|
82
|
+
|
|
83
|
+
### Step 4: Stage and commit
|
|
84
|
+
|
|
85
|
+
If the current branch from the context above is `main`, `master`, or the resolved default branch from Step 1, automatically create a feature branch before committing. Derive the branch name from the change content, create it with `git checkout -b <branch-name>`, run `git branch --show-current` to confirm, and use the new branch as the current branch for the rest of the workflow. Do not ask whether to branch — committing on the default branch is not an option here.
|
|
86
|
+
|
|
87
|
+
Write the commit message:
|
|
88
|
+
- **Subject line**: Concise, imperative mood, focused on *why* not *what*. Follow the convention determined in Step 2.
|
|
89
|
+
- **Body** (when needed): Add a body separated by a blank line for non-trivial changes. Explain motivation, trade-offs, or anything a future reader would need. Omit the body for obvious single-purpose changes.
|
|
90
|
+
|
|
91
|
+
For each commit group, stage and commit in a single call. Prefer staging specific files by name over `git add -A` or `git add .` to avoid accidentally including sensitive files (.env, credentials) or unrelated changes. Use a heredoc to preserve formatting:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
git add file1 file2 file3 && git commit -m "$(cat <<'EOF'
|
|
95
|
+
type(scope): subject line here
|
|
96
|
+
|
|
97
|
+
Optional body explaining why this change was made,
|
|
98
|
+
not just what changed.
|
|
99
|
+
EOF
|
|
100
|
+
)"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Step 5: Confirm
|
|
104
|
+
|
|
105
|
+
Run `git status` after the commit to verify success. Report the commit hash(es) and subject line(s).
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ce-commit-push-pr
|
|
3
|
+
description: Commit, push, and open a PR. Use when asked to ship/open a PR, or for PR-description-only flows like writing, rewriting, or describing a PR body.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Git Commit, Push, and PR
|
|
7
|
+
|
|
8
|
+
**Asking the user:** When this skill says "ask the user", use the platform's blocking question tool: `AskUserQuestion` in Claude Code (call `ToolSearch` with `select:AskUserQuestion` first if its schema isn't loaded), `request_user_input` in Codex, `ask_question` in Antigravity CLI (`agy`), `ask_user` in Pi (requires the `pi-ask-user` extension). Fall back to presenting the question in chat only when no blocking tool exists in the harness or the call errors (e.g., Codex edit modes) — not because a schema load is required. Never silently skip the question.
|
|
9
|
+
|
|
10
|
+
## Mode
|
|
11
|
+
|
|
12
|
+
- **Description-only** — user wants *just* a description ("write/draft a PR description", "describe this PR", or pasted a PR URL/number alone). Run Step 4 only; print the result. Apply only if the user asks. If a PR ref was pasted, pass it to Step 4 so Pre-A resolves the right range.
|
|
13
|
+
- **Description update** — user wants to refresh/rewrite an existing PR's description with no commit/push intent. If no open PR, report and stop. Otherwise run Step 4 (PR mode using the existing PR's URL), then Step 5 to preview, confirm, and apply via `gh pr edit`.
|
|
14
|
+
- **Full workflow** — otherwise. Run Steps 1-5 in order.
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
|
|
18
|
+
**On platforms other than Claude Code**, run the Context fallback below. **In Claude Code**, the labeled sections contain pre-populated data — use them directly.
|
|
19
|
+
|
|
20
|
+
**Git status:**
|
|
21
|
+
!`git status`
|
|
22
|
+
|
|
23
|
+
**Working tree diff:**
|
|
24
|
+
!`git diff HEAD`
|
|
25
|
+
|
|
26
|
+
**Current branch:**
|
|
27
|
+
!`git branch --show-current`
|
|
28
|
+
|
|
29
|
+
**Recent commits:**
|
|
30
|
+
!`git log --oneline -10`
|
|
31
|
+
|
|
32
|
+
**Remote default branch:**
|
|
33
|
+
!`git rev-parse --abbrev-ref origin/HEAD 2>/dev/null || echo 'DEFAULT_BRANCH_UNRESOLVED'`
|
|
34
|
+
|
|
35
|
+
**Existing PR check:**
|
|
36
|
+
!`gh pr view --json url,title,state 2>/dev/null || echo 'NO_OPEN_PR'`
|
|
37
|
+
|
|
38
|
+
### Context fallback
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
printf '=== STATUS ===\n'; git status; printf '\n=== DIFF ===\n'; git diff HEAD; printf '\n=== BRANCH ===\n'; git branch --show-current; printf '\n=== LOG ===\n'; git log --oneline -10; printf '\n=== DEFAULT_BRANCH ===\n'; git rev-parse --abbrev-ref origin/HEAD 2>/dev/null || echo 'DEFAULT_BRANCH_UNRESOLVED'; printf '\n=== PR_CHECK ===\n'; gh pr view --json url,title,state 2>/dev/null || echo 'NO_OPEN_PR'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Step 1: Resolve branch and PR state
|
|
47
|
+
|
|
48
|
+
The remote default branch returns something like `origin/main`; strip the `origin/` prefix. If it returned `DEFAULT_BRANCH_UNRESOLVED` or bare `HEAD`, try `gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'`. If both fail, fall back to `main`.
|
|
49
|
+
|
|
50
|
+
Branch routing:
|
|
51
|
+
|
|
52
|
+
- **Detached HEAD** — explain a branch is required and ask whether to create a feature branch. If yes, derive a name from the change content. If no, stop.
|
|
53
|
+
- **On default branch with work to do** (uncommitted, unpushed, or no upstream) — automatically create a feature branch (pushing the default directly is not supported). Derive a name from the change content and continue at Step 3, which handles branch creation safely. Do not ask whether to branch — committing on the default is not an option here.
|
|
54
|
+
- **On default branch with no work** — report no feature branch work and stop.
|
|
55
|
+
- **Feature branch** — continue.
|
|
56
|
+
|
|
57
|
+
Note the existing PR URL from the PR check if `state: OPEN`. Step 5 uses it to route between new-PR and existing-PR application.
|
|
58
|
+
|
|
59
|
+
## Step 2: Determine conventions
|
|
60
|
+
|
|
61
|
+
Match repo style for commit messages and PR titles (project instructions in context > recent commits > conventional commits as default). With conventional commits, default to `fix:` over `feat:` when ambiguous — adding code to remedy broken or missing behavior is `fix:`. Reserve `feat:` for capabilities the user could not previously accomplish. The user may override.
|
|
62
|
+
|
|
63
|
+
## Step 3: Commit and push
|
|
64
|
+
|
|
65
|
+
If on the default branch, branch creation needs to handle stale local `<base>`, unpushed commits on local `<base>`, and uncommitted changes that collide with the fresh remote base. Read `references/branch-creation.md` and follow its decision flow before continuing.
|
|
66
|
+
|
|
67
|
+
Scan changed files for naturally distinct concerns. If they clearly group into separate logical changes, create separate commits (2-3 max). Group at file level only — no `git add -p`. When ambiguous, one commit is fine.
|
|
68
|
+
|
|
69
|
+
Stage and commit each group. **Avoid `git add -A` and `git add .`** — they sweep in `.env`, build artifacts, and generated files:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git add file1 file2 file3 && git commit -m "$(cat <<'EOF'
|
|
73
|
+
commit message here
|
|
74
|
+
EOF
|
|
75
|
+
)"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Then push:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git push -u origin HEAD
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
If the working tree is clean and all commits are already pushed, this step is a no-op.
|
|
85
|
+
|
|
86
|
+
## Step 4: Compose the PR title and body
|
|
87
|
+
|
|
88
|
+
**You MUST read `references/pr-description-writing.md`** in full — the core principle at the top governs every step. The only input it needs from this skill is the PR ref, if one was identified by mode dispatch (description-only with a pasted URL, or description update).
|
|
89
|
+
|
|
90
|
+
**Evidence decision** before composition. CE no longer owns a dedicated capture workflow; modern harnesses provide their own browser, screenshot, terminal recording, and artifact capture tools. Treat evidence as user-supplied context or as validation prose, not as a separate skill dispatch.
|
|
91
|
+
|
|
92
|
+
1. **User supplied evidence** (URL, markdown image/embed, local artifact path they want referenced) — incorporate it into the PR body as `## Demo`, `## Screenshots`, or `## Evidence`, matching the artifact type. Do not invent or upload evidence.
|
|
93
|
+
2. **User explicitly asks to include evidence but has not supplied it** — ask for the URL/markdown/path, or tell them to use the current harness's capture flow and return with the artifact. Do not launch another CE skill.
|
|
94
|
+
3. **Agent judgment on authored changes** — if you authored the commits and know the change is non-observable (internal plumbing, type-only, backend refactor without user-facing effect, docs/markdown/changelog/CI/test-only, pure refactors), skip evidence handling without asking.
|
|
95
|
+
|
|
96
|
+
Otherwise, if the branch diff changes observable behavior (UI, CLI output, API behavior with runnable code, generated artifacts, workflow output), include a concise validation note in the PR body describing what was exercised and how it behaved. If no real run was possible because of unavailable credentials, paid services, deploy-only infrastructure, hardware, or missing local setup, say that plainly in the validation section.
|
|
97
|
+
|
|
98
|
+
Do not block PR creation solely because no visual artifact exists. Test output and manual validation notes are acceptable validation evidence, but do not label test output as "Demo" or "Screenshots."
|
|
99
|
+
|
|
100
|
+
Then continue with the rest of the reference (Steps A through G) to compose the title and body.
|
|
101
|
+
|
|
102
|
+
## Step 5: Apply and report
|
|
103
|
+
|
|
104
|
+
**Description-only mode** — print the title and body. Stop unless the user asks to apply.
|
|
105
|
+
|
|
106
|
+
**New PR** (full workflow, no existing PR from Step 1) — apply per "Applying via gh" below using `gh pr create`. Report the URL.
|
|
107
|
+
|
|
108
|
+
**Existing PR** (full workflow, found in Step 1) — the new commits are already on the PR from Step 3. Report the PR URL, then ask whether to rewrite the description.
|
|
109
|
+
|
|
110
|
+
- **No** — done.
|
|
111
|
+
- **Yes** — run Step 4 if not already done, then preview and apply (see below).
|
|
112
|
+
|
|
113
|
+
**Description update mode, or existing-PR rewrite confirmed** — preview before applying. Ask: "New title: `<title>` (`<N>` chars). Summary leads with: `<first two sentences>`. Total body: `<L>` lines. Apply?" If declined, the user may pass focus text back for a regenerate; do not apply. If confirmed, apply per "Applying via gh" below using `gh pr edit` and report the URL.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Applying via gh
|
|
118
|
+
|
|
119
|
+
The body **must** be written to a temp file and passed via `--body-file <path>`. Never use `--body-file -`, stdin pipes, heredoc-to-stdin, or `--body "$(cat ...)"` — wrappers and stdin handling can silently produce an empty PR body while `gh` still exits 0 and returns a URL.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
BODY_FILE=$(mktemp "${TMPDIR:-/tmp}/ce-pr-body.XXXXXX") && cat >> "$BODY_FILE" <<'__CE_PR_BODY_END__'
|
|
123
|
+
<the composed body markdown goes here, verbatim>
|
|
124
|
+
__CE_PR_BODY_END__
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The quoted sentinel keeps `$VAR`, backticks, and any literal `EOF` inside the body from being expanded.
|
|
128
|
+
|
|
129
|
+
For `<TITLE>`: substitute verbatim. If it contains `"`, `` ` ``, `$`, or `\`, escape them or switch to single quotes.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
gh pr create --title "<TITLE>" --body-file "$BODY_FILE" # new PR
|
|
133
|
+
gh pr edit --title "<TITLE>" --body-file "$BODY_FILE" # existing PR
|
|
134
|
+
```
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Branch creation from default branch
|
|
2
|
+
|
|
3
|
+
Local `<base>` may have stale commits (another session/worktree advanced it) or commits the user authored intending to branch from later. Local git can't distinguish these — ask when unpushed commits are present.
|
|
4
|
+
|
|
5
|
+
## Decision flow
|
|
6
|
+
|
|
7
|
+
### 1. Fetch fresh remote base
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git fetch --no-tags origin <base>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
If fetch fails (network, auth, no remote), use the fallback at the bottom.
|
|
14
|
+
|
|
15
|
+
### 2. Check for unpushed local commits on `<base>`
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
git log origin/<base>..HEAD --oneline
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **Empty output:** set `BASE_REF=origin/<base>` and proceed to step 3.
|
|
22
|
+
- **Non-empty output:** show the commit list and ask (per the "Asking the user" convention in `SKILL.md`):
|
|
23
|
+
|
|
24
|
+
> "Local `<base>` has N unpushed commits not on `origin/<base>`. Carry them onto the new feature branch, or leave them on local `<base>`?"
|
|
25
|
+
|
|
26
|
+
- **Carry forward** → `BASE_REF=HEAD`. The new branch starts from local HEAD, preserving the commits.
|
|
27
|
+
- **Leave on `<base>`** → `BASE_REF=origin/<base>`. The new branch starts clean; commits remain on local `<base>`.
|
|
28
|
+
|
|
29
|
+
Never default silently — carrying foreign commits into a PR is worse than asking again.
|
|
30
|
+
|
|
31
|
+
### 3. Create the feature branch
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
git checkout -b <branch-name> "$BASE_REF"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
If checkout fails because uncommitted changes would be overwritten, stash and retry:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
git stash push -u -m "ce-commit-push-pr: pre-branch <branch-name>"
|
|
41
|
+
git checkout -b <branch-name> "$BASE_REF"
|
|
42
|
+
git stash pop
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
If `git stash pop` reports conflicts, surface the conflict output and the stash ref to the user — do not auto-resolve.
|
|
46
|
+
|
|
47
|
+
## Fetch failure fallback
|
|
48
|
+
|
|
49
|
+
If `git fetch` fails, branch from current local HEAD:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
git checkout -b <branch-name>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Note in the user-facing summary that base freshness was not verified. Skip the unpushed-commits check — without a fresh `origin/<base>`, the answer is unreliable.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# PR Description Writing
|
|
2
|
+
|
|
3
|
+
## The core principle
|
|
4
|
+
|
|
5
|
+
The diff is already visible on GitHub. The description exists to explain what the diff cannot show: what was impossible before and is now possible, what was broken and is now fixed, what shape changed. Cut any sentence a reader could reconstruct from the diff itself.
|
|
6
|
+
|
|
7
|
+
- Bad: "Adds `evidence-decider.ts`, modifies `ce-commit-push-pr/SKILL.md` to call it, and updates two test files."
|
|
8
|
+
- Good: "Evidence capture now decides automatically whether a change has observable behavior. CLI tools and libraries are now eligible alongside web UIs."
|
|
9
|
+
|
|
10
|
+
If the lead sentence describes what was moved, renamed, or added rather than what's now possible or fixed, rewrite it. This applies to every section, not just the opening — restating the diff is the failure mode this skill exists to prevent.
|
|
11
|
+
|
|
12
|
+
For user-facing bugs, run an extra before/after pass before writing the mechanism: name what the user would have seen before and what they now see instead. Only then mention the technical cause or fix, and only if it helps the reviewer understand risk. A lead like "Playback hooks now ignore late async responses" is still too mechanical if the visible bug was "old videos, thumbnails, or errors could appear after switching selections."
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Step Pre-A: Resolve the range and base
|
|
17
|
+
|
|
18
|
+
Two modes:
|
|
19
|
+
|
|
20
|
+
- **Current-branch mode** (default) — describe HEAD vs the repo's default base.
|
|
21
|
+
- **PR mode** — describe a specific PR. Triggered when the caller passes a PR ref.
|
|
22
|
+
|
|
23
|
+
For PR mode, fetch metadata first:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
gh pr view <ref> --json baseRefName,headRefOid,url,body,state,isCrossRepository,headRepositoryOwner
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If `state` is not `OPEN`, report and stop — do not invent a description. Use `baseRefName` as `<base>` and `headRefOid` as `<head>`.
|
|
30
|
+
|
|
31
|
+
For current-branch mode, resolve `<base>` in priority order: caller-supplied (`base:<ref>`) → `git rev-parse --abbrev-ref origin/HEAD` (strip `origin/`) → `gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'` → try `main`/`master`/`develop` via `git rev-parse --verify origin/<candidate>`. If none resolve, ask the user. `<head>` is `HEAD`.
|
|
32
|
+
|
|
33
|
+
**Base remote:** `origin` for current-branch mode and same-repo PRs. For fork PRs, match the PR's base owner/repo against `git remote -v`. If no local remote matches, skip to the `gh` fallback — do not diff against `origin` (wrong base).
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
git fetch --no-tags <base-remote> <base>
|
|
37
|
+
git fetch --no-tags <base-remote> <head> # PR mode only: <head> is headRefOid and may not be local
|
|
38
|
+
git log --oneline "<base-remote>/<base>..<head>"
|
|
39
|
+
git diff "<base-remote>/<base>...<head>"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
If the commit list is empty, report "No commits to describe" and stop.
|
|
43
|
+
|
|
44
|
+
**Fallback** — use `gh pr diff <ref>` and `gh pr view <ref> --json commits` when local git can't reach the refs (fork PR with no matching remote, shallow clone, offline, merge-base on unrelated histories). For GHES configurations that reject SHA fetch but allow `refs/pull/`:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
git fetch --no-tags <base-remote> "refs/pull/<number>/head"
|
|
48
|
+
PR_HEAD_SHA=$(awk '/refs\/pull\/[0-9]+\/head/ {print $1; exit}' "$(git rev-parse --git-dir)/FETCH_HEAD")
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Note in the user-facing summary when the API fallback was used.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Step A: Size the description
|
|
56
|
+
|
|
57
|
+
Match weight to weight. When in doubt, shorter wins. Subtract fix-up commits (review fixes, lint, rebase resolutions) when sizing — they're invisible to the reader. Large PRs need more selectivity, not more content.
|
|
58
|
+
|
|
59
|
+
| Change profile | Description approach |
|
|
60
|
+
|---|---|
|
|
61
|
+
| Small + simple (typo, config, dep bump) | 1-2 sentences, no headers. Under ~300 characters. |
|
|
62
|
+
| Small + non-trivial (bugfix, behavioral change) | 3-5 sentences. No headers unless two distinct concerns. |
|
|
63
|
+
| Medium feature or refactor | Narrative frame, then what changed and why. Call out design decisions. |
|
|
64
|
+
| Large or architecturally significant | Narrative frame + 3-5 design-decision callouts + brief test summary. Target ~100 lines, cap ~150. For PRs with many mechanisms, use a Summary table; do not create an H3 per mechanism. |
|
|
65
|
+
| Performance improvement | Include before/after measurements as a markdown table. |
|
|
66
|
+
|
|
67
|
+
For small + simple PRs, the value-led sentence is the entire description.
|
|
68
|
+
For small + non-trivial bugfixes, the 3-5 sentence target still needs a user-visible before/after lead when the bug affected UI, CLI output, workflow output, or any other user-observable behavior. Concision is not a reason to skip the visible symptom.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Step B: Compose the title
|
|
73
|
+
|
|
74
|
+
`type: description` or `type(scope): description`.
|
|
75
|
+
|
|
76
|
+
- Type by intent, not file extension. When `fix` and `feat` both seem to fit, default to `fix` — adding code to remedy missing behavior is `fix`. Reserve `feat` for capabilities the user could not previously accomplish. Use `refactor`/`docs`/`chore`/`perf`/`test` when more precise.
|
|
77
|
+
- Scope (optional): narrowest useful label. Omit when no single label adds clarity.
|
|
78
|
+
- Description: imperative, lowercase, under 72 chars, no trailing period.
|
|
79
|
+
- Match repo conventions visible in recent commits.
|
|
80
|
+
- **Never use `!` or `BREAKING CHANGE:` without explicit user confirmation** — they trigger automated major-version bumps.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Step C: Assemble the body
|
|
85
|
+
|
|
86
|
+
In order: opening → body sections that earn their keep → test plan if non-obvious → evidence block if one exists → Compound Engineering badge after a `---` rule.
|
|
87
|
+
|
|
88
|
+
The opening goes under `## Summary` if the body uses any `##` headings; bare paragraph otherwise. No orphaned opening paragraphs above the first heading.
|
|
89
|
+
|
|
90
|
+
**Evidence handling:** preserve any existing `## Demo` or `## Screenshots` block verbatim unless the user's focus asks to refresh it. If the caller passed a freshly captured URL or path, splice as `## Demo`. Otherwise omit. Place before the badge. Never label test output as "Demo" or "Screenshots."
|
|
91
|
+
|
|
92
|
+
**Visual aids:** reach for a diagram or table when it conveys the change faster than prose — relationships, flows, state transitions, sequences, trade-offs, before/after data, or any structure prose would have to enumerate. Mermaid and markdown tables cover most shapes; don't be limited to a particular type if a different one fits the change better. Place inline at the point of relevance. Skip for simple, prose-clear, or rename/dep-bump changes. Prose is authoritative when it conflicts with a visual.
|
|
93
|
+
|
|
94
|
+
**GitHub gotchas:** never prefix list items with `#` (GitHub auto-links `#1` as an issue ref). Use `org/repo#123` or full URL for actual references.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Step D: Badge
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
[](https://github.com/EveryInc/compound-engineering-plugin)
|
|
104
|
+

|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
| Harness | `LOGO` | `COLOR` |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| Claude Code | `claude` | `D97757` |
|
|
110
|
+
| Codex | (omit `?logo=` param) | `000000` |
|
|
111
|
+
| Antigravity CLI (`agy`) | `googlegemini` | `4285F4` |
|
|
112
|
+
|
|
113
|
+
**Model slug:** spaces become underscores; append context window and thinking level in parens if known. **URL-encode literal parens as `%28` / `%29`** — unencoded parens inside markdown image URLs break release-please's commit parser, which silently drops the commit from the changelog. Examples: `Opus_4.6_%281M,_Extended_Thinking%29`, `Sonnet_4.6_%28200K%29`, `Gemini_3.1_Pro`.
|
|
114
|
+
|
|
115
|
+
Skip the badge if regenerating a body that already contains it.
|