@orizm/cli 3.2.0 → 3.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-Bd30EhQC.mjs → agent-Kf8iuW2I.mjs} +2 -2
- package/dist/{agent-Bd30EhQC.mjs.map → agent-Kf8iuW2I.mjs.map} +1 -1
- package/dist/{agent-vC2-9rjt.cjs → agent-UZZtdOZS.cjs} +2 -2
- package/dist/{agent-vC2-9rjt.cjs.map → agent-UZZtdOZS.cjs.map} +1 -1
- package/dist/cli/main.cjs +4 -4
- package/dist/cli/main.mjs +4 -4
- package/dist/{cms-DLOypcw8.mjs → cms-8XZhxwsM.mjs} +5 -2
- package/dist/{cms-DLOypcw8.mjs.map → cms-8XZhxwsM.mjs.map} +1 -1
- package/dist/{cms-CId7jg5l.cjs → cms-C4zEtppZ.cjs} +5 -2
- package/dist/{cms-CId7jg5l.cjs.map → cms-C4zEtppZ.cjs.map} +1 -1
- package/dist/{codegen-kbbIwPbb.cjs → codegen-Cypg4O3L.cjs} +3 -3
- package/dist/{codegen-kbbIwPbb.cjs.map → codegen-Cypg4O3L.cjs.map} +1 -1
- package/dist/{codegen-BKE_IYoM.mjs → codegen-Dnjv7zfm.mjs} +3 -3
- package/dist/{codegen-BKE_IYoM.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/{consumer-OG6IEJun.cjs → consumer-BSgriLn0.cjs} +2 -2
- package/dist/{consumer-OG6IEJun.cjs.map → consumer-BSgriLn0.cjs.map} +1 -1
- package/dist/{consumer-CqyZdG9v.mjs → consumer-s8LnLw4e.mjs} +2 -2
- package/dist/{consumer-CqyZdG9v.mjs.map → consumer-s8LnLw4e.mjs.map} +1 -1
- package/dist/docs/features/cli/commands/schema.md +3 -2
- package/dist/docs/features/cms-sdk/install.md +1 -1
- package/dist/docs/features/console/audit-logs.md +3 -0
- package/dist/docs/features/consumer-sdk/install.md +1 -1
- package/dist/docs/features/dictionary.md +268 -0
- package/dist/docs/features/full-text-search/local-development.md +145 -0
- package/dist/docs/features/full-text-search.md +146 -0
- package/dist/docs/features/schema/database.md +9 -8
- package/dist/docs/index.md +3 -1
- package/dist/docs/manifest.json +3 -3
- package/dist/{erd-BNv5Th6z.mjs → erd-BihhEfZ_.mjs} +2 -2
- package/dist/{erd-BNv5Th6z.mjs.map → erd-BihhEfZ_.mjs.map} +1 -1
- package/dist/{erd-ByuVMQ5n.cjs → erd-DmnB1v2c.cjs} +2 -2
- package/dist/{erd-ByuVMQ5n.cjs.map → erd-DmnB1v2c.cjs.map} +1 -1
- package/dist/{init-CPfpVlUN.mjs → init-BpKpTQ0z.mjs} +66 -13
- package/dist/init-BpKpTQ0z.mjs.map +1 -0
- package/dist/{init-NaL2N3Go.cjs → init-BrZCChEG.cjs} +66 -13
- package/dist/init-BrZCChEG.cjs.map +1 -0
- package/dist/{push-9fPpd4U8.cjs → push-BggkrD0g.cjs} +28 -10
- package/dist/push-BggkrD0g.cjs.map +1 -0
- package/dist/{push-54rmb0T0.mjs → push-xWnD9oov.mjs} +28 -10
- package/dist/push-xWnD9oov.mjs.map +1 -0
- package/dist/{run-codegen-mclysZuT.cjs → run-codegen-B-90rvjk.cjs} +2 -2
- package/dist/run-codegen-B-90rvjk.cjs.map +1 -0
- package/dist/{run-codegen-DjnV60bE.mjs → run-codegen-CrO08jJT.mjs} +2 -2
- package/dist/run-codegen-CrO08jJT.mjs.map +1 -0
- package/dist/{schema-CNSTXsVa.cjs → schema-CUVTXrHk.cjs} +4 -4
- package/dist/{schema-CNSTXsVa.cjs.map → schema-CUVTXrHk.cjs.map} +1 -1
- package/dist/{schema-BL6SlLtH.mjs → schema-DlUWHV_t.mjs} +4 -4
- package/dist/{schema-BL6SlLtH.mjs.map → schema-DlUWHV_t.mjs.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/package.json +8 -8
- package/dist/config-loader-BEgS869e.mjs.map +0 -1
- package/dist/config-loader-D8x32gEU.cjs.map +0 -1
- package/dist/init-CPfpVlUN.mjs.map +0 -1
- package/dist/init-NaL2N3Go.cjs.map +0 -1
- package/dist/push-54rmb0T0.mjs.map +0 -1
- package/dist/push-9fPpd4U8.cjs.map +0 -1
- package/dist/run-codegen-DjnV60bE.mjs.map +0 -1
- package/dist/run-codegen-mclysZuT.cjs.map +0 -1
|
@@ -7,14 +7,14 @@ var schema_default = defineCommand({
|
|
|
7
7
|
description: "Work with orizm.config.ts schema definitions"
|
|
8
8
|
},
|
|
9
9
|
subCommands: {
|
|
10
|
-
push: () => import("./push-
|
|
10
|
+
push: () => import("./push-xWnD9oov.mjs").then((m) => m.default),
|
|
11
11
|
list: () => import("./list-BMnBuZMr.mjs").then((m) => m.default),
|
|
12
12
|
get: () => import("./get-1TtxSEoT.mjs").then((m) => m.default),
|
|
13
|
-
validate: () => import("./validate-
|
|
14
|
-
erd: () => import("./erd-
|
|
13
|
+
validate: () => import("./validate-COS4bfr0.mjs").then((m) => m.default),
|
|
14
|
+
erd: () => import("./erd-BihhEfZ_.mjs").then((m) => m.default)
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
//#endregion
|
|
19
19
|
export { schema_default as default };
|
|
20
|
-
//# sourceMappingURL=schema-
|
|
20
|
+
//# sourceMappingURL=schema-DlUWHV_t.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-
|
|
1
|
+
{"version":3,"file":"schema-DlUWHV_t.mjs","names":[],"sources":["../src/cli/commands/schema/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"schema\",\n description: \"Work with orizm.config.ts schema definitions\",\n },\n subCommands: {\n push: () => import(\"./push.js\").then((m) => m.default),\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n validate: () => import(\"./validate.js\").then((m) => m.default),\n erd: () => import(\"./erd.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;EACnD,gBAAgB,OAAO,0BAAgB,CAAC,MAAM,MAAM,EAAE,OAAO;EAC7D,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;CACrD;AACF,CAAC"}
|
|
@@ -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_config_loader = require('./config-loader-
|
|
3
|
+
const require_config_loader = require('./config-loader-CZfANHBf.cjs');
|
|
4
4
|
let _praha_byethrow = require("@praha/byethrow");
|
|
5
5
|
|
|
6
6
|
//#region src/cli/commands/schema/validate.ts
|
|
@@ -28,4 +28,4 @@ var validate_default = require_cli_main.defineCommand({
|
|
|
28
28
|
|
|
29
29
|
//#endregion
|
|
30
30
|
exports.default = validate_default;
|
|
31
|
-
//# sourceMappingURL=validate-
|
|
31
|
+
//# sourceMappingURL=validate-BH8jqdqq.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-
|
|
1
|
+
{"version":3,"file":"validate-BH8jqdqq.cjs","names":["defineCommand","globalArgs","configFileArg","loadConfig","Result","configLoadFailure"],"sources":["../src/cli/commands/schema/validate.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\n\nexport default defineCommand({\n meta: {\n name: \"validate\",\n description: \"Validate orizm.config.ts locally (no server access)\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n return Result.succeed({\n json: { valid: true, tables: loaded.value.tables.length },\n text: () => \"orizm.config.ts is valid.\",\n });\n },\n});\n"],"mappings":";;;;;;AAMA,uBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,GAAGC;EACH,eAAeC;CACjB;CACA,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,SAAS,MAAMC,iCAAW,KAAK,mCAAqC;EAC1E,IAAIC,uBAAO,UAAU,MAAM,GAAG,OAAOC,wCAAkB,OAAO,KAAK;EAEnE,OAAOD,uBAAO,QAAQ;GACpB,MAAM;IAAE,OAAO;IAAM,QAAQ,OAAO,MAAM,OAAO;GAAO;GACxD,YAAY;EACd,CAAC;CACH;AACF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
2
|
import { i as globalArgs, n as configFileArg, t as DEFAULT_CONFIG_FILE } from "./shared-CZZimGxc.mjs";
|
|
3
|
-
import { n as configLoadFailure, t as loadConfig } from "./config-loader-
|
|
3
|
+
import { n as configLoadFailure, t as loadConfig } from "./config-loader-CtbZOGjc.mjs";
|
|
4
4
|
import { Result } from "@praha/byethrow";
|
|
5
5
|
|
|
6
6
|
//#region src/cli/commands/schema/validate.ts
|
|
@@ -28,4 +28,4 @@ var validate_default = defineCommand({
|
|
|
28
28
|
|
|
29
29
|
//#endregion
|
|
30
30
|
export { validate_default as default };
|
|
31
|
-
//# sourceMappingURL=validate-
|
|
31
|
+
//# sourceMappingURL=validate-COS4bfr0.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-
|
|
1
|
+
{"version":3,"file":"validate-COS4bfr0.mjs","names":[],"sources":["../src/cli/commands/schema/validate.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\n\nexport default defineCommand({\n meta: {\n name: \"validate\",\n description: \"Validate orizm.config.ts locally (no server access)\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n return Result.succeed({\n json: { valid: true, tables: loaded.value.tables.length },\n text: () => \"orizm.config.ts is valid.\",\n });\n },\n});\n"],"mappings":";;;;;;AAMA,uBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,GAAG;EACH,eAAe;CACjB;CACA,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,SAAS,MAAM,WAAW,KAAK,mCAAqC;EAC1E,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,kBAAkB,OAAO,KAAK;EAEnE,OAAO,OAAO,QAAQ;GACpB,MAAM;IAAE,OAAO;IAAM,QAAQ,OAAO,MAAM,OAAO;GAAO;GACxD,YAAY;EACd,CAAC;CACH;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orizm/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0-beta.1",
|
|
4
4
|
"description": "Orizm CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -24,19 +24,19 @@
|
|
|
24
24
|
"dist"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@hono/node-server": "2.
|
|
27
|
+
"@hono/node-server": "2.1.1",
|
|
28
28
|
"@praha/byethrow": "0.12.0",
|
|
29
29
|
"citty": "0.2.2",
|
|
30
30
|
"cli-table3": "0.6.5",
|
|
31
31
|
"consola": "3.4.2",
|
|
32
32
|
"esbuild": "0.28.2",
|
|
33
|
-
"hono": "4.13.
|
|
34
|
-
"jose": "6.2.
|
|
33
|
+
"hono": "4.13.7",
|
|
34
|
+
"jose": "6.2.12",
|
|
35
35
|
"mime-types": "3.0.2",
|
|
36
|
-
"open": "11.0.
|
|
36
|
+
"open": "11.0.2",
|
|
37
37
|
"prettier": "3.9.6",
|
|
38
38
|
"valibot": "1.4.2",
|
|
39
|
-
"@orizm/common": "2.
|
|
39
|
+
"@orizm/common": "2.6.0-beta.1"
|
|
40
40
|
},
|
|
41
41
|
"bin": {
|
|
42
42
|
"orizm": "dist/cli/main.mjs"
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"@types/mime-types": "3.0.1",
|
|
46
46
|
"tsdown": "0.22.14",
|
|
47
47
|
"@orizm/eslint-config": "0.0.0",
|
|
48
|
-
"@orizm/
|
|
49
|
-
"@orizm/
|
|
48
|
+
"@orizm/package-configs": "0.0.0",
|
|
49
|
+
"@orizm/internal-shared": "0.0.10"
|
|
50
50
|
},
|
|
51
51
|
"license": "Apache-2.0",
|
|
52
52
|
"scripts": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader-BEgS869e.mjs","names":[],"sources":["../src/cli/commands/config-errors.ts","../src/cli/config-loader.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { ConfigLoadError } from \"../config-loader.js\";\nimport { getOutputState } from \"../ui/output.js\";\nimport { formatValibotIssues } from \"../ui/error.js\";\nimport { CommandFailure } from \"./define-command.js\";\n\n// loadConfig を使う複数のコマンドが共有する変換。ConfigLoadError 以外は知らない。\nexport function configLoadFailure(\n error: ConfigLoadError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"config_not_found\":\n return Result.fail({ message: `Config file not found: ${error.path}` });\n case \"config_build_failed\":\n return Result.fail({\n message: `Failed to build the config file.\\n${error.message}`,\n });\n case \"config_schema_violation\":\n return Result.fail({\n message: `Config validation failed (${error.issues.length} problem(s)).\\n${formatValibotIssues(\n error.issues,\n getOutputState().color,\n )}`,\n });\n default:\n return assertNever(error);\n }\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled config load error: ${JSON.stringify(value)}`);\n}\n","import { access } from \"node:fs/promises\";\nimport esbuild from \"esbuild\";\nimport * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { OrizmConfigDef } from \"@orizm/common/config-validator\";\nimport { CommonOrizmConfig } from \"./types.js\";\n\nexport type ConfigLoadError =\n | { type: \"config_not_found\"; path: string }\n | { type: \"config_build_failed\"; message: string }\n | { type: \"config_schema_violation\"; issues: v.BaseIssue<unknown>[] };\n\n// keepNames / sourcemap はユーザー config 内の throw を --debug で追えるように、\n// conditions / mainFields は @orizm/cli/config の ESM サブパス解決を固定するために付ける。\nasync function buildConfig(configFile: string): Promise<string> {\n const buildResult = await esbuild.build({\n entryPoints: [configFile],\n bundle: true,\n write: false,\n format: \"esm\",\n target: \"node22\",\n platform: \"node\",\n keepNames: true,\n sourcemap: \"inline\",\n conditions: [\"node\", \"import\"],\n mainFields: [\"module\", \"main\"],\n logLevel: \"silent\",\n loader: { \".json\": \"json\" },\n });\n\n return buildResult.outputFiles[0].text;\n}\n\nexport async function loadConfig(\n configFile: string,\n): Promise<Result.Result<CommonOrizmConfig, ConfigLoadError>> {\n const found = await access(configFile).then(\n () => true,\n () => false,\n );\n if (!found) {\n return Result.fail({ type: \"config_not_found\", path: configFile });\n }\n\n let bundled: string;\n try {\n bundled = await buildConfig(configFile);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return Result.fail({ type: \"config_build_failed\", message });\n }\n\n const moduleURL = `data:text/javascript,${encodeURIComponent(bundled)}`;\n // ユーザー config 内の実行時 throw は捕まえずに伝搬させ、ハンドラ層で --debug 時に stack を出す。\n const { default: raw } = await import(moduleURL);\n\n const parsed = v.safeParse(OrizmConfigDef, raw);\n if (!parsed.success) {\n return Result.fail({\n type: \"config_schema_violation\",\n issues: parsed.issues,\n });\n }\n\n return Result.succeed(parsed.output);\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,kBACd,OACsC;CACtC,QAAQ,MAAM,MAAd;EACE,KAAK,oBACH,OAAO,OAAO,KAAK,EAAE,SAAS,0BAA0B,MAAM,OAAO,CAAC;EACxE,KAAK,uBACH,OAAO,OAAO,KAAK,EACjB,SAAS,qCAAqC,MAAM,UACtD,CAAC;EACH,KAAK,2BACH,OAAO,OAAO,KAAK,EACjB,SAAS,6BAA6B,MAAM,OAAO,OAAO,iBAAiB,oBACzE,MAAM,QACN,eAAe,CAAC,CAAC,KACnB,IACF,CAAC;EACH,SACE,OAAO,YAAY,KAAK;CAC5B;AACF;AAEA,SAAS,YAAY,OAAqB;CACxC,MAAM,IAAI,MAAM,gCAAgC,KAAK,UAAU,KAAK,GAAG;AACzE;;;;ACjBA,eAAe,YAAY,YAAqC;CAgB9D,QAAO,MAfmB,QAAQ,MAAM;EACtC,aAAa,CAAC,UAAU;EACxB,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,WAAW;EACX,WAAW;EACX,YAAY,CAAC,QAAQ,QAAQ;EAC7B,YAAY,CAAC,UAAU,MAAM;EAC7B,UAAU;EACV,QAAQ,EAAE,SAAS,OAAO;CAC5B,CAAC,EAEiB,CAAC,YAAY,EAAE,CAAC;AACpC;AAEA,eAAsB,WACpB,YAC4D;CAK5D,IAAI,CAAC,MAJe,OAAO,UAAU,CAAC,CAAC,WAC/B,YACA,KACR,GAEE,OAAO,OAAO,KAAK;EAAE,MAAM;EAAoB,MAAM;CAAW,CAAC;CAGnE,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,YAAY,UAAU;CACxC,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,OAAO,OAAO,KAAK;GAAE,MAAM;GAAuB;EAAQ,CAAC;CAC7D;CAIA,MAAM,EAAE,SAAS,QAAQ,MAAM,OAAO,wBAFI,mBAAmB,OAAO;CAIpE,MAAM,SAAS,EAAE,UAAU,gBAAgB,GAAG;CAC9C,IAAI,CAAC,OAAO,SACV,OAAO,OAAO,KAAK;EACjB,MAAM;EACN,QAAQ,OAAO;CACjB,CAAC;CAGH,OAAO,OAAO,QAAQ,OAAO,MAAM;AACrC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader-D8x32gEU.cjs","names":["Result","formatValibotIssues","getOutputState","Result","v","OrizmConfigDef"],"sources":["../src/cli/commands/config-errors.ts","../src/cli/config-loader.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { ConfigLoadError } from \"../config-loader.js\";\nimport { getOutputState } from \"../ui/output.js\";\nimport { formatValibotIssues } from \"../ui/error.js\";\nimport { CommandFailure } from \"./define-command.js\";\n\n// loadConfig を使う複数のコマンドが共有する変換。ConfigLoadError 以外は知らない。\nexport function configLoadFailure(\n error: ConfigLoadError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"config_not_found\":\n return Result.fail({ message: `Config file not found: ${error.path}` });\n case \"config_build_failed\":\n return Result.fail({\n message: `Failed to build the config file.\\n${error.message}`,\n });\n case \"config_schema_violation\":\n return Result.fail({\n message: `Config validation failed (${error.issues.length} problem(s)).\\n${formatValibotIssues(\n error.issues,\n getOutputState().color,\n )}`,\n });\n default:\n return assertNever(error);\n }\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled config load error: ${JSON.stringify(value)}`);\n}\n","import { access } from \"node:fs/promises\";\nimport esbuild from \"esbuild\";\nimport * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { OrizmConfigDef } from \"@orizm/common/config-validator\";\nimport { CommonOrizmConfig } from \"./types.js\";\n\nexport type ConfigLoadError =\n | { type: \"config_not_found\"; path: string }\n | { type: \"config_build_failed\"; message: string }\n | { type: \"config_schema_violation\"; issues: v.BaseIssue<unknown>[] };\n\n// keepNames / sourcemap はユーザー config 内の throw を --debug で追えるように、\n// conditions / mainFields は @orizm/cli/config の ESM サブパス解決を固定するために付ける。\nasync function buildConfig(configFile: string): Promise<string> {\n const buildResult = await esbuild.build({\n entryPoints: [configFile],\n bundle: true,\n write: false,\n format: \"esm\",\n target: \"node22\",\n platform: \"node\",\n keepNames: true,\n sourcemap: \"inline\",\n conditions: [\"node\", \"import\"],\n mainFields: [\"module\", \"main\"],\n logLevel: \"silent\",\n loader: { \".json\": \"json\" },\n });\n\n return buildResult.outputFiles[0].text;\n}\n\nexport async function loadConfig(\n configFile: string,\n): Promise<Result.Result<CommonOrizmConfig, ConfigLoadError>> {\n const found = await access(configFile).then(\n () => true,\n () => false,\n );\n if (!found) {\n return Result.fail({ type: \"config_not_found\", path: configFile });\n }\n\n let bundled: string;\n try {\n bundled = await buildConfig(configFile);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return Result.fail({ type: \"config_build_failed\", message });\n }\n\n const moduleURL = `data:text/javascript,${encodeURIComponent(bundled)}`;\n // ユーザー config 内の実行時 throw は捕まえずに伝搬させ、ハンドラ層で --debug 時に stack を出す。\n const { default: raw } = await import(moduleURL);\n\n const parsed = v.safeParse(OrizmConfigDef, raw);\n if (!parsed.success) {\n return Result.fail({\n type: \"config_schema_violation\",\n issues: parsed.issues,\n });\n }\n\n return Result.succeed(parsed.output);\n}\n"],"mappings":";;;;;;;;;;AAOA,SAAgB,kBACd,OACsC;CACtC,QAAQ,MAAM,MAAd;EACE,KAAK,oBACH,OAAOA,uBAAO,KAAK,EAAE,SAAS,0BAA0B,MAAM,OAAO,CAAC;EACxE,KAAK,uBACH,OAAOA,uBAAO,KAAK,EACjB,SAAS,qCAAqC,MAAM,UACtD,CAAC;EACH,KAAK,2BACH,OAAOA,uBAAO,KAAK,EACjB,SAAS,6BAA6B,MAAM,OAAO,OAAO,iBAAiBC,qCACzE,MAAM,QACNC,gCAAe,CAAC,CAAC,KACnB,IACF,CAAC;EACH,SACE,OAAO,YAAY,KAAK;CAC5B;AACF;AAEA,SAAS,YAAY,OAAqB;CACxC,MAAM,IAAI,MAAM,gCAAgC,KAAK,UAAU,KAAK,GAAG;AACzE;;;;ACjBA,eAAe,YAAY,YAAqC;CAgB9D,QAAO,MAfmB,gBAAQ,MAAM;EACtC,aAAa,CAAC,UAAU;EACxB,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,WAAW;EACX,WAAW;EACX,YAAY,CAAC,QAAQ,QAAQ;EAC7B,YAAY,CAAC,UAAU,MAAM;EAC7B,UAAU;EACV,QAAQ,EAAE,SAAS,OAAO;CAC5B,CAAC,EAEiB,CAAC,YAAY,EAAE,CAAC;AACpC;AAEA,eAAsB,WACpB,YAC4D;CAK5D,IAAI,CAAC,mCAJsB,UAAU,CAAC,CAAC,WAC/B,YACA,KACR,GAEE,OAAOC,uBAAO,KAAK;EAAE,MAAM;EAAoB,MAAM;CAAW,CAAC;CAGnE,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,YAAY,UAAU;CACxC,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,OAAOA,uBAAO,KAAK;GAAE,MAAM;GAAuB;EAAQ,CAAC;CAC7D;CAIA,MAAM,EAAE,SAAS,QAAQ,MAAM,OAAO,wBAFI,mBAAmB,OAAO;CAIpE,MAAM,SAASC,QAAE,UAAUC,+CAAgB,GAAG;CAC9C,IAAI,CAAC,OAAO,SACV,OAAOF,uBAAO,KAAK;EACjB,MAAM;EACN,QAAQ,OAAO;CACjB,CAAC;CAGH,OAAOA,uBAAO,QAAQ,OAAO,MAAM;AACrC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-CPfpVlUN.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// 参照本文をマーカーで囲んだ 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 startIdx = text.indexOf(START_TOKEN);\n if (startIdx === -1) return undefined;\n const endIdx = text.indexOf(MARKER_END, startIdx);\n if (endIdx === -1) return undefined;\n return text.slice(startIdx, endIdx + MARKER_END.length);\n}\n\n// 既存内容にマーカーブロックがあれば置換、無ければ末尾に追記する純関数。\n// 置換後が元と完全一致なら unchanged とし、呼び出し側が書き込みを省ける。\nexport function upsertBlock(\n existing: string,\n block: string,\n): { content: string; action: UpsertAction } {\n const startIdx = existing.indexOf(START_TOKEN);\n const endIdx = startIdx === -1 ? -1 : existing.indexOf(MARKER_END, startIdx);\n\n if (endIdx !== -1) {\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + MARKER_END.length);\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 extractBlock,\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) 検出コンテキスト表示。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 : extractBlock(existing) != null\n ? \"exists (managed block present — will update)\"\n : \"exists (no managed block — will append)\";\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 const { content, action } = upsertBlock(existing, newBlock);\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-NaL2N3Go.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// 参照本文をマーカーで囲んだ 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 startIdx = text.indexOf(START_TOKEN);\n if (startIdx === -1) return undefined;\n const endIdx = text.indexOf(MARKER_END, startIdx);\n if (endIdx === -1) return undefined;\n return text.slice(startIdx, endIdx + MARKER_END.length);\n}\n\n// 既存内容にマーカーブロックがあれば置換、無ければ末尾に追記する純関数。\n// 置換後が元と完全一致なら unchanged とし、呼び出し側が書き込みを省ける。\nexport function upsertBlock(\n existing: string,\n block: string,\n): { content: string; action: UpsertAction } {\n const startIdx = existing.indexOf(START_TOKEN);\n const endIdx = startIdx === -1 ? -1 : existing.indexOf(MARKER_END, startIdx);\n\n if (endIdx !== -1) {\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + MARKER_END.length);\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 extractBlock,\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) 検出コンテキスト表示。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 : extractBlock(existing) != null\n ? \"exists (managed block present — will update)\"\n : \"exists (no managed block — will append)\";\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 const { content, action } = upsertBlock(existing, newBlock);\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"push-54rmb0T0.mjs","names":[],"sources":["../src/cli/schema/change-events.ts","../src/cli/commands/schema/push.ts"],"sourcesContent":["import type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\nimport { renderTable, type RowColor, type TableRow } from \"../ui/table.js\";\n\ntype ChangeEvents = components[\"schemas\"][\"OrizmConfigChangeEvents\"];\ntype TableChangeEvent = ChangeEvents[\"tableChangeEvents\"][number];\ntype BucketChangeEvent = ChangeEvents[\"bucketChangeEvents\"][number];\ntype AuthorityChangeEvent = ChangeEvents[\"authorityChangeEvents\"][number];\n\nexport function hasChanges(events: ChangeEvents): boolean {\n return (\n events.tableChangeEvents.length > 0 ||\n events.bucketChangeEvents.length > 0 ||\n events.authorityChangeEvents.length > 0\n );\n}\n\nexport function renderChangeEvents(\n events: ChangeEvents,\n color: boolean,\n): string {\n const sections = [\n ...renderTableSections(events.tableChangeEvents, color),\n ...renderBucketSection(events.bucketChangeEvents, color),\n ...renderAuthoritySection(events.authorityChangeEvents, color),\n ];\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderTableSections(\n tableChangeEvents: TableChangeEvent[],\n color: boolean,\n): string[] {\n // 1 テーブルにつき 1 ブロックを出すため、対象テーブル名でまとめる。\n const eventsByTable = new Map<string, TableChangeEvent[]>();\n for (const event of tableChangeEvents) {\n const grouped = eventsByTable.get(event.tableDef.name) ?? [];\n grouped.push(event);\n eventsByTable.set(event.tableDef.name, grouped);\n }\n\n return [...eventsByTable.entries()].map(([tableName, events]) => {\n const rows = events.map(tableEventRow);\n return `⚫︎Table: ${tableName}\\n${renderTable(\n [\"Type\", \"Name\", \"Event\", \"Detail\"],\n rows,\n color,\n )}`;\n });\n}\n\nfunction renderBucketSection(\n bucketChangeEvents: BucketChangeEvent[],\n color: boolean,\n): string[] {\n if (bucketChangeEvents.length === 0) return [];\n const rows = bucketChangeEvents.map(bucketEventRow);\n return [\n `⚫︎Buckets\\n${renderTable(\n [\"Type\", \"Name\", \"Event\", \"Detail\"],\n rows,\n color,\n )}`,\n ];\n}\n\nfunction renderAuthoritySection(\n authorityChangeEvents: AuthorityChangeEvent[],\n color: boolean,\n): string[] {\n if (authorityChangeEvents.length === 0) return [];\n const rows = authorityChangeEvents.map(\n (event): TableRow => ({\n cells: [\"authority\", event.event, JSON.stringify(event.authorityDef)],\n color: \"green\",\n }),\n );\n return [\n `⚫︎Authorities\\n${renderTable([\"Type\", \"Event\", \"Detail\"], rows, color)}`,\n ];\n}\n\n// create / update / enable は安全な変更なので緑、delete / disable はデータを失う危険な操作なので赤。\nfunction tableEventRow(event: TableChangeEvent): TableRow {\n switch (event.event) {\n case \"table:create\":\n case \"table:update\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"green\");\n case \"table:delete\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"red\");\n case \"column:create\":\n case \"column:update\":\n return row(\n \"column\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"green\",\n );\n case \"column:delete\":\n return row(\n \"column\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"red\",\n );\n case \"index:create\":\n case \"index:update\":\n return row(\n \"index\",\n event.indexDef.columns.join(\", \"),\n event.event,\n JSON.stringify(event.indexDef),\n \"green\",\n );\n case \"index:delete\":\n return row(\n \"index\",\n event.indexDef.columns.join(\", \"),\n event.event,\n JSON.stringify(event.indexDef),\n \"red\",\n );\n case \"module:create\":\n case \"module:update\":\n return row(\n \"module\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"green\",\n );\n case \"module:delete\":\n return row(\n \"module\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"red\",\n );\n case \"search:enable\":\n case \"search:update\":\n case \"history:enable\":\n case \"draft:enable\":\n case \"formSubmissions:create\":\n case \"formSubmissions:update\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"green\");\n case \"search:disable\":\n case \"history:disable\":\n case \"draft:disable\":\n case \"formSubmissions:delete\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"red\");\n }\n}\n\nfunction bucketEventRow(event: BucketChangeEvent): TableRow {\n const color: RowColor = event.event === \"bucket:delete\" ? \"red\" : \"green\";\n return row(\n \"bucket\",\n event.bucketDef.name,\n event.event,\n JSON.stringify(event.bucketDef),\n color,\n );\n}\n\nfunction row(\n type: string,\n name: string,\n event: string,\n detail: string,\n color: RowColor,\n): TableRow {\n return { cells: [type, name, event, detail], color };\n}\n","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, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { getOutputState, notice } from \"../../ui/output.js\";\nimport { confirm } from \"../../ui/prompt.js\";\nimport { hasChanges, renderChangeEvents } from \"../../schema/change-events.js\";\n\nexport type PushOptions = {\n configFile: string;\n dryRun: boolean;\n yes: boolean;\n};\n\nexport async function pushHandler(\n ctx: CommandContext,\n options: PushOptions,\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const loaded = await loadConfig(options.configFile);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const dryRun = await ctx.client.POST(\n \"/projects/{projectName}/definitions/dry-run\",\n {\n params: { path: { projectName: ctx.projectName } },\n body: { definition: loaded.value },\n },\n );\n const events = toResult(dryRun);\n if (Result.isFailure(events)) return apiErrorFailure(events.error);\n\n if (!hasChanges(events.value)) {\n return Result.succeed({\n json: events.value,\n text: () => \"No changes to apply.\",\n });\n }\n\n if (options.dryRun) {\n return Result.succeed({\n json: events.value,\n text: () => renderChangeEvents(events.value, getOutputState().color),\n });\n }\n\n notice(renderChangeEvents(events.value, getOutputState().color));\n\n if (!options.yes) {\n if (process.stdin.isTTY !== true) {\n return Result.fail({\n message:\n \"Refusing to apply without confirmation in a non-interactive shell. Re-run with --yes.\",\n });\n }\n const approved = await confirm(\"Apply these changes?\");\n if (!approved) {\n return Result.succeed({\n json: { applied: false },\n text: () => \"Canceled.\",\n });\n }\n }\n\n const applyResponse = await ctx.client.POST(\n \"/projects/{projectName}/definitions\",\n {\n params: { path: { projectName: ctx.projectName } },\n body: { definition: loaded.value },\n },\n );\n const applied = toResult(applyResponse);\n if (Result.isFailure(applied)) return apiErrorFailure(applied.error);\n\n return Result.succeed({\n json: applied.value,\n text: () => \"Schema applied.\",\n });\n}\n\nconst pushArgs = {\n ...contextArgs,\n \"config-file\": configFileArg,\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show change events without applying them\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Apply without the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"push\",\n description: \"Build orizm.config.ts and apply the schema to the project\",\n },\n args: pushArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n pushHandler(ctx, {\n configFile: args[\"config-file\"] ?? DEFAULT_CONFIG_FILE,\n dryRun: args[\"dry-run\"] === true,\n yes: args.yes === true,\n }),\n ),\n});\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"push-9fPpd4U8.cjs","names":["renderTable","loadConfig","Result","configLoadFailure","toResult","apiErrorFailure","getOutputState","confirm","contextArgs","configFileArg","defineCommand","runWithContext"],"sources":["../src/cli/schema/change-events.ts","../src/cli/commands/schema/push.ts"],"sourcesContent":["import type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\nimport { renderTable, type RowColor, type TableRow } from \"../ui/table.js\";\n\ntype ChangeEvents = components[\"schemas\"][\"OrizmConfigChangeEvents\"];\ntype TableChangeEvent = ChangeEvents[\"tableChangeEvents\"][number];\ntype BucketChangeEvent = ChangeEvents[\"bucketChangeEvents\"][number];\ntype AuthorityChangeEvent = ChangeEvents[\"authorityChangeEvents\"][number];\n\nexport function hasChanges(events: ChangeEvents): boolean {\n return (\n events.tableChangeEvents.length > 0 ||\n events.bucketChangeEvents.length > 0 ||\n events.authorityChangeEvents.length > 0\n );\n}\n\nexport function renderChangeEvents(\n events: ChangeEvents,\n color: boolean,\n): string {\n const sections = [\n ...renderTableSections(events.tableChangeEvents, color),\n ...renderBucketSection(events.bucketChangeEvents, color),\n ...renderAuthoritySection(events.authorityChangeEvents, color),\n ];\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderTableSections(\n tableChangeEvents: TableChangeEvent[],\n color: boolean,\n): string[] {\n // 1 テーブルにつき 1 ブロックを出すため、対象テーブル名でまとめる。\n const eventsByTable = new Map<string, TableChangeEvent[]>();\n for (const event of tableChangeEvents) {\n const grouped = eventsByTable.get(event.tableDef.name) ?? [];\n grouped.push(event);\n eventsByTable.set(event.tableDef.name, grouped);\n }\n\n return [...eventsByTable.entries()].map(([tableName, events]) => {\n const rows = events.map(tableEventRow);\n return `⚫︎Table: ${tableName}\\n${renderTable(\n [\"Type\", \"Name\", \"Event\", \"Detail\"],\n rows,\n color,\n )}`;\n });\n}\n\nfunction renderBucketSection(\n bucketChangeEvents: BucketChangeEvent[],\n color: boolean,\n): string[] {\n if (bucketChangeEvents.length === 0) return [];\n const rows = bucketChangeEvents.map(bucketEventRow);\n return [\n `⚫︎Buckets\\n${renderTable(\n [\"Type\", \"Name\", \"Event\", \"Detail\"],\n rows,\n color,\n )}`,\n ];\n}\n\nfunction renderAuthoritySection(\n authorityChangeEvents: AuthorityChangeEvent[],\n color: boolean,\n): string[] {\n if (authorityChangeEvents.length === 0) return [];\n const rows = authorityChangeEvents.map(\n (event): TableRow => ({\n cells: [\"authority\", event.event, JSON.stringify(event.authorityDef)],\n color: \"green\",\n }),\n );\n return [\n `⚫︎Authorities\\n${renderTable([\"Type\", \"Event\", \"Detail\"], rows, color)}`,\n ];\n}\n\n// create / update / enable は安全な変更なので緑、delete / disable はデータを失う危険な操作なので赤。\nfunction tableEventRow(event: TableChangeEvent): TableRow {\n switch (event.event) {\n case \"table:create\":\n case \"table:update\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"green\");\n case \"table:delete\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"red\");\n case \"column:create\":\n case \"column:update\":\n return row(\n \"column\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"green\",\n );\n case \"column:delete\":\n return row(\n \"column\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"red\",\n );\n case \"index:create\":\n case \"index:update\":\n return row(\n \"index\",\n event.indexDef.columns.join(\", \"),\n event.event,\n JSON.stringify(event.indexDef),\n \"green\",\n );\n case \"index:delete\":\n return row(\n \"index\",\n event.indexDef.columns.join(\", \"),\n event.event,\n JSON.stringify(event.indexDef),\n \"red\",\n );\n case \"module:create\":\n case \"module:update\":\n return row(\n \"module\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"green\",\n );\n case \"module:delete\":\n return row(\n \"module\",\n event.columnDef.name,\n event.event,\n JSON.stringify(event.columnDef),\n \"red\",\n );\n case \"search:enable\":\n case \"search:update\":\n case \"history:enable\":\n case \"draft:enable\":\n case \"formSubmissions:create\":\n case \"formSubmissions:update\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"green\");\n case \"search:disable\":\n case \"history:disable\":\n case \"draft:disable\":\n case \"formSubmissions:delete\":\n return row(\"table\", event.tableDef.name, event.event, \"\", \"red\");\n }\n}\n\nfunction bucketEventRow(event: BucketChangeEvent): TableRow {\n const color: RowColor = event.event === \"bucket:delete\" ? \"red\" : \"green\";\n return row(\n \"bucket\",\n event.bucketDef.name,\n event.event,\n JSON.stringify(event.bucketDef),\n color,\n );\n}\n\nfunction row(\n type: string,\n name: string,\n event: string,\n detail: string,\n color: RowColor,\n): TableRow {\n return { cells: [type, name, event, detail], color };\n}\n","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, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { getOutputState, notice } from \"../../ui/output.js\";\nimport { confirm } from \"../../ui/prompt.js\";\nimport { hasChanges, renderChangeEvents } from \"../../schema/change-events.js\";\n\nexport type PushOptions = {\n configFile: string;\n dryRun: boolean;\n yes: boolean;\n};\n\nexport async function pushHandler(\n ctx: CommandContext,\n options: PushOptions,\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const loaded = await loadConfig(options.configFile);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const dryRun = await ctx.client.POST(\n \"/projects/{projectName}/definitions/dry-run\",\n {\n params: { path: { projectName: ctx.projectName } },\n body: { definition: loaded.value },\n },\n );\n const events = toResult(dryRun);\n if (Result.isFailure(events)) return apiErrorFailure(events.error);\n\n if (!hasChanges(events.value)) {\n return Result.succeed({\n json: events.value,\n text: () => \"No changes to apply.\",\n });\n }\n\n if (options.dryRun) {\n return Result.succeed({\n json: events.value,\n text: () => renderChangeEvents(events.value, getOutputState().color),\n });\n }\n\n notice(renderChangeEvents(events.value, getOutputState().color));\n\n if (!options.yes) {\n if (process.stdin.isTTY !== true) {\n return Result.fail({\n message:\n \"Refusing to apply without confirmation in a non-interactive shell. Re-run with --yes.\",\n });\n }\n const approved = await confirm(\"Apply these changes?\");\n if (!approved) {\n return Result.succeed({\n json: { applied: false },\n text: () => \"Canceled.\",\n });\n }\n }\n\n const applyResponse = await ctx.client.POST(\n \"/projects/{projectName}/definitions\",\n {\n params: { path: { projectName: ctx.projectName } },\n body: { definition: loaded.value },\n },\n );\n const applied = toResult(applyResponse);\n if (Result.isFailure(applied)) return apiErrorFailure(applied.error);\n\n return Result.succeed({\n json: applied.value,\n text: () => \"Schema applied.\",\n });\n}\n\nconst pushArgs = {\n ...contextArgs,\n \"config-file\": configFileArg,\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show change events without applying them\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Apply without the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"push\",\n description: \"Build orizm.config.ts and apply the schema to the project\",\n },\n args: pushArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n pushHandler(ctx, {\n configFile: args[\"config-file\"] ?? DEFAULT_CONFIG_FILE,\n dryRun: args[\"dry-run\"] === true,\n yes: args.yes === true,\n }),\n ),\n});\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-codegen-DjnV60bE.mjs","names":[],"sources":["../src/cli/codegen/format.ts","../src/cli/codegen/render.ts","../src/cli/codegen/write.ts","../src/cli/codegen/pull.ts","../src/cli/commands/codegen/run-codegen.ts"],"sourcesContent":["import * as prettier from \"prettier/standalone\";\nimport prettierPluginEstree from \"prettier/plugins/estree.js\";\nimport prettierPluginTypeScript from \"prettier/plugins/typescript.js\";\n\nexport function formatTsWithPrettier(code: string): Promise<string> {\n return prettier.format(code, {\n parser: \"typescript\",\n plugins: [prettierPluginEstree, prettierPluginTypeScript],\n });\n}\n","export type RenderColumn = {\n name: string;\n type: string;\n required?: boolean;\n readOnly?: boolean;\n moduleName?: string;\n tableName?: string;\n includeName?: string;\n};\n\nexport type RenderIndex = {\n columns: string[];\n unique?: boolean;\n nullsNotDistinct?: boolean;\n};\n\nexport const AUTOGEN_HEADER =\n \"// This file was automatically generated and should not be edited.\";\n\nexport const UTILITIES = `// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};`;\n\nexport function toCodeTypeName(str: string): string {\n const capitalized = str.charAt(0).toUpperCase() + str.slice(1);\n return capitalized.replace(/_([a-z])/g, (g) => g[1].toUpperCase());\n}\n\nexport function typeName(column: RenderColumn, moduleSuffix = \"\"): string {\n switch (column.type) {\n case \"reference\":\n return \"string\";\n case \"module\":\n return toCodeTypeName(column.moduleName ?? \"\") + moduleSuffix;\n case \"module-array\":\n return toCodeTypeName(column.moduleName ?? \"\") + moduleSuffix + \"[]\";\n case \"json\":\n return \"unknown\";\n case \"storage\":\n return \"StorageItemType\";\n default:\n return column.type;\n }\n}\n\nexport function nullableSuffix(column: RenderColumn): string {\n return !column.required && column.type !== \"module-array\" ? \" | null\" : \"\";\n}\n\nexport function filterRefColumns(columns: RenderColumn[]): RenderColumn[] {\n return columns.filter(\n (c) =>\n (c.type === \"reference\" &&\n c.tableName !== undefined &&\n c.includeName !== undefined &&\n c.includeName !== \"\") ||\n (c.type === \"module\" && c.moduleName !== undefined) ||\n (c.type === \"module-array\" && c.moduleName !== undefined),\n );\n}\n\nexport function getIncludeName(column: RenderColumn): string {\n return column.type === \"reference\"\n ? column.includeName || column.name\n : column.name;\n}\n\nexport function getIncludeType(column: RenderColumn): string {\n if (column.type === \"reference\" && column.tableName) {\n return toCodeTypeName(column.tableName) + \"__Descriptor\";\n }\n if (column.type === \"module\" && column.moduleName) {\n return `_ModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n }\n if (column.type === \"module-array\" && column.moduleName) {\n return `_ArrayModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n }\n return \"\";\n}\n\nexport function renderColumnField(\n col: RenderColumn,\n options?: { optional?: boolean; suffix?: string },\n): string {\n const optional = options?.optional === true ? \"?\" : \"\";\n const suffix = options?.suffix ?? \"\";\n return `${col.name}${optional}: ${typeName(col, suffix)}${nullableSuffix(col)};`;\n}\n\nexport function renderTypeBlock(name: string, fields: string[]): string {\n return `export type ${name} = {\\n${fields.join(\"\\n\")}\\n};`;\n}\n\nexport function renderRefsFieldLines(columns: RenderColumn[]): string[] {\n const refCols = filterRefColumns(columns);\n if (refCols.length === 0) return [\"refs: object;\"];\n return [\n \"refs: {\",\n ...refCols.map((c) => `${getIncludeName(c)}: ${getIncludeType(c)};`),\n \"}\",\n ];\n}\n\nexport function renderUniqueFieldLines(table: {\n columns: RenderColumn[];\n indexes?: RenderIndex[];\n}): string[] {\n const uniqueIndexes = (table.indexes ?? []).filter((i) => i.unique);\n if (uniqueIndexes.length === 0) return [\"unique: [];\"];\n const entries = uniqueIndexes.map((index) => {\n const cols = index.columns.map((colName) => {\n const col = table.columns.find((c) => c.name === colName);\n if (!col) throw new Error(`column ${colName} not found`);\n const nullable = !col.required && index.nullsNotDistinct ? \" | null\" : \"\";\n return `${col.name}:${typeName(col)}${nullable},`;\n });\n return `{ ${cols.join(\"\")} },`;\n });\n return [\"unique: [\", ...entries, \"]\"];\n}\n\nexport function renderModuleRowTypeBlock(mod: {\n name: string;\n columns: RenderColumn[];\n}): string {\n return renderTypeBlock(toCodeTypeName(mod.name), [\n \"id: string;\",\n ...mod.columns.map((col) => renderColumnField(col)),\n ]);\n}\n\nexport function renderModuleDescriptorBlock(mod: {\n name: string;\n columns: RenderColumn[];\n}): string {\n const name = toCodeTypeName(mod.name);\n return renderTypeBlock(`${name}__Descriptor`, [\n `row: ${name};`,\n ...renderRefsFieldLines(mod.columns),\n \"unique: [];\",\n ]);\n}\n\nexport function renderSection(title: string, blocks: string[]): string {\n if (blocks.length === 0) return \"\";\n return `// ${title}\\n${blocks.join(\"\\n\\n\")}`;\n}\n\nexport function renderWebhookTypesSection(tables: { name: string }[]): string {\n const lines: string[] = [\n \"// Webhook types\",\n 'export type WebhookEvent = \"content.create\" | \"content.update\" | \"content.delete\";',\n \"\",\n \"type WebhookPayloadBase = {\",\n \" event: WebhookEvent;\",\n \" timestamp: string;\",\n \" project: string;\",\n \"};\",\n \"\",\n ];\n if (tables.length > 0) {\n const unionMembers = tables\n .map((t) => {\n const name = toCodeTypeName(t.name);\n return `| {\\n table: \"${t.name}\";\\n content: ${name};\\n old?: ${name};\\n}`;\n })\n .join(\"\\n\");\n lines.push(\n `export type WebhookPayload = WebhookPayloadBase & (\\n${unionMembers}\\n);`,\n );\n } else {\n lines.push(\"export type WebhookPayload = WebhookPayloadBase;\");\n }\n return lines.join(\"\\n\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport function resolveOutputFile(output: string): string {\n return output.endsWith(\".ts\") ? output : path.join(output, \"index.ts\");\n}\n\nexport async function writeGeneratedFile(\n output: string,\n content: string,\n): Promise<string> {\n const target = resolveOutputFile(output);\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, content, \"utf-8\");\n return target;\n}\n","import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { OrizmConfigDef } from \"@orizm/common/config-validator\";\nimport { toResult, type ApiError } from \"../api/errors.js\";\nimport type { CommandContext } from \"../commands/run-with-context.js\";\nimport { CommonOrizmConfig } from \"../types.js\";\n\nexport type PullError =\n | ApiError\n | { type: \"definition_schema_violation\"; issues: v.BaseIssue<unknown>[] };\n\n// サーバーの applied definition を取得し、ローカル config と同じ valibot 検証を通して\n// codegen 入力(CommonOrizmConfig)に揃える。raw(JSON) を正本にすることで型キャストを避ける。\nexport async function pullCurrentDefinition(\n ctx: CommandContext,\n): Promise<Result.Result<CommonOrizmConfig, PullError>> {\n const definition = toResult(\n await ctx.client.GET(\"/projects/{projectName}/definitions/current\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(definition)) return definition;\n\n const parsed = v.safeParse(\n OrizmConfigDef,\n safeJsonParse(definition.value.raw),\n );\n if (!parsed.success) {\n return Result.fail({\n type: \"definition_schema_violation\",\n issues: parsed.issues,\n });\n }\n return Result.succeed(parsed.output);\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n","import { Result } from \"@praha/byethrow\";\nimport { type CommandFailure, type CommandOutput } from \"../define-command.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { runWithContext } from \"../run-with-context.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { writeGeneratedFile } from \"../../codegen/write.js\";\nimport { pullCurrentDefinition, type PullError } from \"../../codegen/pull.js\";\nimport { getOutputState } from \"../../ui/output.js\";\nimport { formatValibotIssues } from \"../../ui/error.js\";\nimport type { CommonOrizmConfig } from \"../../types.js\";\n\ntype CodegenParams = {\n args: Record<string, unknown>;\n pull: boolean;\n configFile: string;\n output: string;\n label: string;\n render: (config: CommonOrizmConfig) => Promise<string>;\n};\n\n// cms / consumer 共通の codegen 実行。source がローカル config(既定)かサーバー applied\n// definition(--pull)かだけが違い、生成・書き出しは同じ。\nexport async function runCodegen(\n params: CodegenParams,\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (params.pull) {\n return runWithContext(params.args, async (ctx) => {\n const pulled = await pullCurrentDefinition(ctx);\n if (Result.isFailure(pulled)) return pullFailure(pulled.error);\n return generate(pulled.value, params);\n });\n }\n\n const loaded = await loadConfig(params.configFile);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n return generate(loaded.value, params);\n}\n\nasync function generate(\n config: CommonOrizmConfig,\n params: CodegenParams,\n): Promise<Result.Result<CommandOutput, CommandFailure>> {\n const content = await params.render(config);\n const target = await writeGeneratedFile(params.output, content);\n return Result.succeed({\n json: { output: target },\n text: () => `Generated ${params.label} types to ${target}`,\n });\n}\n\nfunction pullFailure(error: PullError): Result.Result<never, CommandFailure> {\n if (error.type === \"definition_schema_violation\") {\n return Result.fail({\n message: `The applied definition is invalid (${error.issues.length} problem(s)).\\n${formatValibotIssues(\n error.issues,\n getOutputState().color,\n )}`,\n });\n }\n return apiErrorFailure(error);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-codegen-mclysZuT.cjs","names":["prettier","prettierPluginEstree","prettierPluginTypeScript","path","toResult","Result","v","OrizmConfigDef","runWithContext","Result","loadConfig","configLoadFailure","formatValibotIssues","getOutputState","apiErrorFailure"],"sources":["../src/cli/codegen/format.ts","../src/cli/codegen/render.ts","../src/cli/codegen/write.ts","../src/cli/codegen/pull.ts","../src/cli/commands/codegen/run-codegen.ts"],"sourcesContent":["import * as prettier from \"prettier/standalone\";\nimport prettierPluginEstree from \"prettier/plugins/estree.js\";\nimport prettierPluginTypeScript from \"prettier/plugins/typescript.js\";\n\nexport function formatTsWithPrettier(code: string): Promise<string> {\n return prettier.format(code, {\n parser: \"typescript\",\n plugins: [prettierPluginEstree, prettierPluginTypeScript],\n });\n}\n","export type RenderColumn = {\n name: string;\n type: string;\n required?: boolean;\n readOnly?: boolean;\n moduleName?: string;\n tableName?: string;\n includeName?: string;\n};\n\nexport type RenderIndex = {\n columns: string[];\n unique?: boolean;\n nullsNotDistinct?: boolean;\n};\n\nexport const AUTOGEN_HEADER =\n \"// This file was automatically generated and should not be edited.\";\n\nexport const UTILITIES = `// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};`;\n\nexport function toCodeTypeName(str: string): string {\n const capitalized = str.charAt(0).toUpperCase() + str.slice(1);\n return capitalized.replace(/_([a-z])/g, (g) => g[1].toUpperCase());\n}\n\nexport function typeName(column: RenderColumn, moduleSuffix = \"\"): string {\n switch (column.type) {\n case \"reference\":\n return \"string\";\n case \"module\":\n return toCodeTypeName(column.moduleName ?? \"\") + moduleSuffix;\n case \"module-array\":\n return toCodeTypeName(column.moduleName ?? \"\") + moduleSuffix + \"[]\";\n case \"json\":\n return \"unknown\";\n case \"storage\":\n return \"StorageItemType\";\n default:\n return column.type;\n }\n}\n\nexport function nullableSuffix(column: RenderColumn): string {\n return !column.required && column.type !== \"module-array\" ? \" | null\" : \"\";\n}\n\nexport function filterRefColumns(columns: RenderColumn[]): RenderColumn[] {\n return columns.filter(\n (c) =>\n (c.type === \"reference\" &&\n c.tableName !== undefined &&\n c.includeName !== undefined &&\n c.includeName !== \"\") ||\n (c.type === \"module\" && c.moduleName !== undefined) ||\n (c.type === \"module-array\" && c.moduleName !== undefined),\n );\n}\n\nexport function getIncludeName(column: RenderColumn): string {\n return column.type === \"reference\"\n ? column.includeName || column.name\n : column.name;\n}\n\nexport function getIncludeType(column: RenderColumn): string {\n if (column.type === \"reference\" && column.tableName) {\n return toCodeTypeName(column.tableName) + \"__Descriptor\";\n }\n if (column.type === \"module\" && column.moduleName) {\n return `_ModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n }\n if (column.type === \"module-array\" && column.moduleName) {\n return `_ArrayModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n }\n return \"\";\n}\n\nexport function renderColumnField(\n col: RenderColumn,\n options?: { optional?: boolean; suffix?: string },\n): string {\n const optional = options?.optional === true ? \"?\" : \"\";\n const suffix = options?.suffix ?? \"\";\n return `${col.name}${optional}: ${typeName(col, suffix)}${nullableSuffix(col)};`;\n}\n\nexport function renderTypeBlock(name: string, fields: string[]): string {\n return `export type ${name} = {\\n${fields.join(\"\\n\")}\\n};`;\n}\n\nexport function renderRefsFieldLines(columns: RenderColumn[]): string[] {\n const refCols = filterRefColumns(columns);\n if (refCols.length === 0) return [\"refs: object;\"];\n return [\n \"refs: {\",\n ...refCols.map((c) => `${getIncludeName(c)}: ${getIncludeType(c)};`),\n \"}\",\n ];\n}\n\nexport function renderUniqueFieldLines(table: {\n columns: RenderColumn[];\n indexes?: RenderIndex[];\n}): string[] {\n const uniqueIndexes = (table.indexes ?? []).filter((i) => i.unique);\n if (uniqueIndexes.length === 0) return [\"unique: [];\"];\n const entries = uniqueIndexes.map((index) => {\n const cols = index.columns.map((colName) => {\n const col = table.columns.find((c) => c.name === colName);\n if (!col) throw new Error(`column ${colName} not found`);\n const nullable = !col.required && index.nullsNotDistinct ? \" | null\" : \"\";\n return `${col.name}:${typeName(col)}${nullable},`;\n });\n return `{ ${cols.join(\"\")} },`;\n });\n return [\"unique: [\", ...entries, \"]\"];\n}\n\nexport function renderModuleRowTypeBlock(mod: {\n name: string;\n columns: RenderColumn[];\n}): string {\n return renderTypeBlock(toCodeTypeName(mod.name), [\n \"id: string;\",\n ...mod.columns.map((col) => renderColumnField(col)),\n ]);\n}\n\nexport function renderModuleDescriptorBlock(mod: {\n name: string;\n columns: RenderColumn[];\n}): string {\n const name = toCodeTypeName(mod.name);\n return renderTypeBlock(`${name}__Descriptor`, [\n `row: ${name};`,\n ...renderRefsFieldLines(mod.columns),\n \"unique: [];\",\n ]);\n}\n\nexport function renderSection(title: string, blocks: string[]): string {\n if (blocks.length === 0) return \"\";\n return `// ${title}\\n${blocks.join(\"\\n\\n\")}`;\n}\n\nexport function renderWebhookTypesSection(tables: { name: string }[]): string {\n const lines: string[] = [\n \"// Webhook types\",\n 'export type WebhookEvent = \"content.create\" | \"content.update\" | \"content.delete\";',\n \"\",\n \"type WebhookPayloadBase = {\",\n \" event: WebhookEvent;\",\n \" timestamp: string;\",\n \" project: string;\",\n \"};\",\n \"\",\n ];\n if (tables.length > 0) {\n const unionMembers = tables\n .map((t) => {\n const name = toCodeTypeName(t.name);\n return `| {\\n table: \"${t.name}\";\\n content: ${name};\\n old?: ${name};\\n}`;\n })\n .join(\"\\n\");\n lines.push(\n `export type WebhookPayload = WebhookPayloadBase & (\\n${unionMembers}\\n);`,\n );\n } else {\n lines.push(\"export type WebhookPayload = WebhookPayloadBase;\");\n }\n return lines.join(\"\\n\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport function resolveOutputFile(output: string): string {\n return output.endsWith(\".ts\") ? output : path.join(output, \"index.ts\");\n}\n\nexport async function writeGeneratedFile(\n output: string,\n content: string,\n): Promise<string> {\n const target = resolveOutputFile(output);\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, content, \"utf-8\");\n return target;\n}\n","import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { OrizmConfigDef } from \"@orizm/common/config-validator\";\nimport { toResult, type ApiError } from \"../api/errors.js\";\nimport type { CommandContext } from \"../commands/run-with-context.js\";\nimport { CommonOrizmConfig } from \"../types.js\";\n\nexport type PullError =\n | ApiError\n | { type: \"definition_schema_violation\"; issues: v.BaseIssue<unknown>[] };\n\n// サーバーの applied definition を取得し、ローカル config と同じ valibot 検証を通して\n// codegen 入力(CommonOrizmConfig)に揃える。raw(JSON) を正本にすることで型キャストを避ける。\nexport async function pullCurrentDefinition(\n ctx: CommandContext,\n): Promise<Result.Result<CommonOrizmConfig, PullError>> {\n const definition = toResult(\n await ctx.client.GET(\"/projects/{projectName}/definitions/current\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(definition)) return definition;\n\n const parsed = v.safeParse(\n OrizmConfigDef,\n safeJsonParse(definition.value.raw),\n );\n if (!parsed.success) {\n return Result.fail({\n type: \"definition_schema_violation\",\n issues: parsed.issues,\n });\n }\n return Result.succeed(parsed.output);\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n","import { Result } from \"@praha/byethrow\";\nimport { type CommandFailure, type CommandOutput } from \"../define-command.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { runWithContext } from \"../run-with-context.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { writeGeneratedFile } from \"../../codegen/write.js\";\nimport { pullCurrentDefinition, type PullError } from \"../../codegen/pull.js\";\nimport { getOutputState } from \"../../ui/output.js\";\nimport { formatValibotIssues } from \"../../ui/error.js\";\nimport type { CommonOrizmConfig } from \"../../types.js\";\n\ntype CodegenParams = {\n args: Record<string, unknown>;\n pull: boolean;\n configFile: string;\n output: string;\n label: string;\n render: (config: CommonOrizmConfig) => Promise<string>;\n};\n\n// cms / consumer 共通の codegen 実行。source がローカル config(既定)かサーバー applied\n// definition(--pull)かだけが違い、生成・書き出しは同じ。\nexport async function runCodegen(\n params: CodegenParams,\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (params.pull) {\n return runWithContext(params.args, async (ctx) => {\n const pulled = await pullCurrentDefinition(ctx);\n if (Result.isFailure(pulled)) return pullFailure(pulled.error);\n return generate(pulled.value, params);\n });\n }\n\n const loaded = await loadConfig(params.configFile);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n return generate(loaded.value, params);\n}\n\nasync function generate(\n config: CommonOrizmConfig,\n params: CodegenParams,\n): Promise<Result.Result<CommandOutput, CommandFailure>> {\n const content = await params.render(config);\n const target = await writeGeneratedFile(params.output, content);\n return Result.succeed({\n json: { output: target },\n text: () => `Generated ${params.label} types to ${target}`,\n });\n}\n\nfunction pullFailure(error: PullError): Result.Result<never, CommandFailure> {\n if (error.type === \"definition_schema_violation\") {\n return Result.fail({\n message: `The applied definition is invalid (${error.issues.length} problem(s)).\\n${formatValibotIssues(\n error.issues,\n getOutputState().color,\n )}`,\n });\n }\n return apiErrorFailure(error);\n}\n"],"mappings":"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"}
|