@theodo/bernard 0.1.0-beta.0 → 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -12
- package/core/README.md +1 -1
- package/core/agents/review-quality.md +13 -12
- package/core/agents/review-security-bugs.md +1 -1
- package/core/agents/review-tests.md +1 -1
- package/core/coder/template/main.tf +14 -1
- package/core/skills/pull-request/SKILL.md +17 -7
- package/core/skills/pull-request/ci-fixer.md +3 -3
- package/dist/bin.mjs +4979 -3176
- package/dist/{config-BawD0TwQ.mjs → config-DtCwJKWe.mjs} +70 -6
- package/dist/config.d.mts +72 -4
- package/dist/config.mjs +1 -1
- package/dist/docs/404.html +23 -0
- package/dist/docs/CLAUDE.html +30 -0
- package/dist/docs/CONTEXT.html +30 -0
- package/dist/docs/CONTRIBUTING.html +62 -0
- package/dist/docs/assets/CLAUDE.md.BLSB-5gK.js +1 -0
- package/dist/docs/assets/CLAUDE.md.BLSB-5gK.lean.js +1 -0
- package/dist/docs/assets/CONTEXT.md.BovnvMGK.js +1 -0
- package/dist/docs/assets/CONTEXT.md.BovnvMGK.lean.js +1 -0
- package/dist/docs/assets/CONTRIBUTING.md.DwJsKrz3.js +33 -0
- package/dist/docs/assets/CONTRIBUTING.md.DwJsKrz3.lean.js +1 -0
- package/dist/docs/assets/app.URmpjWHb.js +312 -0
- package/dist/docs/assets/bernard.RCgrvDdX.svg +94 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.Ylq685Cw.js +1 -0
- package/dist/docs/assets/chunks/VPLocalSearchBox.C8gcRVj0.js +9 -0
- package/dist/docs/assets/chunks/dagre-GXQ25YYZ.2qvw8AqH.js +4 -0
- package/dist/docs/assets/chunks/framework.hgjl6W6o.js +20 -0
- package/dist/docs/assets/chunks/sizeCapture-INFHLROL.BEqL2zFi.js +1 -0
- package/dist/docs/assets/chunks/stateDiagram-v2-MP3YSRHH.3X7wNXKX.js +231 -0
- package/dist/docs/assets/chunks/theme.Cksh_UJH.js +2 -0
- package/dist/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js +1 -0
- package/dist/docs/assets/core_README.md.DyxYsikc.js +15 -0
- package/dist/docs/assets/core_README.md.DyxYsikc.lean.js +1 -0
- package/dist/docs/assets/demo_README.md.Cpi2pUU9.js +18 -0
- package/dist/docs/assets/demo_README.md.Cpi2pUU9.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0001-what-the-core-is-built-for.md.BxOoMjST.js +1 -0
- package/dist/docs/assets/docs_adr_0001-what-the-core-is-built-for.md.BxOoMjST.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0002-which-harness-a-project-runs-on.md.2GwF-nj0.js +1 -0
- package/dist/docs/assets/docs_adr_0002-which-harness-a-project-runs-on.md.2GwF-nj0.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0003-how-core-content-reaches-each-harness.md.BMWE00Mf.js +1 -0
- package/dist/docs/assets/docs_adr_0003-how-core-content-reaches-each-harness.md.BMWE00Mf.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0004-how-the-core-uses-external-tools.md.B7dtE7MB.js +1 -0
- package/dist/docs/assets/docs_adr_0004-how-the-core-uses-external-tools.md.B7dtE7MB.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0005-what-drives-the-pipeline.md.DGn0CJeq.js +1 -0
- package/dist/docs/assets/docs_adr_0005-what-drives-the-pipeline.md.DGn0CJeq.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0006-what-steps-hand-off-to-each-other.md.BflT5ugJ.js +1 -0
- package/dist/docs/assets/docs_adr_0006-what-steps-hand-off-to-each-other.md.BflT5ugJ.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0007-how-humans-take-part-in-the-pipeline.md.CNX3gUD-.js +1 -0
- package/dist/docs/assets/docs_adr_0007-how-humans-take-part-in-the-pipeline.md.CNX3gUD-.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0008-where-a-steps-reviewers-run.md.aGbaBOpB.js +1 -0
- package/dist/docs/assets/docs_adr_0008-where-a-steps-reviewers-run.md.aGbaBOpB.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0009-where-pipeline-state-and-handoffs-live.md.C3tKmV-E.js +1 -0
- package/dist/docs/assets/docs_adr_0009-where-pipeline-state-and-handoffs-live.md.C3tKmV-E.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0010-how-a-project-adapts-the-core.md.Bp7N6tUE.js +1 -0
- package/dist/docs/assets/docs_adr_0010-how-a-project-adapts-the-core.md.Bp7N6tUE.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0011-how-the-factory-is-packaged-and-versioned.md.BBJIwnqa.js +1 -0
- package/dist/docs/assets/docs_adr_0011-how-the-factory-is-packaged-and-versioned.md.BBJIwnqa.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md.uCyrBfug.js +1 -0
- package/dist/docs/assets/docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md.uCyrBfug.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0013-when-code-lands.md.oXgiobfz.js +1 -0
- package/dist/docs/assets/docs_adr_0013-when-code-lands.md.oXgiobfz.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0014-what-a-step-may-change.md.Zslg3bnJ.js +1 -0
- package/dist/docs/assets/docs_adr_0014-what-a-step-may-change.md.Zslg3bnJ.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0015-how-a-project-shapes-its-ticket-flow.md.DNHMxwIT.js +1 -0
- package/dist/docs/assets/docs_adr_0015-how-a-project-shapes-its-ticket-flow.md.DNHMxwIT.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0016-which-core-the-factory-repo-runs.md.CLN6LqBZ.js +1 -0
- package/dist/docs/assets/docs_adr_0016-which-core-the-factory-repo-runs.md.CLN6LqBZ.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0017-where-a-tickets-record-lives.md.jjUeM-ex.js +1 -0
- package/dist/docs/assets/docs_adr_0017-where-a-tickets-record-lives.md.jjUeM-ex.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0018-the-products-name.md.6xaX9vDs.js +1 -0
- package/dist/docs/assets/docs_adr_0018-the-products-name.md.6xaX9vDs.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0019-how-a-finding-is-answered-and-judged.md.CKKoO9-3.js +1 -0
- package/dist/docs/assets/docs_adr_0019-how-a-finding-is-answered-and-judged.md.CKKoO9-3.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0020-how-an-interrupted-run-resumes.md.DTIP-MBK.js +1 -0
- package/dist/docs/assets/docs_adr_0020-how-an-interrupted-run-resumes.md.DTIP-MBK.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0021-how-a-step-runs-in-its-workspace.md.B2r3-FPg.js +1 -0
- package/dist/docs/assets/docs_adr_0021-how-a-step-runs-in-its-workspace.md.B2r3-FPg.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0022-who-names-the-branches.md.DaVk8X0i.js +1 -0
- package/dist/docs/assets/docs_adr_0022-who-names-the-branches.md.DaVk8X0i.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0023-how-a-version-ships-before-npm.md.C7-wuCbq.js +1 -0
- package/dist/docs/assets/docs_adr_0023-how-a-version-ships-before-npm.md.C7-wuCbq.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0024-how-the-config-type-carries-its-docs.md.CQmwhWXs.js +1 -0
- package/dist/docs/assets/docs_adr_0024-how-the-config-type-carries-its-docs.md.CQmwhWXs.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md.CgXYdF2v.js +1 -0
- package/dist/docs/assets/docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md.CgXYdF2v.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0026-support-for-github-copilot.md.DJsawm-R.js +1 -0
- package/dist/docs/assets/docs_adr_0026-support-for-github-copilot.md.DJsawm-R.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0027-which-forge-a-project-is-on.md.CY0qy9xh.js +1 -0
- package/dist/docs/assets/docs_adr_0027-which-forge-a-project-is-on.md.CY0qy9xh.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0028-several-ticket-flows-in-one-pipeline.md.oxffo2qg.js +1 -0
- package/dist/docs/assets/docs_adr_0028-several-ticket-flows-in-one-pipeline.md.oxffo2qg.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0029-the-branch-a-feature-works-on.md.CrgkP6YJ.js +1 -0
- package/dist/docs/assets/docs_adr_0029-the-branch-a-feature-works-on.md.CrgkP6YJ.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0030-a-runner-without-coder.md.CW8sF7jK.js +1 -0
- package/dist/docs/assets/docs_adr_0030-a-runner-without-coder.md.CW8sF7jK.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0031-how-the-run-viewer-reads-its-runs.md.opQYnVF2.js +1 -0
- package/dist/docs/assets/docs_adr_0031-how-the-run-viewer-reads-its-runs.md.opQYnVF2.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0032-how-a-project-gets-the-viewer.md.DB9NjYJf.js +1 -0
- package/dist/docs/assets/docs_adr_0032-how-a-project-gets-the-viewer.md.DB9NjYJf.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0033-the-repos-license.md.NPlkrPj8.js +1 -0
- package/dist/docs/assets/docs_adr_0033-the-repos-license.md.NPlkrPj8.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0034-how-code-review-launches-its-reviewers.md.DSNpkfaL.js +1 -0
- package/dist/docs/assets/docs_adr_0034-how-code-review-launches-its-reviewers.md.DSNpkfaL.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0035-how-the-package-is-published.md.C1f4B5eb.js +1 -0
- package/dist/docs/assets/docs_adr_0035-how-the-package-is-published.md.C1f4B5eb.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0036-what-the-cores-pull-request-skill-does.md.op39HLAT.js +1 -0
- package/dist/docs/assets/docs_adr_0036-what-the-cores-pull-request-skill-does.md.op39HLAT.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0037-how-a-team-reads-the-factorys-documentation.md.Dar_Xo4t.js +1 -0
- package/dist/docs/assets/docs_adr_0037-how-a-team-reads-the-factorys-documentation.md.Dar_Xo4t.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0038-where-adapters-live.md.CkVD3riv.js +1 -0
- package/dist/docs/assets/docs_adr_0038-where-adapters-live.md.CkVD3riv.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0039-the-repos-license.md.C_rraWpb.js +1 -0
- package/dist/docs/assets/docs_adr_0039-the-repos-license.md.C_rraWpb.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0040-how-a-version-is-released.md.CCdwC07z.js +1 -0
- package/dist/docs/assets/docs_adr_0040-how-a-version-is-released.md.CCdwC07z.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0041-who-opens-the-features-pull-request.md.qLu9WLaG.js +1 -0
- package/dist/docs/assets/docs_adr_0041-who-opens-the-features-pull-request.md.qLu9WLaG.lean.js +1 -0
- package/dist/docs/assets/docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md.DJWazI4H.js +1 -0
- package/dist/docs/assets/docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md.DJWazI4H.lean.js +1 -0
- package/dist/docs/assets/docs_getting-started.md.BpQFS8Gr.js +12 -0
- package/dist/docs/assets/docs_getting-started.md.BpQFS8Gr.lean.js +1 -0
- package/dist/docs/assets/docs_github.md.D4gkW71G.js +1 -0
- package/dist/docs/assets/docs_github.md.D4gkW71G.lean.js +1 -0
- package/dist/docs/assets/docs_overlay.md.DoWVb6OM.js +35 -0
- package/dist/docs/assets/docs_overlay.md.DoWVb6OM.lean.js +1 -0
- package/dist/docs/assets/docs_pipeline.md.DdHywWSk.js +1 -0
- package/dist/docs/assets/docs_pipeline.md.DdHywWSk.lean.js +1 -0
- package/dist/docs/assets/docs_recipes.md.8Xf6BsRA.js +45 -0
- package/dist/docs/assets/docs_recipes.md.8Xf6BsRA.lean.js +1 -0
- package/dist/docs/assets/fixtures_README.md.DzbQ0hft.js +1 -0
- package/dist/docs/assets/fixtures_README.md.DzbQ0hft.lean.js +1 -0
- package/dist/docs/assets/index.md.DHgL6CzS.js +28 -0
- package/dist/docs/assets/index.md.DHgL6CzS.lean.js +1 -0
- package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/dist/docs/assets/packages_docs_README.md.PV1a27nC.js +3 -0
- package/dist/docs/assets/packages_docs_README.md.PV1a27nC.lean.js +1 -0
- package/dist/docs/assets/packages_viewer_README.md.BynKZSdN.js +3 -0
- package/dist/docs/assets/packages_viewer_README.md.BynKZSdN.lean.js +1 -0
- package/dist/docs/assets/style.C3E8Ltp6.css +1 -0
- package/dist/docs/bernard.svg +94 -0
- package/dist/docs/core/README.html +44 -0
- package/dist/docs/demo/README.html +47 -0
- package/dist/docs/docs/adr/0001-what-the-core-is-built-for.html +30 -0
- package/dist/docs/docs/adr/0002-which-harness-a-project-runs-on.html +30 -0
- package/dist/docs/docs/adr/0003-how-core-content-reaches-each-harness.html +30 -0
- package/dist/docs/docs/adr/0004-how-the-core-uses-external-tools.html +30 -0
- package/dist/docs/docs/adr/0005-what-drives-the-pipeline.html +30 -0
- package/dist/docs/docs/adr/0006-what-steps-hand-off-to-each-other.html +30 -0
- package/dist/docs/docs/adr/0007-how-humans-take-part-in-the-pipeline.html +30 -0
- package/dist/docs/docs/adr/0008-where-a-steps-reviewers-run.html +30 -0
- package/dist/docs/docs/adr/0009-where-pipeline-state-and-handoffs-live.html +30 -0
- package/dist/docs/docs/adr/0010-how-a-project-adapts-the-core.html +30 -0
- package/dist/docs/docs/adr/0011-how-the-factory-is-packaged-and-versioned.html +30 -0
- package/dist/docs/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed.html +30 -0
- package/dist/docs/docs/adr/0013-when-code-lands.html +30 -0
- package/dist/docs/docs/adr/0014-what-a-step-may-change.html +30 -0
- package/dist/docs/docs/adr/0015-how-a-project-shapes-its-ticket-flow.html +30 -0
- package/dist/docs/docs/adr/0016-which-core-the-factory-repo-runs.html +30 -0
- package/dist/docs/docs/adr/0017-where-a-tickets-record-lives.html +30 -0
- package/dist/docs/docs/adr/0018-the-products-name.html +30 -0
- package/dist/docs/docs/adr/0019-how-a-finding-is-answered-and-judged.html +30 -0
- package/dist/docs/docs/adr/0020-how-an-interrupted-run-resumes.html +30 -0
- package/dist/docs/docs/adr/0021-how-a-step-runs-in-its-workspace.html +30 -0
- package/dist/docs/docs/adr/0022-who-names-the-branches.html +30 -0
- package/dist/docs/docs/adr/0023-how-a-version-ships-before-npm.html +30 -0
- package/dist/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html +30 -0
- package/dist/docs/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.html +30 -0
- package/dist/docs/docs/adr/0026-support-for-github-copilot.html +30 -0
- package/dist/docs/docs/adr/0027-which-forge-a-project-is-on.html +30 -0
- package/dist/docs/docs/adr/0028-several-ticket-flows-in-one-pipeline.html +30 -0
- package/dist/docs/docs/adr/0029-the-branch-a-feature-works-on.html +30 -0
- package/dist/docs/docs/adr/0030-a-runner-without-coder.html +30 -0
- package/dist/docs/docs/adr/0031-how-the-run-viewer-reads-its-runs.html +30 -0
- package/dist/docs/docs/adr/0032-how-a-project-gets-the-viewer.html +30 -0
- package/dist/docs/docs/adr/0033-the-repos-license.html +30 -0
- package/dist/docs/docs/adr/0034-how-code-review-launches-its-reviewers.html +30 -0
- package/dist/docs/docs/adr/0035-how-the-package-is-published.html +30 -0
- package/dist/docs/docs/adr/0036-what-the-cores-pull-request-skill-does.html +30 -0
- package/dist/docs/docs/adr/0037-how-a-team-reads-the-factorys-documentation.html +30 -0
- package/dist/docs/docs/adr/0038-where-adapters-live.html +30 -0
- package/dist/docs/docs/adr/0039-the-repos-license.html +30 -0
- package/dist/docs/docs/adr/0040-how-a-version-is-released.html +30 -0
- package/dist/docs/docs/adr/0041-who-opens-the-features-pull-request.html +30 -0
- package/dist/docs/docs/adr/0042-how-secrets-are-kept-out-of-committed-records.html +30 -0
- package/dist/docs/docs/getting-started.html +41 -0
- package/dist/docs/docs/github.html +30 -0
- package/dist/docs/docs/overlay.html +64 -0
- package/dist/docs/docs/pipeline.html +30 -0
- package/dist/docs/docs/recipes.html +74 -0
- package/dist/docs/fixtures/README.html +30 -0
- package/dist/docs/hashmap.json +1 -0
- package/dist/docs/index.html +57 -0
- package/dist/docs/packages/docs/README.html +32 -0
- package/dist/docs/packages/viewer/README.html +32 -0
- package/dist/docs/vp-icons.css +0 -0
- package/dist/viewer/assets/Heading-C5Va5XMQ.js +1 -0
- package/dist/viewer/assets/SelectionIndicator-DxHiKGW_.js +1 -0
- package/dist/viewer/assets/alert-BI2omIo2.js +1 -0
- package/dist/viewer/assets/attempt-Dunc67N6.js +1 -0
- package/dist/viewer/assets/card-IsZ2ZhSn.js +1 -0
- package/dist/viewer/assets/{chunk-WQQL4CDK-DSpW9ZO8.js → chunk-WQQL4CDK-Bd4bkond.js} +1 -1
- package/dist/viewer/assets/context-CzP3x3DO.js +7 -0
- package/dist/viewer/assets/{dagre-NK4GIZVX-BzzW8pOj.js → dagre-NK4GIZVX-Bhq8pl9Y.js} +1 -1
- package/dist/viewer/assets/{index-CnzUhLCJ.css → index-B90XVeY-.css} +1 -1
- package/dist/viewer/assets/index-tH-KNwJL.js +10 -0
- package/dist/viewer/assets/{mermaid.core-D1FXi6mg.js → mermaid.core-I426eCuN.js} +4 -4
- package/dist/viewer/assets/pipeline-Hw_7tocN.js +1 -0
- package/dist/viewer/assets/routes-BOl7_JgK.js +1 -0
- package/dist/viewer/assets/runs._runId-D4q1mLCt.js +6 -0
- package/dist/viewer/assets/runs._runId.index-B-woIhKA.js +1 -0
- package/dist/viewer/assets/runs._runId.machines-SkWqrTI6.js +2 -0
- package/dist/viewer/assets/runs._runId.sessions-DBVWEbLY.js +1 -0
- package/dist/viewer/assets/{stateDiagram-v2-A6IESKWZ-J9KnYRFT.js → stateDiagram-v2-A6IESKWZ-DUwIje_A.js} +1 -1
- package/dist/viewer/assets/surface-B6LupC_E.js +1 -0
- package/dist/viewer/assets/table-B8t5lQz5.js +1 -0
- package/dist/viewer/assets/useEvent-DXj38gmC.js +1 -0
- package/dist/viewer/assets/useToggleState-D_NUC1vr.js +2 -0
- package/dist/viewer/index.html +5 -5
- package/fixtures/starters/azure-devops/.factory/factory.config.ts +2 -7
- package/fixtures/starters/azure-devops/.factory/factory.lock.json +7 -8
- package/fixtures/starters/github/.factory/factory.config.ts +2 -0
- package/fixtures/starters/github/.factory/factory.lock.json +6 -7
- package/fixtures/starters/gitlab/.factory/factory.config.ts +9 -0
- package/fixtures/starters/gitlab/.factory/factory.lock.json +19 -0
- package/fixtures/starters/gitlab/.factory/slots/checks.command.md +1 -0
- package/fixtures/starters/gitlab/.factory/slots/context.sources.md +3 -0
- package/fixtures/starters/gitlab/.factory/slots/review.detectors.md +5 -0
- package/package.json +9 -7
- package/core/skills/pull-request/scripts/pr-drive.sh +0 -208
- package/dist/viewer/assets/Heading-Dm1Q0gV2.js +0 -1
- package/dist/viewer/assets/api-C4lMOGdC.js +0 -7
- package/dist/viewer/assets/attempt-lbW5voCR.js +0 -1
- package/dist/viewer/assets/card-CtJKot3P.js +0 -1
- package/dist/viewer/assets/context-DEB-Y3Iz.js +0 -1
- package/dist/viewer/assets/index-Co9KwXRI.js +0 -10
- package/dist/viewer/assets/jsx-runtime-CkXRJ162.js +0 -1
- package/dist/viewer/assets/pipeline-B-myvM6K.js +0 -1
- package/dist/viewer/assets/routes-BzvVN6y-.js +0 -1
- package/dist/viewer/assets/runs._runId-BVT2VH_w.js +0 -6
- package/dist/viewer/assets/runs._runId.index-C3bbzwAC.js +0 -1
- package/dist/viewer/assets/runs._runId.machines-Cj21KdLd.js +0 -2
- package/dist/viewer/assets/runs._runId.sessions-Tg6Ou3_9.js +0 -1
- package/dist/viewer/assets/table-DzduWiYu.js +0 -1
- package/dist/viewer/assets/useEvent-CtTfOmE7.js +0 -1
- package/dist/viewer/assets/useToggleState-DfzJwOaN.js +0 -2
- package/fixtures/starters/azure-devops/.factory/skills/pull-request/SKILL.md +0 -29
|
@@ -4,12 +4,7 @@ import { defineConfig } from '@theodo/bernard/config'
|
|
|
4
4
|
export default defineConfig({
|
|
5
5
|
harness: 'claude-code',
|
|
6
6
|
project: { name: 'Starter', language: 'English' },
|
|
7
|
+
// The env vars whose values never reach a committed record: the harnesses' credentials.
|
|
7
8
|
paths: { features: 'docs/features', scratch: 'tmp/factory' },
|
|
8
|
-
|
|
9
|
-
{
|
|
10
|
-
kind: 'skill',
|
|
11
|
-
name: 'pull-request',
|
|
12
|
-
reason: 'The core skill is for GitHub: this one opens the pull request and reads its checks with az.',
|
|
13
|
-
},
|
|
14
|
-
],
|
|
9
|
+
adapters: { forge: { type: 'azure-devops' } },
|
|
15
10
|
})
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
{
|
|
2
|
-
"factoryVersion": "0.1.0-beta.
|
|
2
|
+
"factoryVersion": "0.1.0-beta.1",
|
|
3
3
|
"harness": "claude-code",
|
|
4
4
|
"files": {
|
|
5
|
-
".claude/agents/review-quality.md": "
|
|
6
|
-
".claude/agents/review-security-bugs.md": "
|
|
7
|
-
".claude/agents/review-tests.md": "
|
|
5
|
+
".claude/agents/review-quality.md": "5e60851f7fdb7631d3ad2744b25d166a465dab96d0b773b86c30b4cdc5b49f91",
|
|
6
|
+
".claude/agents/review-security-bugs.md": "a798989c857338eeca332fe12e2076f9338cda01bf7b22daa5cdec9596e29377",
|
|
7
|
+
".claude/agents/review-tests.md": "42049ef5d8f4a056e47413d3f2c8b31127521b0f4ba39668698c428bdbad2c83",
|
|
8
8
|
".claude/skills/apply-review/SKILL.md": "c1defaaf8eb0a414957b19eddaee2285ab72e5e5ca4abe8cef78e7593093f8d1",
|
|
9
9
|
".claude/skills/code-review/scripts/build-bundle.mjs": "c5494a285270713a0c815e5b47d4356e860a46b8217ebab0072035a67f7d4119",
|
|
10
10
|
".claude/skills/code-review/SKILL.md": "bb27fee3132069018924547334e56343641fafead21ca3f928aeb9e591a24501",
|
|
11
11
|
".claude/skills/implement/SKILL.md": "745c6b321d99d642456e531f4ee73a896b22b8ddd3656ad3e9c850c563be9835",
|
|
12
|
-
".claude/skills/pull-request/
|
|
12
|
+
".claude/skills/pull-request/ci-fixer.md": "0c76aa570c591db3552171aa6101db96aa0fb6c10a9f30e3f6ba2b069750120c",
|
|
13
|
+
".claude/skills/pull-request/SKILL.md": "d2e0711ae1c1b3b746128706771f4ccf1eac0631287a76b9967d89f1bf9b6bda",
|
|
13
14
|
".claude/skills/tickets/SKILL.md": "a5fd39be5fb13beccf46367179f03d18f3482a04075c7bfd17e8b268b4387830",
|
|
14
15
|
".claude/skills/validate/SKILL.md": "136785536d5c1835e25dde6d09316087096eaa0197bff80b681ac8063c01ccc9"
|
|
15
16
|
},
|
|
16
|
-
"overrides": {
|
|
17
|
-
"skill:pull-request": "ca515b516b11c88c6e54e7afab40613e3c43f5af630381724c3abcabee6d3bad"
|
|
18
|
-
},
|
|
17
|
+
"overrides": {},
|
|
19
18
|
"defaultDelivery": "2a55e6688f5be8fb867076555d0f54802b27afe15b532952ffcf3ac20f4f3e6a"
|
|
20
19
|
}
|
|
@@ -4,5 +4,7 @@ import { defineConfig } from '@theodo/bernard/config'
|
|
|
4
4
|
export default defineConfig({
|
|
5
5
|
harness: 'claude-code',
|
|
6
6
|
project: { name: 'Starter', language: 'English' },
|
|
7
|
+
// The env vars whose values never reach a committed record: the harnesses' credentials.
|
|
7
8
|
paths: { features: 'docs/features', scratch: 'tmp/factory' },
|
|
9
|
+
adapters: { forge: { type: 'github' } },
|
|
8
10
|
})
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"factoryVersion": "0.1.0-beta.
|
|
2
|
+
"factoryVersion": "0.1.0-beta.1",
|
|
3
3
|
"harness": "claude-code",
|
|
4
4
|
"files": {
|
|
5
|
-
".claude/agents/review-quality.md": "
|
|
6
|
-
".claude/agents/review-security-bugs.md": "
|
|
7
|
-
".claude/agents/review-tests.md": "
|
|
5
|
+
".claude/agents/review-quality.md": "5e60851f7fdb7631d3ad2744b25d166a465dab96d0b773b86c30b4cdc5b49f91",
|
|
6
|
+
".claude/agents/review-security-bugs.md": "a798989c857338eeca332fe12e2076f9338cda01bf7b22daa5cdec9596e29377",
|
|
7
|
+
".claude/agents/review-tests.md": "42049ef5d8f4a056e47413d3f2c8b31127521b0f4ba39668698c428bdbad2c83",
|
|
8
8
|
".claude/skills/apply-review/SKILL.md": "c1defaaf8eb0a414957b19eddaee2285ab72e5e5ca4abe8cef78e7593093f8d1",
|
|
9
9
|
".claude/skills/code-review/scripts/build-bundle.mjs": "c5494a285270713a0c815e5b47d4356e860a46b8217ebab0072035a67f7d4119",
|
|
10
10
|
".claude/skills/code-review/SKILL.md": "bb27fee3132069018924547334e56343641fafead21ca3f928aeb9e591a24501",
|
|
11
11
|
".claude/skills/implement/SKILL.md": "745c6b321d99d642456e531f4ee73a896b22b8ddd3656ad3e9c850c563be9835",
|
|
12
|
-
".claude/skills/pull-request/ci-fixer.md": "
|
|
13
|
-
".claude/skills/pull-request/
|
|
14
|
-
".claude/skills/pull-request/SKILL.md": "244c24715b66c37c5d251aaf19c41543d56307cc300c61276fe65820cd630f1d",
|
|
12
|
+
".claude/skills/pull-request/ci-fixer.md": "0c76aa570c591db3552171aa6101db96aa0fb6c10a9f30e3f6ba2b069750120c",
|
|
13
|
+
".claude/skills/pull-request/SKILL.md": "d2e0711ae1c1b3b746128706771f4ccf1eac0631287a76b9967d89f1bf9b6bda",
|
|
15
14
|
".claude/skills/tickets/SKILL.md": "a5fd39be5fb13beccf46367179f03d18f3482a04075c7bfd17e8b268b4387830",
|
|
16
15
|
".claude/skills/validate/SKILL.md": "136785536d5c1835e25dde6d09316087096eaa0197bff80b681ac8063c01ccc9"
|
|
17
16
|
},
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { defineConfig } from '@theodo/bernard/config'
|
|
2
|
+
|
|
3
|
+
// Every field is described in docs/overlay.md. The ones left out take the core's defaults.
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
harness: 'claude-code',
|
|
6
|
+
project: { name: 'Starter', language: 'English' },
|
|
7
|
+
paths: { features: 'docs/features', scratch: 'tmp/factory' },
|
|
8
|
+
adapters: { forge: { type: 'gitlab' } },
|
|
9
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"factoryVersion": "0.1.0-beta.1",
|
|
3
|
+
"harness": "claude-code",
|
|
4
|
+
"files": {
|
|
5
|
+
".claude/agents/review-quality.md": "5e60851f7fdb7631d3ad2744b25d166a465dab96d0b773b86c30b4cdc5b49f91",
|
|
6
|
+
".claude/agents/review-security-bugs.md": "a798989c857338eeca332fe12e2076f9338cda01bf7b22daa5cdec9596e29377",
|
|
7
|
+
".claude/agents/review-tests.md": "42049ef5d8f4a056e47413d3f2c8b31127521b0f4ba39668698c428bdbad2c83",
|
|
8
|
+
".claude/skills/apply-review/SKILL.md": "c1defaaf8eb0a414957b19eddaee2285ab72e5e5ca4abe8cef78e7593093f8d1",
|
|
9
|
+
".claude/skills/code-review/scripts/build-bundle.mjs": "c5494a285270713a0c815e5b47d4356e860a46b8217ebab0072035a67f7d4119",
|
|
10
|
+
".claude/skills/code-review/SKILL.md": "bb27fee3132069018924547334e56343641fafead21ca3f928aeb9e591a24501",
|
|
11
|
+
".claude/skills/implement/SKILL.md": "745c6b321d99d642456e531f4ee73a896b22b8ddd3656ad3e9c850c563be9835",
|
|
12
|
+
".claude/skills/pull-request/ci-fixer.md": "0c76aa570c591db3552171aa6101db96aa0fb6c10a9f30e3f6ba2b069750120c",
|
|
13
|
+
".claude/skills/pull-request/SKILL.md": "d2e0711ae1c1b3b746128706771f4ccf1eac0631287a76b9967d89f1bf9b6bda",
|
|
14
|
+
".claude/skills/tickets/SKILL.md": "a5fd39be5fb13beccf46367179f03d18f3482a04075c7bfd17e8b268b4387830",
|
|
15
|
+
".claude/skills/validate/SKILL.md": "136785536d5c1835e25dde6d09316087096eaa0197bff80b681ac8063c01ccc9"
|
|
16
|
+
},
|
|
17
|
+
"overrides": {},
|
|
18
|
+
"defaultDelivery": "2a55e6688f5be8fb867076555d0f54802b27afe15b532952ffcf3ac20f4f3e6a"
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
`pnpm check`, which runs the formatter, the linter, the type-checker and the unit tests.
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theodo/bernard",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
4
|
"description": "Bernard the taktician: an agentic factory for new builds and legacy migrations.",
|
|
5
5
|
"license": "PolyForm-Shield-1.0.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/theodo-group/
|
|
8
|
+
"url": "git+https://github.com/theodo-group/bernard.git"
|
|
9
9
|
},
|
|
10
10
|
"type": "module",
|
|
11
11
|
"publishConfig": {
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"dist",
|
|
28
28
|
"core",
|
|
29
29
|
"fixtures/starters/github/.factory",
|
|
30
|
+
"fixtures/starters/gitlab/.factory",
|
|
30
31
|
"fixtures/starters/azure-devops/.factory"
|
|
31
32
|
],
|
|
32
33
|
"dependencies": {
|
|
@@ -47,25 +48,26 @@
|
|
|
47
48
|
"vitest": "^5.0.3"
|
|
48
49
|
},
|
|
49
50
|
"scripts": {
|
|
50
|
-
"build": "tsdown && pnpm --filter @bernard/viewer build",
|
|
51
|
+
"build": "tsdown && pnpm --filter @bernard/viewer build && pnpm --filter @bernard/docs build",
|
|
51
52
|
"check:consumers": "knip --production --include files,exports,types,dependencies,unlisted",
|
|
52
|
-
"check:docs": "node packages/cli/src/bin.ts pipeline --default --out docs/pipeline.md --check",
|
|
53
|
+
"check:docs": "node packages/cli/src/bin.ts pipeline --default --out docs/pipeline.md --check && pnpm --filter @bernard/docs build",
|
|
53
54
|
"check:knip-baseline": "node scripts/check-knip-baseline.ts",
|
|
54
55
|
"check:package": "scripts/check-package.sh",
|
|
55
|
-
"check:sync": "node packages/cli/src/bin.ts sync --check --cwd . && node packages/cli/src/bin.ts sync --check --cwd fixtures/claude-code && node packages/cli/src/bin.ts sync --check --cwd fixtures/pi && node packages/cli/src/bin.ts sync --check --cwd fixtures/copilot && node packages/cli/src/bin.ts sync --check --cwd fixtures/starters/github && node packages/cli/src/bin.ts sync --check --cwd fixtures/starters/azure-devops",
|
|
56
|
+
"check:sync": "node packages/cli/src/bin.ts sync --check --cwd . && node packages/cli/src/bin.ts sync --check --cwd fixtures/claude-code && node packages/cli/src/bin.ts sync --check --cwd fixtures/pi && node packages/cli/src/bin.ts sync --check --cwd fixtures/copilot && node packages/cli/src/bin.ts sync --check --cwd fixtures/starters/github && node packages/cli/src/bin.ts sync --check --cwd fixtures/starters/gitlab && node packages/cli/src/bin.ts sync --check --cwd fixtures/starters/azure-devops",
|
|
56
57
|
"demo:down": "demo/scripts/down.sh",
|
|
57
58
|
"demo:replay": "demo/scripts/replay.sh",
|
|
58
59
|
"demo:starters": "demo/scripts/starters.sh",
|
|
59
60
|
"demo:up": "demo/scripts/up.sh",
|
|
60
61
|
"demo:viewer": "demo/scripts/viewer.sh",
|
|
62
|
+
"dev:docs": "pnpm --filter @bernard/docs dev",
|
|
61
63
|
"dev:viewer": "pnpm --filter @bernard/viewer dev",
|
|
62
64
|
"docs:pipeline": "node packages/cli/src/bin.ts pipeline --default --out docs/pipeline.md",
|
|
63
65
|
"bernard": "node packages/cli/src/bin.ts",
|
|
64
66
|
"format": "biome check --write",
|
|
65
67
|
"lint": "biome check",
|
|
66
68
|
"release": "node scripts/release.ts",
|
|
67
|
-
"sync:all": "node packages/cli/src/bin.ts sync --cwd . && node packages/cli/src/bin.ts sync --cwd fixtures/claude-code && node packages/cli/src/bin.ts sync --cwd fixtures/pi && node packages/cli/src/bin.ts sync --cwd fixtures/copilot && node packages/cli/src/bin.ts sync --cwd fixtures/starters/github && node packages/cli/src/bin.ts sync --cwd fixtures/starters/azure-devops",
|
|
69
|
+
"sync:all": "node packages/cli/src/bin.ts sync --cwd . && node packages/cli/src/bin.ts sync --cwd fixtures/claude-code && node packages/cli/src/bin.ts sync --cwd fixtures/pi && node packages/cli/src/bin.ts sync --cwd fixtures/copilot && node packages/cli/src/bin.ts sync --cwd fixtures/starters/github && node packages/cli/src/bin.ts sync --cwd fixtures/starters/gitlab && node packages/cli/src/bin.ts sync --cwd fixtures/starters/azure-devops",
|
|
68
70
|
"test": "vitest run --dir packages",
|
|
69
|
-
"typecheck": "tsc -p tsconfig.json && pnpm --filter @bernard/viewer typecheck"
|
|
71
|
+
"typecheck": "tsc -p tsconfig.json && pnpm --filter @bernard/viewer typecheck && pnpm --filter @bernard/docs typecheck"
|
|
70
72
|
}
|
|
71
73
|
}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# pr-drive.sh: drives a ticket's pull request on GitHub, with `gh`, from the committed branch to green checks.
|
|
4
|
-
#
|
|
5
|
-
# pr-drive.sh --base <branch> run --title-file <file> --body-file <file>
|
|
6
|
-
#
|
|
7
|
-
# `run` walks the actions that need no judgement (state, uncommitted work, sync with the base, push, open or update,
|
|
8
|
-
# checks) and stops at the first one that does, with a STOP_REASON and a RESUME prompt that says what to do before
|
|
9
|
-
# running the same command again. It keeps no cursor: every run reads the world again, so it is safe to re-run. The
|
|
10
|
-
# title is read from the first line of its file, so that no free text travels on a command line.
|
|
11
|
-
#
|
|
12
|
-
# Exit codes: 0 the checks are green · 2 usage, or the branch is the base, `main` or no branch · 3 the merge with the
|
|
13
|
-
# base conflicts · 4 the checks are red · 5 gh refused to open or update the pull request · 6 git could not
|
|
14
|
-
# reach the remote, or merge, or the base is not on it · 7 uncommitted work · 9 the checks did not conclude,
|
|
15
|
-
# could not be read, none is registered, or one waits on an approval.
|
|
16
|
-
#
|
|
17
|
-
# Green is fail-closed: CI_GREEN needs the registration window to be over, then two reads of the checks, a poll apart,
|
|
18
|
-
# that give the same non-empty set, every one passed: SUCCESS, or SKIPPED or NEUTRAL, which GitHub counts as passing too.
|
|
19
|
-
# The registration window, PR_DRIVE_REGISTER_TIMEOUT (seconds, default 90, counted from the pull request's update), is
|
|
20
|
-
# the time every check has to register: the first one, and one that a slower CI posts after the others concluded. The
|
|
21
|
-
# checks are polled, not watched: the wait for them is bounded by PR_DRIVE_WATCH_TIMEOUT (seconds, default 540, counted
|
|
22
|
-
# from the start of the run: under the 10 minutes a shell tool allows), after which CI_PENDING asks for a new run.
|
|
23
|
-
# PR_DRIVE_POLL_INTERVAL (default 10) spaces the reads. The errors of git and gh are printed with the userinfo of any URL
|
|
24
|
-
# redacted.
|
|
25
|
-
set -euo pipefail
|
|
26
|
-
|
|
27
|
-
usage() {
|
|
28
|
-
echo "Usage: pr-drive.sh --base <branch> run --title-file <file> --body-file <file>" >&2
|
|
29
|
-
exit 2
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
[ "${1:-}" = "--base" ] && [ -n "${2:-}" ] && [ "${3:-}" = "run" ] || usage
|
|
33
|
-
BASE="$2"
|
|
34
|
-
shift 3
|
|
35
|
-
|
|
36
|
-
TITLE_FILE=""
|
|
37
|
-
BODY_FILE=""
|
|
38
|
-
while [ $# -gt 0 ]; do
|
|
39
|
-
case "$1" in
|
|
40
|
-
--title-file) [ $# -ge 2 ] || usage; TITLE_FILE="$2"; shift 2 ;;
|
|
41
|
-
--body-file) [ $# -ge 2 ] || usage; BODY_FILE="$2"; shift 2 ;;
|
|
42
|
-
*) usage ;;
|
|
43
|
-
esac
|
|
44
|
-
done
|
|
45
|
-
[ -s "$TITLE_FILE" ] && [ -s "$BODY_FILE" ] || { echo "ERROR: run needs a non-empty --title-file and a non-empty --body-file" >&2; exit 2; }
|
|
46
|
-
TITLE="$(head -n 1 "$TITLE_FILE")"
|
|
47
|
-
[ -n "$TITLE" ] || { echo "ERROR: the first line of the title file is empty" >&2; exit 2; }
|
|
48
|
-
|
|
49
|
-
run_start=$SECONDS
|
|
50
|
-
BRANCH="$(git symbolic-ref --short -q HEAD)" || { echo "ERROR: refusing to drive a pull request from a detached HEAD" >&2; exit 2; }
|
|
51
|
-
if [ "$BRANCH" = "$BASE" ] || [ "$BRANCH" = "main" ]; then
|
|
52
|
-
echo "ERROR: refusing to drive a pull request from $BRANCH" >&2
|
|
53
|
-
exit 2
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
# Prints the halt for the model, then exits with the cause's code.
|
|
57
|
-
stop() {
|
|
58
|
-
local code="$1" reason="$2"
|
|
59
|
-
shift 2
|
|
60
|
-
echo "STOP_REASON=$reason"
|
|
61
|
-
printf 'RESUME: %s\n' "$*"
|
|
62
|
-
exit "$code"
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
# Runs a command with its stdout in OUT and its stderr in ERR, nothing reaching the session: show_err prints the stderr,
|
|
66
|
-
# the userinfo of any URL redacted (a remote may carry a token, and the session copies what it reads into the record).
|
|
67
|
-
capture() {
|
|
68
|
-
local errfile status=0
|
|
69
|
-
errfile="$(mktemp)"
|
|
70
|
-
OUT="$("$@" 2>"$errfile")" || status=$?
|
|
71
|
-
ERR="$(<"$errfile")"
|
|
72
|
-
rm -f "$errfile"
|
|
73
|
-
return "$status"
|
|
74
|
-
}
|
|
75
|
-
redact() {
|
|
76
|
-
sed -E 's#(://)[^/[:space:]]+@#\1***@#g'
|
|
77
|
-
}
|
|
78
|
-
show_err() {
|
|
79
|
-
[ -z "$ERR" ] || printf '%s\n' "$ERR" | redact >&2
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
# The ticket's record, `.pipeline/`, is committed by the orchestrator: it is not uncommitted work. The pathspec starts
|
|
83
|
-
# at the root of the repository, whatever the directory the driver runs in.
|
|
84
|
-
if [ -n "$(git status --porcelain -- ':(top)' ':(top,exclude)**/.pipeline/**')" ]; then
|
|
85
|
-
stop 7 UNCOMMITTED "Uncommitted changes remain. Commit them in atomic commits, then run the same command again."
|
|
86
|
-
fi
|
|
87
|
-
|
|
88
|
-
if ! capture git fetch origin --quiet; then
|
|
89
|
-
show_err
|
|
90
|
-
stop 6 GIT_REMOTE "The fetch of origin failed, with the message above. Fix the network or the access, then run the same command again."
|
|
91
|
-
fi
|
|
92
|
-
if ! git rev-parse --verify --quiet "origin/$BASE" >/dev/null; then
|
|
93
|
-
stop 6 BASE_MISSING "The base branch $BASE is not on origin. Push it, or run the command with the right --base, then run it again."
|
|
94
|
-
fi
|
|
95
|
-
if ! capture git merge --no-edit "origin/$BASE"; then
|
|
96
|
-
show_err
|
|
97
|
-
conflicts="$(git -c core.quotePath=false diff --name-only --diff-filter=U)"
|
|
98
|
-
if git rev-parse --verify --quiet MERGE_HEAD >/dev/null && ! capture git merge --abort; then
|
|
99
|
-
show_err
|
|
100
|
-
stop 6 GIT_MERGE "Merging origin/$BASE failed and the merge could not be aborted. Run 'git merge --abort' by hand, then run the same command again."
|
|
101
|
-
fi
|
|
102
|
-
if [ -z "$conflicts" ]; then
|
|
103
|
-
stop 6 GIT_MERGE "Merging origin/$BASE failed without a conflict, with the message above (for instance a missing git identity, or a hook that refuses the merge). Fix it, then run the same command again."
|
|
104
|
-
fi
|
|
105
|
-
stop 3 MERGE_CONFLICT "Merging origin/$BASE conflicts in: $(printf '%s' "$conflicts" | tr '\n' ' ') (already aborted). Run 'git merge origin/$BASE', resolve every conflict so both sides' intent survives, regenerate derived files (lock files) rather than merging them by hand, run the project's checks, commit, then run the same command again."
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
# The branch is pushed by its name, never by whatever upstream git has recorded for it.
|
|
109
|
-
if ! capture git push --quiet -u origin "HEAD:refs/heads/$BRANCH"; then
|
|
110
|
-
show_err
|
|
111
|
-
stop 6 GIT_REMOTE "The push of $BRANCH failed, with the message above. Fix the cause (fetch the remote branch if it moved), then run the same command again."
|
|
112
|
-
fi
|
|
113
|
-
echo "PUSHED"
|
|
114
|
-
|
|
115
|
-
# Only this user's pull requests of this repository are the ticket's: a fork's or a colleague's is never edited.
|
|
116
|
-
if ! capture gh pr list --head "$BRANCH" --state open --author @me --json number,isCrossRepository --jq '[.[] | select(.isCrossRepository | not)] | .[0].number // empty'; then
|
|
117
|
-
show_err
|
|
118
|
-
stop 9 PR_UNKNOWN "gh could not list the pull requests of $BRANCH, with the message above. Check gh's authentication and the network, then run the same command again."
|
|
119
|
-
fi
|
|
120
|
-
number="$OUT"
|
|
121
|
-
if [ -n "$number" ]; then
|
|
122
|
-
if ! capture gh pr edit "$number" --base "$BASE" --body-file "$BODY_FILE"; then
|
|
123
|
-
show_err
|
|
124
|
-
stop 5 PR_REFUSED "gh could not update pull request $number, with the message above. Fix the cause, then run the same command again."
|
|
125
|
-
fi
|
|
126
|
-
echo "PR_UPDATED=$number"
|
|
127
|
-
pr="$number"
|
|
128
|
-
else
|
|
129
|
-
if ! capture gh pr create --base "$BASE" --head "$BRANCH" --title "$TITLE" --body-file "$BODY_FILE" --assignee @me || [ -z "$OUT" ]; then
|
|
130
|
-
show_err
|
|
131
|
-
stop 5 PR_REFUSED "gh could not open the pull request, with the message above, if any (for instance the branch has no commit beyond $BASE, or another author holds a pull request from this branch). Fix the cause, then run the same command again."
|
|
132
|
-
fi
|
|
133
|
-
pr="$(tail -n 1 <<<"$OUT")"
|
|
134
|
-
echo "PR_OPENED=$pr"
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
# The checks are polled, those of the pull request just driven, and the verdict is read from the list itself, which
|
|
138
|
-
# fails closed.
|
|
139
|
-
FAILED_STATES=" FAILURE ERROR CANCELLED TIMED_OUT STARTUP_FAILURE STALE "
|
|
140
|
-
PASSED_STATES=" SUCCESS SKIPPED NEUTRAL "
|
|
141
|
-
|
|
142
|
-
POLL="${PR_DRIVE_POLL_INTERVAL:-10}"
|
|
143
|
-
WATCH_TIMEOUT="${PR_DRIVE_WATCH_TIMEOUT:-540}"
|
|
144
|
-
REGISTER_TIMEOUT="${PR_DRIVE_REGISTER_TIMEOUT:-90}"
|
|
145
|
-
start=$SECONDS
|
|
146
|
-
previous=""
|
|
147
|
-
while :; do
|
|
148
|
-
# gh exits non-zero for pending (8) or failing checks too: the rows are read whatever the status.
|
|
149
|
-
status=0
|
|
150
|
-
capture gh pr checks "$pr" --json name,state,link --jq '.[] | "\(.state)\t\(.name)\t\(.link // "")"' || status=$?
|
|
151
|
-
if [ -n "$OUT" ]; then
|
|
152
|
-
checks="$OUT"
|
|
153
|
-
elif [ "$status" -eq 0 ] || grep -qi 'no checks reported' <<<"$ERR"; then
|
|
154
|
-
checks=""
|
|
155
|
-
else
|
|
156
|
-
show_err
|
|
157
|
-
stop 9 CI_UNKNOWN "gh could not read the checks, with the message above. Check gh's authentication and the network, then run the same command again."
|
|
158
|
-
fi
|
|
159
|
-
|
|
160
|
-
if [ -z "$checks" ]; then
|
|
161
|
-
if [ $((SECONDS - start)) -ge "$REGISTER_TIMEOUT" ]; then
|
|
162
|
-
stop 9 CI_NO_CHECKS "No check is registered for the pull request, after a wait. Run the same command once more. Still none: when every workflow of .github/workflows/ that runs on pull requests filters them by paths (paths, paths-ignore) that leave out every file the pull request changes, no check applies: report 'passed', saying so. Otherwise the cause is outside the code: report 'blocked', naming the workflow that should have started. A project without continuous integration overrides this skill."
|
|
163
|
-
fi
|
|
164
|
-
sleep "$POLL"
|
|
165
|
-
continue
|
|
166
|
-
fi
|
|
167
|
-
|
|
168
|
-
red=0
|
|
169
|
-
unfinished=0
|
|
170
|
-
approval=0
|
|
171
|
-
pending=""
|
|
172
|
-
while IFS=$'\t' read -r state name link; do
|
|
173
|
-
link="$(redact <<<"$link")"
|
|
174
|
-
if [[ "$FAILED_STATES" == *" $state "* ]]; then
|
|
175
|
-
echo "FAILED_CHECK=$name STATE=$state LINK=$link"
|
|
176
|
-
red=1
|
|
177
|
-
elif [ "$state" = "ACTION_REQUIRED" ]; then
|
|
178
|
-
echo "APPROVAL_CHECK=$name LINK=$link"
|
|
179
|
-
approval=1
|
|
180
|
-
elif [[ "$PASSED_STATES" != *" $state "* ]]; then
|
|
181
|
-
pending+="PENDING_CHECK=$name STATE=$state"$'\n'
|
|
182
|
-
unfinished=1
|
|
183
|
-
fi
|
|
184
|
-
done <<<"$checks"
|
|
185
|
-
if [ "$red" -eq 1 ]; then
|
|
186
|
-
stop 4 CI_RED "The checks above are red: the failure class is ci-red. Follow ci-fixer.md next to SKILL.md, then run the same command again."
|
|
187
|
-
fi
|
|
188
|
-
if [ "$approval" -eq 1 ]; then
|
|
189
|
-
stop 9 CI_APPROVAL "A check waits for a person to approve its run: the cause is outside the code. Report 'blocked', naming the check, without a round of fixes."
|
|
190
|
-
fi
|
|
191
|
-
|
|
192
|
-
if [ "$unfinished" -eq 0 ]; then
|
|
193
|
-
# Green needs the same set twice, after the registration window: a check that registers late is not missed.
|
|
194
|
-
[ "$checks" = "$previous" ] && [ $((SECONDS - start)) -ge "$REGISTER_TIMEOUT" ] && break
|
|
195
|
-
previous="$checks"
|
|
196
|
-
if [ $((SECONDS - run_start)) -ge "$WATCH_TIMEOUT" ]; then
|
|
197
|
-
stop 9 CI_PENDING "The checks keep changing and have not settled: not a failure. Wait three minutes, then run the same command again."
|
|
198
|
-
fi
|
|
199
|
-
else
|
|
200
|
-
previous=""
|
|
201
|
-
if [ $((SECONDS - run_start)) -ge "$WATCH_TIMEOUT" ]; then
|
|
202
|
-
printf '%s' "$pending"
|
|
203
|
-
stop 9 CI_PENDING "The checks above have not concluded, and none failed: not a failure. Wait three minutes, then run the same command again. A check still QUEUED or PENDING after three runs never started, for want of a runner: the cause is outside the code. Report 'blocked', naming it."
|
|
204
|
-
fi
|
|
205
|
-
fi
|
|
206
|
-
sleep "$POLL"
|
|
207
|
-
done
|
|
208
|
-
echo "CI_GREEN"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-WkwZ5CU-.js";import{n as t}from"./jsx-runtime-CkXRJ162.js";import{Q as n,q as r}from"./api-C4lMOGdC.js";var i=e(t(),1),a=(0,i.createContext)({}),o=(0,i.forwardRef)(function(e,t){[e,t]=r(e,t,a);let{children:o,level:s=3,className:c,...l}=e,u=n[`h${s}`];return i.createElement(u,{...l,ref:t,className:c??`react-aria-Heading`},o)});export{a as n,o as t};
|