@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.
Files changed (71) hide show
  1. package/dist/{agent-Bd30EhQC.mjs → agent-Kf8iuW2I.mjs} +2 -2
  2. package/dist/{agent-Bd30EhQC.mjs.map → agent-Kf8iuW2I.mjs.map} +1 -1
  3. package/dist/{agent-vC2-9rjt.cjs → agent-UZZtdOZS.cjs} +2 -2
  4. package/dist/{agent-vC2-9rjt.cjs.map → agent-UZZtdOZS.cjs.map} +1 -1
  5. package/dist/cli/main.cjs +4 -4
  6. package/dist/cli/main.mjs +4 -4
  7. package/dist/{cms-DLOypcw8.mjs → cms-8XZhxwsM.mjs} +5 -2
  8. package/dist/{cms-DLOypcw8.mjs.map → cms-8XZhxwsM.mjs.map} +1 -1
  9. package/dist/{cms-CId7jg5l.cjs → cms-C4zEtppZ.cjs} +5 -2
  10. package/dist/{cms-CId7jg5l.cjs.map → cms-C4zEtppZ.cjs.map} +1 -1
  11. package/dist/{codegen-kbbIwPbb.cjs → codegen-Cypg4O3L.cjs} +3 -3
  12. package/dist/{codegen-kbbIwPbb.cjs.map → codegen-Cypg4O3L.cjs.map} +1 -1
  13. package/dist/{codegen-BKE_IYoM.mjs → codegen-Dnjv7zfm.mjs} +3 -3
  14. package/dist/{codegen-BKE_IYoM.mjs.map → codegen-Dnjv7zfm.mjs.map} +1 -1
  15. package/dist/config/index.cjs +4 -2
  16. package/dist/config/index.cjs.map +1 -1
  17. package/dist/config/index.d.mts +8 -1
  18. package/dist/config/index.d.mts.map +1 -1
  19. package/dist/config/index.mjs +4 -2
  20. package/dist/config/index.mjs.map +1 -1
  21. package/dist/{config-loader-D8x32gEU.cjs → config-loader-CZfANHBf.cjs} +2 -2
  22. package/dist/config-loader-CZfANHBf.cjs.map +1 -0
  23. package/dist/{config-loader-BEgS869e.mjs → config-loader-CtbZOGjc.mjs} +3 -3
  24. package/dist/config-loader-CtbZOGjc.mjs.map +1 -0
  25. package/dist/{consumer-OG6IEJun.cjs → consumer-BSgriLn0.cjs} +2 -2
  26. package/dist/{consumer-OG6IEJun.cjs.map → consumer-BSgriLn0.cjs.map} +1 -1
  27. package/dist/{consumer-CqyZdG9v.mjs → consumer-s8LnLw4e.mjs} +2 -2
  28. package/dist/{consumer-CqyZdG9v.mjs.map → consumer-s8LnLw4e.mjs.map} +1 -1
  29. package/dist/docs/features/cli/commands/schema.md +3 -2
  30. package/dist/docs/features/cms-sdk/install.md +1 -1
  31. package/dist/docs/features/console/audit-logs.md +3 -0
  32. package/dist/docs/features/consumer-sdk/install.md +1 -1
  33. package/dist/docs/features/dictionary.md +268 -0
  34. package/dist/docs/features/full-text-search/local-development.md +145 -0
  35. package/dist/docs/features/full-text-search.md +146 -0
  36. package/dist/docs/features/schema/database.md +9 -8
  37. package/dist/docs/index.md +3 -1
  38. package/dist/docs/manifest.json +3 -3
  39. package/dist/{erd-BNv5Th6z.mjs → erd-BihhEfZ_.mjs} +2 -2
  40. package/dist/{erd-BNv5Th6z.mjs.map → erd-BihhEfZ_.mjs.map} +1 -1
  41. package/dist/{erd-ByuVMQ5n.cjs → erd-DmnB1v2c.cjs} +2 -2
  42. package/dist/{erd-ByuVMQ5n.cjs.map → erd-DmnB1v2c.cjs.map} +1 -1
  43. package/dist/{init-CPfpVlUN.mjs → init-BpKpTQ0z.mjs} +66 -13
  44. package/dist/init-BpKpTQ0z.mjs.map +1 -0
  45. package/dist/{init-NaL2N3Go.cjs → init-BrZCChEG.cjs} +66 -13
  46. package/dist/init-BrZCChEG.cjs.map +1 -0
  47. package/dist/{push-9fPpd4U8.cjs → push-BggkrD0g.cjs} +28 -10
  48. package/dist/push-BggkrD0g.cjs.map +1 -0
  49. package/dist/{push-54rmb0T0.mjs → push-xWnD9oov.mjs} +28 -10
  50. package/dist/push-xWnD9oov.mjs.map +1 -0
  51. package/dist/{run-codegen-mclysZuT.cjs → run-codegen-B-90rvjk.cjs} +2 -2
  52. package/dist/run-codegen-B-90rvjk.cjs.map +1 -0
  53. package/dist/{run-codegen-DjnV60bE.mjs → run-codegen-CrO08jJT.mjs} +2 -2
  54. package/dist/run-codegen-CrO08jJT.mjs.map +1 -0
  55. package/dist/{schema-CNSTXsVa.cjs → schema-CUVTXrHk.cjs} +4 -4
  56. package/dist/{schema-CNSTXsVa.cjs.map → schema-CUVTXrHk.cjs.map} +1 -1
  57. package/dist/{schema-BL6SlLtH.mjs → schema-DlUWHV_t.mjs} +4 -4
  58. package/dist/{schema-BL6SlLtH.mjs.map → schema-DlUWHV_t.mjs.map} +1 -1
  59. package/dist/{validate-BpxZ8LTl.cjs → validate-BH8jqdqq.cjs} +2 -2
  60. package/dist/{validate-BpxZ8LTl.cjs.map → validate-BH8jqdqq.cjs.map} +1 -1
  61. package/dist/{validate-Ca0CRo16.mjs → validate-COS4bfr0.mjs} +2 -2
  62. package/dist/{validate-Ca0CRo16.mjs.map → validate-COS4bfr0.mjs.map} +1 -1
  63. package/package.json +8 -8
  64. package/dist/config-loader-BEgS869e.mjs.map +0 -1
  65. package/dist/config-loader-D8x32gEU.cjs.map +0 -1
  66. package/dist/init-CPfpVlUN.mjs.map +0 -1
  67. package/dist/init-NaL2N3Go.cjs.map +0 -1
  68. package/dist/push-54rmb0T0.mjs.map +0 -1
  69. package/dist/push-9fPpd4U8.cjs.map +0 -1
  70. package/dist/run-codegen-DjnV60bE.mjs.map +0 -1
  71. package/dist/run-codegen-mclysZuT.cjs.map +0 -1
