@orizm/cli 3.1.0 → 3.3.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/agent-Kf8iuW2I.mjs +14 -0
- package/dist/agent-Kf8iuW2I.mjs.map +1 -0
- package/dist/agent-UZZtdOZS.cjs +14 -0
- package/dist/agent-UZZtdOZS.cjs.map +1 -0
- package/dist/auth-BnXPHgBU.cjs +18 -0
- package/dist/{auth-CNbONZuf.cjs.map → auth-BnXPHgBU.cjs.map} +1 -1
- package/dist/{auth-BGW072BP.mjs → auth-DHVtM0sF.mjs} +4 -4
- package/dist/{auth-BGW072BP.mjs.map → auth-DHVtM0sF.mjs.map} +1 -1
- package/dist/{bucket-mg5QQORh.cjs → bucket-CFaYmimY.cjs} +3 -3
- package/dist/{bucket-mg5QQORh.cjs.map → bucket-CFaYmimY.cjs.map} +1 -1
- package/dist/{bucket-DqW-WEYb.mjs → bucket-D-lu1xgZ.mjs} +3 -3
- package/dist/{bucket-DqW-WEYb.mjs.map → bucket-D-lu1xgZ.mjs.map} +1 -1
- package/dist/cli/main.cjs +14 -12
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +14 -13
- package/dist/cli/main.mjs.map +1 -1
- package/dist/{cms-BJnovGYT.mjs → cms-8XZhxwsM.mjs} +8 -5
- package/dist/cms-8XZhxwsM.mjs.map +1 -0
- package/dist/{cms-Cnx-lDGu.cjs → cms-C4zEtppZ.cjs} +8 -5
- package/dist/cms-C4zEtppZ.cjs.map +1 -0
- package/dist/{codegen-BF5b-u46.cjs → codegen-Cypg4O3L.cjs} +3 -3
- package/dist/{codegen-BF5b-u46.cjs.map → codegen-Cypg4O3L.cjs.map} +1 -1
- package/dist/{codegen-DZOB4ttR.mjs → codegen-Dnjv7zfm.mjs} +3 -3
- package/dist/{codegen-DZOB4ttR.mjs.map → codegen-Dnjv7zfm.mjs.map} +1 -1
- package/dist/config/index.cjs +4 -2
- package/dist/config/index.cjs.map +1 -1
- package/dist/config/index.d.mts +8 -1
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +4 -2
- package/dist/config/index.mjs.map +1 -1
- package/dist/{config-loader-D8x32gEU.cjs → config-loader-CZfANHBf.cjs} +2 -2
- package/dist/config-loader-CZfANHBf.cjs.map +1 -0
- package/dist/{config-loader-BEgS869e.mjs → config-loader-CtbZOGjc.mjs} +3 -3
- package/dist/config-loader-CtbZOGjc.mjs.map +1 -0
- package/dist/{confirm-delete-B9o73U7B.cjs → confirm-delete-BX8bJrXZ.cjs} +3 -3
- package/dist/{confirm-delete-B9o73U7B.cjs.map → confirm-delete-BX8bJrXZ.cjs.map} +1 -1
- package/dist/{confirm-delete-CsWkW69-.mjs → confirm-delete-CcKLYuCB.mjs} +2 -2
- package/dist/{confirm-delete-CsWkW69-.mjs.map → confirm-delete-CcKLYuCB.mjs.map} +1 -1
- package/dist/{consumer-C4WiGHWG.mjs → consumer-BAM3E_68.mjs} +4 -4
- package/dist/{consumer-C4WiGHWG.mjs.map → consumer-BAM3E_68.mjs.map} +1 -1
- package/dist/{consumer-OF6Z_eTP.cjs → consumer-BSgriLn0.cjs} +4 -4
- package/dist/consumer-BSgriLn0.cjs.map +1 -0
- package/dist/consumer-D-Y6KJ8a.cjs +18 -0
- package/dist/{consumer-l-8wUK8E.cjs.map → consumer-D-Y6KJ8a.cjs.map} +1 -1
- package/dist/{consumer-pU2HyiyA.mjs → consumer-s8LnLw4e.mjs} +4 -4
- package/dist/consumer-s8LnLw4e.mjs.map +1 -0
- package/dist/content-ClRuLcGq.cjs +20 -0
- package/dist/{content-DMjSwor1.cjs.map → content-ClRuLcGq.cjs.map} +1 -1
- package/dist/content-DWnYo6ad.mjs +20 -0
- package/dist/{content-BOb6NC8M.mjs.map → content-DWnYo6ad.mjs.map} +1 -1
- package/dist/{create-DJY71sp9.cjs → create-B3d4CDel.cjs} +2 -2
- package/dist/{create-DJY71sp9.cjs.map → create-B3d4CDel.cjs.map} +1 -1
- package/dist/{create-CC814ixh.mjs → create-BD6iS4n6.mjs} +2 -2
- package/dist/{create-CC814ixh.mjs.map → create-BD6iS4n6.mjs.map} +1 -1
- package/dist/{create-B-PAOor6.mjs → create-BGV3F44O.mjs} +3 -3
- package/dist/{create-B-PAOor6.mjs.map → create-BGV3F44O.mjs.map} +1 -1
- package/dist/{create-Z-z3LXNW.cjs → create-BYDbsUvw.cjs} +3 -3
- package/dist/{create-Z-z3LXNW.cjs.map → create-BYDbsUvw.cjs.map} +1 -1
- package/dist/{create-Belwettw.mjs → create-BtuS23L3.mjs} +2 -2
- package/dist/{create-Belwettw.mjs.map → create-BtuS23L3.mjs.map} +1 -1
- package/dist/{create-CCsn7yp5.cjs → create-CNDCTpi0.cjs} +3 -3
- package/dist/{create-CCsn7yp5.cjs.map → create-CNDCTpi0.cjs.map} +1 -1
- package/dist/{create-BNYWcyuQ.cjs → create-DzRMGpm_.cjs} +2 -2
- package/dist/{create-BNYWcyuQ.cjs.map → create-DzRMGpm_.cjs.map} +1 -1
- package/dist/{create-B1ZBOqcV.mjs → create-fweRd0UB.mjs} +2 -2
- package/dist/{create-B1ZBOqcV.mjs.map → create-fweRd0UB.mjs.map} +1 -1
- package/dist/{create-D5suBd3J.mjs → create-m5fNBqQE.mjs} +3 -3
- package/dist/{create-D5suBd3J.mjs.map → create-m5fNBqQE.mjs.map} +1 -1
- package/dist/{create-CmOriwGo.cjs → create-tWGEtI3t.cjs} +2 -2
- package/dist/{create-CmOriwGo.cjs.map → create-tWGEtI3t.cjs.map} +1 -1
- package/dist/{delete-DhSU-Lx2.mjs → delete-B8VlzzCj.mjs} +3 -3
- package/dist/{delete-DhSU-Lx2.mjs.map → delete-B8VlzzCj.mjs.map} +1 -1
- package/dist/{delete-DVrafka1.cjs → delete-B9j8c8ln.cjs} +3 -3
- package/dist/{delete-DVrafka1.cjs.map → delete-B9j8c8ln.cjs.map} +1 -1
- package/dist/{delete-ZIifaG0i.mjs → delete-BhJK-8vE.mjs} +3 -3
- package/dist/{delete-ZIifaG0i.mjs.map → delete-BhJK-8vE.mjs.map} +1 -1
- package/dist/{delete-YYh_0khQ.mjs → delete-Bi6UhAhS.mjs} +3 -3
- package/dist/{delete-YYh_0khQ.mjs.map → delete-Bi6UhAhS.mjs.map} +1 -1
- package/dist/{delete-CCTiCYIL.cjs → delete-C_oxZa_p.cjs} +3 -3
- package/dist/{delete-CCTiCYIL.cjs.map → delete-C_oxZa_p.cjs.map} +1 -1
- package/dist/{delete-CSs5Czlo.mjs → delete-Ci7cq3mU.mjs} +3 -3
- package/dist/{delete-CSs5Czlo.mjs.map → delete-Ci7cq3mU.mjs.map} +1 -1
- package/dist/{delete-XWJRhBFs.mjs → delete-CiWkGnog.mjs} +3 -3
- package/dist/{delete-XWJRhBFs.mjs.map → delete-CiWkGnog.mjs.map} +1 -1
- package/dist/{delete-DozSxZQ7.cjs → delete-Cmk80aqF.cjs} +3 -3
- package/dist/{delete-DozSxZQ7.cjs.map → delete-Cmk80aqF.cjs.map} +1 -1
- package/dist/{delete-8yZ3j0vX.cjs → delete-CvtvB2Cr.cjs} +3 -3
- package/dist/{delete-8yZ3j0vX.cjs.map → delete-CvtvB2Cr.cjs.map} +1 -1
- package/dist/{delete-CIYY59v_.cjs → delete-DG825UwK.cjs} +4 -3
- package/dist/{delete-CIYY59v_.cjs.map → delete-DG825UwK.cjs.map} +1 -1
- package/dist/{delete-WpMIIvjj.cjs → delete-DGrSMqOt.cjs} +3 -3
- package/dist/{delete-WpMIIvjj.cjs.map → delete-DGrSMqOt.cjs.map} +1 -1
- package/dist/{delete-BOUObrDw.mjs → delete-Datr3Kqq.mjs} +3 -2
- package/dist/{delete-BOUObrDw.mjs.map → delete-Datr3Kqq.mjs.map} +1 -1
- package/dist/{delete-D4r1ve4v.cjs → delete-TTF4pIKw.cjs} +3 -3
- package/dist/{delete-D4r1ve4v.cjs.map → delete-TTF4pIKw.cjs.map} +1 -1
- package/dist/{delete-BSLIXrAh.mjs → delete-X8iVsETw.mjs} +3 -3
- package/dist/{delete-BSLIXrAh.mjs.map → delete-X8iVsETw.mjs.map} +1 -1
- package/dist/docs/features/cli/authentication.md +93 -0
- package/dist/docs/features/cli/commands/agent.md +49 -0
- package/dist/docs/features/cli/commands/auth.md +36 -0
- package/dist/docs/features/cli/commands/bucket.md +120 -0
- package/dist/docs/features/cli/commands/codegen.md +51 -0
- package/dist/docs/features/cli/commands/content.md +117 -0
- package/dist/docs/features/cli/commands/key.md +155 -0
- package/dist/docs/features/cli/commands/link.md +21 -0
- package/dist/docs/features/cli/commands/org.md +18 -0
- package/dist/docs/features/cli/commands/project-user.md +108 -0
- package/dist/docs/features/cli/commands/project.md +106 -0
- package/dist/docs/features/cli/commands/schema.md +108 -0
- package/dist/docs/features/cli/commands/webhook.md +110 -0
- package/dist/docs/features/cli/commands.md +110 -0
- package/dist/docs/features/cli/configuration.md +70 -0
- package/dist/docs/features/cli/output.md +53 -0
- package/dist/docs/features/cli/project-linking.md +58 -0
- package/dist/docs/features/cli/quickstart.md +83 -0
- package/dist/docs/features/cli.md +56 -0
- package/dist/docs/features/cms-sdk/account.md +122 -0
- package/dist/docs/features/cms-sdk/auth.md +122 -0
- package/dist/docs/features/cms-sdk/bucket.md +113 -0
- package/dist/docs/features/cms-sdk/cli.md +104 -0
- package/dist/docs/features/cms-sdk/fetch-contents.md +608 -0
- package/dist/docs/features/cms-sdk/install.md +98 -0
- package/dist/docs/features/cms-sdk/management-user.md +244 -0
- package/dist/docs/features/cms-sdk/migrate-to-v2.md +152 -0
- package/dist/docs/features/cms-sdk/mutation-contents.md +190 -0
- package/dist/docs/features/console/audit-logs.md +55 -0
- package/dist/docs/features/console/bucket.md +70 -0
- package/dist/docs/features/console/create-project.md +103 -0
- package/dist/docs/features/console/generate-api-key.md +103 -0
- package/dist/docs/features/console/invite-project-users.md +70 -0
- package/dist/docs/features/console/management-tables.md +131 -0
- package/dist/docs/features/console/organization-member-management.md +78 -0
- package/dist/docs/features/console/schema-history.md +29 -0
- package/dist/docs/features/console.md +15 -0
- package/dist/docs/features/consumer-sdk/cli.md +60 -0
- package/dist/docs/features/consumer-sdk/fetch-contents.md +603 -0
- package/dist/docs/features/consumer-sdk/install.md +90 -0
- package/dist/docs/features/consumer-sdk/migrate-to-v2.md +43 -0
- package/dist/docs/features/design-editor/about.md +36 -0
- package/dist/docs/features/design-editor/getting-started.md +244 -0
- package/dist/docs/features/design-editor/install.md +17 -0
- package/dist/docs/features/design-editor/prop-editor.md +83 -0
- package/dist/docs/features/design-editor/schema.md +279 -0
- package/dist/docs/features/dictionary.md +265 -0
- package/dist/docs/features/draft.md +241 -0
- package/dist/docs/features/form/about.md +83 -0
- package/dist/docs/features/form/editor.md +410 -0
- package/dist/docs/features/form/submission.md +94 -0
- package/dist/docs/features/full-text-search.md +114 -0
- package/dist/docs/features/history.md +152 -0
- package/dist/docs/features/schema/about.md +215 -0
- package/dist/docs/features/schema/authority.md +456 -0
- package/dist/docs/features/schema/bucket.md +142 -0
- package/dist/docs/features/schema/database.md +419 -0
- package/dist/docs/features/schema/table-module.md +140 -0
- package/dist/docs/features/webhook/revalidate-nextjs.md +185 -0
- package/dist/docs/features/webhook.md +295 -0
- package/dist/docs/get-started/add-model-starter.md +124 -0
- package/dist/docs/get-started/get-started-with-starter.md +218 -0
- package/dist/docs/index.md +89 -0
- package/dist/docs/introduction.md +140 -0
- package/dist/docs/manifest.json +6 -0
- package/dist/docs/resources/cli-migration-guide.md +82 -0
- package/dist/docs/resources/cli-v2-to-v3-migration-guide.md +138 -0
- package/dist/docs/resources/deploy-to-vercel.md +62 -0
- package/dist/docs/resources/limits.md +24 -0
- package/dist/docs/resources/private-registry.md +23 -0
- package/dist/docs/resources/status.md +22 -0
- package/dist/docs/resources/user-model.md +38 -0
- package/dist/{download-ogGbb3FU.cjs → download-BkzmfQXD.cjs} +2 -2
- package/dist/{download-ogGbb3FU.cjs.map → download-BkzmfQXD.cjs.map} +1 -1
- package/dist/{download-oFGzg30E.mjs → download-Dx1oyrMg.mjs} +2 -2
- package/dist/{download-oFGzg30E.mjs.map → download-Dx1oyrMg.mjs.map} +1 -1
- package/dist/{erd-zDoF6I_y.mjs → erd-BihhEfZ_.mjs} +3 -3
- package/dist/{erd-zDoF6I_y.mjs.map → erd-BihhEfZ_.mjs.map} +1 -1
- package/dist/{erd-lKC5NB2l.cjs → erd-DmnB1v2c.cjs} +3 -3
- package/dist/{erd-lKC5NB2l.cjs.map → erd-DmnB1v2c.cjs.map} +1 -1
- package/dist/{get-CgEgETQa.mjs → get-1TtxSEoT.mjs} +2 -2
- package/dist/{get-CgEgETQa.mjs.map → get-1TtxSEoT.mjs.map} +1 -1
- package/dist/{get-DjRyK0hJ.cjs → get-B5S1GfjR.cjs} +2 -2
- package/dist/{get-DjRyK0hJ.cjs.map → get-B5S1GfjR.cjs.map} +1 -1
- package/dist/{get-DDB89cOs.mjs → get-BLDHE_Zl.mjs} +2 -2
- package/dist/{get-DDB89cOs.mjs.map → get-BLDHE_Zl.mjs.map} +1 -1
- package/dist/{get-KdWfYINc.cjs → get-C5OH05Ka.cjs} +2 -2
- package/dist/{get-KdWfYINc.cjs.map → get-C5OH05Ka.cjs.map} +1 -1
- package/dist/{get-DwtzBjGV.cjs → get-CKZPn669.cjs} +2 -2
- package/dist/{get-DwtzBjGV.cjs.map → get-CKZPn669.cjs.map} +1 -1
- package/dist/{get-IOU__2RP.cjs → get-CdDZkUXV.cjs} +2 -2
- package/dist/{get-IOU__2RP.cjs.map → get-CdDZkUXV.cjs.map} +1 -1
- package/dist/{get-DB80UNSR.mjs → get-Cw4Dw5NG.mjs} +2 -2
- package/dist/{get-DB80UNSR.mjs.map → get-Cw4Dw5NG.mjs.map} +1 -1
- package/dist/{get-C7dKoSIc.mjs → get-Dy3AD4il.mjs} +2 -2
- package/dist/{get-C7dKoSIc.mjs.map → get-Dy3AD4il.mjs.map} +1 -1
- package/dist/{get-BBOKSXkh.cjs → get-PVsUGHBR.cjs} +2 -2
- package/dist/{get-BBOKSXkh.cjs.map → get-PVsUGHBR.cjs.map} +1 -1
- package/dist/{get-B6vBaq_D.mjs → get-Vo3yr12d.mjs} +2 -2
- package/dist/{get-B6vBaq_D.mjs.map → get-Vo3yr12d.mjs.map} +1 -1
- package/dist/{get-jwXRlIBJ.cjs → get-jaN2o0XY.cjs} +2 -2
- package/dist/{get-jwXRlIBJ.cjs.map → get-jaN2o0XY.cjs.map} +1 -1
- package/dist/{get-DBxhbN1G.mjs → get-qOKYAc46.mjs} +2 -2
- package/dist/{get-DBxhbN1G.mjs.map → get-qOKYAc46.mjs.map} +1 -1
- package/dist/init-BpKpTQ0z.mjs +425 -0
- package/dist/init-BpKpTQ0z.mjs.map +1 -0
- package/dist/init-BrZCChEG.cjs +427 -0
- package/dist/init-BrZCChEG.cjs.map +1 -0
- package/dist/{invite-DPygtCoO.cjs → invite-Tw3SMV0Q.cjs} +2 -2
- package/dist/{invite-DPygtCoO.cjs.map → invite-Tw3SMV0Q.cjs.map} +1 -1
- package/dist/{invite-D66DSMvq.mjs → invite-vzajkU2u.mjs} +2 -2
- package/dist/{invite-D66DSMvq.mjs.map → invite-vzajkU2u.mjs.map} +1 -1
- package/dist/{key-C71Ffll9.mjs → key-CyVxu3Uk.mjs} +3 -3
- package/dist/{key-C71Ffll9.mjs.map → key-CyVxu3Uk.mjs.map} +1 -1
- package/dist/{key-DQr7qRL2.cjs → key-tRYRqYNo.cjs} +3 -3
- package/dist/{key-DQr7qRL2.cjs.map → key-tRYRqYNo.cjs.map} +1 -1
- package/dist/{link-BluFyxEL.mjs → link-Bd55x5Zf.mjs} +2 -2
- package/dist/{link-BluFyxEL.mjs.map → link-Bd55x5Zf.mjs.map} +1 -1
- package/dist/{link-DYu1Vjlw.cjs → link-Cz7MX02S.cjs} +2 -2
- package/dist/{link-DYu1Vjlw.cjs.map → link-Cz7MX02S.cjs.map} +1 -1
- package/dist/{list-D5PSDMWw.mjs → list-2otVufvs.mjs} +3 -3
- package/dist/{list-D5PSDMWw.mjs.map → list-2otVufvs.mjs.map} +1 -1
- package/dist/{list-sQk00GV5.mjs → list-BMnBuZMr.mjs} +2 -2
- package/dist/{list-sQk00GV5.mjs.map → list-BMnBuZMr.mjs.map} +1 -1
- package/dist/{list-BwfpuhmJ.cjs → list-Bo8IMFd0.cjs} +2 -2
- package/dist/{list-BwfpuhmJ.cjs.map → list-Bo8IMFd0.cjs.map} +1 -1
- package/dist/{list-B0N4-Q-5.mjs → list-BtgAAUKm.mjs} +2 -2
- package/dist/{list-B0N4-Q-5.mjs.map → list-BtgAAUKm.mjs.map} +1 -1
- package/dist/{list-vbMaOiza.mjs → list-C0lq-gBZ.mjs} +2 -2
- package/dist/{list-vbMaOiza.mjs.map → list-C0lq-gBZ.mjs.map} +1 -1
- package/dist/{list-BsYYq9wT.mjs → list-CGZ3iT6J.mjs} +2 -2
- package/dist/{list-BsYYq9wT.mjs.map → list-CGZ3iT6J.mjs.map} +1 -1
- package/dist/{list-CFwW0G9f.cjs → list-CMWXO4nB.cjs} +2 -2
- package/dist/{list-CFwW0G9f.cjs.map → list-CMWXO4nB.cjs.map} +1 -1
- package/dist/{list-rAn3uOA7.mjs → list-Ccaec0cs.mjs} +2 -2
- package/dist/{list-rAn3uOA7.mjs.map → list-Ccaec0cs.mjs.map} +1 -1
- package/dist/{list-CU42ERNY.cjs → list-Cp_mHwbN.cjs} +2 -2
- package/dist/{list-CU42ERNY.cjs.map → list-Cp_mHwbN.cjs.map} +1 -1
- package/dist/{list-D0-QrWmn.cjs → list-Cs7kbAAi.cjs} +3 -3
- package/dist/{list-D0-QrWmn.cjs.map → list-Cs7kbAAi.cjs.map} +1 -1
- package/dist/{list-DlJssPwy.cjs → list-D5IaYurn.cjs} +2 -2
- package/dist/{list-DlJssPwy.cjs.map → list-D5IaYurn.cjs.map} +1 -1
- package/dist/{list-CbvEh7eA.mjs → list-DcIBInNA.mjs} +2 -2
- package/dist/{list-CbvEh7eA.mjs.map → list-DcIBInNA.mjs.map} +1 -1
- package/dist/{list-BzLraBnA.cjs → list-Dd3veD9Z.cjs} +2 -2
- package/dist/{list-BzLraBnA.cjs.map → list-Dd3veD9Z.cjs.map} +1 -1
- package/dist/{list-DexBclfb.cjs → list-DdVKKaDN.cjs} +2 -2
- package/dist/{list-DexBclfb.cjs.map → list-DdVKKaDN.cjs.map} +1 -1
- package/dist/{list-Br6Cmi9S.cjs → list-E1sjTZLe.cjs} +2 -2
- package/dist/{list-Br6Cmi9S.cjs.map → list-E1sjTZLe.cjs.map} +1 -1
- package/dist/{list-BRh59EqI.cjs → list-KI-7REC_.cjs} +2 -2
- package/dist/{list-BRh59EqI.cjs.map → list-KI-7REC_.cjs.map} +1 -1
- package/dist/{list-ocfd7631.mjs → list-MWD4huKP.mjs} +2 -2
- package/dist/{list-ocfd7631.mjs.map → list-MWD4huKP.mjs.map} +1 -1
- package/dist/{list-57TUfNFd.mjs → list-Pf5aAoaN.mjs} +2 -2
- package/dist/{list-57TUfNFd.mjs.map → list-Pf5aAoaN.mjs.map} +1 -1
- package/dist/{list-BHvURTWd.cjs → list-fG4zo8zz.cjs} +2 -2
- package/dist/{list-BHvURTWd.cjs.map → list-fG4zo8zz.cjs.map} +1 -1
- package/dist/{list-DrZYlidZ.mjs → list-r2UPz1zW.mjs} +2 -2
- package/dist/{list-DrZYlidZ.mjs.map → list-r2UPz1zW.mjs.map} +1 -1
- package/dist/{login-FE_dbWMo.mjs → login-Dq2L3bI7.mjs} +2 -2
- package/dist/{login-FE_dbWMo.mjs.map → login-Dq2L3bI7.mjs.map} +1 -1
- package/dist/{login-2XcHd4wn.cjs → login-M1IF2MdC.cjs} +2 -2
- package/dist/{login-2XcHd4wn.cjs.map → login-M1IF2MdC.cjs.map} +1 -1
- package/dist/{logout-DC5TMJ5_.cjs → logout-BCSfFgPz.cjs} +2 -2
- package/dist/{logout-DC5TMJ5_.cjs.map → logout-BCSfFgPz.cjs.map} +1 -1
- package/dist/{logout-BDbWrGBm.mjs → logout-DFzQCQKe.mjs} +2 -2
- package/dist/{logout-BDbWrGBm.mjs.map → logout-DFzQCQKe.mjs.map} +1 -1
- package/dist/management-C1p-Hm2Z.cjs +19 -0
- package/dist/{management-BGYcZB4c.cjs.map → management-C1p-Hm2Z.cjs.map} +1 -1
- package/dist/{management-DDACMgbU.mjs → management-h4yE09a6.mjs} +5 -5
- package/dist/{management-DDACMgbU.mjs.map → management-h4yE09a6.mjs.map} +1 -1
- package/dist/object-CZDLoc9L.cjs +20 -0
- package/dist/{object-DVqidsEc.cjs.map → object-CZDLoc9L.cjs.map} +1 -1
- package/dist/object-CqMsEkh9.mjs +20 -0
- package/dist/{object-qdBdEghr.mjs.map → object-CqMsEkh9.mjs.map} +1 -1
- package/dist/{org-CPhTRTks.mjs → org-Co-rjfr-.mjs} +2 -2
- package/dist/{org-CPhTRTks.mjs.map → org-Co-rjfr-.mjs.map} +1 -1
- package/dist/{org-C4cVovOM.cjs → org-Drj3VqIm.cjs} +2 -2
- package/dist/{org-C4cVovOM.cjs.map → org-Drj3VqIm.cjs.map} +1 -1
- package/dist/{org-context-Bewx2NEW.cjs → org-context-DKFnPH_o.cjs} +2 -2
- package/dist/{org-context-Bewx2NEW.cjs.map → org-context-DKFnPH_o.cjs.map} +1 -1
- package/dist/{org-context-D0dwWC2M.mjs → org-context-Df5McOiK.mjs} +2 -2
- package/dist/{org-context-D0dwWC2M.mjs.map → org-context-Df5McOiK.mjs.map} +1 -1
- package/dist/project-C7qWFjMV.mjs +20 -0
- package/dist/{project-CaXD3QBs.mjs.map → project-C7qWFjMV.mjs.map} +1 -1
- package/dist/project-Dm7nr5NV.cjs +20 -0
- package/dist/{project-BX7zvWB1.cjs.map → project-Dm7nr5NV.cjs.map} +1 -1
- package/dist/project-user-D9h_QBc0.mjs +20 -0
- package/dist/{project-user-Cp7i6orv.mjs.map → project-user-D9h_QBc0.mjs.map} +1 -1
- package/dist/project-user-wLFnHFwB.cjs +20 -0
- package/dist/{project-user-Dm0qR-sh.cjs.map → project-user-wLFnHFwB.cjs.map} +1 -1
- package/dist/prompt-C-XNDSNE.cjs +42 -0
- package/dist/prompt-C-XNDSNE.cjs.map +1 -0
- package/dist/prompt-Dr2Rkxun.mjs +25 -0
- package/dist/prompt-Dr2Rkxun.mjs.map +1 -0
- package/dist/{push-0u6PDz4E.cjs → push-BggkrD0g.cjs} +31 -12
- package/dist/push-BggkrD0g.cjs.map +1 -0
- package/dist/{push-D7co0keA.mjs → push-xWnD9oov.mjs} +30 -11
- package/dist/push-xWnD9oov.mjs.map +1 -0
- package/dist/{run-codegen-Ceeosw5x.cjs → run-codegen-B-90rvjk.cjs} +4 -4
- package/dist/run-codegen-B-90rvjk.cjs.map +1 -0
- package/dist/{run-codegen-DgaFaIQ1.mjs → run-codegen-CrO08jJT.mjs} +4 -4
- package/dist/run-codegen-CrO08jJT.mjs.map +1 -0
- package/dist/{run-with-context-CVhmzAFZ.mjs → run-with-context-B4DyI8Wo.mjs} +6 -26
- package/dist/run-with-context-B4DyI8Wo.mjs.map +1 -0
- package/dist/{run-with-context-DJNnEigg.cjs → run-with-context-D8pSrqD_.cjs} +7 -39
- package/dist/run-with-context-D8pSrqD_.cjs.map +1 -0
- package/dist/schema-CUVTXrHk.cjs +20 -0
- package/dist/{schema-B3iRqvYK.cjs.map → schema-CUVTXrHk.cjs.map} +1 -1
- package/dist/schema-DlUWHV_t.mjs +20 -0
- package/dist/{schema-exG250MU.mjs.map → schema-DlUWHV_t.mjs.map} +1 -1
- package/dist/{status-Dq_NJE71.cjs → status-CqPJTxeK.cjs} +2 -2
- package/dist/{status-Dq_NJE71.cjs.map → status-CqPJTxeK.cjs.map} +1 -1
- package/dist/{status-fWqXzV0P.mjs → status-D7nOW3R3.mjs} +2 -2
- package/dist/{status-fWqXzV0P.mjs.map → status-D7nOW3R3.mjs.map} +1 -1
- package/dist/{token-store--9GYVL7N.cjs → token-store-BgWGhqq0.cjs} +3 -3
- package/dist/{token-store--9GYVL7N.cjs.map → token-store-BgWGhqq0.cjs.map} +1 -1
- package/dist/{token-store-reCGF86F.mjs → token-store-C2r7cFA-.mjs} +2 -2
- package/dist/{token-store-reCGF86F.mjs.map → token-store-C2r7cFA-.mjs.map} +1 -1
- package/dist/{update-B4lv4dAz.mjs → update-8-sHFvNB.mjs} +2 -2
- package/dist/{update-B4lv4dAz.mjs.map → update-8-sHFvNB.mjs.map} +1 -1
- package/dist/{update-Dyo4vuZs.mjs → update-B5hKKw0K.mjs} +3 -3
- package/dist/{update-Dyo4vuZs.mjs.map → update-B5hKKw0K.mjs.map} +1 -1
- package/dist/{update-Do9HHWzs.cjs → update-BVaqURWE.cjs} +2 -2
- package/dist/{update-Do9HHWzs.cjs.map → update-BVaqURWE.cjs.map} +1 -1
- package/dist/{update-DRnN1kiu.cjs → update-BlUwNhLA.cjs} +2 -2
- package/dist/{update-DRnN1kiu.cjs.map → update-BlUwNhLA.cjs.map} +1 -1
- package/dist/{update-Cx_2GkQj.cjs → update-BqhLwuP7.cjs} +2 -2
- package/dist/{update-Cx_2GkQj.cjs.map → update-BqhLwuP7.cjs.map} +1 -1
- package/dist/{update-mEmULIau.mjs → update-DaYjh5VN.mjs} +2 -2
- package/dist/{update-mEmULIau.mjs.map → update-DaYjh5VN.mjs.map} +1 -1
- package/dist/{update-CJgEmSWJ.cjs → update-DcTzR54Z.cjs} +3 -3
- package/dist/{update-CJgEmSWJ.cjs.map → update-DcTzR54Z.cjs.map} +1 -1
- package/dist/{update-CIH6sSVk.cjs → update-Dne7g_0s.cjs} +2 -2
- package/dist/{update-CIH6sSVk.cjs.map → update-Dne7g_0s.cjs.map} +1 -1
- package/dist/{update-CQ4n4Xuf.mjs → update-Dy1BOnTB.mjs} +2 -2
- package/dist/{update-CQ4n4Xuf.mjs.map → update-Dy1BOnTB.mjs.map} +1 -1
- package/dist/{update-rzij1b_o.mjs → update-slz_X0mG.mjs} +2 -2
- package/dist/{update-rzij1b_o.mjs.map → update-slz_X0mG.mjs.map} +1 -1
- package/dist/{upload-DGgJ1TQk.mjs → upload-CDtzV9Wx.mjs} +3 -3
- package/dist/{upload-DGgJ1TQk.mjs.map → upload-CDtzV9Wx.mjs.map} +1 -1
- package/dist/{upload-C43ZXxyb.cjs → upload-DIln1QDA.cjs} +3 -3
- package/dist/{upload-C43ZXxyb.cjs.map → upload-DIln1QDA.cjs.map} +1 -1
- package/dist/{validate-BpxZ8LTl.cjs → validate-BH8jqdqq.cjs} +2 -2
- package/dist/{validate-BpxZ8LTl.cjs.map → validate-BH8jqdqq.cjs.map} +1 -1
- package/dist/{validate-Ca0CRo16.mjs → validate-COS4bfr0.mjs} +2 -2
- package/dist/{validate-Ca0CRo16.mjs.map → validate-COS4bfr0.mjs.map} +1 -1
- package/dist/webhook-BT3cHrq5.mjs +20 -0
- package/dist/{webhook-CpZ1-Ho5.mjs.map → webhook-BT3cHrq5.mjs.map} +1 -1
- package/dist/webhook-CQeuAqec.cjs +20 -0
- package/dist/{webhook-CbL4QaR5.cjs.map → webhook-CQeuAqec.cjs.map} +1 -1
- package/package.json +10 -9
- package/dist/auth-CNbONZuf.cjs +0 -18
- package/dist/cms-BJnovGYT.mjs.map +0 -1
- package/dist/cms-Cnx-lDGu.cjs.map +0 -1
- package/dist/config-loader-BEgS869e.mjs.map +0 -1
- package/dist/config-loader-D8x32gEU.cjs.map +0 -1
- package/dist/consumer-OF6Z_eTP.cjs.map +0 -1
- package/dist/consumer-l-8wUK8E.cjs +0 -18
- package/dist/consumer-pU2HyiyA.mjs.map +0 -1
- package/dist/content-BOb6NC8M.mjs +0 -20
- package/dist/content-DMjSwor1.cjs +0 -20
- package/dist/management-BGYcZB4c.cjs +0 -19
- package/dist/object-DVqidsEc.cjs +0 -20
- package/dist/object-qdBdEghr.mjs +0 -20
- package/dist/project-BX7zvWB1.cjs +0 -20
- package/dist/project-CaXD3QBs.mjs +0 -20
- package/dist/project-user-Cp7i6orv.mjs +0 -20
- package/dist/project-user-Dm0qR-sh.cjs +0 -20
- package/dist/push-0u6PDz4E.cjs.map +0 -1
- package/dist/push-D7co0keA.mjs.map +0 -1
- package/dist/run-codegen-Ceeosw5x.cjs.map +0 -1
- package/dist/run-codegen-DgaFaIQ1.mjs.map +0 -1
- package/dist/run-with-context-CVhmzAFZ.mjs.map +0 -1
- package/dist/run-with-context-DJNnEigg.cjs.map +0 -1
- package/dist/schema-B3iRqvYK.cjs +0 -20
- package/dist/schema-exG250MU.mjs +0 -20
- package/dist/webhook-CbL4QaR5.cjs +0 -20
- package/dist/webhook-CpZ1-Ho5.mjs +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-BpKpTQ0z.mjs","names":["cliVersion"],"sources":["../src/cli/agent/resolve-docs.ts","../src/cli/agent/resolve-target.ts","../src/cli/agent/execution-mode.ts","../src/cli/agent/preview.ts","../src/cli/agent/template.ts","../src/cli/agent/write-reference.ts","../src/cli/commands/agent/init.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { version as cliVersion } from \"../version.js\";\n\n// きれいに辿れる場合に優先する公開パス(トップレベル/ホイスト済みインストール)。\nconst PRETTY_DOCS_SUBPATH = \"node_modules/@orizm/cli/dist/docs\";\n\nexport type BundledDocs = {\n docsDir: string;\n version: string;\n pages: number;\n};\n\nexport type ResolveDocsError = {\n type: \"docs_not_resolved\";\n reason: \"manifest_missing\" | \"manifest_invalid\";\n manifestPath: string;\n};\n\nconst ManifestSchema = v.object({\n version: v.pipe(v.string(), v.nonEmpty()),\n generatedAt: v.string(),\n pages: v.optional(v.number(), 0),\n});\n\nfunction findPackageRoot(start: string): string | undefined {\n let dir = start;\n for (;;) {\n if (existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\n// 実行中の CLI ファイル位置から自パッケージルートをたどるため、プロジェクト側 node_modules の\n// レイアウト(hoisting / pnpm)に依存しない。\nfunction defaultPackageRoot(): string {\n const from = path.dirname(fileURLToPath(import.meta.url));\n const root = findPackageRoot(from);\n if (root === undefined) {\n throw new Error(\n `@orizm/cli の package.json が ${from} から上に見つかりません。`,\n );\n }\n return root;\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\n// 同梱 docs の存在を manifest.json で確認し、参照文言に載せる version を得る。\nexport async function resolveDocs(\n packageRoot: string = defaultPackageRoot(),\n): Promise<Result.Result<BundledDocs, ResolveDocsError>> {\n const docsDir = path.join(packageRoot, \"dist\", \"docs\");\n const manifestPath = path.join(docsDir, \"manifest.json\");\n const raw = await readFile(manifestPath, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) {\n return Result.fail({\n type: \"docs_not_resolved\",\n reason: \"manifest_missing\",\n manifestPath,\n });\n }\n\n const parsed = v.safeParse(ManifestSchema, safeJsonParse(raw));\n if (!parsed.success) {\n return Result.fail({\n type: \"docs_not_resolved\",\n reason: \"manifest_invalid\",\n manifestPath,\n });\n }\n\n return Result.succeed({\n docsDir,\n version: parsed.output.version,\n pages: parsed.output.pages,\n });\n}\n\n// 指示ファイルに書く docs 参照は常に `node_modules/@orizm/cli/dist/docs` の公開パスにする\n// (相対パスや .pnpm の実体パスは書かない。Next.js の `node_modules/next/dist/docs` と同方式)。\n// `resolves` は targetDir 直下からそのパスが実在するか。false の場合、呼び出し側で警告する\n// (@orizm/cli が targetDir を起点に解決できない配置。プロジェクトの依存に加えるか、\n// 解決できる場所で実行する必要がある)。\nexport function docsReference(targetDir: string): {\n docsDir: string;\n docsIndex: string;\n resolves: boolean;\n} {\n const base = `./${PRETTY_DOCS_SUBPATH}`;\n return {\n docsDir: `${base}/`,\n docsIndex: `${base}/index.md`,\n resolves: existsSync(path.join(targetDir, PRETTY_DOCS_SUBPATH)),\n };\n}\n\n// docs_not_resolved の表示文。原因ごとに復旧手段を添える(commands.md の仕様)。\n// 公開パスが辿れない問題は独立して起こるため、成功時の警告(init.ts)で扱う。\nexport function renderDocsNotResolved(error: ResolveDocsError): string {\n switch (error.reason) {\n case \"manifest_missing\":\n return (\n `Could not find the bundled Orizm docs (looked in ${error.manifestPath}). ` +\n `The installed @orizm/cli ${cliVersion} does not ship docs. ` +\n \"Run `pnpm update @orizm/cli`.\"\n );\n case \"manifest_invalid\":\n return (\n `Could not read the bundled Orizm docs manifest (${error.manifestPath}). ` +\n `The @orizm/cli ${cliVersion} install looks incomplete. ` +\n \"Run `pnpm install --force`.\"\n );\n }\n}\n","import path from \"node:path\";\n\nexport const CLAUDE_FILE = \"CLAUDE.md\";\nexport const AGENTS_FILE = \"AGENTS.md\";\n\n// canonical: docs 参照の本文そのものを書くファイル(AGENTS.md)。\n// claude-import: 本文を持たず AGENTS.md を `@` import するファイル(CLAUDE.md)。\nexport type TargetKind = \"canonical\" | \"claude-import\";\n\nexport type Target = {\n path: string;\n fileName: string;\n kind: TargetKind;\n};\n\n// 書き込み対象の決定。\n// - --target 明示: そのファイル 1 つに本文(canonical)を書く。\n// - 省略時: AGENTS.md を正本(canonical)に、CLAUDE.md は @AGENTS.md import として\n// 両方を管理する。どちらも無ければ両方新規作成する。\nexport function resolveTargets(cwd: string, targetFlag?: string): Target[] {\n if (targetFlag != null && targetFlag !== \"\") {\n const resolved = path.resolve(cwd, targetFlag);\n return [\n { path: resolved, fileName: path.basename(resolved), kind: \"canonical\" },\n ];\n }\n\n return [\n { path: path.join(cwd, AGENTS_FILE), fileName: AGENTS_FILE, kind: \"canonical\" },\n {\n path: path.join(cwd, CLAUDE_FILE),\n fileName: CLAUDE_FILE,\n kind: \"claude-import\",\n },\n ];\n}\n","// orizm agent init の実行モード判定(純関数)。\n// 解決順序は「フラグ > 対話 (TTY) > 既定/エラー (非 TTY)」で ADR-004 のコンテキスト解決と揃える。\n// - interactive: TTY かつ --yes / --json / --dry-run のいずれも無いとき。npx skills 風ウィザードを出す。\n// - non-interactive: それ以外(CI・スクリプト・--yes・非 TTY・--json・--dry-run)。プロンプトを出さない。\n// --json は stdout を機械可読結果専用に空けるため、--dry-run はプレビューのみで書き込まないため、\n// どちらも非対話に倒してウィザードを出さない。\nexport type ExecutionMode = \"interactive\" | \"non-interactive\";\n\nexport function resolveExecutionMode(opts: {\n isTTY: boolean;\n yes: boolean;\n json: boolean;\n dryRun: boolean;\n}): ExecutionMode {\n if (opts.isTTY && !opts.yes && !opts.json && !opts.dryRun) {\n return \"interactive\";\n }\n return \"non-interactive\";\n}\n\n// 対話ウィザードの「書き込み対象の選択」を --target フラグ相当へ写像する。\n// \"both\"(既定=両方)は --target 未指定と同じ = undefined。単一選択はそのファイル名を返す。\nexport function targetChoiceToFlag(choice: string): string | undefined {\n if (choice === \"agents\") return \"AGENTS.md\";\n if (choice === \"claude\") return \"CLAUDE.md\";\n return undefined;\n}\n","import type { UpsertAction } from \"./write-reference.js\";\n\n// 変更プレビューの 1 対象分。書き換わるのは自機能の管理ブロックだけなので、\n// 旧ブロック↔新ブロックの差分だけを見せる(ファイル全文は出さない)。\nexport type PreviewItem = {\n fileName: string;\n action: UpsertAction;\n // 既存の管理ブロック(updated のとき)。新規作成・ブロック未存在なら undefined。\n oldBlock?: string;\n // 書き込む新しい管理ブロック。\n newBlock: string;\n};\n\n// 旧・新ブロックの共通の先頭行 / 末尾行を除いた「変わった行」だけを -/+ で返す。\n// created(oldBlock=undefined)は新ブロック全行が追加 (+) になる。\nexport function diffBlockLines(\n oldBlock: string | undefined,\n newBlock: string,\n): string[] {\n const oldLines = oldBlock != null ? oldBlock.split(\"\\n\") : [];\n const newLines = newBlock.split(\"\\n\");\n\n let start = 0;\n while (\n start < oldLines.length &&\n start < newLines.length &&\n oldLines[start] === newLines[start]\n ) {\n start++;\n }\n\n let oldEnd = oldLines.length;\n let newEnd = newLines.length;\n while (\n oldEnd > start &&\n newEnd > start &&\n oldLines[oldEnd - 1] === newLines[newEnd - 1]\n ) {\n oldEnd--;\n newEnd--;\n }\n\n const removed = oldLines.slice(start, oldEnd).map((line) => `- ${line}`);\n const added = newLines.slice(start, newEnd).map((line) => `+ ${line}`);\n return [...removed, ...added];\n}\n\n// 対象ごとの操作(create / update / unchanged)とブロック差分を組み立てた表示用文字列。\n// 対話ウィザードのプレビュー、および --dry-run の出力に共通で使う。\nexport function renderPlanPreview(items: PreviewItem[]): string {\n const sections = items.map((item) => {\n if (item.action === \"unchanged\") {\n return `= ${item.fileName} (unchanged)`;\n }\n const marker = item.action === \"created\" ? \"+\" : \"~\";\n const verb = item.action === \"created\" ? \"create\" : \"update\";\n const header = `${marker} ${verb} ${item.fileName}`;\n const body = diffBlockLines(item.oldBlock, item.newBlock).map(\n (line) => ` ${line}`,\n );\n return [header, ...body].join(\"\\n\");\n });\n return sections.join(\"\\n\\n\");\n}\n","import { AGENTS_FILE } from \"./resolve-target.js\";\n\n// 指示ファイルに書き込む参照ブロックの本文(マーカーは write-reference が付ける)。\n// docs 全文は inline せず、docs へのポインタと索引だけを渡してコンテキストを圧迫しない。\n// パスは resolve-docs.docsReference が算出した「実際に解決できる相対パス」を受け取る。\n// バージョン数字は書かない(パス先の docs が常に整合するため。数字を書くと再実行漏れで嘘になる)。\n// 代わりに SDK ページのバージョン表記と package.json を突き合わせさせる(SDK は CLI と別版で進む)。\n// docs.orizm.com への誘導はこのブロックにだけ置く(同梱 docs 本文は外部 URL を持たない)。\nexport function renderReferenceInner(params: {\n docsDir: string;\n docsIndex: string;\n}): string {\n return [\n \"## Orizm\",\n \"\",\n \"You are working in an Orizm project (Starter Kit v2). Before generating or editing\",\n \"any Orizm code, read the bundled docs below. They are a snapshot of\",\n \"https://docs.orizm.com, bundled with and version-matched to the `@orizm/cli`\",\n \"installed in this project. Do NOT rely on your training data — Orizm is a private\",\n \"product and your built-in knowledge is likely stale or wrong.\",\n \"\",\n `- Docs: \\`${params.docsDir}\\``,\n `- Index (start here): \\`${params.docsIndex}\\``,\n \"\",\n \"The path above assumes `@orizm/cli` is installed as a project devDependency\",\n \"(a global-only install is not resolved by this project-relative path).\",\n \"\",\n \"`@orizm/cms-sdk` / `@orizm/consumer-sdk` are versioned separately from\",\n \"`@orizm/cli`, so check the version each SDK page documents against this\",\n \"project's `package.json`.\",\n \"\",\n \"For the latest release, upgrades, or migrations, see https://docs.orizm.com.\",\n \"\",\n \"Starter Kit v2 conventions:\",\n \"\",\n \"- Edit only `apps/cms`, `apps/consumer`, and `packages/design-editor`.\",\n \"- `packages/orizm` is generated from `orizm.config.ts` — never edit it by hand.\",\n ].join(\"\\n\");\n}\n\n// CLAUDE.md 用のブロック本文。正本は AGENTS.md に置き、CLAUDE.md は Claude Code の\n// `@` import でそれを取り込む(内容の重複を避け、AGENTS.md を単一の情報源にする)。\nexport function renderClaudeImportInner(): string {\n return [\n \"## Orizm\",\n \"\",\n `Orizm docs and conventions are maintained in ${AGENTS_FILE} (managed by \\`orizm agent\\`).`,\n \"Claude Code imports it here:\",\n \"\",\n `@${AGENTS_FILE}`,\n ].join(\"\\n\");\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n// エージェント指示ファイル内で自機能が管理する領域の境界。start はプレフィックスで検出し、\n// 「do not edit」の文言をユーザーが多少書き換えても再検出できるようにする。\nconst START_TOKEN = \"<!-- orizm-agent:start\";\nexport const MARKER_START =\n \"<!-- orizm-agent:start (managed by `orizm agent` — do not edit manually) -->\";\nexport const MARKER_END = \"<!-- orizm-agent:end -->\";\n\nexport type UpsertAction = \"created\" | \"updated\" | \"unchanged\";\n\n// 既存内容の中での管理ブロックの状態。\n// - absent: 開始マーカーが無い(末尾に追記する)\n// - present: 開始マーカー 1 つと、その後ろに終了マーカーがある(置換する)\n// - broken: 開始マーカーはあるが対応する終了マーカーが無い、または開始マーカーが複数ある\n// (どちらも人手で直してもらう。追記で「開始マーカーが 2 つ」の状態を作ると、次回の実行で\n// 2 つのマーカーに挟まれたユーザー本文を丸ごと置換してしまうため、機械的には触らない)\nexport type ManagedBlockState =\n | { kind: \"absent\" }\n | { kind: \"present\"; start: number; end: number }\n | { kind: \"broken\"; reason: string };\n\n// 管理ブロックが壊れていて安全に更新できないことを表す。呼び出し側(init コマンド)が\n// 捕まえて、対象ファイル名と直し方を添えたエラーにする\nexport class BrokenManagedBlockError extends Error {\n readonly reason: string;\n\n constructor(reason: string) {\n super(`managed block is broken (${reason})`);\n this.name = \"BrokenManagedBlockError\";\n this.reason = reason;\n }\n}\n\nfunction indexOfAll(text: string, token: string): number[] {\n const found: number[] = [];\n let from = 0;\n while (true) {\n const idx = text.indexOf(token, from);\n if (idx === -1) return found;\n found.push(idx);\n from = idx + token.length;\n }\n}\n\n// 既存内容の管理ブロックの状態を判定する。extractBlock / upsertBlock と、\n// 対話モードのコンテキスト表示が同じ判定を共有する\nexport function inspectManagedBlock(text: string): ManagedBlockState {\n const starts = indexOfAll(text, START_TOKEN);\n if (starts.length === 0) return { kind: \"absent\" };\n if (starts.length > 1) {\n return {\n kind: \"broken\",\n reason: `found ${starts.length} start markers, expected at most 1`,\n };\n }\n const start = starts[0];\n const endIdx = text.indexOf(MARKER_END, start);\n if (endIdx === -1) {\n return {\n kind: \"broken\",\n reason: \"found a start marker without a matching end marker after it\",\n };\n }\n return { kind: \"present\", start, end: endIdx + MARKER_END.length };\n}\n\n// 参照本文をマーカーで囲んだ 1 ブロックにする。前後の余分な空白は落として揺れを防ぐ。\nexport function wrapBlock(inner: string): string {\n return `${MARKER_START}\\n${inner.trim()}\\n${MARKER_END}`;\n}\n\n// 既存内容から自機能の管理ブロック(マーカー含む)を抜き出す。無い・壊れているなら undefined。\n// プレビューの差分表示やコンテキスト表示で「既存ブロックの有無」を判定するのに使う。\nexport function extractBlock(text: string): string | undefined {\n const state = inspectManagedBlock(text);\n if (state.kind !== \"present\") return undefined;\n return text.slice(state.start, state.end);\n}\n\n// 既存内容にマーカーブロックがあれば置換、無ければ末尾に追記する純関数。\n// 置換後が元と完全一致なら unchanged とし、呼び出し側が書き込みを省ける。\n// 管理ブロックが壊れている(inspectManagedBlock 参照)ときは BrokenManagedBlockError を投げる。\nexport function upsertBlock(\n existing: string,\n block: string,\n): { content: string; action: UpsertAction } {\n const state = inspectManagedBlock(existing);\n\n if (state.kind === \"broken\") {\n throw new BrokenManagedBlockError(state.reason);\n }\n\n if (state.kind === \"present\") {\n const before = existing.slice(0, state.start);\n const after = existing.slice(state.end);\n const content = before + block + after;\n return { content, action: content === existing ? \"unchanged\" : \"updated\" };\n }\n\n if (existing === \"\") {\n return { content: `${block}\\n`, action: \"created\" };\n }\n\n // 既存本文とブロックの間は 1 行空ける。末尾改行がない既存にも改行を補う。\n const prefix = existing.endsWith(\"\\n\") ? existing : `${existing}\\n`;\n return { content: `${prefix}\\n${block}\\n`, action: \"updated\" };\n}\n\nfunction enoentToUndefined(error: NodeJS.ErrnoException): undefined {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n}\n\n// 対象ファイルを読む。存在しなければ空文字(= 新規作成扱い)。\nexport async function readTextFile(filePath: string): Promise<string> {\n const existing = await readFile(filePath, \"utf-8\").catch(enoentToUndefined);\n return existing ?? \"\";\n}\n\n// 一時ファイルへ書いてから rename で差し替える。直書きだと中断時に既存の\n// AGENTS.md / CLAUDE.md の本文を失う(architecture.md の非破壊要件)。\nexport async function applyWrite(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n const temp = path.join(\n dir,\n `${path.basename(filePath)}.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, content, \"utf-8\");\n await rename(temp, filePath).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n}\n","import path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { confirm, select } from \"../../ui/prompt.js\";\nimport { logger, notice, warn } from \"../../ui/output.js\";\nimport {\n docsReference,\n renderDocsNotResolved,\n resolveDocs,\n} from \"../../agent/resolve-docs.js\";\nimport { resolveTargets, type Target } from \"../../agent/resolve-target.js\";\nimport {\n resolveExecutionMode,\n targetChoiceToFlag,\n} from \"../../agent/execution-mode.js\";\nimport { renderPlanPreview, type PreviewItem } from \"../../agent/preview.js\";\nimport {\n renderClaudeImportInner,\n renderReferenceInner,\n} from \"../../agent/template.js\";\nimport {\n applyWrite,\n BrokenManagedBlockError,\n extractBlock,\n inspectManagedBlock,\n readTextFile,\n upsertBlock,\n wrapBlock,\n type UpsertAction,\n} from \"../../agent/write-reference.js\";\n\ntype TargetPlan = {\n target: Target;\n content: string;\n action: UpsertAction;\n oldBlock: string | undefined;\n newBlock: string;\n};\n\n// 既存ファイルの管理ブロックの状態を、検出コンテキスト表示の 1 行に写す。\n// 壊れているときは「ここで止まる」ことが読めるようにする(実際の中断は plan 組み立て側)。\nfunction describeExisting(existing: string): string {\n const state = inspectManagedBlock(existing);\n switch (state.kind) {\n case \"present\":\n return \"exists (managed block present — will update)\";\n case \"absent\":\n return \"exists (no managed block — will append)\";\n case \"broken\":\n return `exists (broken managed block: ${state.reason} — cannot update)`;\n }\n}\n\n// 壊れた管理ブロックを見つけたときの失敗メッセージ。追記も置換もせず、人手での修復を促す\nfunction renderBrokenManagedBlock(\n fileName: string,\n error: BrokenManagedBlockError,\n): string {\n return (\n `${fileName}: ${error.message}. ` +\n \"Nothing was written. Repair the file by hand — keep exactly one \" +\n \"`<!-- orizm-agent:start ... -->` marker followed by one `<!-- orizm-agent:end -->` \" +\n \"marker, or remove both — then re-run `orizm agent init`.\"\n );\n}\n\n// 対話ウィザードの (1) 検出コンテキスト表示。docs version / プロジェクトルート /\n// 書き込み対象の有無・既存ブロックの有無を stderr に出す。\nasync function showDetectedContext(\n cwd: string,\n version: string,\n targets: Target[],\n): Promise<void> {\n const lines = [\n `Detected bundled Orizm docs v${version} (shipped with @orizm/cli).`,\n `Project root: ${cwd}`,\n ];\n for (const target of targets) {\n const fileName = target.fileName;\n const existing = await readTextFile(target.path);\n const status =\n existing === \"\"\n ? \"not found (will be created)\"\n : describeExisting(existing);\n lines.push(`- ${fileName}: ${status}`);\n }\n notice(lines.join(\"\\n\"));\n}\n\nexport default defineCommand({\n meta: {\n name: \"init\",\n description:\n \"Add a reference to the bundled Orizm docs into AGENTS.md / CLAUDE.md\",\n },\n args: {\n ...globalArgs,\n target: {\n type: \"string\",\n description:\n \"Write only this file (e.g. AGENTS.md). Default: manage both AGENTS.md and CLAUDE.md\",\n },\n cwd: {\n type: \"string\",\n description: \"Project root directory (defaults to the current directory)\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would change without writing\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt (non-interactive)\",\n default: false,\n },\n },\n run: async ({ args }) => {\n const cwd = args.cwd != null && args.cwd !== \"\" ? args.cwd : process.cwd();\n\n const docs = await resolveDocs();\n if (Result.isFailure(docs)) {\n // version と manifest パスはエラー本文に出るので、ここは本文にない情報だけ出す。\n logger.debug(`import.meta.url: ${import.meta.url}`);\n return Result.fail({ message: renderDocsNotResolved(docs.error) });\n }\n const version = docs.value.version;\n\n // 実行モードを解決(フラグ > 対話(TTY) > 既定/エラー(非TTY))。\n // 非対話ではプロンプトを一切出さず、フラグ指定のまま処理する。\n const mode = resolveExecutionMode({\n isTTY: process.stdin.isTTY === true,\n yes: args.yes === true,\n json: args.json === true,\n dryRun: args[\"dry-run\"] === true,\n });\n\n // 対話モード: (1) コンテキスト表示 →(2) 書き込み対象の選択(--target 未指定時のみ)。\n // フラグで与えた項目はウィザードで再質問しない(フラグが対話を上書き)。\n let targetFlag = args.target;\n if (mode === \"interactive\") {\n await showDetectedContext(cwd, version, resolveTargets(cwd, targetFlag));\n if (targetFlag == null || targetFlag === \"\") {\n const choice = await select(\n \"Which files should reference the Orizm docs?\",\n [\n {\n label: \"AGENTS.md and CLAUDE.md (recommended)\",\n value: \"both\",\n },\n { label: \"AGENTS.md only\", value: \"agents\" },\n { label: \"CLAUDE.md only\", value: \"claude\" },\n ],\n );\n if (choice == null) return Result.fail({ message: \"Aborted.\" });\n targetFlag = targetChoiceToFlag(choice);\n }\n }\n\n // 各ターゲットの適用結果を先に計算し、書き込みは確認後にまとめて行う。\n const targets = resolveTargets(cwd, targetFlag);\n const plans: TargetPlan[] = [];\n for (const target of targets) {\n let inner: string;\n if (target.kind === \"canonical\") {\n const ref = docsReference(path.dirname(target.path));\n if (!ref.resolves) {\n warn(\n `node_modules/@orizm/cli was not found from ${path.dirname(target.path)} ` +\n \"(it may be installed globally only, or not a dependency). \" +\n \"To let agents reference version-aligned docs, \" +\n \"add @orizm/cli to this project's devDependencies \" +\n \"(a global install cannot be resolved via a project-relative reference path). \" +\n \"If it is already a dependency, check where it resolves with `pnpm why @orizm/cli`. \" +\n \"The reference path itself will still be written.\",\n );\n }\n inner = renderReferenceInner({\n docsDir: ref.docsDir,\n docsIndex: ref.docsIndex,\n });\n } else {\n inner = renderClaudeImportInner();\n }\n const existing = await readTextFile(target.path);\n const newBlock = wrapBlock(inner);\n let upserted: ReturnType<typeof upsertBlock>;\n try {\n upserted = upsertBlock(existing, newBlock);\n } catch (error) {\n // 開始マーカーだけが残ったファイルに追記すると開始マーカーが 2 つになり、次回の\n // 実行(CI の --yes)で 2 つのマーカーに挟まれたユーザー本文を丸ごと消してしまう。\n // 壊れた形は機械的に触らず、他の対象にも書き込まずに中断する\n if (error instanceof BrokenManagedBlockError) {\n return Result.fail({\n message: renderBrokenManagedBlock(target.fileName, error),\n });\n }\n throw error;\n }\n const { content, action } = upserted;\n plans.push({\n target,\n content,\n action,\n oldBlock: extractBlock(existing),\n newBlock,\n });\n }\n\n const toJson = (): {\n version: string;\n dryRun: boolean;\n results: { target: string; action: UpsertAction }[];\n } => ({\n version,\n dryRun: args[\"dry-run\"] === true,\n results: plans.map((plan) => ({\n target: plan.target.path,\n action: plan.action,\n })),\n });\n\n const changed = plans.filter((plan) => plan.action !== \"unchanged\");\n\n if (changed.length === 0) {\n const names = plans.map((plan) => plan.target.fileName).join(\", \");\n return Result.succeed({\n json: toJson(),\n text: () => `Orizm docs reference already up to date in ${names}.`,\n });\n }\n\n const previewItems: PreviewItem[] = changed.map((plan) => ({\n fileName: plan.target.fileName,\n action: plan.action,\n oldBlock: plan.oldBlock,\n newBlock: plan.newBlock,\n }));\n\n // --dry-run はどちらのモードでも書き込まずプレビューのみ。\n if (args[\"dry-run\"] === true) {\n return Result.succeed({\n json: toJson(),\n text: () => renderPlanPreview(previewItems),\n });\n }\n\n // 対話モード: (3) 変更プレビュー →(4) 確定。非対話はフラグ指定のまま書き込む。\n if (mode === \"interactive\") {\n notice(renderPlanPreview(previewItems));\n const summary = changed\n .map(\n (plan) =>\n `${plan.action === \"created\" ? \"create\" : \"update\"} ${plan.target.fileName}`,\n )\n .join(\", \");\n const approved = await confirm(\n `Write the Orizm docs reference (${summary})?`,\n true,\n );\n if (!approved) return Result.fail({ message: \"Aborted.\" });\n }\n\n for (const plan of changed) {\n await applyWrite(plan.target.path, plan.content);\n }\n\n return Result.succeed({\n json: toJson(),\n text: () => {\n const lines = changed.map(\n (plan) =>\n `${plan.action === \"created\" ? \"Created\" : \"Updated\"} ${plan.target.fileName}`,\n );\n return `${lines.join(\"\\n\")} (Orizm docs v${version}).`;\n },\n });\n },\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
+
const require_prompt = require('./prompt-C-XNDSNE.cjs');
|
|
4
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
5
|
+
let valibot = require("valibot");
|
|
6
|
+
valibot = require_cli_main.__toESM(valibot, 1);
|
|
7
|
+
let node_path = require("node:path");
|
|
8
|
+
node_path = require_cli_main.__toESM(node_path, 1);
|
|
9
|
+
let node_fs = require("node:fs");
|
|
10
|
+
let node_fs_promises = require("node:fs/promises");
|
|
11
|
+
let node_url = require("node:url");
|
|
12
|
+
|
|
13
|
+
//#region src/cli/agent/resolve-docs.ts
|
|
14
|
+
const PRETTY_DOCS_SUBPATH = "node_modules/@orizm/cli/dist/docs";
|
|
15
|
+
const ManifestSchema = valibot.object({
|
|
16
|
+
version: valibot.pipe(valibot.string(), valibot.nonEmpty()),
|
|
17
|
+
generatedAt: valibot.string(),
|
|
18
|
+
pages: valibot.optional(valibot.number(), 0)
|
|
19
|
+
});
|
|
20
|
+
function findPackageRoot(start) {
|
|
21
|
+
let dir = start;
|
|
22
|
+
for (;;) {
|
|
23
|
+
if ((0, node_fs.existsSync)(node_path.default.join(dir, "package.json"))) return dir;
|
|
24
|
+
const parent = node_path.default.dirname(dir);
|
|
25
|
+
if (parent === dir) return void 0;
|
|
26
|
+
dir = parent;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function defaultPackageRoot() {
|
|
30
|
+
const from = node_path.default.dirname((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href));
|
|
31
|
+
const root = findPackageRoot(from);
|
|
32
|
+
if (root === void 0) throw new Error(`@orizm/cli の package.json が ${from} から上に見つかりません。`);
|
|
33
|
+
return root;
|
|
34
|
+
}
|
|
35
|
+
function safeJsonParse(raw) {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
} catch {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function resolveDocs(packageRoot = defaultPackageRoot()) {
|
|
43
|
+
const docsDir = node_path.default.join(packageRoot, "dist", "docs");
|
|
44
|
+
const manifestPath = node_path.default.join(docsDir, "manifest.json");
|
|
45
|
+
const raw = await (0, node_fs_promises.readFile)(manifestPath, "utf-8").catch((error) => {
|
|
46
|
+
if (error.code === "ENOENT") return void 0;
|
|
47
|
+
throw error;
|
|
48
|
+
});
|
|
49
|
+
if (raw === void 0) return _praha_byethrow.Result.fail({
|
|
50
|
+
type: "docs_not_resolved",
|
|
51
|
+
reason: "manifest_missing",
|
|
52
|
+
manifestPath
|
|
53
|
+
});
|
|
54
|
+
const parsed = valibot.safeParse(ManifestSchema, safeJsonParse(raw));
|
|
55
|
+
if (!parsed.success) return _praha_byethrow.Result.fail({
|
|
56
|
+
type: "docs_not_resolved",
|
|
57
|
+
reason: "manifest_invalid",
|
|
58
|
+
manifestPath
|
|
59
|
+
});
|
|
60
|
+
return _praha_byethrow.Result.succeed({
|
|
61
|
+
docsDir,
|
|
62
|
+
version: parsed.output.version,
|
|
63
|
+
pages: parsed.output.pages
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function docsReference(targetDir) {
|
|
67
|
+
const base = `./${PRETTY_DOCS_SUBPATH}`;
|
|
68
|
+
return {
|
|
69
|
+
docsDir: `${base}/`,
|
|
70
|
+
docsIndex: `${base}/index.md`,
|
|
71
|
+
resolves: (0, node_fs.existsSync)(node_path.default.join(targetDir, PRETTY_DOCS_SUBPATH))
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function renderDocsNotResolved(error) {
|
|
75
|
+
switch (error.reason) {
|
|
76
|
+
case "manifest_missing": return `Could not find the bundled Orizm docs (looked in ${error.manifestPath}). The installed @orizm/cli ${require_cli_main.version} does not ship docs. Run \`pnpm update @orizm/cli\`.`;
|
|
77
|
+
case "manifest_invalid": return `Could not read the bundled Orizm docs manifest (${error.manifestPath}). The @orizm/cli ${require_cli_main.version} install looks incomplete. Run \`pnpm install --force\`.`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/cli/agent/resolve-target.ts
|
|
83
|
+
const CLAUDE_FILE = "CLAUDE.md";
|
|
84
|
+
const AGENTS_FILE = "AGENTS.md";
|
|
85
|
+
function resolveTargets(cwd, targetFlag) {
|
|
86
|
+
if (targetFlag != null && targetFlag !== "") {
|
|
87
|
+
const resolved = node_path.default.resolve(cwd, targetFlag);
|
|
88
|
+
return [{
|
|
89
|
+
path: resolved,
|
|
90
|
+
fileName: node_path.default.basename(resolved),
|
|
91
|
+
kind: "canonical"
|
|
92
|
+
}];
|
|
93
|
+
}
|
|
94
|
+
return [{
|
|
95
|
+
path: node_path.default.join(cwd, AGENTS_FILE),
|
|
96
|
+
fileName: AGENTS_FILE,
|
|
97
|
+
kind: "canonical"
|
|
98
|
+
}, {
|
|
99
|
+
path: node_path.default.join(cwd, CLAUDE_FILE),
|
|
100
|
+
fileName: CLAUDE_FILE,
|
|
101
|
+
kind: "claude-import"
|
|
102
|
+
}];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/cli/agent/execution-mode.ts
|
|
107
|
+
function resolveExecutionMode(opts) {
|
|
108
|
+
if (opts.isTTY && !opts.yes && !opts.json && !opts.dryRun) return "interactive";
|
|
109
|
+
return "non-interactive";
|
|
110
|
+
}
|
|
111
|
+
function targetChoiceToFlag(choice) {
|
|
112
|
+
if (choice === "agents") return "AGENTS.md";
|
|
113
|
+
if (choice === "claude") return "CLAUDE.md";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
//#region src/cli/agent/preview.ts
|
|
118
|
+
function diffBlockLines(oldBlock, newBlock) {
|
|
119
|
+
const oldLines = oldBlock != null ? oldBlock.split("\n") : [];
|
|
120
|
+
const newLines = newBlock.split("\n");
|
|
121
|
+
let start = 0;
|
|
122
|
+
while (start < oldLines.length && start < newLines.length && oldLines[start] === newLines[start]) start++;
|
|
123
|
+
let oldEnd = oldLines.length;
|
|
124
|
+
let newEnd = newLines.length;
|
|
125
|
+
while (oldEnd > start && newEnd > start && oldLines[oldEnd - 1] === newLines[newEnd - 1]) {
|
|
126
|
+
oldEnd--;
|
|
127
|
+
newEnd--;
|
|
128
|
+
}
|
|
129
|
+
const removed = oldLines.slice(start, oldEnd).map((line) => `- ${line}`);
|
|
130
|
+
const added = newLines.slice(start, newEnd).map((line) => `+ ${line}`);
|
|
131
|
+
return [...removed, ...added];
|
|
132
|
+
}
|
|
133
|
+
function renderPlanPreview(items) {
|
|
134
|
+
return items.map((item) => {
|
|
135
|
+
if (item.action === "unchanged") return `= ${item.fileName} (unchanged)`;
|
|
136
|
+
return [`${item.action === "created" ? "+" : "~"} ${item.action === "created" ? "create" : "update"} ${item.fileName}`, ...diffBlockLines(item.oldBlock, item.newBlock).map((line) => ` ${line}`)].join("\n");
|
|
137
|
+
}).join("\n\n");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
//#endregion
|
|
141
|
+
//#region src/cli/agent/template.ts
|
|
142
|
+
function renderReferenceInner(params) {
|
|
143
|
+
return [
|
|
144
|
+
"## Orizm",
|
|
145
|
+
"",
|
|
146
|
+
"You are working in an Orizm project (Starter Kit v2). Before generating or editing",
|
|
147
|
+
"any Orizm code, read the bundled docs below. They are a snapshot of",
|
|
148
|
+
"https://docs.orizm.com, bundled with and version-matched to the `@orizm/cli`",
|
|
149
|
+
"installed in this project. Do NOT rely on your training data — Orizm is a private",
|
|
150
|
+
"product and your built-in knowledge is likely stale or wrong.",
|
|
151
|
+
"",
|
|
152
|
+
`- Docs: \`${params.docsDir}\``,
|
|
153
|
+
`- Index (start here): \`${params.docsIndex}\``,
|
|
154
|
+
"",
|
|
155
|
+
"The path above assumes `@orizm/cli` is installed as a project devDependency",
|
|
156
|
+
"(a global-only install is not resolved by this project-relative path).",
|
|
157
|
+
"",
|
|
158
|
+
"`@orizm/cms-sdk` / `@orizm/consumer-sdk` are versioned separately from",
|
|
159
|
+
"`@orizm/cli`, so check the version each SDK page documents against this",
|
|
160
|
+
"project's `package.json`.",
|
|
161
|
+
"",
|
|
162
|
+
"For the latest release, upgrades, or migrations, see https://docs.orizm.com.",
|
|
163
|
+
"",
|
|
164
|
+
"Starter Kit v2 conventions:",
|
|
165
|
+
"",
|
|
166
|
+
"- Edit only `apps/cms`, `apps/consumer`, and `packages/design-editor`.",
|
|
167
|
+
"- `packages/orizm` is generated from `orizm.config.ts` — never edit it by hand."
|
|
168
|
+
].join("\n");
|
|
169
|
+
}
|
|
170
|
+
function renderClaudeImportInner() {
|
|
171
|
+
return [
|
|
172
|
+
"## Orizm",
|
|
173
|
+
"",
|
|
174
|
+
`Orizm docs and conventions are maintained in ${AGENTS_FILE} (managed by \`orizm agent\`).`,
|
|
175
|
+
"Claude Code imports it here:",
|
|
176
|
+
"",
|
|
177
|
+
`@${AGENTS_FILE}`
|
|
178
|
+
].join("\n");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/cli/agent/write-reference.ts
|
|
183
|
+
const START_TOKEN = "<!-- orizm-agent:start";
|
|
184
|
+
const MARKER_START = "<!-- orizm-agent:start (managed by `orizm agent` — do not edit manually) -->";
|
|
185
|
+
const MARKER_END = "<!-- orizm-agent:end -->";
|
|
186
|
+
var BrokenManagedBlockError = class extends Error {
|
|
187
|
+
reason;
|
|
188
|
+
constructor(reason) {
|
|
189
|
+
super(`managed block is broken (${reason})`);
|
|
190
|
+
this.name = "BrokenManagedBlockError";
|
|
191
|
+
this.reason = reason;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
function indexOfAll(text, token) {
|
|
195
|
+
const found = [];
|
|
196
|
+
let from = 0;
|
|
197
|
+
while (true) {
|
|
198
|
+
const idx = text.indexOf(token, from);
|
|
199
|
+
if (idx === -1) return found;
|
|
200
|
+
found.push(idx);
|
|
201
|
+
from = idx + token.length;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function inspectManagedBlock(text) {
|
|
205
|
+
const starts = indexOfAll(text, START_TOKEN);
|
|
206
|
+
if (starts.length === 0) return { kind: "absent" };
|
|
207
|
+
if (starts.length > 1) return {
|
|
208
|
+
kind: "broken",
|
|
209
|
+
reason: `found ${starts.length} start markers, expected at most 1`
|
|
210
|
+
};
|
|
211
|
+
const start = starts[0];
|
|
212
|
+
const endIdx = text.indexOf(MARKER_END, start);
|
|
213
|
+
if (endIdx === -1) return {
|
|
214
|
+
kind: "broken",
|
|
215
|
+
reason: "found a start marker without a matching end marker after it"
|
|
216
|
+
};
|
|
217
|
+
return {
|
|
218
|
+
kind: "present",
|
|
219
|
+
start,
|
|
220
|
+
end: endIdx + 24
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function wrapBlock(inner) {
|
|
224
|
+
return `${MARKER_START}\n${inner.trim()}\n${MARKER_END}`;
|
|
225
|
+
}
|
|
226
|
+
function extractBlock(text) {
|
|
227
|
+
const state = inspectManagedBlock(text);
|
|
228
|
+
if (state.kind !== "present") return void 0;
|
|
229
|
+
return text.slice(state.start, state.end);
|
|
230
|
+
}
|
|
231
|
+
function upsertBlock(existing, block) {
|
|
232
|
+
const state = inspectManagedBlock(existing);
|
|
233
|
+
if (state.kind === "broken") throw new BrokenManagedBlockError(state.reason);
|
|
234
|
+
if (state.kind === "present") {
|
|
235
|
+
const before = existing.slice(0, state.start);
|
|
236
|
+
const after = existing.slice(state.end);
|
|
237
|
+
const content = before + block + after;
|
|
238
|
+
return {
|
|
239
|
+
content,
|
|
240
|
+
action: content === existing ? "unchanged" : "updated"
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
if (existing === "") return {
|
|
244
|
+
content: `${block}\n`,
|
|
245
|
+
action: "created"
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
content: `${existing.endsWith("\n") ? existing : `${existing}\n`}\n${block}\n`,
|
|
249
|
+
action: "updated"
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function enoentToUndefined(error) {
|
|
253
|
+
if (error.code === "ENOENT") return void 0;
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
async function readTextFile(filePath) {
|
|
257
|
+
return await (0, node_fs_promises.readFile)(filePath, "utf-8").catch(enoentToUndefined) ?? "";
|
|
258
|
+
}
|
|
259
|
+
async function applyWrite(filePath, content) {
|
|
260
|
+
const dir = node_path.default.dirname(filePath);
|
|
261
|
+
await (0, node_fs_promises.mkdir)(dir, { recursive: true });
|
|
262
|
+
const temp = node_path.default.join(dir, `${node_path.default.basename(filePath)}.${globalThis.crypto.randomUUID()}.tmp`);
|
|
263
|
+
await (0, node_fs_promises.writeFile)(temp, content, "utf-8");
|
|
264
|
+
await (0, node_fs_promises.rename)(temp, filePath).catch(async (error) => {
|
|
265
|
+
await (0, node_fs_promises.rm)(temp, { force: true });
|
|
266
|
+
throw error;
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
//#endregion
|
|
271
|
+
//#region src/cli/commands/agent/init.ts
|
|
272
|
+
function describeExisting(existing) {
|
|
273
|
+
const state = inspectManagedBlock(existing);
|
|
274
|
+
switch (state.kind) {
|
|
275
|
+
case "present": return "exists (managed block present — will update)";
|
|
276
|
+
case "absent": return "exists (no managed block — will append)";
|
|
277
|
+
case "broken": return `exists (broken managed block: ${state.reason} — cannot update)`;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function renderBrokenManagedBlock(fileName, error) {
|
|
281
|
+
return `${fileName}: ${error.message}. Nothing was written. Repair the file by hand — keep exactly one \`<!-- orizm-agent:start ... -->\` marker followed by one \`<!-- orizm-agent:end -->\` marker, or remove both — then re-run \`orizm agent init\`.`;
|
|
282
|
+
}
|
|
283
|
+
async function showDetectedContext(cwd, version, targets) {
|
|
284
|
+
const lines = [`Detected bundled Orizm docs v${version} (shipped with @orizm/cli).`, `Project root: ${cwd}`];
|
|
285
|
+
for (const target of targets) {
|
|
286
|
+
const fileName = target.fileName;
|
|
287
|
+
const existing = await readTextFile(target.path);
|
|
288
|
+
const status = existing === "" ? "not found (will be created)" : describeExisting(existing);
|
|
289
|
+
lines.push(`- ${fileName}: ${status}`);
|
|
290
|
+
}
|
|
291
|
+
require_cli_main.notice(lines.join("\n"));
|
|
292
|
+
}
|
|
293
|
+
var init_default = require_cli_main.defineCommand({
|
|
294
|
+
meta: {
|
|
295
|
+
name: "init",
|
|
296
|
+
description: "Add a reference to the bundled Orizm docs into AGENTS.md / CLAUDE.md"
|
|
297
|
+
},
|
|
298
|
+
args: {
|
|
299
|
+
...require_shared.globalArgs,
|
|
300
|
+
target: {
|
|
301
|
+
type: "string",
|
|
302
|
+
description: "Write only this file (e.g. AGENTS.md). Default: manage both AGENTS.md and CLAUDE.md"
|
|
303
|
+
},
|
|
304
|
+
cwd: {
|
|
305
|
+
type: "string",
|
|
306
|
+
description: "Project root directory (defaults to the current directory)"
|
|
307
|
+
},
|
|
308
|
+
"dry-run": {
|
|
309
|
+
type: "boolean",
|
|
310
|
+
description: "Show what would change without writing",
|
|
311
|
+
default: false
|
|
312
|
+
},
|
|
313
|
+
yes: {
|
|
314
|
+
type: "boolean",
|
|
315
|
+
description: "Skip the confirmation prompt (non-interactive)",
|
|
316
|
+
default: false
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
run: async ({ args }) => {
|
|
320
|
+
const cwd = args.cwd != null && args.cwd !== "" ? args.cwd : process.cwd();
|
|
321
|
+
const docs = await resolveDocs();
|
|
322
|
+
if (_praha_byethrow.Result.isFailure(docs)) {
|
|
323
|
+
require_cli_main.logger.debug(`import.meta.url: ${require("url").pathToFileURL(__filename).href}`);
|
|
324
|
+
return _praha_byethrow.Result.fail({ message: renderDocsNotResolved(docs.error) });
|
|
325
|
+
}
|
|
326
|
+
const version = docs.value.version;
|
|
327
|
+
const mode = resolveExecutionMode({
|
|
328
|
+
isTTY: process.stdin.isTTY === true,
|
|
329
|
+
yes: args.yes === true,
|
|
330
|
+
json: args.json === true,
|
|
331
|
+
dryRun: args["dry-run"] === true
|
|
332
|
+
});
|
|
333
|
+
let targetFlag = args.target;
|
|
334
|
+
if (mode === "interactive") {
|
|
335
|
+
await showDetectedContext(cwd, version, resolveTargets(cwd, targetFlag));
|
|
336
|
+
if (targetFlag == null || targetFlag === "") {
|
|
337
|
+
const choice = await require_prompt.select("Which files should reference the Orizm docs?", [
|
|
338
|
+
{
|
|
339
|
+
label: "AGENTS.md and CLAUDE.md (recommended)",
|
|
340
|
+
value: "both"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
label: "AGENTS.md only",
|
|
344
|
+
value: "agents"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
label: "CLAUDE.md only",
|
|
348
|
+
value: "claude"
|
|
349
|
+
}
|
|
350
|
+
]);
|
|
351
|
+
if (choice == null) return _praha_byethrow.Result.fail({ message: "Aborted." });
|
|
352
|
+
targetFlag = targetChoiceToFlag(choice);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
const targets = resolveTargets(cwd, targetFlag);
|
|
356
|
+
const plans = [];
|
|
357
|
+
for (const target of targets) {
|
|
358
|
+
let inner;
|
|
359
|
+
if (target.kind === "canonical") {
|
|
360
|
+
const ref = docsReference(node_path.default.dirname(target.path));
|
|
361
|
+
if (!ref.resolves) require_cli_main.warn(`node_modules/@orizm/cli was not found from ${node_path.default.dirname(target.path)} (it may be installed globally only, or not a dependency). To let agents reference version-aligned docs, add @orizm/cli to this project's devDependencies (a global install cannot be resolved via a project-relative reference path). If it is already a dependency, check where it resolves with \`pnpm why @orizm/cli\`. The reference path itself will still be written.`);
|
|
362
|
+
inner = renderReferenceInner({
|
|
363
|
+
docsDir: ref.docsDir,
|
|
364
|
+
docsIndex: ref.docsIndex
|
|
365
|
+
});
|
|
366
|
+
} else inner = renderClaudeImportInner();
|
|
367
|
+
const existing = await readTextFile(target.path);
|
|
368
|
+
const newBlock = wrapBlock(inner);
|
|
369
|
+
let upserted;
|
|
370
|
+
try {
|
|
371
|
+
upserted = upsertBlock(existing, newBlock);
|
|
372
|
+
} catch (error) {
|
|
373
|
+
if (error instanceof BrokenManagedBlockError) return _praha_byethrow.Result.fail({ message: renderBrokenManagedBlock(target.fileName, error) });
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
const { content, action } = upserted;
|
|
377
|
+
plans.push({
|
|
378
|
+
target,
|
|
379
|
+
content,
|
|
380
|
+
action,
|
|
381
|
+
oldBlock: extractBlock(existing),
|
|
382
|
+
newBlock
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
const toJson = () => ({
|
|
386
|
+
version,
|
|
387
|
+
dryRun: args["dry-run"] === true,
|
|
388
|
+
results: plans.map((plan) => ({
|
|
389
|
+
target: plan.target.path,
|
|
390
|
+
action: plan.action
|
|
391
|
+
}))
|
|
392
|
+
});
|
|
393
|
+
const changed = plans.filter((plan) => plan.action !== "unchanged");
|
|
394
|
+
if (changed.length === 0) {
|
|
395
|
+
const names = plans.map((plan) => plan.target.fileName).join(", ");
|
|
396
|
+
return _praha_byethrow.Result.succeed({
|
|
397
|
+
json: toJson(),
|
|
398
|
+
text: () => `Orizm docs reference already up to date in ${names}.`
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
const previewItems = changed.map((plan) => ({
|
|
402
|
+
fileName: plan.target.fileName,
|
|
403
|
+
action: plan.action,
|
|
404
|
+
oldBlock: plan.oldBlock,
|
|
405
|
+
newBlock: plan.newBlock
|
|
406
|
+
}));
|
|
407
|
+
if (args["dry-run"] === true) return _praha_byethrow.Result.succeed({
|
|
408
|
+
json: toJson(),
|
|
409
|
+
text: () => renderPlanPreview(previewItems)
|
|
410
|
+
});
|
|
411
|
+
if (mode === "interactive") {
|
|
412
|
+
require_cli_main.notice(renderPlanPreview(previewItems));
|
|
413
|
+
if (!await require_prompt.confirm(`Write the Orizm docs reference (${changed.map((plan) => `${plan.action === "created" ? "create" : "update"} ${plan.target.fileName}`).join(", ")})?`, true)) return _praha_byethrow.Result.fail({ message: "Aborted." });
|
|
414
|
+
}
|
|
415
|
+
for (const plan of changed) await applyWrite(plan.target.path, plan.content);
|
|
416
|
+
return _praha_byethrow.Result.succeed({
|
|
417
|
+
json: toJson(),
|
|
418
|
+
text: () => {
|
|
419
|
+
return `${changed.map((plan) => `${plan.action === "created" ? "Created" : "Updated"} ${plan.target.fileName}`).join("\n")} (Orizm docs v${version}).`;
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
//#endregion
|
|
426
|
+
exports.default = init_default;
|
|
427
|
+
//# sourceMappingURL=init-BrZCChEG.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-BrZCChEG.cjs","names":["v","path","Result","cliVersion","path","path","defineCommand","globalArgs","Result","select","path","confirm"],"sources":["../src/cli/agent/resolve-docs.ts","../src/cli/agent/resolve-target.ts","../src/cli/agent/execution-mode.ts","../src/cli/agent/preview.ts","../src/cli/agent/template.ts","../src/cli/agent/write-reference.ts","../src/cli/commands/agent/init.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { version as cliVersion } from \"../version.js\";\n\n// きれいに辿れる場合に優先する公開パス(トップレベル/ホイスト済みインストール)。\nconst PRETTY_DOCS_SUBPATH = \"node_modules/@orizm/cli/dist/docs\";\n\nexport type BundledDocs = {\n docsDir: string;\n version: string;\n pages: number;\n};\n\nexport type ResolveDocsError = {\n type: \"docs_not_resolved\";\n reason: \"manifest_missing\" | \"manifest_invalid\";\n manifestPath: string;\n};\n\nconst ManifestSchema = v.object({\n version: v.pipe(v.string(), v.nonEmpty()),\n generatedAt: v.string(),\n pages: v.optional(v.number(), 0),\n});\n\nfunction findPackageRoot(start: string): string | undefined {\n let dir = start;\n for (;;) {\n if (existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\n// 実行中の CLI ファイル位置から自パッケージルートをたどるため、プロジェクト側 node_modules の\n// レイアウト(hoisting / pnpm)に依存しない。\nfunction defaultPackageRoot(): string {\n const from = path.dirname(fileURLToPath(import.meta.url));\n const root = findPackageRoot(from);\n if (root === undefined) {\n throw new Error(\n `@orizm/cli の package.json が ${from} から上に見つかりません。`,\n );\n }\n return root;\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\n// 同梱 docs の存在を manifest.json で確認し、参照文言に載せる version を得る。\nexport async function resolveDocs(\n packageRoot: string = defaultPackageRoot(),\n): Promise<Result.Result<BundledDocs, ResolveDocsError>> {\n const docsDir = path.join(packageRoot, \"dist\", \"docs\");\n const manifestPath = path.join(docsDir, \"manifest.json\");\n const raw = await readFile(manifestPath, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) {\n return Result.fail({\n type: \"docs_not_resolved\",\n reason: \"manifest_missing\",\n manifestPath,\n });\n }\n\n const parsed = v.safeParse(ManifestSchema, safeJsonParse(raw));\n if (!parsed.success) {\n return Result.fail({\n type: \"docs_not_resolved\",\n reason: \"manifest_invalid\",\n manifestPath,\n });\n }\n\n return Result.succeed({\n docsDir,\n version: parsed.output.version,\n pages: parsed.output.pages,\n });\n}\n\n// 指示ファイルに書く docs 参照は常に `node_modules/@orizm/cli/dist/docs` の公開パスにする\n// (相対パスや .pnpm の実体パスは書かない。Next.js の `node_modules/next/dist/docs` と同方式)。\n// `resolves` は targetDir 直下からそのパスが実在するか。false の場合、呼び出し側で警告する\n// (@orizm/cli が targetDir を起点に解決できない配置。プロジェクトの依存に加えるか、\n// 解決できる場所で実行する必要がある)。\nexport function docsReference(targetDir: string): {\n docsDir: string;\n docsIndex: string;\n resolves: boolean;\n} {\n const base = `./${PRETTY_DOCS_SUBPATH}`;\n return {\n docsDir: `${base}/`,\n docsIndex: `${base}/index.md`,\n resolves: existsSync(path.join(targetDir, PRETTY_DOCS_SUBPATH)),\n };\n}\n\n// docs_not_resolved の表示文。原因ごとに復旧手段を添える(commands.md の仕様)。\n// 公開パスが辿れない問題は独立して起こるため、成功時の警告(init.ts)で扱う。\nexport function renderDocsNotResolved(error: ResolveDocsError): string {\n switch (error.reason) {\n case \"manifest_missing\":\n return (\n `Could not find the bundled Orizm docs (looked in ${error.manifestPath}). ` +\n `The installed @orizm/cli ${cliVersion} does not ship docs. ` +\n \"Run `pnpm update @orizm/cli`.\"\n );\n case \"manifest_invalid\":\n return (\n `Could not read the bundled Orizm docs manifest (${error.manifestPath}). ` +\n `The @orizm/cli ${cliVersion} install looks incomplete. ` +\n \"Run `pnpm install --force`.\"\n );\n }\n}\n","import path from \"node:path\";\n\nexport const CLAUDE_FILE = \"CLAUDE.md\";\nexport const AGENTS_FILE = \"AGENTS.md\";\n\n// canonical: docs 参照の本文そのものを書くファイル(AGENTS.md)。\n// claude-import: 本文を持たず AGENTS.md を `@` import するファイル(CLAUDE.md)。\nexport type TargetKind = \"canonical\" | \"claude-import\";\n\nexport type Target = {\n path: string;\n fileName: string;\n kind: TargetKind;\n};\n\n// 書き込み対象の決定。\n// - --target 明示: そのファイル 1 つに本文(canonical)を書く。\n// - 省略時: AGENTS.md を正本(canonical)に、CLAUDE.md は @AGENTS.md import として\n// 両方を管理する。どちらも無ければ両方新規作成する。\nexport function resolveTargets(cwd: string, targetFlag?: string): Target[] {\n if (targetFlag != null && targetFlag !== \"\") {\n const resolved = path.resolve(cwd, targetFlag);\n return [\n { path: resolved, fileName: path.basename(resolved), kind: \"canonical\" },\n ];\n }\n\n return [\n { path: path.join(cwd, AGENTS_FILE), fileName: AGENTS_FILE, kind: \"canonical\" },\n {\n path: path.join(cwd, CLAUDE_FILE),\n fileName: CLAUDE_FILE,\n kind: \"claude-import\",\n },\n ];\n}\n","// orizm agent init の実行モード判定(純関数)。\n// 解決順序は「フラグ > 対話 (TTY) > 既定/エラー (非 TTY)」で ADR-004 のコンテキスト解決と揃える。\n// - interactive: TTY かつ --yes / --json / --dry-run のいずれも無いとき。npx skills 風ウィザードを出す。\n// - non-interactive: それ以外(CI・スクリプト・--yes・非 TTY・--json・--dry-run)。プロンプトを出さない。\n// --json は stdout を機械可読結果専用に空けるため、--dry-run はプレビューのみで書き込まないため、\n// どちらも非対話に倒してウィザードを出さない。\nexport type ExecutionMode = \"interactive\" | \"non-interactive\";\n\nexport function resolveExecutionMode(opts: {\n isTTY: boolean;\n yes: boolean;\n json: boolean;\n dryRun: boolean;\n}): ExecutionMode {\n if (opts.isTTY && !opts.yes && !opts.json && !opts.dryRun) {\n return \"interactive\";\n }\n return \"non-interactive\";\n}\n\n// 対話ウィザードの「書き込み対象の選択」を --target フラグ相当へ写像する。\n// \"both\"(既定=両方)は --target 未指定と同じ = undefined。単一選択はそのファイル名を返す。\nexport function targetChoiceToFlag(choice: string): string | undefined {\n if (choice === \"agents\") return \"AGENTS.md\";\n if (choice === \"claude\") return \"CLAUDE.md\";\n return undefined;\n}\n","import type { UpsertAction } from \"./write-reference.js\";\n\n// 変更プレビューの 1 対象分。書き換わるのは自機能の管理ブロックだけなので、\n// 旧ブロック↔新ブロックの差分だけを見せる(ファイル全文は出さない)。\nexport type PreviewItem = {\n fileName: string;\n action: UpsertAction;\n // 既存の管理ブロック(updated のとき)。新規作成・ブロック未存在なら undefined。\n oldBlock?: string;\n // 書き込む新しい管理ブロック。\n newBlock: string;\n};\n\n// 旧・新ブロックの共通の先頭行 / 末尾行を除いた「変わった行」だけを -/+ で返す。\n// created(oldBlock=undefined)は新ブロック全行が追加 (+) になる。\nexport function diffBlockLines(\n oldBlock: string | undefined,\n newBlock: string,\n): string[] {\n const oldLines = oldBlock != null ? oldBlock.split(\"\\n\") : [];\n const newLines = newBlock.split(\"\\n\");\n\n let start = 0;\n while (\n start < oldLines.length &&\n start < newLines.length &&\n oldLines[start] === newLines[start]\n ) {\n start++;\n }\n\n let oldEnd = oldLines.length;\n let newEnd = newLines.length;\n while (\n oldEnd > start &&\n newEnd > start &&\n oldLines[oldEnd - 1] === newLines[newEnd - 1]\n ) {\n oldEnd--;\n newEnd--;\n }\n\n const removed = oldLines.slice(start, oldEnd).map((line) => `- ${line}`);\n const added = newLines.slice(start, newEnd).map((line) => `+ ${line}`);\n return [...removed, ...added];\n}\n\n// 対象ごとの操作(create / update / unchanged)とブロック差分を組み立てた表示用文字列。\n// 対話ウィザードのプレビュー、および --dry-run の出力に共通で使う。\nexport function renderPlanPreview(items: PreviewItem[]): string {\n const sections = items.map((item) => {\n if (item.action === \"unchanged\") {\n return `= ${item.fileName} (unchanged)`;\n }\n const marker = item.action === \"created\" ? \"+\" : \"~\";\n const verb = item.action === \"created\" ? \"create\" : \"update\";\n const header = `${marker} ${verb} ${item.fileName}`;\n const body = diffBlockLines(item.oldBlock, item.newBlock).map(\n (line) => ` ${line}`,\n );\n return [header, ...body].join(\"\\n\");\n });\n return sections.join(\"\\n\\n\");\n}\n","import { AGENTS_FILE } from \"./resolve-target.js\";\n\n// 指示ファイルに書き込む参照ブロックの本文(マーカーは write-reference が付ける)。\n// docs 全文は inline せず、docs へのポインタと索引だけを渡してコンテキストを圧迫しない。\n// パスは resolve-docs.docsReference が算出した「実際に解決できる相対パス」を受け取る。\n// バージョン数字は書かない(パス先の docs が常に整合するため。数字を書くと再実行漏れで嘘になる)。\n// 代わりに SDK ページのバージョン表記と package.json を突き合わせさせる(SDK は CLI と別版で進む)。\n// docs.orizm.com への誘導はこのブロックにだけ置く(同梱 docs 本文は外部 URL を持たない)。\nexport function renderReferenceInner(params: {\n docsDir: string;\n docsIndex: string;\n}): string {\n return [\n \"## Orizm\",\n \"\",\n \"You are working in an Orizm project (Starter Kit v2). Before generating or editing\",\n \"any Orizm code, read the bundled docs below. They are a snapshot of\",\n \"https://docs.orizm.com, bundled with and version-matched to the `@orizm/cli`\",\n \"installed in this project. Do NOT rely on your training data — Orizm is a private\",\n \"product and your built-in knowledge is likely stale or wrong.\",\n \"\",\n `- Docs: \\`${params.docsDir}\\``,\n `- Index (start here): \\`${params.docsIndex}\\``,\n \"\",\n \"The path above assumes `@orizm/cli` is installed as a project devDependency\",\n \"(a global-only install is not resolved by this project-relative path).\",\n \"\",\n \"`@orizm/cms-sdk` / `@orizm/consumer-sdk` are versioned separately from\",\n \"`@orizm/cli`, so check the version each SDK page documents against this\",\n \"project's `package.json`.\",\n \"\",\n \"For the latest release, upgrades, or migrations, see https://docs.orizm.com.\",\n \"\",\n \"Starter Kit v2 conventions:\",\n \"\",\n \"- Edit only `apps/cms`, `apps/consumer`, and `packages/design-editor`.\",\n \"- `packages/orizm` is generated from `orizm.config.ts` — never edit it by hand.\",\n ].join(\"\\n\");\n}\n\n// CLAUDE.md 用のブロック本文。正本は AGENTS.md に置き、CLAUDE.md は Claude Code の\n// `@` import でそれを取り込む(内容の重複を避け、AGENTS.md を単一の情報源にする)。\nexport function renderClaudeImportInner(): string {\n return [\n \"## Orizm\",\n \"\",\n `Orizm docs and conventions are maintained in ${AGENTS_FILE} (managed by \\`orizm agent\\`).`,\n \"Claude Code imports it here:\",\n \"\",\n `@${AGENTS_FILE}`,\n ].join(\"\\n\");\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n// エージェント指示ファイル内で自機能が管理する領域の境界。start はプレフィックスで検出し、\n// 「do not edit」の文言をユーザーが多少書き換えても再検出できるようにする。\nconst START_TOKEN = \"<!-- orizm-agent:start\";\nexport const MARKER_START =\n \"<!-- orizm-agent:start (managed by `orizm agent` — do not edit manually) -->\";\nexport const MARKER_END = \"<!-- orizm-agent:end -->\";\n\nexport type UpsertAction = \"created\" | \"updated\" | \"unchanged\";\n\n// 既存内容の中での管理ブロックの状態。\n// - absent: 開始マーカーが無い(末尾に追記する)\n// - present: 開始マーカー 1 つと、その後ろに終了マーカーがある(置換する)\n// - broken: 開始マーカーはあるが対応する終了マーカーが無い、または開始マーカーが複数ある\n// (どちらも人手で直してもらう。追記で「開始マーカーが 2 つ」の状態を作ると、次回の実行で\n// 2 つのマーカーに挟まれたユーザー本文を丸ごと置換してしまうため、機械的には触らない)\nexport type ManagedBlockState =\n | { kind: \"absent\" }\n | { kind: \"present\"; start: number; end: number }\n | { kind: \"broken\"; reason: string };\n\n// 管理ブロックが壊れていて安全に更新できないことを表す。呼び出し側(init コマンド)が\n// 捕まえて、対象ファイル名と直し方を添えたエラーにする\nexport class BrokenManagedBlockError extends Error {\n readonly reason: string;\n\n constructor(reason: string) {\n super(`managed block is broken (${reason})`);\n this.name = \"BrokenManagedBlockError\";\n this.reason = reason;\n }\n}\n\nfunction indexOfAll(text: string, token: string): number[] {\n const found: number[] = [];\n let from = 0;\n while (true) {\n const idx = text.indexOf(token, from);\n if (idx === -1) return found;\n found.push(idx);\n from = idx + token.length;\n }\n}\n\n// 既存内容の管理ブロックの状態を判定する。extractBlock / upsertBlock と、\n// 対話モードのコンテキスト表示が同じ判定を共有する\nexport function inspectManagedBlock(text: string): ManagedBlockState {\n const starts = indexOfAll(text, START_TOKEN);\n if (starts.length === 0) return { kind: \"absent\" };\n if (starts.length > 1) {\n return {\n kind: \"broken\",\n reason: `found ${starts.length} start markers, expected at most 1`,\n };\n }\n const start = starts[0];\n const endIdx = text.indexOf(MARKER_END, start);\n if (endIdx === -1) {\n return {\n kind: \"broken\",\n reason: \"found a start marker without a matching end marker after it\",\n };\n }\n return { kind: \"present\", start, end: endIdx + MARKER_END.length };\n}\n\n// 参照本文をマーカーで囲んだ 1 ブロックにする。前後の余分な空白は落として揺れを防ぐ。\nexport function wrapBlock(inner: string): string {\n return `${MARKER_START}\\n${inner.trim()}\\n${MARKER_END}`;\n}\n\n// 既存内容から自機能の管理ブロック(マーカー含む)を抜き出す。無い・壊れているなら undefined。\n// プレビューの差分表示やコンテキスト表示で「既存ブロックの有無」を判定するのに使う。\nexport function extractBlock(text: string): string | undefined {\n const state = inspectManagedBlock(text);\n if (state.kind !== \"present\") return undefined;\n return text.slice(state.start, state.end);\n}\n\n// 既存内容にマーカーブロックがあれば置換、無ければ末尾に追記する純関数。\n// 置換後が元と完全一致なら unchanged とし、呼び出し側が書き込みを省ける。\n// 管理ブロックが壊れている(inspectManagedBlock 参照)ときは BrokenManagedBlockError を投げる。\nexport function upsertBlock(\n existing: string,\n block: string,\n): { content: string; action: UpsertAction } {\n const state = inspectManagedBlock(existing);\n\n if (state.kind === \"broken\") {\n throw new BrokenManagedBlockError(state.reason);\n }\n\n if (state.kind === \"present\") {\n const before = existing.slice(0, state.start);\n const after = existing.slice(state.end);\n const content = before + block + after;\n return { content, action: content === existing ? \"unchanged\" : \"updated\" };\n }\n\n if (existing === \"\") {\n return { content: `${block}\\n`, action: \"created\" };\n }\n\n // 既存本文とブロックの間は 1 行空ける。末尾改行がない既存にも改行を補う。\n const prefix = existing.endsWith(\"\\n\") ? existing : `${existing}\\n`;\n return { content: `${prefix}\\n${block}\\n`, action: \"updated\" };\n}\n\nfunction enoentToUndefined(error: NodeJS.ErrnoException): undefined {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n}\n\n// 対象ファイルを読む。存在しなければ空文字(= 新規作成扱い)。\nexport async function readTextFile(filePath: string): Promise<string> {\n const existing = await readFile(filePath, \"utf-8\").catch(enoentToUndefined);\n return existing ?? \"\";\n}\n\n// 一時ファイルへ書いてから rename で差し替える。直書きだと中断時に既存の\n// AGENTS.md / CLAUDE.md の本文を失う(architecture.md の非破壊要件)。\nexport async function applyWrite(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n const temp = path.join(\n dir,\n `${path.basename(filePath)}.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, content, \"utf-8\");\n await rename(temp, filePath).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n}\n","import path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { confirm, select } from \"../../ui/prompt.js\";\nimport { logger, notice, warn } from \"../../ui/output.js\";\nimport {\n docsReference,\n renderDocsNotResolved,\n resolveDocs,\n} from \"../../agent/resolve-docs.js\";\nimport { resolveTargets, type Target } from \"../../agent/resolve-target.js\";\nimport {\n resolveExecutionMode,\n targetChoiceToFlag,\n} from \"../../agent/execution-mode.js\";\nimport { renderPlanPreview, type PreviewItem } from \"../../agent/preview.js\";\nimport {\n renderClaudeImportInner,\n renderReferenceInner,\n} from \"../../agent/template.js\";\nimport {\n applyWrite,\n BrokenManagedBlockError,\n extractBlock,\n inspectManagedBlock,\n readTextFile,\n upsertBlock,\n wrapBlock,\n type UpsertAction,\n} from \"../../agent/write-reference.js\";\n\ntype TargetPlan = {\n target: Target;\n content: string;\n action: UpsertAction;\n oldBlock: string | undefined;\n newBlock: string;\n};\n\n// 既存ファイルの管理ブロックの状態を、検出コンテキスト表示の 1 行に写す。\n// 壊れているときは「ここで止まる」ことが読めるようにする(実際の中断は plan 組み立て側)。\nfunction describeExisting(existing: string): string {\n const state = inspectManagedBlock(existing);\n switch (state.kind) {\n case \"present\":\n return \"exists (managed block present — will update)\";\n case \"absent\":\n return \"exists (no managed block — will append)\";\n case \"broken\":\n return `exists (broken managed block: ${state.reason} — cannot update)`;\n }\n}\n\n// 壊れた管理ブロックを見つけたときの失敗メッセージ。追記も置換もせず、人手での修復を促す\nfunction renderBrokenManagedBlock(\n fileName: string,\n error: BrokenManagedBlockError,\n): string {\n return (\n `${fileName}: ${error.message}. ` +\n \"Nothing was written. Repair the file by hand — keep exactly one \" +\n \"`<!-- orizm-agent:start ... -->` marker followed by one `<!-- orizm-agent:end -->` \" +\n \"marker, or remove both — then re-run `orizm agent init`.\"\n );\n}\n\n// 対話ウィザードの (1) 検出コンテキスト表示。docs version / プロジェクトルート /\n// 書き込み対象の有無・既存ブロックの有無を stderr に出す。\nasync function showDetectedContext(\n cwd: string,\n version: string,\n targets: Target[],\n): Promise<void> {\n const lines = [\n `Detected bundled Orizm docs v${version} (shipped with @orizm/cli).`,\n `Project root: ${cwd}`,\n ];\n for (const target of targets) {\n const fileName = target.fileName;\n const existing = await readTextFile(target.path);\n const status =\n existing === \"\"\n ? \"not found (will be created)\"\n : describeExisting(existing);\n lines.push(`- ${fileName}: ${status}`);\n }\n notice(lines.join(\"\\n\"));\n}\n\nexport default defineCommand({\n meta: {\n name: \"init\",\n description:\n \"Add a reference to the bundled Orizm docs into AGENTS.md / CLAUDE.md\",\n },\n args: {\n ...globalArgs,\n target: {\n type: \"string\",\n description:\n \"Write only this file (e.g. AGENTS.md). Default: manage both AGENTS.md and CLAUDE.md\",\n },\n cwd: {\n type: \"string\",\n description: \"Project root directory (defaults to the current directory)\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would change without writing\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt (non-interactive)\",\n default: false,\n },\n },\n run: async ({ args }) => {\n const cwd = args.cwd != null && args.cwd !== \"\" ? args.cwd : process.cwd();\n\n const docs = await resolveDocs();\n if (Result.isFailure(docs)) {\n // version と manifest パスはエラー本文に出るので、ここは本文にない情報だけ出す。\n logger.debug(`import.meta.url: ${import.meta.url}`);\n return Result.fail({ message: renderDocsNotResolved(docs.error) });\n }\n const version = docs.value.version;\n\n // 実行モードを解決(フラグ > 対話(TTY) > 既定/エラー(非TTY))。\n // 非対話ではプロンプトを一切出さず、フラグ指定のまま処理する。\n const mode = resolveExecutionMode({\n isTTY: process.stdin.isTTY === true,\n yes: args.yes === true,\n json: args.json === true,\n dryRun: args[\"dry-run\"] === true,\n });\n\n // 対話モード: (1) コンテキスト表示 →(2) 書き込み対象の選択(--target 未指定時のみ)。\n // フラグで与えた項目はウィザードで再質問しない(フラグが対話を上書き)。\n let targetFlag = args.target;\n if (mode === \"interactive\") {\n await showDetectedContext(cwd, version, resolveTargets(cwd, targetFlag));\n if (targetFlag == null || targetFlag === \"\") {\n const choice = await select(\n \"Which files should reference the Orizm docs?\",\n [\n {\n label: \"AGENTS.md and CLAUDE.md (recommended)\",\n value: \"both\",\n },\n { label: \"AGENTS.md only\", value: \"agents\" },\n { label: \"CLAUDE.md only\", value: \"claude\" },\n ],\n );\n if (choice == null) return Result.fail({ message: \"Aborted.\" });\n targetFlag = targetChoiceToFlag(choice);\n }\n }\n\n // 各ターゲットの適用結果を先に計算し、書き込みは確認後にまとめて行う。\n const targets = resolveTargets(cwd, targetFlag);\n const plans: TargetPlan[] = [];\n for (const target of targets) {\n let inner: string;\n if (target.kind === \"canonical\") {\n const ref = docsReference(path.dirname(target.path));\n if (!ref.resolves) {\n warn(\n `node_modules/@orizm/cli was not found from ${path.dirname(target.path)} ` +\n \"(it may be installed globally only, or not a dependency). \" +\n \"To let agents reference version-aligned docs, \" +\n \"add @orizm/cli to this project's devDependencies \" +\n \"(a global install cannot be resolved via a project-relative reference path). \" +\n \"If it is already a dependency, check where it resolves with `pnpm why @orizm/cli`. \" +\n \"The reference path itself will still be written.\",\n );\n }\n inner = renderReferenceInner({\n docsDir: ref.docsDir,\n docsIndex: ref.docsIndex,\n });\n } else {\n inner = renderClaudeImportInner();\n }\n const existing = await readTextFile(target.path);\n const newBlock = wrapBlock(inner);\n let upserted: ReturnType<typeof upsertBlock>;\n try {\n upserted = upsertBlock(existing, newBlock);\n } catch (error) {\n // 開始マーカーだけが残ったファイルに追記すると開始マーカーが 2 つになり、次回の\n // 実行(CI の --yes)で 2 つのマーカーに挟まれたユーザー本文を丸ごと消してしまう。\n // 壊れた形は機械的に触らず、他の対象にも書き込まずに中断する\n if (error instanceof BrokenManagedBlockError) {\n return Result.fail({\n message: renderBrokenManagedBlock(target.fileName, error),\n });\n }\n throw error;\n }\n const { content, action } = upserted;\n plans.push({\n target,\n content,\n action,\n oldBlock: extractBlock(existing),\n newBlock,\n });\n }\n\n const toJson = (): {\n version: string;\n dryRun: boolean;\n results: { target: string; action: UpsertAction }[];\n } => ({\n version,\n dryRun: args[\"dry-run\"] === true,\n results: plans.map((plan) => ({\n target: plan.target.path,\n action: plan.action,\n })),\n });\n\n const changed = plans.filter((plan) => plan.action !== \"unchanged\");\n\n if (changed.length === 0) {\n const names = plans.map((plan) => plan.target.fileName).join(\", \");\n return Result.succeed({\n json: toJson(),\n text: () => `Orizm docs reference already up to date in ${names}.`,\n });\n }\n\n const previewItems: PreviewItem[] = changed.map((plan) => ({\n fileName: plan.target.fileName,\n action: plan.action,\n oldBlock: plan.oldBlock,\n newBlock: plan.newBlock,\n }));\n\n // --dry-run はどちらのモードでも書き込まずプレビューのみ。\n if (args[\"dry-run\"] === true) {\n return Result.succeed({\n json: toJson(),\n text: () => renderPlanPreview(previewItems),\n });\n }\n\n // 対話モード: (3) 変更プレビュー →(4) 確定。非対話はフラグ指定のまま書き込む。\n if (mode === \"interactive\") {\n notice(renderPlanPreview(previewItems));\n const summary = changed\n .map(\n (plan) =>\n `${plan.action === \"created\" ? \"create\" : \"update\"} ${plan.target.fileName}`,\n )\n .join(\", \");\n const approved = await confirm(\n `Write the Orizm docs reference (${summary})?`,\n true,\n );\n if (!approved) return Result.fail({ message: \"Aborted.\" });\n }\n\n for (const plan of changed) {\n await applyWrite(plan.target.path, plan.content);\n }\n\n return Result.succeed({\n json: toJson(),\n text: () => {\n const lines = changed.map(\n (plan) =>\n `${plan.action === \"created\" ? \"Created\" : \"Updated\"} ${plan.target.fileName}`,\n );\n return `${lines.join(\"\\n\")} (Orizm docs v${version}).`;\n },\n });\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_cli_main = require('./cli/main.cjs');
|
|
2
2
|
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
-
const require_run_with_context = require('./run-with-context-
|
|
3
|
+
const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
|
|
4
4
|
const require_detail = require('./detail-8CXNIhKw.cjs');
|
|
5
5
|
const require_parse = require('./parse-C8oHgQXx.cjs');
|
|
6
6
|
const require_group_roles = require('./group-roles-B_iAZog-.cjs');
|
|
@@ -63,4 +63,4 @@ var invite_default = require_cli_main.defineCommand({
|
|
|
63
63
|
|
|
64
64
|
//#endregion
|
|
65
65
|
exports.default = invite_default;
|
|
66
|
-
//# sourceMappingURL=invite-
|
|
66
|
+
//# sourceMappingURL=invite-Tw3SMV0Q.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-
|
|
1
|
+
{"version":3,"file":"invite-Tw3SMV0Q.cjs","names":["toResult","Result","apiErrorFailure","renderDetail","formatGroupRoles","contextArgs","defineCommand","parseGroupRoles","collectRepeatableFlag","runWithContext"],"sources":["../src/cli/commands/project-user/invite.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport {\n formatGroupRoles,\n parseGroupRoles,\n type GroupRole,\n} from \"../group-roles.js\";\nimport { collectRepeatableFlag } from \"../parse.js\";\n\nexport async function projectUserInviteHandler(\n ctx: CommandContext,\n options: { email: string; name?: string; groupRoles?: GroupRole[] },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const invited = toResult(\n await ctx.client.POST(\"/projects/{projectName}/users\", {\n params: { path: { projectName: ctx.projectName } },\n body: {\n email: options.email,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.groupRoles !== undefined\n ? { groupRoles: options.groupRoles }\n : {}),\n },\n }),\n );\n if (Result.isFailure(invited)) return apiErrorFailure(invited.error);\n\n const value = invited.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Invited\", value.email],\n [\"ID\", value.id],\n [\"Name\", value.name],\n [\"Group roles\", formatGroupRoles(value.groupRoles)],\n ]),\n });\n}\n\nconst inviteArgs = {\n ...contextArgs,\n email: {\n type: \"positional\",\n required: true,\n description: \"Email address to invite\",\n },\n name: {\n type: \"string\",\n description: \"Display name for the invited user\",\n },\n \"group-role\": {\n type: \"string\",\n description: \"RBAC assignment as <group>:<role>; repeatable\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"invite\",\n description: \"Invite a user to the project by email\",\n },\n args: inviteArgs,\n run: async ({ args, rawArgs }) => {\n const groupRoles = parseGroupRoles(\n \"group-role\",\n collectRepeatableFlag(rawArgs, \"group-role\"),\n );\n if (Result.isFailure(groupRoles)) return groupRoles;\n\n return runWithContext(args, (ctx) =>\n projectUserInviteHandler(ctx, {\n email: args.email,\n name: typeof args.name === \"string\" ? args.name : undefined,\n groupRoles: groupRoles.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAmBA,eAAsB,yBACpB,KACA,SACmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,KAAK,iCAAiC;EACrD,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD,MAAM;GACJ,OAAO,QAAQ;GACf,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;GAC3D,GAAI,QAAQ,eAAe,SACvB,EAAE,YAAY,QAAQ,WAAW,IACjC,CAAC;EACP;CACF,CAAC,CACH;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEE,4BAAa;GACX,CAAC,WAAW,MAAM,KAAK;GACvB,CAAC,MAAM,MAAM,EAAE;GACf,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,eAAeC,qCAAiB,MAAM,UAAU,CAAC;EACpD,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGC;CACH,OAAO;EACL,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,cAAc;EACZ,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,MAAM,aAAaC,oCACjB,cACAC,oCAAsB,SAAS,YAAY,CAC7C;EACA,IAAIP,uBAAO,UAAU,UAAU,GAAG,OAAO;EAEzC,OAAOQ,wCAAe,OAAO,QAC3B,yBAAyB,KAAK;GAC5B,OAAO,KAAK;GACZ,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;GAClD,YAAY,WAAW;EACzB,CAAC,CACH;CACF;AACF,CAAC"}
|