@refrainai/cli 0.4.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 (69) hide show
  1. package/dist/ai-model-FM6GWCID.js +37 -0
  2. package/dist/ai-model-FM6GWCID.js.map +1 -0
  3. package/dist/chunk-2BVDAJZT.js +236 -0
  4. package/dist/chunk-2BVDAJZT.js.map +1 -0
  5. package/dist/chunk-2H7UOFLK.js +11 -0
  6. package/dist/chunk-2H7UOFLK.js.map +1 -0
  7. package/dist/chunk-7UCVPKD4.js +902 -0
  8. package/dist/chunk-7UCVPKD4.js.map +1 -0
  9. package/dist/chunk-AG3CFMYU.js +36 -0
  10. package/dist/chunk-AG3CFMYU.js.map +1 -0
  11. package/dist/chunk-CLYJHKPY.js +1131 -0
  12. package/dist/chunk-CLYJHKPY.js.map +1 -0
  13. package/dist/chunk-D5SI2PHK.js +74 -0
  14. package/dist/chunk-D5SI2PHK.js.map +1 -0
  15. package/dist/chunk-DJVUITRB.js +9084 -0
  16. package/dist/chunk-DJVUITRB.js.map +1 -0
  17. package/dist/chunk-H47NWH7N.js +4427 -0
  18. package/dist/chunk-H47NWH7N.js.map +1 -0
  19. package/dist/chunk-HQDXLWAY.js +109 -0
  20. package/dist/chunk-HQDXLWAY.js.map +1 -0
  21. package/dist/chunk-IGFCYKHC.js +1974 -0
  22. package/dist/chunk-IGFCYKHC.js.map +1 -0
  23. package/dist/chunk-RT664YIO.js +245 -0
  24. package/dist/chunk-RT664YIO.js.map +1 -0
  25. package/dist/chunk-RYIJPYM3.js +164 -0
  26. package/dist/chunk-RYIJPYM3.js.map +1 -0
  27. package/dist/chunk-TDSM3UXI.js +40 -0
  28. package/dist/chunk-TDSM3UXI.js.map +1 -0
  29. package/dist/chunk-UGPXCQY3.js +778 -0
  30. package/dist/chunk-UGPXCQY3.js.map +1 -0
  31. package/dist/chunk-VPK2MQAZ.js +589 -0
  32. package/dist/chunk-VPK2MQAZ.js.map +1 -0
  33. package/dist/chunk-WEYR56ZN.js +953 -0
  34. package/dist/chunk-WEYR56ZN.js.map +1 -0
  35. package/dist/chunk-XMFCXPYU.js +275 -0
  36. package/dist/chunk-XMFCXPYU.js.map +1 -0
  37. package/dist/chunk-Z33FCOTZ.js +251 -0
  38. package/dist/chunk-Z33FCOTZ.js.map +1 -0
  39. package/dist/cli.js +59 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/compose-MTSIJY5D.js +547 -0
  42. package/dist/compose-MTSIJY5D.js.map +1 -0
  43. package/dist/config-ZSUNCFXR.js +9 -0
  44. package/dist/config-ZSUNCFXR.js.map +1 -0
  45. package/dist/fix-runbook-ZSBOTLC2.js +294 -0
  46. package/dist/fix-runbook-ZSBOTLC2.js.map +1 -0
  47. package/dist/google-sheets-DRWIVEVC.js +482 -0
  48. package/dist/google-sheets-DRWIVEVC.js.map +1 -0
  49. package/dist/registry-LZLYTNDJ.js +17 -0
  50. package/dist/registry-LZLYTNDJ.js.map +1 -0
  51. package/dist/runbook-data-helpers-KRR2SH76.js +16 -0
  52. package/dist/runbook-data-helpers-KRR2SH76.js.map +1 -0
  53. package/dist/runbook-executor-K7T6RJWJ.js +1480 -0
  54. package/dist/runbook-executor-K7T6RJWJ.js.map +1 -0
  55. package/dist/runbook-generator-MPXJBQ5N.js +800 -0
  56. package/dist/runbook-generator-MPXJBQ5N.js.map +1 -0
  57. package/dist/runbook-schema-3T6TP3JJ.js +35 -0
  58. package/dist/runbook-schema-3T6TP3JJ.js.map +1 -0
  59. package/dist/runbook-store-G5GUOWRR.js +11 -0
  60. package/dist/runbook-store-G5GUOWRR.js.map +1 -0
  61. package/dist/schema-5G6UQSPT.js +91 -0
  62. package/dist/schema-5G6UQSPT.js.map +1 -0
  63. package/dist/server-AG3LXQBI.js +8778 -0
  64. package/dist/server-AG3LXQBI.js.map +1 -0
  65. package/dist/tenant-ai-config-QPFEJUVJ.js +14 -0
  66. package/dist/tenant-ai-config-QPFEJUVJ.js.map +1 -0
  67. package/dist/yaml-patcher-VGUS2JGH.js +15 -0
  68. package/dist/yaml-patcher-VGUS2JGH.js.map +1 -0
  69. package/package.json +37 -0
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ jobs,
4
+ runbookSecrets,
5
+ runbookSettings,
6
+ runbookSteps,
7
+ runbookVariables
8
+ } from "./chunk-CLYJHKPY.js";
9
+
10
+ // src/server/store/runbook-data-helpers.ts
11
+ import { eq } from "drizzle-orm";
12
+
13
+ // src/server/store/version-lifecycle.ts
14
+ function isEditable(status) {
15
+ return status === "draft" || status === "pending_verification";
16
+ }
17
+ function isDeletable(status) {
18
+ return status === "draft" || status === "pending_verification";
19
+ }
20
+ function isVerifiable(status) {
21
+ return status === "pending_verification";
22
+ }
23
+ function resolveDisplayStatus(status, verificationJobId, verificationJobStatus) {
24
+ if (status === "disabled") return "disabled";
25
+ if (status === "pending_verification") {
26
+ if (verificationJobId && verificationJobStatus === "completed") return "readyToActivate";
27
+ if (verificationJobId && verificationJobStatus && !["completed", "failed", "cancelled"].includes(verificationJobStatus)) return "verifying";
28
+ return "pendingVerification";
29
+ }
30
+ if (status === "pending_approval") return "pendingApproval";
31
+ if (status === "active") return "active";
32
+ if (status === "archived") return "archived";
33
+ return "draft";
34
+ }
35
+
36
+ // src/server/store/runbook-data-helpers.ts
37
+ async function copyVersionData(tx, sourceVersionId, targetVersionId, options) {
38
+ const srcSettings = await tx.query.runbookSettings.findFirst({
39
+ where: eq(runbookSettings.versionId, sourceVersionId)
40
+ });
41
+ if (srcSettings) {
42
+ await tx.insert(runbookSettings).values({
43
+ versionId: targetVersionId,
44
+ defaultTimeout: srcSettings.defaultTimeout,
45
+ pauseBetweenSteps: srcSettings.pauseBetweenSteps,
46
+ stopOnError: srcSettings.stopOnError,
47
+ stepDelay: srcSettings.stepDelay,
48
+ enableSelectorCache: srcSettings.enableSelectorCache,
49
+ enableAgentFallback: srcSettings.enableAgentFallback,
50
+ enableVisionFallback: srcSettings.enableVisionFallback,
51
+ modelId: srcSettings.modelId,
52
+ modelProvider: srcSettings.modelProvider
53
+ });
54
+ }
55
+ const srcVars = await tx.query.runbookVariables.findMany({
56
+ where: eq(runbookVariables.versionId, sourceVersionId)
57
+ });
58
+ if (srcVars.length > 0) {
59
+ await tx.insert(runbookVariables).values(
60
+ srcVars.map((v) => ({
61
+ versionId: targetVersionId,
62
+ name: v.name,
63
+ source: v.source,
64
+ description: v.description,
65
+ required: v.required,
66
+ sensitive: v.sensitive,
67
+ value: v.value
68
+ }))
69
+ );
70
+ }
71
+ const srcSecrets = await tx.query.runbookSecrets.findMany({
72
+ where: eq(runbookSecrets.versionId, sourceVersionId)
73
+ });
74
+ if (srcSecrets.length > 0) {
75
+ await tx.insert(runbookSecrets).values(
76
+ srcSecrets.map((s) => ({
77
+ versionId: targetVersionId,
78
+ key: s.key,
79
+ encryptedValue: s.encryptedValue
80
+ }))
81
+ );
82
+ }
83
+ if (options?.skipSteps) return;
84
+ const srcSteps = await tx.query.runbookSteps.findMany({
85
+ where: eq(runbookSteps.versionId, sourceVersionId),
86
+ orderBy: [runbookSteps.ordinal]
87
+ });
88
+ if (srcSteps.length > 0) {
89
+ const idMap = /* @__PURE__ */ new Map();
90
+ for (const s of srcSteps) {
91
+ const [newStep] = await tx.insert(runbookSteps).values({
92
+ versionId: targetVersionId,
93
+ parentStepId: s.parentStepId ? idMap.get(s.parentStepId) ?? null : null,
94
+ ordinal: s.ordinal,
95
+ description: s.description,
96
+ actionType: s.actionType,
97
+ url: s.url,
98
+ riskLevel: s.riskLevel,
99
+ requiresConfirmation: s.requiresConfirmation,
100
+ value: s.value,
101
+ optionText: s.optionText,
102
+ script: s.script,
103
+ keys: s.keys,
104
+ downloadPath: s.downloadPath,
105
+ exportCollection: s.exportCollection,
106
+ exportFormat: s.exportFormat,
107
+ exportPath: s.exportPath,
108
+ selector: s.selector,
109
+ condition: s.condition,
110
+ captures: s.captures,
111
+ memoryOperations: s.memoryOperations,
112
+ loopCondition: s.loopCondition,
113
+ loopForEach: s.loopForEach,
114
+ loopItemVariable: s.loopItemVariable,
115
+ loopIndexVariable: s.loopIndexVariable,
116
+ loopMaxIterations: s.loopMaxIterations,
117
+ loopCounterVariable: s.loopCounterVariable,
118
+ branchValue: s.branchValue,
119
+ branchCaseMatch: s.branchCaseMatch,
120
+ branchIsDefault: s.branchIsDefault
121
+ }).returning();
122
+ idMap.set(s.id, newStep.id);
123
+ }
124
+ }
125
+ }
126
+ async function insertSteps(tx, versionId, steps, parentStepId, branchCaseMatch, branchIsDefault) {
127
+ for (const step of steps) {
128
+ const [inserted] = await tx.insert(runbookSteps).values({
129
+ versionId,
130
+ parentStepId,
131
+ ordinal: step.ordinal,
132
+ description: step.description,
133
+ actionType: step.action.type,
134
+ url: step.url || null,
135
+ riskLevel: step.riskLevel,
136
+ requiresConfirmation: step.requiresConfirmation,
137
+ value: step.action.value ?? null,
138
+ optionText: step.action.optionText ?? null,
139
+ script: step.action.script ?? null,
140
+ keys: step.action.keys ?? null,
141
+ downloadPath: step.action.downloadPath ?? null,
142
+ exportCollection: step.action.exportCollection ?? null,
143
+ exportFormat: step.action.exportFormat ?? null,
144
+ exportPath: step.action.exportPath ?? null,
145
+ selector: step.action.selector ?? null,
146
+ condition: step.condition ?? null,
147
+ captures: step.captures ?? null,
148
+ memoryOperations: step.memoryOperations ?? null,
149
+ loopCondition: step.loop?.condition ?? null,
150
+ loopForEach: step.loop?.forEach ?? null,
151
+ loopItemVariable: step.loop?.itemVariable ?? null,
152
+ loopIndexVariable: step.loop?.indexVariable ?? null,
153
+ loopMaxIterations: step.loop?.maxIterations ?? null,
154
+ loopCounterVariable: step.loop?.counterVariable ?? null,
155
+ branchValue: step.branches?.value ?? null,
156
+ branchCaseMatch: branchCaseMatch ?? null,
157
+ branchIsDefault: branchIsDefault ?? false
158
+ }).returning();
159
+ if (step.steps && step.steps.length > 0) {
160
+ await insertSteps(tx, versionId, step.steps, inserted.id);
161
+ }
162
+ if (step.branches) {
163
+ for (const branchCase of step.branches.cases) {
164
+ await insertSteps(
165
+ tx,
166
+ versionId,
167
+ branchCase.steps,
168
+ inserted.id,
169
+ branchCase.match
170
+ );
171
+ }
172
+ if (step.branches.default) {
173
+ await insertSteps(
174
+ tx,
175
+ versionId,
176
+ step.branches.default.steps,
177
+ inserted.id,
178
+ void 0,
179
+ true
180
+ );
181
+ }
182
+ }
183
+ }
184
+ }
185
+ async function loadVersionDetail(db, versionId) {
186
+ const [settingsRow, variables, secretRows, steps] = await Promise.all([
187
+ db.query.runbookSettings.findFirst({
188
+ where: eq(runbookSettings.versionId, versionId)
189
+ }),
190
+ db.query.runbookVariables.findMany({
191
+ where: eq(runbookVariables.versionId, versionId)
192
+ }),
193
+ db.query.runbookSecrets.findMany({
194
+ where: eq(runbookSecrets.versionId, versionId)
195
+ }),
196
+ db.query.runbookSteps.findMany({
197
+ where: eq(runbookSteps.versionId, versionId),
198
+ orderBy: [runbookSteps.ordinal]
199
+ })
200
+ ]);
201
+ return {
202
+ settings: settingsRow ?? null,
203
+ variables,
204
+ secrets: secretRows,
205
+ steps
206
+ };
207
+ }
208
+ async function buildFlatRunbook(db, rb, ver) {
209
+ const detail = await loadVersionDetail(db, ver.id);
210
+ let verificationJobStatus = null;
211
+ if (ver.verificationJobId) {
212
+ const [job] = await db.select({ status: jobs.status }).from(jobs).where(eq(jobs.id, ver.verificationJobId));
213
+ verificationJobStatus = job?.status ?? null;
214
+ }
215
+ const status = rb.disabled ? "disabled" : ver.status === "active" ? "active" : ver.status === "pending_verification" ? "pending_verification" : ver.status === "pending_approval" ? "pending_verification" : "draft";
216
+ return {
217
+ ...rb,
218
+ // フラット構造互換フィールド(バージョンからコピー)
219
+ goal: ver.goal,
220
+ startUrl: ver.startUrl,
221
+ context: ver.context,
222
+ generatedAt: ver.generatedAt,
223
+ status,
224
+ verificationJobId: ver.verificationJobId,
225
+ verificationJobStatus,
226
+ displayStatus: resolveDisplayStatus(
227
+ rb.disabled ? "disabled" : ver.status,
228
+ ver.verificationJobId,
229
+ verificationJobStatus
230
+ ),
231
+ // 子データ
232
+ ...detail,
233
+ // バージョン情報
234
+ activeVersionId: rb.activeVersionId,
235
+ currentVersionId: ver.id,
236
+ versionNumber: ver.versionNumber,
237
+ versionStatus: ver.status
238
+ };
239
+ }
240
+
241
+ export {
242
+ isEditable,
243
+ isDeletable,
244
+ isVerifiable,
245
+ resolveDisplayStatus,
246
+ copyVersionData,
247
+ insertSteps,
248
+ loadVersionDetail,
249
+ buildFlatRunbook
250
+ };
251
+ //# sourceMappingURL=chunk-Z33FCOTZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/store/runbook-data-helpers.ts","../../../src/server/store/version-lifecycle.ts"],"sourcesContent":["/**\n * Runbook データ操作の純粋ヘルパー関数\n *\n * RunbookStore / VersionStore の private メソッドを抽出したもの。\n * DB トランザクション内で使用する。\n */\n\nimport { eq } from \"drizzle-orm\";\nimport {\n runbookSettings,\n runbookVariables,\n runbookSecrets,\n runbookSteps,\n jobs,\n} from \"../db/schema.js\";\nimport type { getDb } from \"../db/client.js\";\nimport type { ParsedStep } from \"../../runbook-executor/types.js\";\nimport { resolveDisplayStatus } from \"./version-lifecycle.js\";\n\ntype Db = ReturnType<typeof getDb>;\ntype Tx = Parameters<Parameters<Db[\"transaction\"]>[0]>[0];\n\n/**\n * バージョンデータ(settings, variables, secrets, steps)をコピーする。\n */\nexport async function copyVersionData(\n tx: Tx,\n sourceVersionId: string,\n targetVersionId: string,\n options?: { skipSteps?: boolean },\n) {\n // Settings\n const srcSettings = await tx.query.runbookSettings.findFirst({\n where: eq(runbookSettings.versionId, sourceVersionId),\n });\n if (srcSettings) {\n await tx.insert(runbookSettings).values({\n versionId: targetVersionId,\n defaultTimeout: srcSettings.defaultTimeout,\n pauseBetweenSteps: srcSettings.pauseBetweenSteps,\n stopOnError: srcSettings.stopOnError,\n stepDelay: srcSettings.stepDelay,\n enableSelectorCache: srcSettings.enableSelectorCache,\n enableAgentFallback: srcSettings.enableAgentFallback,\n enableVisionFallback: srcSettings.enableVisionFallback,\n modelId: srcSettings.modelId,\n modelProvider: srcSettings.modelProvider,\n });\n }\n\n // Variables\n const srcVars = await tx.query.runbookVariables.findMany({\n where: eq(runbookVariables.versionId, sourceVersionId),\n });\n if (srcVars.length > 0) {\n await tx.insert(runbookVariables).values(\n srcVars.map((v) => ({\n versionId: targetVersionId,\n name: v.name,\n source: v.source,\n description: v.description,\n required: v.required,\n sensitive: v.sensitive,\n value: v.value,\n })),\n );\n }\n\n // Secrets\n const srcSecrets = await tx.query.runbookSecrets.findMany({\n where: eq(runbookSecrets.versionId, sourceVersionId),\n });\n if (srcSecrets.length > 0) {\n await tx.insert(runbookSecrets).values(\n srcSecrets.map((s) => ({\n versionId: targetVersionId,\n key: s.key,\n encryptedValue: s.encryptedValue,\n })),\n );\n }\n\n // Steps(skipSteps 時はスキップ — 新バージョンでは AI が再生成する)\n if (options?.skipSteps) return;\n\n // Steps(再帰構造をコピー)\n const srcSteps = await tx.query.runbookSteps.findMany({\n where: eq(runbookSteps.versionId, sourceVersionId),\n orderBy: [runbookSteps.ordinal],\n });\n if (srcSteps.length > 0) {\n // ID マッピングを構築\n const idMap = new Map<string, string>();\n for (const s of srcSteps) {\n const [newStep] = await tx.insert(runbookSteps).values({\n versionId: targetVersionId,\n parentStepId: s.parentStepId ? idMap.get(s.parentStepId) ?? null : null,\n ordinal: s.ordinal,\n description: s.description,\n actionType: s.actionType,\n url: s.url,\n riskLevel: s.riskLevel,\n requiresConfirmation: s.requiresConfirmation,\n value: s.value,\n optionText: s.optionText,\n script: s.script,\n keys: s.keys,\n downloadPath: s.downloadPath,\n exportCollection: s.exportCollection,\n exportFormat: s.exportFormat,\n exportPath: s.exportPath,\n selector: s.selector,\n condition: s.condition,\n captures: s.captures,\n memoryOperations: s.memoryOperations,\n loopCondition: s.loopCondition,\n loopForEach: s.loopForEach,\n loopItemVariable: s.loopItemVariable,\n loopIndexVariable: s.loopIndexVariable,\n loopMaxIterations: s.loopMaxIterations,\n loopCounterVariable: s.loopCounterVariable,\n branchValue: s.branchValue,\n branchCaseMatch: s.branchCaseMatch,\n branchIsDefault: s.branchIsDefault,\n }).returning();\n idMap.set(s.id, newStep.id);\n }\n }\n}\n\n/**\n * ステップツリーを再帰的に DB に挿入する。\n */\nexport async function insertSteps(\n tx: Tx,\n versionId: string,\n steps: ParsedStep[],\n parentStepId: string | null,\n branchCaseMatch?: string,\n branchIsDefault?: boolean,\n) {\n for (const step of steps) {\n const [inserted] = await tx\n .insert(runbookSteps)\n .values({\n versionId,\n parentStepId,\n ordinal: step.ordinal,\n description: step.description,\n actionType: step.action.type,\n url: step.url || null,\n riskLevel: step.riskLevel,\n requiresConfirmation: step.requiresConfirmation,\n value: step.action.value ?? null,\n optionText: step.action.optionText ?? null,\n script: step.action.script ?? null,\n keys: step.action.keys ?? null,\n downloadPath: step.action.downloadPath ?? null,\n exportCollection: step.action.exportCollection ?? null,\n exportFormat: step.action.exportFormat ?? null,\n exportPath: step.action.exportPath ?? null,\n selector: step.action.selector ?? null,\n condition: step.condition ?? null,\n captures: step.captures ?? null,\n memoryOperations: step.memoryOperations ?? null,\n loopCondition: step.loop?.condition ?? null,\n loopForEach: step.loop?.forEach ?? null,\n loopItemVariable: step.loop?.itemVariable ?? null,\n loopIndexVariable: step.loop?.indexVariable ?? null,\n loopMaxIterations: step.loop?.maxIterations ?? null,\n loopCounterVariable: step.loop?.counterVariable ?? null,\n branchValue: step.branches?.value ?? null,\n branchCaseMatch: branchCaseMatch ?? null,\n branchIsDefault: branchIsDefault ?? false,\n })\n .returning();\n\n // サブステップ (loop)\n if (step.steps && step.steps.length > 0) {\n await insertSteps(tx, versionId, step.steps, inserted.id);\n }\n\n // ブランチ (cases + default)\n if (step.branches) {\n for (const branchCase of step.branches.cases) {\n await insertSteps(\n tx,\n versionId,\n branchCase.steps,\n inserted.id,\n branchCase.match,\n );\n }\n if (step.branches.default) {\n await insertSteps(\n tx,\n versionId,\n step.branches.default.steps,\n inserted.id,\n undefined,\n true,\n );\n }\n }\n }\n}\n\n/**\n * バージョン詳細(settings, variables, secrets, steps)を読み込む。\n */\nexport async function loadVersionDetail(db: Db, versionId: string) {\n const [settingsRow, variables, secretRows, steps] = await Promise.all([\n db.query.runbookSettings.findFirst({\n where: eq(runbookSettings.versionId, versionId),\n }),\n db.query.runbookVariables.findMany({\n where: eq(runbookVariables.versionId, versionId),\n }),\n db.query.runbookSecrets.findMany({\n where: eq(runbookSecrets.versionId, versionId),\n }),\n db.query.runbookSteps.findMany({\n where: eq(runbookSteps.versionId, versionId),\n orderBy: [runbookSteps.ordinal],\n }),\n ]);\n\n return {\n settings: settingsRow ?? null,\n variables,\n secrets: secretRows,\n steps,\n };\n}\n\n/**\n * DB のバージョン + 子テーブルからフラット構造を構築する(旧 API 互換)。\n */\nexport async function buildFlatRunbook(\n db: Db,\n rb: { id: string; title: string; disabled: boolean; activeVersionId: string | null; createdAt: Date; updatedAt: Date; tenantId: string; createdBy: string | null },\n ver: { id: string; status: string; goal: string; startUrl: string | null; context: string | null; generatedAt: string | null; verificationJobId: string | null; versionNumber: number },\n) {\n const detail = await loadVersionDetail(db, ver.id);\n\n // 検証ジョブのステータスを取得\n let verificationJobStatus: string | null = null;\n if (ver.verificationJobId) {\n const [job] = await db.select({ status: jobs.status }).from(jobs).where(eq(jobs.id, ver.verificationJobId));\n verificationJobStatus = job?.status ?? null;\n }\n\n // ステータスの計算: disabled フラグが true なら \"disabled\"、それ以外はバージョンステータス\n const status = rb.disabled\n ? \"disabled\" as const\n : ver.status === \"active\"\n ? \"active\" as const\n : ver.status === \"pending_verification\"\n ? \"pending_verification\" as const\n : ver.status === \"pending_approval\"\n ? \"pending_verification\" as const // 旧 API 互換\n : \"draft\" as const;\n\n return {\n ...rb,\n // フラット構造互換フィールド(バージョンからコピー)\n goal: ver.goal,\n startUrl: ver.startUrl,\n context: ver.context,\n generatedAt: ver.generatedAt,\n status,\n verificationJobId: ver.verificationJobId,\n verificationJobStatus,\n displayStatus: resolveDisplayStatus(\n rb.disabled ? \"disabled\" : ver.status,\n ver.verificationJobId,\n verificationJobStatus,\n ),\n // 子データ\n ...detail,\n // バージョン情報\n activeVersionId: rb.activeVersionId,\n currentVersionId: ver.id,\n versionNumber: ver.versionNumber,\n versionStatus: ver.status,\n };\n}\n","/**\n * バージョン状態遷移マシン\n *\n * 全てのバージョンステータス遷移ルールを一元管理する。\n * store/handler はここを参照して遷移の妥当性を検証する。\n */\n\nexport type VersionStatus = \"draft\" | \"pending_verification\" | \"pending_approval\" | \"active\" | \"archived\";\n\n/** 許可された状態遷移マップ */\nconst TRANSITIONS: Record<VersionStatus, VersionStatus[]> = {\n draft: [\"pending_verification\"],\n pending_verification: [\"pending_approval\", \"active\"],\n pending_approval: [\"pending_verification\", \"active\"],\n active: [\"archived\"],\n archived: [\"active\"],\n};\n\n/** 遷移が許可されているか */\nexport function canTransition(from: VersionStatus, to: VersionStatus): boolean {\n return TRANSITIONS[from]?.includes(to) ?? false;\n}\n\n/** 遷移を検証し、不正な場合は例外を投げる */\nexport function assertTransition(from: VersionStatus, to: VersionStatus): void {\n if (!canTransition(from, to)) {\n throw new Error(`Invalid transition: ${from} → ${to}`);\n }\n}\n\n/** 編集可能なステータスか(draft | pending_verification) */\nexport function isEditable(status: VersionStatus): boolean {\n return status === \"draft\" || status === \"pending_verification\";\n}\n\n/** 削除可能なステータスか(draft | pending_verification) */\nexport function isDeletable(status: VersionStatus): boolean {\n return status === \"draft\" || status === \"pending_verification\";\n}\n\n/** 検証可能なステータスか(pending_verification) */\nexport function isVerifiable(status: VersionStatus): boolean {\n return status === \"pending_verification\";\n}\n\n// ── 表示ステータス ──\n\nexport type DisplayStatus =\n | \"draft\"\n | \"pendingVerification\"\n | \"verifying\"\n | \"readyToActivate\"\n | \"pendingApproval\"\n | \"active\"\n | \"archived\"\n | \"disabled\";\n\n/**\n * DB ステータス + 検証ジョブ状態から表示用ステータスを解決する。\n * サーバーで計算して返し、フロントエンドはそのまま使う。\n */\nexport function resolveDisplayStatus(\n status: string,\n verificationJobId: string | null,\n verificationJobStatus: string | null,\n): DisplayStatus {\n if (status === \"disabled\") return \"disabled\";\n if (status === \"pending_verification\") {\n if (verificationJobId && verificationJobStatus === \"completed\") return \"readyToActivate\";\n if (\n verificationJobId &&\n verificationJobStatus &&\n ![\"completed\", \"failed\", \"cancelled\"].includes(verificationJobStatus)\n ) return \"verifying\";\n return \"pendingVerification\";\n }\n if (status === \"pending_approval\") return \"pendingApproval\";\n if (status === \"active\") return \"active\";\n if (status === \"archived\") return \"archived\";\n return \"draft\";\n}\n\n/**\n * 公開可能なステータスか\n * requireApproval=true の場合: pending_approval のみ\n * requireApproval=false の場合: pending_verification | pending_approval\n */\nexport function isPublishable(status: VersionStatus, requireApproval: boolean): boolean {\n if (requireApproval) {\n return status === \"pending_approval\";\n }\n return status === \"pending_verification\" || status === \"pending_approval\";\n}\n"],"mappings":";;;;;;;;;;AAOA,SAAS,UAAU;;;ACwBZ,SAAS,WAAW,QAAgC;AACzD,SAAO,WAAW,WAAW,WAAW;AAC1C;AAGO,SAAS,YAAY,QAAgC;AAC1D,SAAO,WAAW,WAAW,WAAW;AAC1C;AAGO,SAAS,aAAa,QAAgC;AAC3D,SAAO,WAAW;AACpB;AAkBO,SAAS,qBACd,QACA,mBACA,uBACe;AACf,MAAI,WAAW,WAAY,QAAO;AAClC,MAAI,WAAW,wBAAwB;AACrC,QAAI,qBAAqB,0BAA0B,YAAa,QAAO;AACvE,QACE,qBACA,yBACA,CAAC,CAAC,aAAa,UAAU,WAAW,EAAE,SAAS,qBAAqB,EACpE,QAAO;AACT,WAAO;AAAA,EACT;AACA,MAAI,WAAW,mBAAoB,QAAO;AAC1C,MAAI,WAAW,SAAU,QAAO;AAChC,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;;;ADvDA,eAAsB,gBACpB,IACA,iBACA,iBACA,SACA;AAEA,QAAM,cAAc,MAAM,GAAG,MAAM,gBAAgB,UAAU;AAAA,IAC3D,OAAO,GAAG,gBAAgB,WAAW,eAAe;AAAA,EACtD,CAAC;AACD,MAAI,aAAa;AACf,UAAM,GAAG,OAAO,eAAe,EAAE,OAAO;AAAA,MACtC,WAAW;AAAA,MACX,gBAAgB,YAAY;AAAA,MAC5B,mBAAmB,YAAY;AAAA,MAC/B,aAAa,YAAY;AAAA,MACzB,WAAW,YAAY;AAAA,MACvB,qBAAqB,YAAY;AAAA,MACjC,qBAAqB,YAAY;AAAA,MACjC,sBAAsB,YAAY;AAAA,MAClC,SAAS,YAAY;AAAA,MACrB,eAAe,YAAY;AAAA,IAC7B,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,MAAM,GAAG,MAAM,iBAAiB,SAAS;AAAA,IACvD,OAAO,GAAG,iBAAiB,WAAW,eAAe;AAAA,EACvD,CAAC;AACD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,GAAG,OAAO,gBAAgB,EAAE;AAAA,MAChC,QAAQ,IAAI,CAAC,OAAO;AAAA,QAClB,WAAW;AAAA,QACX,MAAM,EAAE;AAAA,QACR,QAAQ,EAAE;AAAA,QACV,aAAa,EAAE;AAAA,QACf,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF;AAGA,QAAM,aAAa,MAAM,GAAG,MAAM,eAAe,SAAS;AAAA,IACxD,OAAO,GAAG,eAAe,WAAW,eAAe;AAAA,EACrD,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,GAAG,OAAO,cAAc,EAAE;AAAA,MAC9B,WAAW,IAAI,CAAC,OAAO;AAAA,QACrB,WAAW;AAAA,QACX,KAAK,EAAE;AAAA,QACP,gBAAgB,EAAE;AAAA,MACpB,EAAE;AAAA,IACJ;AAAA,EACF;AAGA,MAAI,SAAS,UAAW;AAGxB,QAAM,WAAW,MAAM,GAAG,MAAM,aAAa,SAAS;AAAA,IACpD,OAAO,GAAG,aAAa,WAAW,eAAe;AAAA,IACjD,SAAS,CAAC,aAAa,OAAO;AAAA,EAChC,CAAC;AACD,MAAI,SAAS,SAAS,GAAG;AAEvB,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,KAAK,UAAU;AACxB,YAAM,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO,YAAY,EAAE,OAAO;AAAA,QACrD,WAAW;AAAA,QACX,cAAc,EAAE,eAAe,MAAM,IAAI,EAAE,YAAY,KAAK,OAAO;AAAA,QACnE,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,QACd,KAAK,EAAE;AAAA,QACP,WAAW,EAAE;AAAA,QACb,sBAAsB,EAAE;AAAA,QACxB,OAAO,EAAE;AAAA,QACT,YAAY,EAAE;AAAA,QACd,QAAQ,EAAE;AAAA,QACV,MAAM,EAAE;AAAA,QACR,cAAc,EAAE;AAAA,QAChB,kBAAkB,EAAE;AAAA,QACpB,cAAc,EAAE;AAAA,QAChB,YAAY,EAAE;AAAA,QACd,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,UAAU,EAAE;AAAA,QACZ,kBAAkB,EAAE;AAAA,QACpB,eAAe,EAAE;AAAA,QACjB,aAAa,EAAE;AAAA,QACf,kBAAkB,EAAE;AAAA,QACpB,mBAAmB,EAAE;AAAA,QACrB,mBAAmB,EAAE;AAAA,QACrB,qBAAqB,EAAE;AAAA,QACvB,aAAa,EAAE;AAAA,QACf,iBAAiB,EAAE;AAAA,QACnB,iBAAiB,EAAE;AAAA,MACrB,CAAC,EAAE,UAAU;AACb,YAAM,IAAI,EAAE,IAAI,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AACF;AAKA,eAAsB,YACpB,IACA,WACA,OACA,cACA,iBACA,iBACA;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,QAAQ,IAAI,MAAM,GACtB,OAAO,YAAY,EACnB,OAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK,OAAO;AAAA,MACxB,KAAK,KAAK,OAAO;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,sBAAsB,KAAK;AAAA,MAC3B,OAAO,KAAK,OAAO,SAAS;AAAA,MAC5B,YAAY,KAAK,OAAO,cAAc;AAAA,MACtC,QAAQ,KAAK,OAAO,UAAU;AAAA,MAC9B,MAAM,KAAK,OAAO,QAAQ;AAAA,MAC1B,cAAc,KAAK,OAAO,gBAAgB;AAAA,MAC1C,kBAAkB,KAAK,OAAO,oBAAoB;AAAA,MAClD,cAAc,KAAK,OAAO,gBAAgB;AAAA,MAC1C,YAAY,KAAK,OAAO,cAAc;AAAA,MACtC,UAAU,KAAK,OAAO,YAAY;AAAA,MAClC,WAAW,KAAK,aAAa;AAAA,MAC7B,UAAU,KAAK,YAAY;AAAA,MAC3B,kBAAkB,KAAK,oBAAoB;AAAA,MAC3C,eAAe,KAAK,MAAM,aAAa;AAAA,MACvC,aAAa,KAAK,MAAM,WAAW;AAAA,MACnC,kBAAkB,KAAK,MAAM,gBAAgB;AAAA,MAC7C,mBAAmB,KAAK,MAAM,iBAAiB;AAAA,MAC/C,mBAAmB,KAAK,MAAM,iBAAiB;AAAA,MAC/C,qBAAqB,KAAK,MAAM,mBAAmB;AAAA,MACnD,aAAa,KAAK,UAAU,SAAS;AAAA,MACrC,iBAAiB,mBAAmB;AAAA,MACpC,iBAAiB,mBAAmB;AAAA,IACtC,CAAC,EACA,UAAU;AAGb,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,YAAM,YAAY,IAAI,WAAW,KAAK,OAAO,SAAS,EAAE;AAAA,IAC1D;AAGA,QAAI,KAAK,UAAU;AACjB,iBAAW,cAAc,KAAK,SAAS,OAAO;AAC5C,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AACA,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,KAAK,SAAS,QAAQ;AAAA,UACtB,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,kBAAkB,IAAQ,WAAmB;AACjE,QAAM,CAAC,aAAa,WAAW,YAAY,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpE,GAAG,MAAM,gBAAgB,UAAU;AAAA,MACjC,OAAO,GAAG,gBAAgB,WAAW,SAAS;AAAA,IAChD,CAAC;AAAA,IACD,GAAG,MAAM,iBAAiB,SAAS;AAAA,MACjC,OAAO,GAAG,iBAAiB,WAAW,SAAS;AAAA,IACjD,CAAC;AAAA,IACD,GAAG,MAAM,eAAe,SAAS;AAAA,MAC/B,OAAO,GAAG,eAAe,WAAW,SAAS;AAAA,IAC/C,CAAC;AAAA,IACD,GAAG,MAAM,aAAa,SAAS;AAAA,MAC7B,OAAO,GAAG,aAAa,WAAW,SAAS;AAAA,MAC3C,SAAS,CAAC,aAAa,OAAO;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,UAAU,eAAe;AAAA,IACzB;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAKA,eAAsB,iBACpB,IACA,IACA,KACA;AACA,QAAM,SAAS,MAAM,kBAAkB,IAAI,IAAI,EAAE;AAGjD,MAAI,wBAAuC;AAC3C,MAAI,IAAI,mBAAmB;AACzB,UAAM,CAAC,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,iBAAiB,CAAC;AAC1G,4BAAwB,KAAK,UAAU;AAAA,EACzC;AAGA,QAAM,SAAS,GAAG,WACd,aACA,IAAI,WAAW,WACb,WACA,IAAI,WAAW,yBACb,yBACA,IAAI,WAAW,qBACb,yBACA;AAEV,SAAO;AAAA,IACL,GAAG;AAAA;AAAA,IAEH,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd,SAAS,IAAI;AAAA,IACb,aAAa,IAAI;AAAA,IACjB;AAAA,IACA,mBAAmB,IAAI;AAAA,IACvB;AAAA,IACA,eAAe;AAAA,MACb,GAAG,WAAW,aAAa,IAAI;AAAA,MAC/B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA;AAAA,IAEA,GAAG;AAAA;AAAA,IAEH,iBAAiB,GAAG;AAAA,IACpB,kBAAkB,IAAI;AAAA,IACtB,eAAe,IAAI;AAAA,IACnB,eAAe,IAAI;AAAA,EACrB;AACF;","names":[]}
package/dist/cli.js ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli-entry.ts
4
+ var command = process.argv[2];
5
+ process.argv = [process.argv[0], process.argv[1], ...process.argv.slice(3)];
6
+ switch (command) {
7
+ case "generate":
8
+ await import("./runbook-generator-MPXJBQ5N.js");
9
+ break;
10
+ case "execute":
11
+ await import("./runbook-executor-K7T6RJWJ.js");
12
+ break;
13
+ case "fix-runbook":
14
+ await import("./fix-runbook-ZSBOTLC2.js");
15
+ break;
16
+ case "compose":
17
+ await import("./compose-MTSIJY5D.js");
18
+ break;
19
+ case "serve":
20
+ await import("./server-AG3LXQBI.js");
21
+ break;
22
+ case "--version":
23
+ case "-v": {
24
+ const { readFileSync } = await import("fs");
25
+ const { join, dirname } = await import("path");
26
+ const { fileURLToPath } = await import("url");
27
+ const pkgPath = join(
28
+ dirname(fileURLToPath(import.meta.url)),
29
+ "..",
30
+ "package.json"
31
+ );
32
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
33
+ console.log(pkg.version);
34
+ break;
35
+ }
36
+ case "--help":
37
+ case "-h":
38
+ case void 0:
39
+ console.log(`Usage: refrain <command> [options]
40
+
41
+ Commands:
42
+ generate \u624B\u9806\u66F8 YAML \u3092\u30D6\u30E9\u30A6\u30B6\u63A2\u7D22\u304B\u3089\u751F\u6210
43
+ execute \u624B\u9806\u66F8 YAML \u3092\u5B9F\u884C
44
+ fix-runbook \u30EC\u30DD\u30FC\u30C8\u304B\u3089\u4FEE\u6B63\u63D0\u6848\u3092\u62BD\u51FA\u3057\u624B\u9806\u66F8\u306B\u9069\u7528
45
+ compose \u8907\u6570\u306E\u624B\u9806\u66F8\u3092\u5206\u5C90\u4ED8\u304D\u624B\u9806\u66F8\u306B\u5408\u6210
46
+ serve API \u30B5\u30FC\u30D0\u30FC\u3092\u8D77\u52D5
47
+
48
+ Options:
49
+ --version, -v \u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u8868\u793A
50
+ --help, -h \u3053\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A
51
+
52
+ Run 'refrain <command> --help' for command-specific help.`);
53
+ break;
54
+ default:
55
+ console.error(`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${command}`);
56
+ console.error("'refrain --help' \u3067\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30DE\u30F3\u30C9\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
57
+ process.exit(1);
58
+ }
59
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli-entry.ts"],"sourcesContent":["/**\n * 統合 CLI エントリポイント — npx @refrainai/cli <command> で実行\n *\n * サブコマンドを argv から除去し、下流の parseArgs が正しく動作するようにルーティングする。\n */\n\nimport { printCommandHelp } from \"./cli/help\";\n\nconst command = process.argv[2];\n\n// サブコマンドを除去して下流に渡す\nprocess.argv = [process.argv[0], process.argv[1], ...process.argv.slice(3)];\n\nswitch (command) {\n case \"generate\":\n await import(\"./runbook-generator/index.js\");\n break;\n\n case \"execute\":\n await import(\"./runbook-executor/index.js\");\n break;\n\n case \"fix-runbook\":\n await import(\"./fix-runbook/index.js\");\n break;\n\n case \"compose\":\n await import(\"./compose/index.js\");\n break;\n\n case \"serve\":\n await import(\"./server/index.js\");\n break;\n\n case \"--version\":\n case \"-v\": {\n const { readFileSync } = await import(\"node:fs\");\n const { join, dirname } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n const pkgPath = join(\n dirname(fileURLToPath(import.meta.url)),\n \"..\",\n \"package.json\",\n );\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n console.log(pkg.version);\n break;\n }\n\n case \"--help\":\n case \"-h\":\n case undefined:\n console.log(`Usage: refrain <command> [options]\n\nCommands:\n generate 手順書 YAML をブラウザ探索から生成\n execute 手順書 YAML を実行\n fix-runbook レポートから修正提案を抽出し手順書に適用\n compose 複数の手順書を分岐付き手順書に合成\n serve API サーバーを起動\n\nOptions:\n --version, -v バージョンを表示\n --help, -h このヘルプを表示\n\nRun 'refrain <command> --help' for command-specific help.`);\n break;\n\n default:\n console.error(`不明なコマンド: ${command}`);\n console.error(\"'refrain --help' で利用可能なコマンドを確認してください。\");\n process.exit(1);\n}\n"],"mappings":";;;AAQA,IAAM,UAAU,QAAQ,KAAK,CAAC;AAG9B,QAAQ,OAAO,CAAC,QAAQ,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,GAAG,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC;AAE1E,QAAQ,SAAS;AAAA,EACf,KAAK;AACH,UAAM,OAAO,iCAA8B;AAC3C;AAAA,EAEF,KAAK;AACH,UAAM,OAAO,gCAA6B;AAC1C;AAAA,EAEF,KAAK;AACH,UAAM,OAAO,2BAAwB;AACrC;AAAA,EAEF,KAAK;AACH,UAAM,OAAO,uBAAoB;AACjC;AAAA,EAEF,KAAK;AACH,UAAM,OAAO,sBAAmB;AAChC;AAAA,EAEF,KAAK;AAAA,EACL,KAAK,MAAM;AACT,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,IAAS;AAC/C,UAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,OAAO,MAAW;AAClD,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,KAAU;AACjD,UAAM,UAAU;AAAA,MACd,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AACA,UAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AACrD,YAAQ,IAAI,IAAI,OAAO;AACvB;AAAA,EACF;AAAA,EAEA,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACH,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAa0C;AACtD;AAAA,EAEF;AACE,YAAQ,MAAM,+CAAY,OAAO,EAAE;AACnC,YAAQ,MAAM,2IAAuC;AACrD,YAAQ,KAAK,CAAC;AAClB;","names":[]}