@@ -183,22 +183,57 @@ function renderClaudeImportInner() {
183
183
  const START_TOKEN = "<!-- orizm-agent:start";
184
184
  const MARKER_START = "<!-- orizm-agent:start (managed by `orizm agent` — do not edit manually) -->";
185
185
  const MARKER_END = "<!-- orizm-agent:end -->";
186
+ var BrokenManagedBlockError = class extends Error {
187
+ reason;
188
+ constructor(reason) {
189
+ super(`managed block is broken (${reason})`);
190
+ this.name = "BrokenManagedBlockError";
191
+ this.reason = reason;
192
+ }
193
+ };
194
+ function indexOfAll(text, token) {
195
+ const found = [];
196
+ let from = 0;
197
+ while (true) {
198
+ const idx = text.indexOf(token, from);
199
+ if (idx === -1) return found;
200
+ found.push(idx);
201
+ from = idx + token.length;
202
+ }
203
+ }
204
+ function inspectManagedBlock(text) {
205
+ const starts = indexOfAll(text, START_TOKEN);
206
+ if (starts.length === 0) return { kind: "absent" };
207
+ if (starts.length > 1) return {
208
+ kind: "broken",
209
+ reason: `found ${starts.length} start markers, expected at most 1`
210
+ };
211
+ const start = starts[0];
212
+ const endIdx = text.indexOf(MARKER_END, start);
213
+ if (endIdx === -1) return {
214
+ kind: "broken",
215
+ reason: "found a start marker without a matching end marker after it"
216
+ };
217
+ return {
218
+ kind: "present",
219
+ start,
220
+ end: endIdx + 24
221
+ };
222
+ }
186
223
  function wrapBlock(inner) {
187
224
  return `${MARKER_START}\n${inner.trim()}\n${MARKER_END}`;
188
225
  }
189
226
  function extractBlock(text) {
190
- const startIdx = text.indexOf(START_TOKEN);
191
- if (startIdx === -1) return void 0;
192
- const endIdx = text.indexOf(MARKER_END, startIdx);
193
- if (endIdx === -1) return void 0;
194
- return text.slice(startIdx, endIdx + 24);
227
+ const state = inspectManagedBlock(text);
228
+ if (state.kind !== "present") return void 0;
229
+ return text.slice(state.start, state.end);
195
230
  }
196
231
  function upsertBlock(existing, block) {
197
- const startIdx = existing.indexOf(START_TOKEN);
198
- const endIdx = startIdx === -1 ? -1 : existing.indexOf(MARKER_END, startIdx);
199
- if (endIdx !== -1) {
200
- const before = existing.slice(0, startIdx);
201
- const after = existing.slice(endIdx + 24);
232
+ const state = inspectManagedBlock(existing);
233
+ if (state.kind === "broken") throw new BrokenManagedBlockError(state.reason);
234
+ if (state.kind === "present") {
235
+ const before = existing.slice(0, state.start);
236
+ const after = existing.slice(state.end);
202
237
  const content = before + block + after;
203
238
  return {
204
239
  content,
@@ -234,12 +269,23 @@ async function applyWrite(filePath, content) {
234
269
 
235
270
  //#endregion
236
271
  //#region src/cli/commands/agent/init.ts
272
+ function describeExisting(existing) {
273
+ const state = inspectManagedBlock(existing);
274
+ switch (state.kind) {
275
+ case "present": return "exists (managed block present — will update)";
276
+ case "absent": return "exists (no managed block — will append)";
277
+ case "broken": return `exists (broken managed block: ${state.reason} — cannot update)`;
278
+ }
279
+ }
280
+ function renderBrokenManagedBlock(fileName, error) {
281
+ return `${fileName}: ${error.message}. Nothing was written. Repair the file by hand — keep exactly one \`<!-- orizm-agent:start ... -->\` marker followed by one \`<!-- orizm-agent:end -->\` marker, or remove both — then re-run \`orizm agent init\`.`;
282
+ }
237
283
  async function showDetectedContext(cwd, version, targets) {
238
284
  const lines = [`Detected bundled Orizm docs v${version} (shipped with @orizm/cli).`, `Project root: ${cwd}`];
239
285
  for (const target of targets) {
240
286
  const fileName = target.fileName;
241
287
  const existing = await readTextFile(target.path);
242
- const status = existing === "" ? "not found (will be created)" : extractBlock(existing) != null ? "exists (managed block present — will update)" : "exists (no managed block — will append)";
288
+ const status = existing === "" ? "not found (will be created)" : describeExisting(existing);
243
289
  lines.push(`- ${fileName}: ${status}`);
244
290
  }
245
291
  require_cli_main.notice(lines.join("\n"));
@@ -320,7 +366,14 @@ var init_default = require_cli_main.defineCommand({
320
366
  } else inner = renderClaudeImportInner();
321
367
  const existing = await readTextFile(target.path);
322
368
  const newBlock = wrapBlock(inner);
323
- const { content, action } = upsertBlock(existing, newBlock);
369
+ let upserted;
370
+ try {
371
+ upserted = upsertBlock(existing, newBlock);
372
+ } catch (error) {
373
+ if (error instanceof BrokenManagedBlockError) return _praha_byethrow.Result.fail({ message: renderBrokenManagedBlock(target.fileName, error) });
374
+ throw error;
375
+ }
376
+ const { content, action } = upserted;
324
377
  plans.push({
325
378
  target,
326
379
  content,
@@ -371,4 +424,4 @@ var init_default = require_cli_main.defineCommand({
371
424
 
372
425
  //#endregion
373
426
  exports.default = init_default;
374
- //# sourceMappingURL=init-NaL2N3Go.cjs.map
427
+ //# sourceMappingURL=init-BrZCChEG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-BrZCChEG.cjs","names":["v","path","Result","cliVersion","path","path","defineCommand","globalArgs","Result","select","path","confirm"],"sources":["../src/cli/agent/resolve-docs.ts","../src/cli/agent/resolve-target.ts","../src/cli/agent/execution-mode.ts","../src/cli/agent/preview.ts","../src/cli/agent/template.ts","../src/cli/agent/write-reference.ts","../src/cli/commands/agent/init.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\nimport { version as cliVersion } from \"../version.js\";\n\n// きれいに辿れる場合に優先する公開パス(トップレベル/ホイスト済みインストール)。\nconst PRETTY_DOCS_SUBPATH = \"node_modules/@orizm/cli/dist/docs\";\n\nexport type BundledDocs = {\n docsDir: string;\n version: string;\n pages: number;\n};\n\nexport type ResolveDocsError = {\n type: \"docs_not_resolved\";\n reason: \"manifest_missing\" | \"manifest_invalid\";\n manifestPath: string;\n};\n\nconst ManifestSchema = v.object({\n version: v.pipe(v.string(), v.nonEmpty()),\n generatedAt: v.string(),\n pages: v.optional(v.number(), 0),\n});\n\nfunction findPackageRoot(start: string): string | undefined {\n let dir = start;\n for (;;) {\n if (existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\n// 実行中の CLI ファイル位置から自パッケージルートをたどるため、プロジェクト側 node_modules の\n// レイアウト(hoisting / pnpm)に依存しない。\nfunction defaultPackageRoot(): string {\n const from = path.dirname(fileURLToPath(import.meta.url));\n const root = findPackageRoot(from);\n if (root === undefined) {\n throw new Error(\n `@orizm/cli の package.json が ${from} から上に見つかりません。`,\n );\n }\n return root;\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\n// 同梱 docs の存在を manifest.json で確認し、参照文言に載せる version を得る。\nexport async function resolveDocs(\n packageRoot: string = defaultPackageRoot(),\n): Promise<Result.Result<BundledDocs, ResolveDocsError>> {\n const docsDir = path.join(packageRoot, \"dist\", \"docs\");\n const manifestPath = path.join(docsDir, \"manifest.json\");\n const raw = await readFile(manifestPath, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) {\n return Result.fail({\n type: \"docs_not_resolved\",\n reason: \"manifest_missing\",\n manifestPath,\n });\n }\n\n const parsed = v.safeParse(ManifestSchema, safeJsonParse(raw));\n if (!parsed.success) {\n return Result.fail({\n type: \"docs_not_resolved\",\n reason: \"manifest_invalid\",\n manifestPath,\n });\n }\n\n return Result.succeed({\n docsDir,\n version: parsed.output.version,\n pages: parsed.output.pages,\n });\n}\n\n// 指示ファイルに書く docs 参照は常に `node_modules/@orizm/cli/dist/docs` の公開パスにする\n// (相対パスや .pnpm の実体パスは書かない。Next.js の `node_modules/next/dist/docs` と同方式)。\n// `resolves` は targetDir 直下からそのパスが実在するか。false の場合、呼び出し側で警告する\n// (@orizm/cli が targetDir を起点に解決できない配置。プロジェクトの依存に加えるか、\n// 解決できる場所で実行する必要がある)。\nexport function docsReference(targetDir: string): {\n docsDir: string;\n docsIndex: string;\n resolves: boolean;\n} {\n const base = `./${PRETTY_DOCS_SUBPATH}`;\n return {\n docsDir: `${base}/`,\n docsIndex: `${base}/index.md`,\n resolves: existsSync(path.join(targetDir, PRETTY_DOCS_SUBPATH)),\n };\n}\n\n// docs_not_resolved の表示文。原因ごとに復旧手段を添える(commands.md の仕様)。\n// 公開パスが辿れない問題は独立して起こるため、成功時の警告(init.ts)で扱う。\nexport function renderDocsNotResolved(error: ResolveDocsError): string {\n switch (error.reason) {\n case \"manifest_missing\":\n return (\n `Could not find the bundled Orizm docs (looked in ${error.manifestPath}). ` +\n `The installed @orizm/cli ${cliVersion} does not ship docs. ` +\n \"Run `pnpm update @orizm/cli`.\"\n );\n case \"manifest_invalid\":\n return (\n `Could not read the bundled Orizm docs manifest (${error.manifestPath}). ` +\n `The @orizm/cli ${cliVersion} install looks incomplete. ` +\n \"Run `pnpm install --force`.\"\n );\n }\n}\n","import path from \"node:path\";\n\nexport const CLAUDE_FILE = \"CLAUDE.md\";\nexport const AGENTS_FILE = \"AGENTS.md\";\n\n// canonical: docs 参照の本文そのものを書くファイル(AGENTS.md)。\n// claude-import: 本文を持たず AGENTS.md を `@` import するファイル(CLAUDE.md)。\nexport type TargetKind = \"canonical\" | \"claude-import\";\n\nexport type Target = {\n path: string;\n fileName: string;\n kind: TargetKind;\n};\n\n// 書き込み対象の決定。\n// - --target 明示: そのファイル 1 つに本文(canonical)を書く。\n// - 省略時: AGENTS.md を正本(canonical)に、CLAUDE.md は @AGENTS.md import として\n// 両方を管理する。どちらも無ければ両方新規作成する。\nexport function resolveTargets(cwd: string, targetFlag?: string): Target[] {\n if (targetFlag != null && targetFlag !== \"\") {\n const resolved = path.resolve(cwd, targetFlag);\n return [\n { path: resolved, fileName: path.basename(resolved), kind: \"canonical\" },\n ];\n }\n\n return [\n { path: path.join(cwd, AGENTS_FILE), fileName: AGENTS_FILE, kind: \"canonical\" },\n {\n path: path.join(cwd, CLAUDE_FILE),\n fileName: CLAUDE_FILE,\n kind: \"claude-import\",\n },\n ];\n}\n","// orizm agent init の実行モード判定(純関数)。\n// 解決順序は「フラグ > 対話 (TTY) > 既定/エラー (非 TTY)」で ADR-004 のコンテキスト解決と揃える。\n// - interactive: TTY かつ --yes / --json / --dry-run のいずれも無いとき。npx skills 風ウィザードを出す。\n// - non-interactive: それ以外(CI・スクリプト・--yes・非 TTY・--json・--dry-run)。プロンプトを出さない。\n// --json は stdout を機械可読結果専用に空けるため、--dry-run はプレビューのみで書き込まないため、\n// どちらも非対話に倒してウィザードを出さない。\nexport type ExecutionMode = \"interactive\" | \"non-interactive\";\n\nexport function resolveExecutionMode(opts: {\n isTTY: boolean;\n yes: boolean;\n json: boolean;\n dryRun: boolean;\n}): ExecutionMode {\n if (opts.isTTY && !opts.yes && !opts.json && !opts.dryRun) {\n return \"interactive\";\n }\n return \"non-interactive\";\n}\n\n// 対話ウィザードの「書き込み対象の選択」を --target フラグ相当へ写像する。\n// \"both\"(既定=両方)は --target 未指定と同じ = undefined。単一選択はそのファイル名を返す。\nexport function targetChoiceToFlag(choice: string): string | undefined {\n if (choice === \"agents\") return \"AGENTS.md\";\n if (choice === \"claude\") return \"CLAUDE.md\";\n return undefined;\n}\n","import type { UpsertAction } from \"./write-reference.js\";\n\n// 変更プレビューの 1 対象分。書き換わるのは自機能の管理ブロックだけなので、\n// 旧ブロック↔新ブロックの差分だけを見せる(ファイル全文は出さない)。\nexport type PreviewItem = {\n fileName: string;\n action: UpsertAction;\n // 既存の管理ブロック(updated のとき)。新規作成・ブロック未存在なら undefined。\n oldBlock?: string;\n // 書き込む新しい管理ブロック。\n newBlock: string;\n};\n\n// 旧・新ブロックの共通の先頭行 / 末尾行を除いた「変わった行」だけを -/+ で返す。\n// created(oldBlock=undefined)は新ブロック全行が追加 (+) になる。\nexport function diffBlockLines(\n oldBlock: string | undefined,\n newBlock: string,\n): string[] {\n const oldLines = oldBlock != null ? oldBlock.split(\"\\n\") : [];\n const newLines = newBlock.split(\"\\n\");\n\n let start = 0;\n while (\n start < oldLines.length &&\n start < newLines.length &&\n oldLines[start] === newLines[start]\n ) {\n start++;\n }\n\n let oldEnd = oldLines.length;\n let newEnd = newLines.length;\n while (\n oldEnd > start &&\n newEnd > start &&\n oldLines[oldEnd - 1] === newLines[newEnd - 1]\n ) {\n oldEnd--;\n newEnd--;\n }\n\n const removed = oldLines.slice(start, oldEnd).map((line) => `- ${line}`);\n const added = newLines.slice(start, newEnd).map((line) => `+ ${line}`);\n return [...removed, ...added];\n}\n\n// 対象ごとの操作(create / update / unchanged)とブロック差分を組み立てた表示用文字列。\n// 対話ウィザードのプレビュー、および --dry-run の出力に共通で使う。\nexport function renderPlanPreview(items: PreviewItem[]): string {\n const sections = items.map((item) => {\n if (item.action === \"unchanged\") {\n return `= ${item.fileName} (unchanged)`;\n }\n const marker = item.action === \"created\" ? \"+\" : \"~\";\n const verb = item.action === \"created\" ? \"create\" : \"update\";\n const header = `${marker} ${verb} ${item.fileName}`;\n const body = diffBlockLines(item.oldBlock, item.newBlock).map(\n (line) => ` ${line}`,\n );\n return [header, ...body].join(\"\\n\");\n });\n return sections.join(\"\\n\\n\");\n}\n","import { AGENTS_FILE } from \"./resolve-target.js\";\n\n// 指示ファイルに書き込む参照ブロックの本文(マーカーは write-reference が付ける)。\n// docs 全文は inline せず、docs へのポインタと索引だけを渡してコンテキストを圧迫しない。\n// パスは resolve-docs.docsReference が算出した「実際に解決できる相対パス」を受け取る。\n// バージョン数字は書かない(パス先の docs が常に整合するため。数字を書くと再実行漏れで嘘になる)。\n// 代わりに SDK ページのバージョン表記と package.json を突き合わせさせる(SDK は CLI と別版で進む)。\n// docs.orizm.com への誘導はこのブロックにだけ置く(同梱 docs 本文は外部 URL を持たない)。\nexport function renderReferenceInner(params: {\n docsDir: string;\n docsIndex: string;\n}): string {\n return [\n \"## Orizm\",\n \"\",\n \"You are working in an Orizm project (Starter Kit v2). Before generating or editing\",\n \"any Orizm code, read the bundled docs below. They are a snapshot of\",\n \"https://docs.orizm.com, bundled with and version-matched to the `@orizm/cli`\",\n \"installed in this project. Do NOT rely on your training data — Orizm is a private\",\n \"product and your built-in knowledge is likely stale or wrong.\",\n \"\",\n `- Docs: \\`${params.docsDir}\\``,\n `- Index (start here): \\`${params.docsIndex}\\``,\n \"\",\n \"The path above assumes `@orizm/cli` is installed as a project devDependency\",\n \"(a global-only install is not resolved by this project-relative path).\",\n \"\",\n \"`@orizm/cms-sdk` / `@orizm/consumer-sdk` are versioned separately from\",\n \"`@orizm/cli`, so check the version each SDK page documents against this\",\n \"project's `package.json`.\",\n \"\",\n \"For the latest release, upgrades, or migrations, see https://docs.orizm.com.\",\n \"\",\n \"Starter Kit v2 conventions:\",\n \"\",\n \"- Edit only `apps/cms`, `apps/consumer`, and `packages/design-editor`.\",\n \"- `packages/orizm` is generated from `orizm.config.ts` — never edit it by hand.\",\n ].join(\"\\n\");\n}\n\n// CLAUDE.md 用のブロック本文。正本は AGENTS.md に置き、CLAUDE.md は Claude Code の\n// `@` import でそれを取り込む(内容の重複を避け、AGENTS.md を単一の情報源にする)。\nexport function renderClaudeImportInner(): string {\n return [\n \"## Orizm\",\n \"\",\n `Orizm docs and conventions are maintained in ${AGENTS_FILE} (managed by \\`orizm agent\\`).`,\n \"Claude Code imports it here:\",\n \"\",\n `@${AGENTS_FILE}`,\n ].join(\"\\n\");\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n// エージェント指示ファイル内で自機能が管理する領域の境界。start はプレフィックスで検出し、\n// 「do not edit」の文言をユーザーが多少書き換えても再検出できるようにする。\nconst START_TOKEN = \"<!-- orizm-agent:start\";\nexport const MARKER_START =\n \"<!-- orizm-agent:start (managed by `orizm agent` — do not edit manually) -->\";\nexport const MARKER_END = \"<!-- orizm-agent:end -->\";\n\nexport type UpsertAction = \"created\" | \"updated\" | \"unchanged\";\n\n// 既存内容の中での管理ブロックの状態。\n// - absent: 開始マーカーが無い(末尾に追記する)\n// - present: 開始マーカー 1 つと、その後ろに終了マーカーがある(置換する)\n// - broken: 開始マーカーはあるが対応する終了マーカーが無い、または開始マーカーが複数ある\n// (どちらも人手で直してもらう。追記で「開始マーカーが 2 つ」の状態を作ると、次回の実行で\n// 2 つのマーカーに挟まれたユーザー本文を丸ごと置換してしまうため、機械的には触らない)\nexport type ManagedBlockState =\n | { kind: \"absent\" }\n | { kind: \"present\"; start: number; end: number }\n | { kind: \"broken\"; reason: string };\n\n// 管理ブロックが壊れていて安全に更新できないことを表す。呼び出し側(init コマンド)が\n// 捕まえて、対象ファイル名と直し方を添えたエラーにする\nexport class BrokenManagedBlockError extends Error {\n readonly reason: string;\n\n constructor(reason: string) {\n super(`managed block is broken (${reason})`);\n this.name = \"BrokenManagedBlockError\";\n this.reason = reason;\n }\n}\n\nfunction indexOfAll(text: string, token: string): number[] {\n const found: number[] = [];\n let from = 0;\n while (true) {\n const idx = text.indexOf(token, from);\n if (idx === -1) return found;\n found.push(idx);\n from = idx + token.length;\n }\n}\n\n// 既存内容の管理ブロックの状態を判定する。extractBlock / upsertBlock と、\n// 対話モードのコンテキスト表示が同じ判定を共有する\nexport function inspectManagedBlock(text: string): ManagedBlockState {\n const starts = indexOfAll(text, START_TOKEN);\n if (starts.length === 0) return { kind: \"absent\" };\n if (starts.length > 1) {\n return {\n kind: \"broken\",\n reason: `found ${starts.length} start markers, expected at most 1`,\n };\n }\n const start = starts[0];\n const endIdx = text.indexOf(MARKER_END, start);\n if (endIdx === -1) {\n return {\n kind: \"broken\",\n reason: \"found a start marker without a matching end marker after it\",\n };\n }\n return { kind: \"present\", start, end: endIdx + MARKER_END.length };\n}\n\n// 参照本文をマーカーで囲んだ 1 ブロックにする。前後の余分な空白は落として揺れを防ぐ。\nexport function wrapBlock(inner: string): string {\n return `${MARKER_START}\\n${inner.trim()}\\n${MARKER_END}`;\n}\n\n// 既存内容から自機能の管理ブロック(マーカー含む)を抜き出す。無い・壊れているなら undefined。\n// プレビューの差分表示やコンテキスト表示で「既存ブロックの有無」を判定するのに使う。\nexport function extractBlock(text: string): string | undefined {\n const state = inspectManagedBlock(text);\n if (state.kind !== \"present\") return undefined;\n return text.slice(state.start, state.end);\n}\n\n// 既存内容にマーカーブロックがあれば置換、無ければ末尾に追記する純関数。\n// 置換後が元と完全一致なら unchanged とし、呼び出し側が書き込みを省ける。\n// 管理ブロックが壊れている(inspectManagedBlock 参照)ときは BrokenManagedBlockError を投げる。\nexport function upsertBlock(\n existing: string,\n block: string,\n): { content: string; action: UpsertAction } {\n const state = inspectManagedBlock(existing);\n\n if (state.kind === \"broken\") {\n throw new BrokenManagedBlockError(state.reason);\n }\n\n if (state.kind === \"present\") {\n const before = existing.slice(0, state.start);\n const after = existing.slice(state.end);\n const content = before + block + after;\n return { content, action: content === existing ? \"unchanged\" : \"updated\" };\n }\n\n if (existing === \"\") {\n return { content: `${block}\\n`, action: \"created\" };\n }\n\n // 既存本文とブロックの間は 1 行空ける。末尾改行がない既存にも改行を補う。\n const prefix = existing.endsWith(\"\\n\") ? existing : `${existing}\\n`;\n return { content: `${prefix}\\n${block}\\n`, action: \"updated\" };\n}\n\nfunction enoentToUndefined(error: NodeJS.ErrnoException): undefined {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n}\n\n// 対象ファイルを読む。存在しなければ空文字(= 新規作成扱い)。\nexport async function readTextFile(filePath: string): Promise<string> {\n const existing = await readFile(filePath, \"utf-8\").catch(enoentToUndefined);\n return existing ?? \"\";\n}\n\n// 一時ファイルへ書いてから rename で差し替える。直書きだと中断時に既存の\n// AGENTS.md / CLAUDE.md の本文を失う(architecture.md の非破壊要件)。\nexport async function applyWrite(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n const temp = path.join(\n dir,\n `${path.basename(filePath)}.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, content, \"utf-8\");\n await rename(temp, filePath).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n}\n","import path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { confirm, select } from \"../../ui/prompt.js\";\nimport { logger, notice, warn } from \"../../ui/output.js\";\nimport {\n docsReference,\n renderDocsNotResolved,\n resolveDocs,\n} from \"../../agent/resolve-docs.js\";\nimport { resolveTargets, type Target } from \"../../agent/resolve-target.js\";\nimport {\n resolveExecutionMode,\n targetChoiceToFlag,\n} from \"../../agent/execution-mode.js\";\nimport { renderPlanPreview, type PreviewItem } from \"../../agent/preview.js\";\nimport {\n renderClaudeImportInner,\n renderReferenceInner,\n} from \"../../agent/template.js\";\nimport {\n applyWrite,\n BrokenManagedBlockError,\n extractBlock,\n inspectManagedBlock,\n readTextFile,\n upsertBlock,\n wrapBlock,\n type UpsertAction,\n} from \"../../agent/write-reference.js\";\n\ntype TargetPlan = {\n target: Target;\n content: string;\n action: UpsertAction;\n oldBlock: string | undefined;\n newBlock: string;\n};\n\n// 既存ファイルの管理ブロックの状態を、検出コンテキスト表示の 1 行に写す。\n// 壊れているときは「ここで止まる」ことが読めるようにする(実際の中断は plan 組み立て側)。\nfunction describeExisting(existing: string): string {\n const state = inspectManagedBlock(existing);\n switch (state.kind) {\n case \"present\":\n return \"exists (managed block present — will update)\";\n case \"absent\":\n return \"exists (no managed block — will append)\";\n case \"broken\":\n return `exists (broken managed block: ${state.reason} — cannot update)`;\n }\n}\n\n// 壊れた管理ブロックを見つけたときの失敗メッセージ。追記も置換もせず、人手での修復を促す\nfunction renderBrokenManagedBlock(\n fileName: string,\n error: BrokenManagedBlockError,\n): string {\n return (\n `${fileName}: ${error.message}. ` +\n \"Nothing was written. Repair the file by hand — keep exactly one \" +\n \"`<!-- orizm-agent:start ... -->` marker followed by one `<!-- orizm-agent:end -->` \" +\n \"marker, or remove both — then re-run `orizm agent init`.\"\n );\n}\n\n// 対話ウィザードの (1) 検出コンテキスト表示。docs version / プロジェクトルート /\n// 書き込み対象の有無・既存ブロックの有無を stderr に出す。\nasync function showDetectedContext(\n cwd: string,\n version: string,\n targets: Target[],\n): Promise<void> {\n const lines = [\n `Detected bundled Orizm docs v${version} (shipped with @orizm/cli).`,\n `Project root: ${cwd}`,\n ];\n for (const target of targets) {\n const fileName = target.fileName;\n const existing = await readTextFile(target.path);\n const status =\n existing === \"\"\n ? \"not found (will be created)\"\n : describeExisting(existing);\n lines.push(`- ${fileName}: ${status}`);\n }\n notice(lines.join(\"\\n\"));\n}\n\nexport default defineCommand({\n meta: {\n name: \"init\",\n description:\n \"Add a reference to the bundled Orizm docs into AGENTS.md / CLAUDE.md\",\n },\n args: {\n ...globalArgs,\n target: {\n type: \"string\",\n description:\n \"Write only this file (e.g. AGENTS.md). Default: manage both AGENTS.md and CLAUDE.md\",\n },\n cwd: {\n type: \"string\",\n description: \"Project root directory (defaults to the current directory)\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would change without writing\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt (non-interactive)\",\n default: false,\n },\n },\n run: async ({ args }) => {\n const cwd = args.cwd != null && args.cwd !== \"\" ? args.cwd : process.cwd();\n\n const docs = await resolveDocs();\n if (Result.isFailure(docs)) {\n // version と manifest パスはエラー本文に出るので、ここは本文にない情報だけ出す。\n logger.debug(`import.meta.url: ${import.meta.url}`);\n return Result.fail({ message: renderDocsNotResolved(docs.error) });\n }\n const version = docs.value.version;\n\n // 実行モードを解決(フラグ > 対話(TTY) > 既定/エラー(非TTY))。\n // 非対話ではプロンプトを一切出さず、フラグ指定のまま処理する。\n const mode = resolveExecutionMode({\n isTTY: process.stdin.isTTY === true,\n yes: args.yes === true,\n json: args.json === true,\n dryRun: args[\"dry-run\"] === true,\n });\n\n // 対話モード: (1) コンテキスト表示 →(2) 書き込み対象の選択(--target 未指定時のみ)。\n // フラグで与えた項目はウィザードで再質問しない(フラグが対話を上書き)。\n let targetFlag = args.target;\n if (mode === \"interactive\") {\n await showDetectedContext(cwd, version, resolveTargets(cwd, targetFlag));\n if (targetFlag == null || targetFlag === \"\") {\n const choice = await select(\n \"Which files should reference the Orizm docs?\",\n [\n {\n label: \"AGENTS.md and CLAUDE.md (recommended)\",\n value: \"both\",\n },\n { label: \"AGENTS.md only\", value: \"agents\" },\n { label: \"CLAUDE.md only\", value: \"claude\" },\n ],\n );\n if (choice == null) return Result.fail({ message: \"Aborted.\" });\n targetFlag = targetChoiceToFlag(choice);\n }\n }\n\n // 各ターゲットの適用結果を先に計算し、書き込みは確認後にまとめて行う。\n const targets = resolveTargets(cwd, targetFlag);\n const plans: TargetPlan[] = [];\n for (const target of targets) {\n let inner: string;\n if (target.kind === \"canonical\") {\n const ref = docsReference(path.dirname(target.path));\n if (!ref.resolves) {\n warn(\n `node_modules/@orizm/cli was not found from ${path.dirname(target.path)} ` +\n \"(it may be installed globally only, or not a dependency). \" +\n \"To let agents reference version-aligned docs, \" +\n \"add @orizm/cli to this project's devDependencies \" +\n \"(a global install cannot be resolved via a project-relative reference path). \" +\n \"If it is already a dependency, check where it resolves with `pnpm why @orizm/cli`. \" +\n \"The reference path itself will still be written.\",\n );\n }\n inner = renderReferenceInner({\n docsDir: ref.docsDir,\n docsIndex: ref.docsIndex,\n });\n } else {\n inner = renderClaudeImportInner();\n }\n const existing = await readTextFile(target.path);\n const newBlock = wrapBlock(inner);\n let upserted: ReturnType<typeof upsertBlock>;\n try {\n upserted = upsertBlock(existing, newBlock);\n } catch (error) {\n // 開始マーカーだけが残ったファイルに追記すると開始マーカーが 2 つになり、次回の\n // 実行(CI の --yes)で 2 つのマーカーに挟まれたユーザー本文を丸ごと消してしまう。\n // 壊れた形は機械的に触らず、他の対象にも書き込まずに中断する\n if (error instanceof BrokenManagedBlockError) {\n return Result.fail({\n message: renderBrokenManagedBlock(target.fileName, error),\n });\n }\n throw error;\n }\n const { content, action } = upserted;\n plans.push({\n target,\n content,\n action,\n oldBlock: extractBlock(existing),\n newBlock,\n });\n }\n\n const toJson = (): {\n version: string;\n dryRun: boolean;\n results: { target: string; action: UpsertAction }[];\n } => ({\n version,\n dryRun: args[\"dry-run\"] === true,\n results: plans.map((plan) => ({\n target: plan.target.path,\n action: plan.action,\n })),\n });\n\n const changed = plans.filter((plan) => plan.action !== \"unchanged\");\n\n if (changed.length === 0) {\n const names = plans.map((plan) => plan.target.fileName).join(\", \");\n return Result.succeed({\n json: toJson(),\n text: () => `Orizm docs reference already up to date in ${names}.`,\n });\n }\n\n const previewItems: PreviewItem[] = changed.map((plan) => ({\n fileName: plan.target.fileName,\n action: plan.action,\n oldBlock: plan.oldBlock,\n newBlock: plan.newBlock,\n }));\n\n // --dry-run はどちらのモードでも書き込まずプレビューのみ。\n if (args[\"dry-run\"] === true) {\n return Result.succeed({\n json: toJson(),\n text: () => renderPlanPreview(previewItems),\n });\n }\n\n // 対話モード: (3) 変更プレビュー →(4) 確定。非対話はフラグ指定のまま書き込む。\n if (mode === \"interactive\") {\n notice(renderPlanPreview(previewItems));\n const summary = changed\n .map(\n (plan) =>\n `${plan.action === \"created\" ? \"create\" : \"update\"} ${plan.target.fileName}`,\n )\n .join(\", \");\n const approved = await confirm(\n `Write the Orizm docs reference (${summary})?`,\n true,\n );\n if (!approved) return Result.fail({ message: \"Aborted.\" });\n }\n\n for (const plan of changed) {\n await applyWrite(plan.target.path, plan.content);\n }\n\n return Result.succeed({\n json: toJson(),\n text: () => {\n const lines = changed.map(\n (plan) =>\n `${plan.action === \"created\" ? \"Created\" : \"Updated\"} ${plan.target.fileName}`,\n );\n return `${lines.join(\"\\n\")} (Orizm docs v${version}).`;\n },\n });\n },\n});\n"],"mappings":"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"}
@@ -3,18 +3,22 @@ const require_shared = require('./shared-DHRPzzKl.cjs');
3
3
  const require_prompt = require('./prompt-C-XNDSNE.cjs');
4
4
  const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
5
5
  const require_table = require('./table-C74eOSh8.cjs');
6
- const require_config_loader = require('./config-loader-D8x32gEU.cjs');
6
+ const require_config_loader = require('./config-loader-CZfANHBf.cjs');
7
7
  let _praha_byethrow = require("@praha/byethrow");
8
8
 
9
9
  //#region src/cli/schema/change-events.ts
10
10
  function hasChanges(events) {
11
- return events.tableChangeEvents.length > 0 || events.bucketChangeEvents.length > 0 || events.authorityChangeEvents.length > 0;
11
+ return events.tableChangeEvents.length > 0 || events.bucketChangeEvents.length > 0 || events.authorityChangeEvents.length > 0 || semanticSearchChangeEventsOf(events).length > 0;
12
+ }
13
+ function semanticSearchChangeEventsOf(events) {
14
+ return events.semanticSearchChangeEvents ?? [];
12
15
  }
13
16
  function renderChangeEvents(events, color) {
14
17
  return [
15
18
  ...renderTableSections(events.tableChangeEvents, color),
16
19
  ...renderBucketSection(events.bucketChangeEvents, color),
17
- ...renderAuthoritySection(events.authorityChangeEvents, color)
20
+ ...renderAuthoritySection(events.authorityChangeEvents, color),
21
+ ...renderSemanticSearchSection(semanticSearchChangeEventsOf(events), color)
18
22
  ].join("\n\n");
19
23
  }
20
24
  function renderTableSections(tableChangeEvents, color) {
@@ -57,6 +61,13 @@ function renderAuthoritySection(authorityChangeEvents, color) {
57
61
  color: "green"
58
62
  })), color)}`];
59
63
  }
64
+ function renderSemanticSearchSection(semanticSearchChangeEvents, color) {
65
+ if (semanticSearchChangeEvents.length === 0) return [];
66
+ return [`⚫︎Semantic search\n${require_table.renderTable(["Type", "Event"], semanticSearchChangeEvents.map((event) => ({
67
+ cells: ["semanticSearch", event.event],
68
+ color: event.event === "semanticSearch:enable" ? "green" : "red"
69
+ })), color)}`];
70
+ }
60
71
  function tableEventRow(event) {
61
72
  switch (event.event) {
62
73
  case "table:create":
@@ -109,15 +120,16 @@ async function pushHandler(ctx, options) {
109
120
  body: { definition: loaded.value }
110
121
  }));
111
122
  if (_praha_byethrow.Result.isFailure(events)) return require_run_with_context.apiErrorFailure(events.error);
112
- if (!hasChanges(events.value)) return _praha_byethrow.Result.succeed({
123
+ const changed = hasChanges(events.value);
124
+ if (options.dryRun) return _praha_byethrow.Result.succeed({
113
125
  json: events.value,
114
- text: () => "No changes to apply."
126
+ text: () => changed ? renderChangeEvents(events.value, require_cli_main.getOutputState().color) : "No changes to apply."
115
127
  });
116
- if (options.dryRun) return _praha_byethrow.Result.succeed({
128
+ if (!changed && !options.force) return _praha_byethrow.Result.succeed({
117
129
  json: events.value,
118
- text: () => renderChangeEvents(events.value, require_cli_main.getOutputState().color)
130
+ text: () => "No changes to apply."
119
131
  });
120
- require_cli_main.notice(renderChangeEvents(events.value, require_cli_main.getOutputState().color));
132
+ require_cli_main.notice(changed ? renderChangeEvents(events.value, require_cli_main.getOutputState().color) : "No changes detected. Applying anyway (--force).");
121
133
  if (!options.yes) {
122
134
  if (process.stdin.isTTY !== true) return _praha_byethrow.Result.fail({ message: "Refusing to apply without confirmation in a non-interactive shell. Re-run with --yes." });
123
135
  if (!await require_prompt.confirm("Apply these changes?")) return _praha_byethrow.Result.succeed({
@@ -147,6 +159,11 @@ const pushArgs = {
147
159
  type: "boolean",
148
160
  description: "Apply without the confirmation prompt",
149
161
  default: false
162
+ },
163
+ force: {
164
+ type: "boolean",
165
+ description: "Apply even when no changes are detected (re-runs server-side reconciliation, e.g. semantic search indexes)",
166
+ default: false
150
167
  }
151
168
  };
152
169
  var push_default = require_cli_main.defineCommand({
@@ -158,10 +175,11 @@ var push_default = require_cli_main.defineCommand({
158
175
  run: ({ args }) => require_run_with_context.runWithContext(args, (ctx) => pushHandler(ctx, {
159
176
  configFile: args["config-file"] ?? "orizm.config.ts",
160
177
  dryRun: args["dry-run"] === true,
161
- yes: args.yes === true
178
+ yes: args.yes === true,
179
+ force: args.force === true
162
180
  }))
163
181
  });
164
182
 
165
183
  //#endregion
166
184
  exports.default = push_default;
167
- //# sourceMappingURL=push-9fPpd4U8.cjs.map
185
+ //# sourceMappingURL=push-BggkrD0g.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-BggkrD0g.cjs","names":["partial","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];\ntype SemanticSearchChangeEvent =\n ChangeEvents[\"semanticSearchChangeEvents\"][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 semanticSearchChangeEventsOf(events).length > 0\n );\n}\n\n// semanticSearchChangeEvents はこのフィールドを返さない旧サーバーに対しても落ちないよう、\n// 欠けていれば空として扱う(openapi-fetch は応答を実行時検証しない)\nfunction semanticSearchChangeEventsOf(\n events: ChangeEvents,\n): SemanticSearchChangeEvent[] {\n const partial: Partial<ChangeEvents> = events;\n return partial.semanticSearchChangeEvents ?? [];\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 ...renderSemanticSearchSection(semanticSearchChangeEventsOf(events), 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((event): TableRow => ({\n cells: [\"authority\", event.event, JSON.stringify(event.authorityDef)],\n color: \"green\",\n }));\n return [\n `⚫︎Authorities\\n${renderTable([\"Type\", \"Event\", \"Detail\"], rows, color)}`,\n ];\n}\n\n// 有効化は追加のみ、無効化はベクトルインデックス(埋め込み済みデータ)を消すので赤。\nfunction renderSemanticSearchSection(\n semanticSearchChangeEvents: SemanticSearchChangeEvent[],\n color: boolean,\n): string[] {\n if (semanticSearchChangeEvents.length === 0) return [];\n const rows = semanticSearchChangeEvents.map((event): TableRow => ({\n cells: [\"semanticSearch\", event.event],\n color: event.event === \"semanticSearch:enable\" ? \"green\" : \"red\",\n }));\n return [`⚫︎Semantic search\\n${renderTable([\"Type\", \"Event\"], rows, color)}`];\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 force: 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 const changed = hasChanges(events.value);\n // --dry-run は --force の影響を受けない(apply しないので「差分なし」の表示のまま)\n if (options.dryRun) {\n return Result.succeed({\n json: events.value,\n text: () =>\n changed\n ? renderChangeEvents(events.value, getOutputState().color)\n : \"No changes to apply.\",\n });\n }\n\n if (!changed && !options.force) {\n return Result.succeed({\n json: events.value,\n text: () => \"No changes to apply.\",\n });\n }\n\n // --force は差分の有無に関わらず定義を送る(サーバー側の突き合わせ処理を同じ定義で再実行させるため)\n notice(\n changed\n ? renderChangeEvents(events.value, getOutputState().color)\n : \"No changes detected. Applying anyway (--force).\",\n );\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 force: {\n type: \"boolean\",\n description:\n \"Apply even when no changes are detected (re-runs server-side reconciliation, e.g. semantic search indexes)\",\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 force: args.force === true,\n }),\n ),\n});\n"],"mappings":"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"}
@@ -3,18 +3,22 @@ import { n as configFileArg, r as contextArgs, t as DEFAULT_CONFIG_FILE } from "
3
3
  import { t as confirm } from "./prompt-Dr2Rkxun.mjs";
4
4
  import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
5
5
  import { t as renderTable } from "./table-MHEfbnWO.mjs";
6
- import { n as configLoadFailure, t as loadConfig } from "./config-loader-BEgS869e.mjs";
6
+ import { n as configLoadFailure, t as loadConfig } from "./config-loader-CtbZOGjc.mjs";
7
7
  import { Result } from "@praha/byethrow";
8
8
 
9
9
  //#region src/cli/schema/change-events.ts
10
10
  function hasChanges(events) {
11
- return events.tableChangeEvents.length > 0 || events.bucketChangeEvents.length > 0 || events.authorityChangeEvents.length > 0;
11
+ return events.tableChangeEvents.length > 0 || events.bucketChangeEvents.length > 0 || events.authorityChangeEvents.length > 0 || semanticSearchChangeEventsOf(events).length > 0;
12
+ }
13
+ function semanticSearchChangeEventsOf(events) {
14
+ return events.semanticSearchChangeEvents ?? [];
12
15
  }
13
16
  function renderChangeEvents(events, color) {
14
17
  return [
15
18
  ...renderTableSections(events.tableChangeEvents, color),
16
19
  ...renderBucketSection(events.bucketChangeEvents, color),
17
- ...renderAuthoritySection(events.authorityChangeEvents, color)
20
+ ...renderAuthoritySection(events.authorityChangeEvents, color),
21
+ ...renderSemanticSearchSection(semanticSearchChangeEventsOf(events), color)
18
22
  ].join("\n\n");
19
23
  }
20
24
  function renderTableSections(tableChangeEvents, color) {
@@ -57,6 +61,13 @@ function renderAuthoritySection(authorityChangeEvents, color) {
57
61
  color: "green"
58
62
  })), color)}`];
59
63
  }
64
+ function renderSemanticSearchSection(semanticSearchChangeEvents, color) {
65
+ if (semanticSearchChangeEvents.length === 0) return [];
66
+ return [`⚫︎Semantic search\n${renderTable(["Type", "Event"], semanticSearchChangeEvents.map((event) => ({
67
+ cells: ["semanticSearch", event.event],
68
+ color: event.event === "semanticSearch:enable" ? "green" : "red"
69
+ })), color)}`];
70
+ }
60
71
  function tableEventRow(event) {
61
72
  switch (event.event) {
62
73
  case "table:create":
@@ -109,15 +120,16 @@ async function pushHandler(ctx, options) {
109
120
  body: { definition: loaded.value }
110
121
  }));
111
122
  if (Result.isFailure(events)) return apiErrorFailure(events.error);
112
- if (!hasChanges(events.value)) return Result.succeed({
123
+ const changed = hasChanges(events.value);
124
+ if (options.dryRun) return Result.succeed({
113
125
  json: events.value,
114
- text: () => "No changes to apply."
126
+ text: () => changed ? renderChangeEvents(events.value, getOutputState().color) : "No changes to apply."
115
127
  });
116
- if (options.dryRun) return Result.succeed({
128
+ if (!changed && !options.force) return Result.succeed({
117
129
  json: events.value,
118
- text: () => renderChangeEvents(events.value, getOutputState().color)
130
+ text: () => "No changes to apply."
119
131
  });
120
- notice(renderChangeEvents(events.value, getOutputState().color));
132
+ notice(changed ? renderChangeEvents(events.value, getOutputState().color) : "No changes detected. Applying anyway (--force).");
121
133
  if (!options.yes) {
122
134
  if (process.stdin.isTTY !== true) return Result.fail({ message: "Refusing to apply without confirmation in a non-interactive shell. Re-run with --yes." });
123
135
  if (!await confirm("Apply these changes?")) return Result.succeed({
@@ -147,6 +159,11 @@ const pushArgs = {
147
159
  type: "boolean",
148
160
  description: "Apply without the confirmation prompt",
149
161
  default: false
162
+ },
163
+ force: {
164
+ type: "boolean",
165
+ description: "Apply even when no changes are detected (re-runs server-side reconciliation, e.g. semantic search indexes)",
166
+ default: false
150
167
  }
151
168
  };
152
169
  var push_default = defineCommand({
@@ -158,10 +175,11 @@ var push_default = defineCommand({
158
175
  run: ({ args }) => runWithContext(args, (ctx) => pushHandler(ctx, {
159
176
  configFile: args["config-file"] ?? "orizm.config.ts",
160
177
  dryRun: args["dry-run"] === true,
161
- yes: args.yes === true
178
+ yes: args.yes === true,
179
+ force: args.force === true
162
180
  }))
163
181
  });
164
182
 
165
183
  //#endregion
166
184
  export { push_default as default };
167
- //# sourceMappingURL=push-54rmb0T0.mjs.map
185
+ //# sourceMappingURL=push-xWnD9oov.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-xWnD9oov.mjs","names":["partial"],"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];\ntype SemanticSearchChangeEvent =\n ChangeEvents[\"semanticSearchChangeEvents\"][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 semanticSearchChangeEventsOf(events).length > 0\n );\n}\n\n// semanticSearchChangeEvents はこのフィールドを返さない旧サーバーに対しても落ちないよう、\n// 欠けていれば空として扱う(openapi-fetch は応答を実行時検証しない)\nfunction semanticSearchChangeEventsOf(\n events: ChangeEvents,\n): SemanticSearchChangeEvent[] {\n const partial: Partial<ChangeEvents> = events;\n return partial.semanticSearchChangeEvents ?? [];\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 ...renderSemanticSearchSection(semanticSearchChangeEventsOf(events), 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((event): TableRow => ({\n cells: [\"authority\", event.event, JSON.stringify(event.authorityDef)],\n color: \"green\",\n }));\n return [\n `⚫︎Authorities\\n${renderTable([\"Type\", \"Event\", \"Detail\"], rows, color)}`,\n ];\n}\n\n// 有効化は追加のみ、無効化はベクトルインデックス(埋め込み済みデータ)を消すので赤。\nfunction renderSemanticSearchSection(\n semanticSearchChangeEvents: SemanticSearchChangeEvent[],\n color: boolean,\n): string[] {\n if (semanticSearchChangeEvents.length === 0) return [];\n const rows = semanticSearchChangeEvents.map((event): TableRow => ({\n cells: [\"semanticSearch\", event.event],\n color: event.event === \"semanticSearch:enable\" ? \"green\" : \"red\",\n }));\n return [`⚫︎Semantic search\\n${renderTable([\"Type\", \"Event\"], rows, color)}`];\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 force: 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 const changed = hasChanges(events.value);\n // --dry-run は --force の影響を受けない(apply しないので「差分なし」の表示のまま)\n if (options.dryRun) {\n return Result.succeed({\n json: events.value,\n text: () =>\n changed\n ? renderChangeEvents(events.value, getOutputState().color)\n : \"No changes to apply.\",\n });\n }\n\n if (!changed && !options.force) {\n return Result.succeed({\n json: events.value,\n text: () => \"No changes to apply.\",\n });\n }\n\n // --force は差分の有無に関わらず定義を送る(サーバー側の突き合わせ処理を同じ定義で再実行させるため)\n notice(\n changed\n ? renderChangeEvents(events.value, getOutputState().color)\n : \"No changes detected. Applying anyway (--force).\",\n );\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 force: {\n type: \"boolean\",\n description:\n \"Apply even when no changes are detected (re-runs server-side reconciliation, e.g. semantic search indexes)\",\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 force: args.force === true,\n }),\n ),\n});\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
3
- const require_config_loader = require('./config-loader-D8x32gEU.cjs');
3
+ const require_config_loader = require('./config-loader-CZfANHBf.cjs');
4
4
  let _praha_byethrow = require("@praha/byethrow");
5
5
  let valibot = require("valibot");
6
6
  valibot = require_cli_main.__toESM(valibot, 1);
@@ -269,4 +269,4 @@ Object.defineProperty(exports, 'toCodeTypeName', {
269
269
  return toCodeTypeName;
270
270
  }
271
271
  });
272
- //# sourceMappingURL=run-codegen-mclysZuT.cjs.map
272
+ //# sourceMappingURL=run-codegen-B-90rvjk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-codegen-B-90rvjk.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 を取得し、valibot 検証を通して codegen 入力\n// (CommonOrizmConfig)に揃える。raw(JSON) を正本にすることで型キャストを避ける。\n// ここは保存済み定義の「読み取り」なので、authoring 用の OrizmConfigInputDef ではなく\n// OrizmConfigDef を使う — 予約名(例: `_semantic`)を後から追加しても、その名前を\n// 予約前から使っているプロジェクトの pull / codegen を壊さないため。\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,6 +1,6 @@
1
1
  import { n as formatValibotIssues, r as getOutputState } from "./cli/main.mjs";
2
2
  import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
3
- import { n as configLoadFailure, t as loadConfig } from "./config-loader-BEgS869e.mjs";
3
+ import { n as configLoadFailure, t as loadConfig } from "./config-loader-CtbZOGjc.mjs";
4
4
  import { Result } from "@praha/byethrow";
5
5
  import * as v from "valibot";
6
6
  import path from "node:path";
@@ -187,4 +187,4 @@ function pullFailure(error) {
187
187
 
188
188
  //#endregion
189
189
  export { renderModuleDescriptorBlock as a, renderSection as c, renderWebhookTypesSection as d, toCodeTypeName as f, renderColumnField as i, renderTypeBlock as l, AUTOGEN_HEADER as n, renderModuleRowTypeBlock as o, formatTsWithPrettier as p, UTILITIES as r, renderRefsFieldLines as s, runCodegen as t, renderUniqueFieldLines as u };
190
- //# sourceMappingURL=run-codegen-DjnV60bE.mjs.map
190
+ //# sourceMappingURL=run-codegen-CrO08jJT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-codegen-CrO08jJT.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 を取得し、valibot 検証を通して codegen 入力\n// (CommonOrizmConfig)に揃える。raw(JSON) を正本にすることで型キャストを避ける。\n// ここは保存済み定義の「読み取り」なので、authoring 用の OrizmConfigInputDef ではなく\n// OrizmConfigDef を使う — 予約名(例: `_semantic`)を後から追加しても、その名前を\n// 予約前から使っているプロジェクトの pull / codegen を壊さないため。\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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"}
@@ -7,14 +7,14 @@ var schema_default = require_cli_main.defineCommand({
7
7
  description: "Work with orizm.config.ts schema definitions"
8
8
  },
9
9
  subCommands: {
10
- push: () => Promise.resolve().then(() => require("./push-9fPpd4U8.cjs")).then((m) => m.default),
10
+ push: () => Promise.resolve().then(() => require("./push-BggkrD0g.cjs")).then((m) => m.default),
11
11
  list: () => Promise.resolve().then(() => require("./list-E1sjTZLe.cjs")).then((m) => m.default),
12
12
  get: () => Promise.resolve().then(() => require("./get-CdDZkUXV.cjs")).then((m) => m.default),
13
- validate: () => Promise.resolve().then(() => require("./validate-BpxZ8LTl.cjs")).then((m) => m.default),
14
- erd: () => Promise.resolve().then(() => require("./erd-ByuVMQ5n.cjs")).then((m) => m.default)
13
+ validate: () => Promise.resolve().then(() => require("./validate-BH8jqdqq.cjs")).then((m) => m.default),
14
+ erd: () => Promise.resolve().then(() => require("./erd-DmnB1v2c.cjs")).then((m) => m.default)
15
15
  }
16
16
  });
17
17
 
18
18
  //#endregion
19
19
  exports.default = schema_default;
20
- //# sourceMappingURL=schema-CNSTXsVa.cjs.map
20
+ //# sourceMappingURL=schema-CUVTXrHk.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-CNSTXsVa.cjs","names":["defineCommand"],"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,qBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,qDAAgB,4BAAwB,MAAM,MAAM,EAAE,OAAO;EAC7D,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;CACrD;AACF,CAAC"}
1
+ {"version":3,"file":"schema-CUVTXrHk.cjs","names":["defineCommand"],"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,qBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,qDAAgB,4BAAwB,MAAM,MAAM,EAAE,OAAO;EAC7D,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;CACrD;AACF,CAAC"}