@refrainai/cli 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ai-model-FM6GWCID.js → ai-model-DP5PKGM6.js} +2 -2
- package/dist/{chunk-IGFCYKHC.js → chunk-5CKPPEYP.js} +262 -305
- package/dist/chunk-5CKPPEYP.js.map +1 -0
- package/dist/{chunk-7UCVPKD4.js → chunk-6FGCPMBU.js} +34 -74
- package/dist/chunk-6FGCPMBU.js.map +1 -0
- package/dist/{chunk-2BVDAJZT.js → chunk-A5X2VF5G.js} +9 -6
- package/dist/chunk-A5X2VF5G.js.map +1 -0
- package/dist/{chunk-H47NWH7N.js → chunk-AOCGSFRM.js} +611 -73
- package/dist/chunk-AOCGSFRM.js.map +1 -0
- package/dist/{chunk-CLYJHKPY.js → chunk-CMWLFQXD.js} +43 -42
- package/dist/chunk-CMWLFQXD.js.map +1 -0
- package/dist/chunk-GC7I5SGK.js +1146 -0
- package/dist/chunk-GC7I5SGK.js.map +1 -0
- package/dist/{chunk-WEYR56ZN.js → chunk-HHRHHFSK.js} +4 -4
- package/dist/chunk-IGJNT457.js +30 -0
- package/dist/chunk-IGJNT457.js.map +1 -0
- package/dist/{chunk-UGPXCQY3.js → chunk-KFNW4XR2.js} +13 -4
- package/dist/chunk-KFNW4XR2.js.map +1 -0
- package/dist/{chunk-RT664YIO.js → chunk-LZDZGI4M.js} +3 -1
- package/dist/chunk-LZDZGI4M.js.map +1 -0
- package/dist/{chunk-RYIJPYM3.js → chunk-MYITSQYV.js} +25 -8
- package/dist/chunk-MYITSQYV.js.map +1 -0
- package/dist/chunk-NRKZJVPE.js +74 -0
- package/dist/chunk-NRKZJVPE.js.map +1 -0
- package/dist/chunk-RBZK7T76.js +349 -0
- package/dist/chunk-RBZK7T76.js.map +1 -0
- package/dist/{chunk-HQDXLWAY.js → chunk-SDV3X5UN.js} +2 -2
- package/dist/{chunk-Z33FCOTZ.js → chunk-VVXNFUPL.js} +4 -2
- package/dist/chunk-VVXNFUPL.js.map +1 -0
- package/dist/chunk-YTVEYQGA.js +64 -0
- package/dist/chunk-YTVEYQGA.js.map +1 -0
- package/dist/{chunk-DJVUITRB.js → chunk-ZEBQWBEU.js} +898 -1135
- package/dist/chunk-ZEBQWBEU.js.map +1 -0
- package/dist/cli.js +5 -5
- package/dist/{compose-MTSIJY5D.js → compose-AVX5RU67.js} +9 -7
- package/dist/{compose-MTSIJY5D.js.map → compose-AVX5RU67.js.map} +1 -1
- package/dist/extraction-prompt-VDCKIFLB.js +17 -0
- package/dist/extraction-prompt-VDCKIFLB.js.map +1 -0
- package/dist/{fix-runbook-ZSBOTLC2.js → fix-runbook-6L5ZMA5G.js} +12 -10
- package/dist/{fix-runbook-ZSBOTLC2.js.map → fix-runbook-6L5ZMA5G.js.map} +1 -1
- package/dist/prompts-AGUYYIOM.js +13 -0
- package/dist/runbook-builder-2ZLE2AEO.js +11 -0
- package/dist/{runbook-data-helpers-KRR2SH76.js → runbook-data-helpers-5UAO65TZ.js} +3 -3
- package/dist/{runbook-executor-K7T6RJWJ.js → runbook-executor-OJXJTN6A.js} +41 -444
- package/dist/runbook-executor-OJXJTN6A.js.map +1 -0
- package/dist/{runbook-generator-MPXJBQ5N.js → runbook-generator-UIHWBEYC.js} +61 -136
- package/dist/runbook-generator-UIHWBEYC.js.map +1 -0
- package/dist/{runbook-schema-3T6TP3JJ.js → runbook-schema-X7DW725O.js} +2 -2
- package/dist/runbook-store-S24PXIHD.js +11 -0
- package/dist/{schema-5G6UQSPT.js → schema-XFSD5EWN.js} +2 -2
- package/dist/{server-AG3LXQBI.js → server-MULT5ZWG.js} +1176 -128
- package/dist/server-MULT5ZWG.js.map +1 -0
- package/dist/{tenant-ai-config-QPFEJUVJ.js → tenant-ai-config-4NHKRW7O.js} +4 -4
- package/dist/tenant-ai-config-4NHKRW7O.js.map +1 -0
- package/dist/yaml-patcher-GOCLYKZZ.js +18 -0
- package/dist/yaml-patcher-GOCLYKZZ.js.map +1 -0
- package/package.json +3 -2
- package/dist/chunk-2BVDAJZT.js.map +0 -1
- package/dist/chunk-7UCVPKD4.js.map +0 -1
- package/dist/chunk-CLYJHKPY.js.map +0 -1
- package/dist/chunk-DJVUITRB.js.map +0 -1
- package/dist/chunk-H47NWH7N.js.map +0 -1
- package/dist/chunk-IGFCYKHC.js.map +0 -1
- package/dist/chunk-RT664YIO.js.map +0 -1
- package/dist/chunk-RYIJPYM3.js.map +0 -1
- package/dist/chunk-UGPXCQY3.js.map +0 -1
- package/dist/chunk-VPK2MQAZ.js +0 -589
- package/dist/chunk-VPK2MQAZ.js.map +0 -1
- package/dist/chunk-Z33FCOTZ.js.map +0 -1
- package/dist/runbook-executor-K7T6RJWJ.js.map +0 -1
- package/dist/runbook-generator-MPXJBQ5N.js.map +0 -1
- package/dist/runbook-store-G5GUOWRR.js +0 -11
- package/dist/server-AG3LXQBI.js.map +0 -1
- package/dist/yaml-patcher-VGUS2JGH.js +0 -15
- /package/dist/{ai-model-FM6GWCID.js.map → ai-model-DP5PKGM6.js.map} +0 -0
- /package/dist/{chunk-WEYR56ZN.js.map → chunk-HHRHHFSK.js.map} +0 -0
- /package/dist/{chunk-HQDXLWAY.js.map → chunk-SDV3X5UN.js.map} +0 -0
- /package/dist/{runbook-data-helpers-KRR2SH76.js.map → prompts-AGUYYIOM.js.map} +0 -0
- /package/dist/{runbook-schema-3T6TP3JJ.js.map → runbook-builder-2ZLE2AEO.js.map} +0 -0
- /package/dist/{runbook-store-G5GUOWRR.js.map → runbook-data-helpers-5UAO65TZ.js.map} +0 -0
- /package/dist/{schema-5G6UQSPT.js.map → runbook-schema-X7DW725O.js.map} +0 -0
- /package/dist/{tenant-ai-config-QPFEJUVJ.js.map → runbook-store-S24PXIHD.js.map} +0 -0
- /package/dist/{yaml-patcher-VGUS2JGH.js.map → schema-XFSD5EWN.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -5,19 +5,19 @@ var command = process.argv[2];
|
|
|
5
5
|
process.argv = [process.argv[0], process.argv[1], ...process.argv.slice(3)];
|
|
6
6
|
switch (command) {
|
|
7
7
|
case "generate":
|
|
8
|
-
await import("./runbook-generator-
|
|
8
|
+
await import("./runbook-generator-UIHWBEYC.js");
|
|
9
9
|
break;
|
|
10
10
|
case "execute":
|
|
11
|
-
await import("./runbook-executor-
|
|
11
|
+
await import("./runbook-executor-OJXJTN6A.js");
|
|
12
12
|
break;
|
|
13
13
|
case "fix-runbook":
|
|
14
|
-
await import("./fix-runbook-
|
|
14
|
+
await import("./fix-runbook-6L5ZMA5G.js");
|
|
15
15
|
break;
|
|
16
16
|
case "compose":
|
|
17
|
-
await import("./compose-
|
|
17
|
+
await import("./compose-AVX5RU67.js");
|
|
18
18
|
break;
|
|
19
19
|
case "serve":
|
|
20
|
-
await import("./server-
|
|
20
|
+
await import("./server-MULT5ZWG.js");
|
|
21
21
|
break;
|
|
22
22
|
case "--version":
|
|
23
23
|
case "-v": {
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
initLocale,
|
|
4
3
|
intro,
|
|
5
4
|
log,
|
|
6
5
|
note,
|
|
7
6
|
outro,
|
|
8
7
|
promptConfirm,
|
|
9
8
|
promptSelect,
|
|
10
|
-
promptText
|
|
11
|
-
|
|
12
|
-
tf
|
|
13
|
-
} from "./chunk-7UCVPKD4.js";
|
|
9
|
+
promptText
|
|
10
|
+
} from "./chunk-NRKZJVPE.js";
|
|
14
11
|
import {
|
|
15
12
|
ParsedRunbookSchema
|
|
16
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-LZDZGI4M.js";
|
|
14
|
+
import {
|
|
15
|
+
initLocale,
|
|
16
|
+
t,
|
|
17
|
+
tf
|
|
18
|
+
} from "./chunk-6FGCPMBU.js";
|
|
17
19
|
import "./chunk-2H7UOFLK.js";
|
|
18
20
|
|
|
19
21
|
// src/compose/config.ts
|
|
@@ -544,4 +546,4 @@ try {
|
|
|
544
546
|
console.error(`\u5408\u6210\u5931\u6557: ${msg}`);
|
|
545
547
|
process.exit(1);
|
|
546
548
|
}
|
|
547
|
-
//# sourceMappingURL=compose-
|
|
549
|
+
//# sourceMappingURL=compose-AVX5RU67.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/compose/config.ts","../../../src/compose/composer.ts","../../../src/compose/interactive.ts","../../../src/compose/index.ts"],"sourcesContent":["/**\n * compose CLI 引数パース\n *\n * 対話式フローでは全引数を optional に。--output のみ必須。\n * CLI 引数はプリフィルとして使用し、未指定分はプロンプトで収集。\n */\n\nimport { parseArgs } from \"node:util\";\n\nexport interface ComposeConfig {\n /** 分岐条件の変数名(未指定時はプロンプトで収集) */\n branchOn?: string;\n /** \"match:yamlPath\" のペア(未指定時はプロンプトで収集) */\n cases: { match: string; yamlPath: string }[];\n /** 合成後のゴール */\n goal?: string;\n /** 出力先 YAML パス */\n output: string;\n /** ロケール */\n locale?: string;\n}\n\nexport function parseComposeArgs(): ComposeConfig {\n const { values } = parseArgs({\n options: {\n \"branch-on\": { type: \"string\" },\n case: { type: \"string\", multiple: true },\n goal: { type: \"string\" },\n output: { type: \"string\" },\n locale: { type: \"string\" },\n },\n strict: false,\n });\n\n const output = values[\"output\"] as string | undefined;\n if (!output) {\n console.error(\"--output is required\");\n process.exit(1);\n }\n\n const caseArgs = (values[\"case\"] as string[] | undefined) ?? [];\n const cases = caseArgs.map((c) => {\n const colonIdx = c.indexOf(\":\");\n if (colonIdx === -1) {\n console.error(`Invalid --case format: \"${c}\" (expected match:yamlPath)`);\n process.exit(1);\n }\n return {\n match: c.slice(0, colonIdx),\n yamlPath: c.slice(colonIdx + 1),\n };\n });\n\n return {\n branchOn: values[\"branch-on\"] as string | undefined,\n cases,\n goal: values[\"goal\"] as string | undefined,\n output,\n locale: values[\"locale\"] as string | undefined,\n };\n}\n","/**\n * composer — 複数の手順書 YAML を1つの分岐付き手順書に合成する純粋関数群\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { parse, stringify } from \"yaml\";\nimport { ParsedRunbookSchema, VariableDefinitionSchema } from \"../schemas/runbook-schema\";\nimport type { z } from \"zod\";\n\n// ── 型定義 ──\n\nexport type ParsedRunbook = z.infer<typeof ParsedRunbookSchema>;\nexport type VariableDefinition = z.infer<typeof VariableDefinitionSchema>;\n\nexport interface LoadedCase {\n match: string;\n yamlPath: string;\n runbook: ParsedRunbook;\n}\n\nexport interface VariableConflict {\n name: string;\n definitions: { caseName: string; def: VariableDefinition }[];\n}\n\nexport interface VariableMergeResult {\n /** 全ケースで定義一致の変数 */\n shared: Record<string, VariableDefinition>;\n /** ケース間で定義が異なる変数 */\n conflicts: VariableConflict[];\n /** 特定ケースにのみ存在する変数 */\n caseSpecific: { caseName: string; name: string; def: VariableDefinition }[];\n}\n\nexport interface SettingsDiff {\n key: string;\n values: { caseName: string; value: unknown }[];\n}\n\nexport interface CompositionState {\n branchOn: string;\n cases: LoadedCase[];\n goal?: string;\n output: string;\n mergedVariables: Record<string, VariableDefinition>;\n settings: ParsedRunbook[\"settings\"];\n metadata: ParsedRunbook[\"metadata\"];\n title: string;\n}\n\n// ── 純粋関数 ──\n\n/**\n * 単一ケースの読み込み・バリデーション\n */\nexport async function loadCase(match: string, yamlPath: string): Promise<LoadedCase> {\n const raw = await readFile(yamlPath, \"utf-8\");\n const doc = parse(raw);\n const runbook = ParsedRunbookSchema.parse(doc);\n return { match, yamlPath, runbook };\n}\n\n/**\n * VariableDefinition を正規化して比較用にする。\n * Zod のデフォルト値(required: true, sensitive: false)を埋めた上でフィールド単位比較。\n */\nfunction normalizeVarDef(def: VariableDefinition): VariableDefinition {\n return {\n source: def.source,\n required: def.required ?? true,\n sensitive: def.sensitive ?? false,\n ...(def.description !== undefined ? { description: def.description } : {}),\n ...(def.value !== undefined ? { value: def.value } : {}),\n ...(def.expression !== undefined ? { expression: def.expression } : {}),\n ...(def.envKey !== undefined ? { envKey: def.envKey } : {}),\n };\n}\n\nfunction varDefsEqual(a: VariableDefinition, b: VariableDefinition): boolean {\n const na = normalizeVarDef(a);\n const nb = normalizeVarDef(b);\n return (\n na.source === nb.source &&\n na.required === nb.required &&\n na.sensitive === nb.sensitive &&\n na.description === nb.description &&\n na.value === nb.value &&\n na.expression === nb.expression &&\n na.envKey === nb.envKey\n );\n}\n\n/**\n * 変数を分析(共通/競合/ケース固有に分類)\n */\nexport function analyzeVariables(cases: LoadedCase[]): VariableMergeResult {\n // 各変数名がどのケースに定義されているか収集\n const varMap = new Map<string, { caseName: string; def: VariableDefinition }[]>();\n for (const lc of cases) {\n if (!lc.runbook.variables) continue;\n for (const [name, def] of Object.entries(lc.runbook.variables)) {\n const existing = varMap.get(name) ?? [];\n existing.push({ caseName: lc.match, def });\n varMap.set(name, existing);\n }\n }\n\n const shared: Record<string, VariableDefinition> = {};\n const conflicts: VariableConflict[] = [];\n const caseSpecific: { caseName: string; name: string; def: VariableDefinition }[] = [];\n\n for (const [name, entries] of varMap) {\n if (entries.length === 1) {\n // 1つのケースにのみ存在\n caseSpecific.push({ caseName: entries[0].caseName, name, def: entries[0].def });\n } else if (entries.length === cases.length) {\n // 全ケースに存在 → 定義が一致するか確認\n const allEqual = entries.every((e) => varDefsEqual(e.def, entries[0].def));\n if (allEqual) {\n shared[name] = entries[0].def;\n } else {\n conflicts.push({ name, definitions: entries });\n }\n } else {\n // 一部のケースにのみ存在(2ケース以上だが全ケースではない)\n // これも競合として扱う\n conflicts.push({ name, definitions: entries });\n }\n }\n\n return { shared, conflicts, caseSpecific };\n}\n\n/**\n * 競合解決マップ付きで変数をマージ。\n * resolutions: 競合変数名 → 採用する定義のマップ\n */\nexport function mergeVariables(\n analysis: VariableMergeResult,\n resolutions: Map<string, VariableDefinition>,\n branchOn: string,\n caseMatches: string[],\n): Record<string, VariableDefinition> {\n const merged: Record<string, VariableDefinition> = {};\n\n // 共通変数\n for (const [name, def] of Object.entries(analysis.shared)) {\n merged[name] = def;\n }\n\n // 競合変数(解決マップから採用)\n for (const conflict of analysis.conflicts) {\n const resolved = resolutions.get(conflict.name);\n if (resolved) {\n merged[conflict.name] = resolved;\n } else {\n // 解決がない場合は最初のケースの定義を使用\n merged[conflict.name] = conflict.definitions[0].def;\n }\n }\n\n // ケース固有変数\n for (const cs of analysis.caseSpecific) {\n merged[cs.name] = cs.def;\n }\n\n // 分岐変数を追加(まだ含まれていなければ)\n if (!(branchOn in merged)) {\n merged[branchOn] = {\n source: \"prompt\",\n description: `分岐条件 (${caseMatches.join(\", \")})`,\n required: true,\n sensitive: false,\n };\n }\n\n return merged;\n}\n\n/**\n * Settings の差分検出。全ケースで同じ値なら空配列。\n */\nexport function diffSettings(cases: LoadedCase[]): SettingsDiff[] {\n if (cases.length <= 1) return [];\n\n const diffs: SettingsDiff[] = [];\n const keys = [\"baseUrl\", \"defaultTimeout\", \"pauseBetweenSteps\", \"stopOnError\"] as const;\n\n for (const key of keys) {\n const values = cases.map((lc) => ({\n caseName: lc.match,\n value: lc.runbook.settings[key],\n }));\n\n const allSame = values.every((v) => v.value === values[0].value);\n if (!allSame) {\n diffs.push({ key, values });\n }\n }\n\n return diffs;\n}\n\n/**\n * 合成済み runbook オブジェクト構築(I/O なし)\n */\nexport function buildComposedRunbook(state: CompositionState): Record<string, unknown> {\n const base = state.cases[0].runbook;\n\n const branchStep = {\n ordinal: 0,\n description: state.goal ?? `${state.branchOn} に応じた分岐`,\n action: { type: \"memory\" },\n url: state.metadata.startUrl,\n riskLevel: \"low\",\n requiresConfirmation: false,\n branches: {\n value: `{{${state.branchOn}}}`,\n cases: state.cases.map((lc) => ({\n match: lc.match,\n steps: lc.runbook.steps.map((s, i) => ({\n ...s,\n ordinal: i,\n })),\n })),\n },\n };\n\n return {\n title: state.title,\n ...(base.naturalLanguageSummary ? { naturalLanguageSummary: base.naturalLanguageSummary } : {}),\n settings: state.settings,\n metadata: {\n ...state.metadata,\n totalSteps: 1,\n generatedAt: new Date().toISOString(),\n },\n steps: [branchStep],\n context: base.context ?? \"\",\n variables: state.mergedVariables,\n };\n}\n\n/**\n * Zod バリデーション + YAML 書き出し\n */\nexport async function validateAndWriteYaml(\n composed: Record<string, unknown>,\n outputPath: string,\n): Promise<string> {\n ParsedRunbookSchema.parse(composed);\n const yamlContent = stringify(composed, { lineWidth: 120 });\n await writeFile(outputPath, yamlContent, \"utf-8\");\n return outputPath;\n}\n\n/**\n * 変数定義の表示文字列を生成\n */\nexport function formatVariableDef(def: VariableDefinition): string {\n const parts = [`source: ${def.source}`];\n if (def.value !== undefined) parts.push(`value: \"${def.value}\"`);\n if (def.envKey !== undefined) parts.push(`envKey: ${def.envKey}`);\n if (def.expression !== undefined) parts.push(`expression: ${def.expression}`);\n return parts.join(\", \");\n}\n","/**\n * compose/interactive — 対話ロジック(収集・競合解決・プレビュー・編集ループ)\n *\n * composer.ts の純粋関数を呼び出しつつ、@clack/prompts でユーザーと対話する。\n */\n\nimport { t, tf } from \"../i18n\";\nimport { log, note, promptConfirm, promptSelect, promptText } from \"../cli/prompts\";\nimport type {\n CompositionState,\n LoadedCase,\n VariableConflict,\n VariableDefinition,\n VariableMergeResult,\n SettingsDiff,\n ParsedRunbook,\n} from \"./composer\";\nimport { loadCase, formatVariableDef, analyzeVariables, mergeVariables, diffSettings } from \"./composer\";\n\n// ── Phase 1: 入力収集 ──\n\n/**\n * 分岐変数名をプロンプトで取得\n */\nexport async function gatherBranchVariable(): Promise<string> {\n return promptText(t(\"compose.branchVarPrompt\"), {\n validate: (v) => (!v?.trim() ? t(\"compose.branchVarPrompt\") : undefined),\n });\n}\n\n/**\n * 対話的にケースを1つずつ追加\n */\nexport async function gatherCasesInteractively(): Promise<LoadedCase[]> {\n const cases: LoadedCase[] = [];\n\n // 最低2ケース必要\n while (cases.length < 2 || (await promptConfirm(t(\"compose.addAnotherCase\"), false))) {\n const yamlPath = await promptText(t(\"compose.yamlPathPrompt\"), {\n validate: (v) => (!v?.trim() ? t(\"compose.yamlPathPrompt\") : undefined),\n });\n const match = await promptText(t(\"compose.matchValuePrompt\"), {\n validate: (v) => (!v?.trim() ? t(\"compose.matchValuePrompt\") : undefined),\n });\n\n const loaded = await loadCase(match, yamlPath);\n const varCount = loaded.runbook.variables\n ? Object.keys(loaded.runbook.variables).length\n : 0;\n log.success(\n tf(\"compose.caseLoaded\", {\n title: loaded.runbook.title,\n steps: loaded.runbook.steps.length,\n vars: varCount,\n }),\n );\n cases.push(loaded);\n }\n\n return cases;\n}\n\n/**\n * CLI 引数で指定されたケースを一括ロード\n */\nexport async function loadProvidedCases(\n caseDefs: { match: string; yamlPath: string }[],\n): Promise<LoadedCase[]> {\n const cases: LoadedCase[] = [];\n for (const c of caseDefs) {\n const loaded = await loadCase(c.match, c.yamlPath);\n const varCount = loaded.runbook.variables\n ? Object.keys(loaded.runbook.variables).length\n : 0;\n log.success(\n tf(\"compose.caseLoaded\", {\n title: loaded.runbook.title,\n steps: loaded.runbook.steps.length,\n vars: varCount,\n }),\n );\n cases.push(loaded);\n }\n return cases;\n}\n\n/**\n * ゴールをプロンプトで取得\n */\nexport async function gatherGoal(defaultGoal?: string): Promise<string | undefined> {\n const goal = await promptText(t(\"compose.goalPrompt\"), {\n initialValue: defaultGoal,\n placeholder: defaultGoal,\n });\n return goal.trim() || undefined;\n}\n\n// ── Phase 2: 変数競合解決 ──\n\n/**\n * 変数マージプレビューを表示\n */\nexport function displayVariableMergePreview(\n analysis: VariableMergeResult,\n branchOn: string,\n): void {\n const lines: string[] = [];\n\n // 共通変数\n const sharedEntries = Object.entries(analysis.shared);\n if (sharedEntries.length > 0) {\n lines.push(t(\"compose.sharedVariables\"));\n for (const [name, def] of sharedEntries) {\n lines.push(` ${name} → ${formatVariableDef(def)}`);\n }\n lines.push(\"\");\n }\n\n // 競合変数\n if (analysis.conflicts.length > 0) {\n lines.push(t(\"compose.conflictingVariables\"));\n for (const conflict of analysis.conflicts) {\n lines.push(` ${conflict.name}`);\n for (const d of conflict.definitions) {\n lines.push(` [${d.caseName}] ${formatVariableDef(d.def)}`);\n }\n }\n lines.push(\"\");\n }\n\n // ケース固有変数\n if (analysis.caseSpecific.length > 0) {\n lines.push(t(\"compose.caseSpecificVariables\"));\n for (const cs of analysis.caseSpecific) {\n lines.push(` [${cs.caseName}] ${cs.name} → ${formatVariableDef(cs.def)}`);\n }\n lines.push(\"\");\n }\n\n // 分岐変数\n lines.push(t(\"compose.branchVariable\"));\n lines.push(` ${branchOn} → source: prompt`);\n\n note(lines.join(\"\\n\"), t(\"compose.variableMergePreview\"));\n}\n\n/**\n * 競合変数の解決をユーザーに問う\n */\nexport async function resolveVariableConflicts(\n analysis: VariableMergeResult,\n): Promise<Map<string, VariableDefinition>> {\n const resolutions = new Map<string, VariableDefinition>();\n\n for (const conflict of analysis.conflicts) {\n const options = conflict.definitions.map((d) => ({\n value: d.caseName,\n label: tf(\"compose.useFromCase\", { case: d.caseName }),\n hint: formatVariableDef(d.def),\n }));\n\n const chosen = await promptSelect(\n tf(\"compose.conflictPrompt\", { name: conflict.name }),\n options,\n );\n\n const selected = conflict.definitions.find((d) => d.caseName === chosen);\n if (selected) {\n resolutions.set(conflict.name, selected.def);\n }\n }\n\n return resolutions;\n}\n\n// ── Phase 3: Settings 解決 ──\n\n/**\n * Settings の差分をユーザーに問う\n */\nexport async function resolveSettings(\n diffs: SettingsDiff[],\n cases: LoadedCase[],\n baseSettings: ParsedRunbook[\"settings\"],\n): Promise<ParsedRunbook[\"settings\"]> {\n const settings = { ...baseSettings };\n\n for (const diff of diffs) {\n const options = diff.values.map((v) => ({\n value: v.caseName,\n label: tf(\"compose.useFromCase\", { case: v.caseName }),\n hint: `${diff.key} = ${JSON.stringify(v.value)}`,\n }));\n\n const chosen = await promptSelect(\n tf(\"compose.settingsDiffPrompt\", { key: diff.key }),\n options,\n );\n\n const selectedCase = cases.find((c) => c.match === chosen);\n if (selectedCase) {\n (settings as Record<string, unknown>)[diff.key] =\n selectedCase.runbook.settings[diff.key as keyof typeof settings];\n }\n }\n\n return settings;\n}\n\n// ── Phase 4: プレビュー + 編集ループ ──\n\n/**\n * 合成結果のプレビューを表示\n */\nfunction displayPreview(state: CompositionState): void {\n const lines: string[] = [];\n lines.push(`Title: ${state.title}`);\n lines.push(`Branch: {{${state.branchOn}}}`);\n lines.push(\n `Cases: ${state.cases.map((c) => `${c.match} (${c.runbook.steps.length} steps)`).join(\", \")}`,\n );\n lines.push(\"\");\n\n const varEntries = Object.entries(state.mergedVariables);\n lines.push(`Variables (${varEntries.length}):`);\n for (const [name, def] of varEntries) {\n const isBranch = name === state.branchOn ? \" (branch)\" : \"\";\n lines.push(` ${name} → ${formatVariableDef(def)}${isBranch}`);\n }\n lines.push(\"\");\n\n lines.push(\"Settings:\");\n lines.push(` baseUrl: ${state.settings.baseUrl}`);\n lines.push(` defaultTimeout: ${state.settings.defaultTimeout}`);\n\n note(lines.join(\"\\n\"), t(\"compose.composedPreview\"));\n}\n\ntype EditAction = \"confirm\" | \"editBranch\" | \"editMatches\" | \"editVariables\" | \"editTitle\";\n\n/**\n * 編集ループ — ユーザーが「確定」を選ぶまで繰り返す\n */\nexport async function editLoop(state: CompositionState): Promise<void> {\n while (true) {\n displayPreview(state);\n\n const action = await promptSelect<EditAction>(t(\"compose.selectAction\"), [\n { value: \"confirm\", label: t(\"compose.confirm\"), hint: t(\"compose.confirmHint\") },\n { value: \"editBranch\", label: t(\"compose.editBranch\") },\n { value: \"editMatches\", label: t(\"compose.editMatches\") },\n { value: \"editVariables\", label: t(\"compose.editVariables\") },\n { value: \"editTitle\", label: t(\"compose.editTitle\") },\n ]);\n\n if (action === \"confirm\") break;\n\n switch (action) {\n case \"editBranch\":\n await handleEditBranch(state);\n break;\n case \"editMatches\":\n await handleEditMatches(state);\n break;\n case \"editVariables\":\n await handleEditVariables(state);\n break;\n case \"editTitle\":\n await handleEditTitle(state);\n break;\n }\n }\n}\n\nasync function handleEditBranch(state: CompositionState): Promise<void> {\n const oldBranch = state.branchOn;\n const newBranch = await promptText(t(\"compose.newBranchVar\"), {\n initialValue: oldBranch,\n validate: (v) => (!v?.trim() ? t(\"compose.branchVarPrompt\") : undefined),\n });\n\n if (newBranch !== oldBranch) {\n // mergedVariables のキーを付け替え\n const branchDef = state.mergedVariables[oldBranch];\n if (branchDef) {\n delete state.mergedVariables[oldBranch];\n state.mergedVariables[newBranch] = branchDef;\n }\n state.branchOn = newBranch;\n }\n}\n\nasync function handleEditMatches(state: CompositionState): Promise<void> {\n const options = state.cases.map((c) => ({\n value: c.match,\n label: c.match,\n hint: c.runbook.title,\n }));\n\n const selected = await promptSelect(t(\"compose.selectCase\"), options);\n const caseObj = state.cases.find((c) => c.match === selected);\n if (!caseObj) return;\n\n const newMatch = await promptText(t(\"compose.newMatchValue\"), {\n initialValue: caseObj.match,\n validate: (v) => (!v?.trim() ? t(\"compose.matchValuePrompt\") : undefined),\n });\n caseObj.match = newMatch;\n\n // 分岐変数の description を更新\n const branchDef = state.mergedVariables[state.branchOn];\n if (branchDef) {\n branchDef.description = `分岐条件 (${state.cases.map((c) => c.match).join(\", \")})`;\n }\n}\n\ntype VarAction = \"delete\" | \"add\" | \"edit\";\n\nasync function handleEditVariables(state: CompositionState): Promise<void> {\n const action = await promptSelect<VarAction>(t(\"compose.editVarAction\"), [\n { value: \"delete\", label: t(\"compose.deleteVar\") },\n { value: \"add\", label: t(\"compose.addVar\") },\n { value: \"edit\", label: t(\"compose.editVarDef\") },\n ]);\n\n const varNames = Object.keys(state.mergedVariables).filter((n) => n !== state.branchOn);\n\n switch (action) {\n case \"delete\": {\n if (varNames.length === 0) return;\n const toDelete = await promptSelect(\n t(\"compose.selectVar\"),\n varNames.map((n) => ({\n value: n,\n label: n,\n hint: formatVariableDef(state.mergedVariables[n]),\n })),\n );\n delete state.mergedVariables[toDelete];\n log.success(tf(\"compose.varDeleted\", { name: toDelete }));\n break;\n }\n case \"add\": {\n const name = await promptText(t(\"compose.newVarName\"), {\n validate: (v) => {\n if (!v?.trim()) return t(\"compose.newVarName\");\n if (v.trim() === state.branchOn)\n return tf(\"compose.branchVarConflict\", { name: v.trim() });\n return undefined;\n },\n });\n const source = await promptSelect(t(\"compose.newVarSource\"), [\n { value: \"prompt\", label: \"prompt\" },\n { value: \"fixed\", label: \"fixed\" },\n { value: \"env\", label: \"env\" },\n { value: \"context\", label: \"context\" },\n { value: \"expression\", label: \"expression\" },\n { value: \"data\", label: \"data\" },\n ]);\n const value = await promptText(t(\"compose.newVarValue\"));\n const description = await promptText(t(\"compose.newVarDescription\"));\n state.mergedVariables[name] = {\n source: source as VariableDefinition[\"source\"],\n required: true,\n sensitive: false,\n ...(value.trim() ? { value: value.trim() } : {}),\n ...(description.trim() ? { description: description.trim() } : {}),\n };\n log.success(tf(\"compose.varAdded\", { name }));\n break;\n }\n case \"edit\": {\n if (varNames.length === 0) return;\n const toEdit = await promptSelect(\n t(\"compose.selectVar\"),\n varNames.map((n) => ({\n value: n,\n label: n,\n hint: formatVariableDef(state.mergedVariables[n]),\n })),\n );\n const currentDef = state.mergedVariables[toEdit];\n const newSource = await promptSelect(t(\"compose.newVarSource\"), [\n { value: \"prompt\", label: \"prompt\" },\n { value: \"fixed\", label: \"fixed\" },\n { value: \"env\", label: \"env\" },\n { value: \"context\", label: \"context\" },\n { value: \"expression\", label: \"expression\" },\n { value: \"data\", label: \"data\" },\n ]);\n const newValue = await promptText(t(\"compose.newVarValue\"), {\n initialValue: currentDef.value ?? \"\",\n });\n const newDesc = await promptText(t(\"compose.newVarDescription\"), {\n initialValue: currentDef.description ?? \"\",\n });\n state.mergedVariables[toEdit] = {\n source: newSource as VariableDefinition[\"source\"],\n required: currentDef.required,\n sensitive: currentDef.sensitive,\n ...(newValue.trim() ? { value: newValue.trim() } : {}),\n ...(newDesc.trim() ? { description: newDesc.trim() } : {}),\n };\n log.success(tf(\"compose.varUpdated\", { name: toEdit }));\n break;\n }\n }\n}\n\nasync function handleEditTitle(state: CompositionState): Promise<void> {\n const newTitle = await promptText(t(\"compose.newTitle\"), {\n initialValue: state.title,\n validate: (v) => (!v?.trim() ? t(\"compose.newTitle\") : undefined),\n });\n state.title = newTitle;\n state.goal = newTitle;\n state.metadata = { ...state.metadata, goal: newTitle };\n}\n\n// ── ヘルパー: 状態構築の再利用 ──\n\n/**\n * 変数分析・競合解決・Settings 解決を経て CompositionState を構築する\n */\nexport async function buildState(opts: {\n branchOn: string;\n cases: LoadedCase[];\n goal?: string;\n output: string;\n}): Promise<CompositionState> {\n const { branchOn, cases, goal, output } = opts;\n\n // 変数分析\n const varAnalysis = analyzeVariables(cases);\n displayVariableMergePreview(varAnalysis, branchOn);\n const resolutions = await resolveVariableConflicts(varAnalysis);\n\n // Settings 解決\n const settingsDiffs = diffSettings(cases);\n const settings = await resolveSettings(settingsDiffs, cases, cases[0].runbook.settings);\n\n const mergedVars = mergeVariables(\n varAnalysis,\n resolutions,\n branchOn,\n cases.map((c) => c.match),\n );\n\n const title = goal ?? cases[0].runbook.title;\n\n return {\n branchOn,\n cases,\n goal,\n output,\n mergedVariables: mergedVars,\n settings,\n metadata: {\n ...cases[0].runbook.metadata,\n goal: goal ?? cases[0].runbook.metadata.goal,\n },\n title,\n };\n}\n","/**\n * compose CLI エントリポイント\n *\n * 複数の生成済み手順書を1つの分岐付き手順書に対話的に合成する。\n * CLI 引数はプリフィルとして使用し、未指定分はプロンプトで収集。\n */\n\nimport { initLocale, t, tf } from \"../i18n\";\nimport { intro, outro } from \"../cli/prompts\";\nimport { parseComposeArgs } from \"./config\";\nimport { buildComposedRunbook, validateAndWriteYaml } from \"./composer\";\nimport {\n gatherBranchVariable,\n gatherCasesInteractively,\n loadProvidedCases,\n gatherGoal,\n buildState,\n editLoop,\n} from \"./interactive\";\n\nconst config = parseComposeArgs();\ninitLocale(config.locale);\nintro(t(\"compose.title\"));\n\ntry {\n // Phase 1: 入力収集(CLI 引数はプリフィル)\n const branchOn = config.branchOn ?? (await gatherBranchVariable());\n const cases =\n config.cases.length > 0\n ? await loadProvidedCases(config.cases)\n : await gatherCasesInteractively();\n const goal = config.goal ?? (await gatherGoal(cases[0]?.runbook.title));\n\n // Phase 2 & 3: 変数競合解決 + Settings 解決\n const state = await buildState({ branchOn, cases, goal, output: config.output });\n\n // Phase 4: プレビュー + 編集ループ\n await editLoop(state);\n\n // Phase 5: 書き出し\n const composed = buildComposedRunbook(state);\n const outputPath = await validateAndWriteYaml(composed, config.output);\n outro(tf(\"compose.complete\", { path: outputPath }));\n} catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`合成失敗: ${msg}`);\n process.exit(1);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/compose/config.ts","../../../src/compose/composer.ts","../../../src/compose/interactive.ts","../../../src/compose/index.ts"],"sourcesContent":["/**\n * compose CLI 引数パース\n *\n * 対話式フローでは全引数を optional に。--output のみ必須。\n * CLI 引数はプリフィルとして使用し、未指定分はプロンプトで収集。\n */\n\nimport { parseArgs } from \"node:util\";\n\nexport interface ComposeConfig {\n /** 分岐条件の変数名(未指定時はプロンプトで収集) */\n branchOn?: string;\n /** \"match:yamlPath\" のペア(未指定時はプロンプトで収集) */\n cases: { match: string; yamlPath: string }[];\n /** 合成後のゴール */\n goal?: string;\n /** 出力先 YAML パス */\n output: string;\n /** ロケール */\n locale?: string;\n}\n\nexport function parseComposeArgs(): ComposeConfig {\n const { values } = parseArgs({\n options: {\n \"branch-on\": { type: \"string\" },\n case: { type: \"string\", multiple: true },\n goal: { type: \"string\" },\n output: { type: \"string\" },\n locale: { type: \"string\" },\n },\n strict: false,\n });\n\n const output = values[\"output\"] as string | undefined;\n if (!output) {\n console.error(\"--output is required\");\n process.exit(1);\n }\n\n const caseArgs = (values[\"case\"] as string[] | undefined) ?? [];\n const cases = caseArgs.map((c) => {\n const colonIdx = c.indexOf(\":\");\n if (colonIdx === -1) {\n console.error(`Invalid --case format: \"${c}\" (expected match:yamlPath)`);\n process.exit(1);\n }\n return {\n match: c.slice(0, colonIdx),\n yamlPath: c.slice(colonIdx + 1),\n };\n });\n\n return {\n branchOn: values[\"branch-on\"] as string | undefined,\n cases,\n goal: values[\"goal\"] as string | undefined,\n output,\n locale: values[\"locale\"] as string | undefined,\n };\n}\n","/**\n * composer — 複数の手順書 YAML を1つの分岐付き手順書に合成する純粋関数群\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { parse, stringify } from \"yaml\";\nimport { ParsedRunbookSchema, VariableDefinitionSchema } from \"../schemas/runbook-schema\";\nimport type { z } from \"zod\";\n\n// ── 型定義 ──\n\nexport type ParsedRunbook = z.infer<typeof ParsedRunbookSchema>;\nexport type VariableDefinition = z.infer<typeof VariableDefinitionSchema>;\n\nexport interface LoadedCase {\n match: string;\n yamlPath: string;\n runbook: ParsedRunbook;\n}\n\nexport interface VariableConflict {\n name: string;\n definitions: { caseName: string; def: VariableDefinition }[];\n}\n\nexport interface VariableMergeResult {\n /** 全ケースで定義一致の変数 */\n shared: Record<string, VariableDefinition>;\n /** ケース間で定義が異なる変数 */\n conflicts: VariableConflict[];\n /** 特定ケースにのみ存在する変数 */\n caseSpecific: { caseName: string; name: string; def: VariableDefinition }[];\n}\n\nexport interface SettingsDiff {\n key: string;\n values: { caseName: string; value: unknown }[];\n}\n\nexport interface CompositionState {\n branchOn: string;\n cases: LoadedCase[];\n goal?: string;\n output: string;\n mergedVariables: Record<string, VariableDefinition>;\n settings: ParsedRunbook[\"settings\"];\n metadata: ParsedRunbook[\"metadata\"];\n title: string;\n}\n\n// ── 純粋関数 ──\n\n/**\n * 単一ケースの読み込み・バリデーション\n */\nexport async function loadCase(match: string, yamlPath: string): Promise<LoadedCase> {\n const raw = await readFile(yamlPath, \"utf-8\");\n const doc = parse(raw);\n const runbook = ParsedRunbookSchema.parse(doc);\n return { match, yamlPath, runbook };\n}\n\n/**\n * VariableDefinition を正規化して比較用にする。\n * Zod のデフォルト値(required: true, sensitive: false)を埋めた上でフィールド単位比較。\n */\nfunction normalizeVarDef(def: VariableDefinition): VariableDefinition {\n return {\n source: def.source,\n required: def.required ?? true,\n sensitive: def.sensitive ?? false,\n ...(def.description !== undefined ? { description: def.description } : {}),\n ...(def.value !== undefined ? { value: def.value } : {}),\n ...(def.expression !== undefined ? { expression: def.expression } : {}),\n ...(def.envKey !== undefined ? { envKey: def.envKey } : {}),\n };\n}\n\nfunction varDefsEqual(a: VariableDefinition, b: VariableDefinition): boolean {\n const na = normalizeVarDef(a);\n const nb = normalizeVarDef(b);\n return (\n na.source === nb.source &&\n na.required === nb.required &&\n na.sensitive === nb.sensitive &&\n na.description === nb.description &&\n na.value === nb.value &&\n na.expression === nb.expression &&\n na.envKey === nb.envKey\n );\n}\n\n/**\n * 変数を分析(共通/競合/ケース固有に分類)\n */\nexport function analyzeVariables(cases: LoadedCase[]): VariableMergeResult {\n // 各変数名がどのケースに定義されているか収集\n const varMap = new Map<string, { caseName: string; def: VariableDefinition }[]>();\n for (const lc of cases) {\n if (!lc.runbook.variables) continue;\n for (const [name, def] of Object.entries(lc.runbook.variables)) {\n const existing = varMap.get(name) ?? [];\n existing.push({ caseName: lc.match, def });\n varMap.set(name, existing);\n }\n }\n\n const shared: Record<string, VariableDefinition> = {};\n const conflicts: VariableConflict[] = [];\n const caseSpecific: { caseName: string; name: string; def: VariableDefinition }[] = [];\n\n for (const [name, entries] of varMap) {\n if (entries.length === 1) {\n // 1つのケースにのみ存在\n caseSpecific.push({ caseName: entries[0].caseName, name, def: entries[0].def });\n } else if (entries.length === cases.length) {\n // 全ケースに存在 → 定義が一致するか確認\n const allEqual = entries.every((e) => varDefsEqual(e.def, entries[0].def));\n if (allEqual) {\n shared[name] = entries[0].def;\n } else {\n conflicts.push({ name, definitions: entries });\n }\n } else {\n // 一部のケースにのみ存在(2ケース以上だが全ケースではない)\n // これも競合として扱う\n conflicts.push({ name, definitions: entries });\n }\n }\n\n return { shared, conflicts, caseSpecific };\n}\n\n/**\n * 競合解決マップ付きで変数をマージ。\n * resolutions: 競合変数名 → 採用する定義のマップ\n */\nexport function mergeVariables(\n analysis: VariableMergeResult,\n resolutions: Map<string, VariableDefinition>,\n branchOn: string,\n caseMatches: string[],\n): Record<string, VariableDefinition> {\n const merged: Record<string, VariableDefinition> = {};\n\n // 共通変数\n for (const [name, def] of Object.entries(analysis.shared)) {\n merged[name] = def;\n }\n\n // 競合変数(解決マップから採用)\n for (const conflict of analysis.conflicts) {\n const resolved = resolutions.get(conflict.name);\n if (resolved) {\n merged[conflict.name] = resolved;\n } else {\n // 解決がない場合は最初のケースの定義を使用\n merged[conflict.name] = conflict.definitions[0].def;\n }\n }\n\n // ケース固有変数\n for (const cs of analysis.caseSpecific) {\n merged[cs.name] = cs.def;\n }\n\n // 分岐変数を追加(まだ含まれていなければ)\n if (!(branchOn in merged)) {\n merged[branchOn] = {\n source: \"prompt\",\n description: `分岐条件 (${caseMatches.join(\", \")})`,\n required: true,\n sensitive: false,\n };\n }\n\n return merged;\n}\n\n/**\n * Settings の差分検出。全ケースで同じ値なら空配列。\n */\nexport function diffSettings(cases: LoadedCase[]): SettingsDiff[] {\n if (cases.length <= 1) return [];\n\n const diffs: SettingsDiff[] = [];\n const keys = [\"baseUrl\", \"defaultTimeout\", \"pauseBetweenSteps\", \"stopOnError\"] as const;\n\n for (const key of keys) {\n const values = cases.map((lc) => ({\n caseName: lc.match,\n value: lc.runbook.settings[key],\n }));\n\n const allSame = values.every((v) => v.value === values[0].value);\n if (!allSame) {\n diffs.push({ key, values });\n }\n }\n\n return diffs;\n}\n\n/**\n * 合成済み runbook オブジェクト構築(I/O なし)\n */\nexport function buildComposedRunbook(state: CompositionState): Record<string, unknown> {\n const base = state.cases[0].runbook;\n\n const branchStep = {\n ordinal: 0,\n description: state.goal ?? `${state.branchOn} に応じた分岐`,\n action: { type: \"memory\" },\n url: state.metadata.startUrl,\n riskLevel: \"low\",\n requiresConfirmation: false,\n branches: {\n value: `{{${state.branchOn}}}`,\n cases: state.cases.map((lc) => ({\n match: lc.match,\n steps: lc.runbook.steps.map((s, i) => ({\n ...s,\n ordinal: i,\n })),\n })),\n },\n };\n\n return {\n title: state.title,\n ...(base.naturalLanguageSummary ? { naturalLanguageSummary: base.naturalLanguageSummary } : {}),\n settings: state.settings,\n metadata: {\n ...state.metadata,\n totalSteps: 1,\n generatedAt: new Date().toISOString(),\n },\n steps: [branchStep],\n context: base.context ?? \"\",\n variables: state.mergedVariables,\n };\n}\n\n/**\n * Zod バリデーション + YAML 書き出し\n */\nexport async function validateAndWriteYaml(\n composed: Record<string, unknown>,\n outputPath: string,\n): Promise<string> {\n ParsedRunbookSchema.parse(composed);\n const yamlContent = stringify(composed, { lineWidth: 120 });\n await writeFile(outputPath, yamlContent, \"utf-8\");\n return outputPath;\n}\n\n/**\n * 変数定義の表示文字列を生成\n */\nexport function formatVariableDef(def: VariableDefinition): string {\n const parts = [`source: ${def.source}`];\n if (def.value !== undefined) parts.push(`value: \"${def.value}\"`);\n if (def.envKey !== undefined) parts.push(`envKey: ${def.envKey}`);\n if (def.expression !== undefined) parts.push(`expression: ${def.expression}`);\n return parts.join(\", \");\n}\n","/**\n * compose/interactive — 対話ロジック(収集・競合解決・プレビュー・編集ループ)\n *\n * composer.ts の純粋関数を呼び出しつつ、@clack/prompts でユーザーと対話する。\n */\n\nimport { t, tf } from \"../i18n\";\nimport { log, note, promptConfirm, promptSelect, promptText } from \"../cli/prompts\";\nimport type {\n CompositionState,\n LoadedCase,\n VariableConflict,\n VariableDefinition,\n VariableMergeResult,\n SettingsDiff,\n ParsedRunbook,\n} from \"./composer\";\nimport { loadCase, formatVariableDef, analyzeVariables, mergeVariables, diffSettings } from \"./composer\";\n\n// ── Phase 1: 入力収集 ──\n\n/**\n * 分岐変数名をプロンプトで取得\n */\nexport async function gatherBranchVariable(): Promise<string> {\n return promptText(t(\"compose.branchVarPrompt\"), {\n validate: (v) => (!v?.trim() ? t(\"compose.branchVarPrompt\") : undefined),\n });\n}\n\n/**\n * 対話的にケースを1つずつ追加\n */\nexport async function gatherCasesInteractively(): Promise<LoadedCase[]> {\n const cases: LoadedCase[] = [];\n\n // 最低2ケース必要\n while (cases.length < 2 || (await promptConfirm(t(\"compose.addAnotherCase\"), false))) {\n const yamlPath = await promptText(t(\"compose.yamlPathPrompt\"), {\n validate: (v) => (!v?.trim() ? t(\"compose.yamlPathPrompt\") : undefined),\n });\n const match = await promptText(t(\"compose.matchValuePrompt\"), {\n validate: (v) => (!v?.trim() ? t(\"compose.matchValuePrompt\") : undefined),\n });\n\n const loaded = await loadCase(match, yamlPath);\n const varCount = loaded.runbook.variables\n ? Object.keys(loaded.runbook.variables).length\n : 0;\n log.success(\n tf(\"compose.caseLoaded\", {\n title: loaded.runbook.title,\n steps: loaded.runbook.steps.length,\n vars: varCount,\n }),\n );\n cases.push(loaded);\n }\n\n return cases;\n}\n\n/**\n * CLI 引数で指定されたケースを一括ロード\n */\nexport async function loadProvidedCases(\n caseDefs: { match: string; yamlPath: string }[],\n): Promise<LoadedCase[]> {\n const cases: LoadedCase[] = [];\n for (const c of caseDefs) {\n const loaded = await loadCase(c.match, c.yamlPath);\n const varCount = loaded.runbook.variables\n ? Object.keys(loaded.runbook.variables).length\n : 0;\n log.success(\n tf(\"compose.caseLoaded\", {\n title: loaded.runbook.title,\n steps: loaded.runbook.steps.length,\n vars: varCount,\n }),\n );\n cases.push(loaded);\n }\n return cases;\n}\n\n/**\n * ゴールをプロンプトで取得\n */\nexport async function gatherGoal(defaultGoal?: string): Promise<string | undefined> {\n const goal = await promptText(t(\"compose.goalPrompt\"), {\n initialValue: defaultGoal,\n placeholder: defaultGoal,\n });\n return goal.trim() || undefined;\n}\n\n// ── Phase 2: 変数競合解決 ──\n\n/**\n * 変数マージプレビューを表示\n */\nexport function displayVariableMergePreview(\n analysis: VariableMergeResult,\n branchOn: string,\n): void {\n const lines: string[] = [];\n\n // 共通変数\n const sharedEntries = Object.entries(analysis.shared);\n if (sharedEntries.length > 0) {\n lines.push(t(\"compose.sharedVariables\"));\n for (const [name, def] of sharedEntries) {\n lines.push(` ${name} → ${formatVariableDef(def)}`);\n }\n lines.push(\"\");\n }\n\n // 競合変数\n if (analysis.conflicts.length > 0) {\n lines.push(t(\"compose.conflictingVariables\"));\n for (const conflict of analysis.conflicts) {\n lines.push(` ${conflict.name}`);\n for (const d of conflict.definitions) {\n lines.push(` [${d.caseName}] ${formatVariableDef(d.def)}`);\n }\n }\n lines.push(\"\");\n }\n\n // ケース固有変数\n if (analysis.caseSpecific.length > 0) {\n lines.push(t(\"compose.caseSpecificVariables\"));\n for (const cs of analysis.caseSpecific) {\n lines.push(` [${cs.caseName}] ${cs.name} → ${formatVariableDef(cs.def)}`);\n }\n lines.push(\"\");\n }\n\n // 分岐変数\n lines.push(t(\"compose.branchVariable\"));\n lines.push(` ${branchOn} → source: prompt`);\n\n note(lines.join(\"\\n\"), t(\"compose.variableMergePreview\"));\n}\n\n/**\n * 競合変数の解決をユーザーに問う\n */\nexport async function resolveVariableConflicts(\n analysis: VariableMergeResult,\n): Promise<Map<string, VariableDefinition>> {\n const resolutions = new Map<string, VariableDefinition>();\n\n for (const conflict of analysis.conflicts) {\n const options = conflict.definitions.map((d) => ({\n value: d.caseName,\n label: tf(\"compose.useFromCase\", { case: d.caseName }),\n hint: formatVariableDef(d.def),\n }));\n\n const chosen = await promptSelect(\n tf(\"compose.conflictPrompt\", { name: conflict.name }),\n options,\n );\n\n const selected = conflict.definitions.find((d) => d.caseName === chosen);\n if (selected) {\n resolutions.set(conflict.name, selected.def);\n }\n }\n\n return resolutions;\n}\n\n// ── Phase 3: Settings 解決 ──\n\n/**\n * Settings の差分をユーザーに問う\n */\nexport async function resolveSettings(\n diffs: SettingsDiff[],\n cases: LoadedCase[],\n baseSettings: ParsedRunbook[\"settings\"],\n): Promise<ParsedRunbook[\"settings\"]> {\n const settings = { ...baseSettings };\n\n for (const diff of diffs) {\n const options = diff.values.map((v) => ({\n value: v.caseName,\n label: tf(\"compose.useFromCase\", { case: v.caseName }),\n hint: `${diff.key} = ${JSON.stringify(v.value)}`,\n }));\n\n const chosen = await promptSelect(\n tf(\"compose.settingsDiffPrompt\", { key: diff.key }),\n options,\n );\n\n const selectedCase = cases.find((c) => c.match === chosen);\n if (selectedCase) {\n (settings as Record<string, unknown>)[diff.key] =\n selectedCase.runbook.settings[diff.key as keyof typeof settings];\n }\n }\n\n return settings;\n}\n\n// ── Phase 4: プレビュー + 編集ループ ──\n\n/**\n * 合成結果のプレビューを表示\n */\nfunction displayPreview(state: CompositionState): void {\n const lines: string[] = [];\n lines.push(`Title: ${state.title}`);\n lines.push(`Branch: {{${state.branchOn}}}`);\n lines.push(\n `Cases: ${state.cases.map((c) => `${c.match} (${c.runbook.steps.length} steps)`).join(\", \")}`,\n );\n lines.push(\"\");\n\n const varEntries = Object.entries(state.mergedVariables);\n lines.push(`Variables (${varEntries.length}):`);\n for (const [name, def] of varEntries) {\n const isBranch = name === state.branchOn ? \" (branch)\" : \"\";\n lines.push(` ${name} → ${formatVariableDef(def)}${isBranch}`);\n }\n lines.push(\"\");\n\n lines.push(\"Settings:\");\n lines.push(` baseUrl: ${state.settings.baseUrl}`);\n lines.push(` defaultTimeout: ${state.settings.defaultTimeout}`);\n\n note(lines.join(\"\\n\"), t(\"compose.composedPreview\"));\n}\n\ntype EditAction = \"confirm\" | \"editBranch\" | \"editMatches\" | \"editVariables\" | \"editTitle\";\n\n/**\n * 編集ループ — ユーザーが「確定」を選ぶまで繰り返す\n */\nexport async function editLoop(state: CompositionState): Promise<void> {\n while (true) {\n displayPreview(state);\n\n const action = await promptSelect<EditAction>(t(\"compose.selectAction\"), [\n { value: \"confirm\", label: t(\"compose.confirm\"), hint: t(\"compose.confirmHint\") },\n { value: \"editBranch\", label: t(\"compose.editBranch\") },\n { value: \"editMatches\", label: t(\"compose.editMatches\") },\n { value: \"editVariables\", label: t(\"compose.editVariables\") },\n { value: \"editTitle\", label: t(\"compose.editTitle\") },\n ]);\n\n if (action === \"confirm\") break;\n\n switch (action) {\n case \"editBranch\":\n await handleEditBranch(state);\n break;\n case \"editMatches\":\n await handleEditMatches(state);\n break;\n case \"editVariables\":\n await handleEditVariables(state);\n break;\n case \"editTitle\":\n await handleEditTitle(state);\n break;\n }\n }\n}\n\nasync function handleEditBranch(state: CompositionState): Promise<void> {\n const oldBranch = state.branchOn;\n const newBranch = await promptText(t(\"compose.newBranchVar\"), {\n initialValue: oldBranch,\n validate: (v) => (!v?.trim() ? t(\"compose.branchVarPrompt\") : undefined),\n });\n\n if (newBranch !== oldBranch) {\n // mergedVariables のキーを付け替え\n const branchDef = state.mergedVariables[oldBranch];\n if (branchDef) {\n delete state.mergedVariables[oldBranch];\n state.mergedVariables[newBranch] = branchDef;\n }\n state.branchOn = newBranch;\n }\n}\n\nasync function handleEditMatches(state: CompositionState): Promise<void> {\n const options = state.cases.map((c) => ({\n value: c.match,\n label: c.match,\n hint: c.runbook.title,\n }));\n\n const selected = await promptSelect(t(\"compose.selectCase\"), options);\n const caseObj = state.cases.find((c) => c.match === selected);\n if (!caseObj) return;\n\n const newMatch = await promptText(t(\"compose.newMatchValue\"), {\n initialValue: caseObj.match,\n validate: (v) => (!v?.trim() ? t(\"compose.matchValuePrompt\") : undefined),\n });\n caseObj.match = newMatch;\n\n // 分岐変数の description を更新\n const branchDef = state.mergedVariables[state.branchOn];\n if (branchDef) {\n branchDef.description = `分岐条件 (${state.cases.map((c) => c.match).join(\", \")})`;\n }\n}\n\ntype VarAction = \"delete\" | \"add\" | \"edit\";\n\nasync function handleEditVariables(state: CompositionState): Promise<void> {\n const action = await promptSelect<VarAction>(t(\"compose.editVarAction\"), [\n { value: \"delete\", label: t(\"compose.deleteVar\") },\n { value: \"add\", label: t(\"compose.addVar\") },\n { value: \"edit\", label: t(\"compose.editVarDef\") },\n ]);\n\n const varNames = Object.keys(state.mergedVariables).filter((n) => n !== state.branchOn);\n\n switch (action) {\n case \"delete\": {\n if (varNames.length === 0) return;\n const toDelete = await promptSelect(\n t(\"compose.selectVar\"),\n varNames.map((n) => ({\n value: n,\n label: n,\n hint: formatVariableDef(state.mergedVariables[n]),\n })),\n );\n delete state.mergedVariables[toDelete];\n log.success(tf(\"compose.varDeleted\", { name: toDelete }));\n break;\n }\n case \"add\": {\n const name = await promptText(t(\"compose.newVarName\"), {\n validate: (v) => {\n if (!v?.trim()) return t(\"compose.newVarName\");\n if (v.trim() === state.branchOn)\n return tf(\"compose.branchVarConflict\", { name: v.trim() });\n return undefined;\n },\n });\n const source = await promptSelect(t(\"compose.newVarSource\"), [\n { value: \"prompt\", label: \"prompt\" },\n { value: \"fixed\", label: \"fixed\" },\n { value: \"env\", label: \"env\" },\n { value: \"context\", label: \"context\" },\n { value: \"expression\", label: \"expression\" },\n { value: \"data\", label: \"data\" },\n ]);\n const value = await promptText(t(\"compose.newVarValue\"));\n const description = await promptText(t(\"compose.newVarDescription\"));\n state.mergedVariables[name] = {\n source: source as VariableDefinition[\"source\"],\n required: true,\n sensitive: false,\n ...(value.trim() ? { value: value.trim() } : {}),\n ...(description.trim() ? { description: description.trim() } : {}),\n };\n log.success(tf(\"compose.varAdded\", { name }));\n break;\n }\n case \"edit\": {\n if (varNames.length === 0) return;\n const toEdit = await promptSelect(\n t(\"compose.selectVar\"),\n varNames.map((n) => ({\n value: n,\n label: n,\n hint: formatVariableDef(state.mergedVariables[n]),\n })),\n );\n const currentDef = state.mergedVariables[toEdit];\n const newSource = await promptSelect(t(\"compose.newVarSource\"), [\n { value: \"prompt\", label: \"prompt\" },\n { value: \"fixed\", label: \"fixed\" },\n { value: \"env\", label: \"env\" },\n { value: \"context\", label: \"context\" },\n { value: \"expression\", label: \"expression\" },\n { value: \"data\", label: \"data\" },\n ]);\n const newValue = await promptText(t(\"compose.newVarValue\"), {\n initialValue: currentDef.value ?? \"\",\n });\n const newDesc = await promptText(t(\"compose.newVarDescription\"), {\n initialValue: currentDef.description ?? \"\",\n });\n state.mergedVariables[toEdit] = {\n source: newSource as VariableDefinition[\"source\"],\n required: currentDef.required,\n sensitive: currentDef.sensitive,\n ...(newValue.trim() ? { value: newValue.trim() } : {}),\n ...(newDesc.trim() ? { description: newDesc.trim() } : {}),\n };\n log.success(tf(\"compose.varUpdated\", { name: toEdit }));\n break;\n }\n }\n}\n\nasync function handleEditTitle(state: CompositionState): Promise<void> {\n const newTitle = await promptText(t(\"compose.newTitle\"), {\n initialValue: state.title,\n validate: (v) => (!v?.trim() ? t(\"compose.newTitle\") : undefined),\n });\n state.title = newTitle;\n state.goal = newTitle;\n state.metadata = { ...state.metadata, goal: newTitle };\n}\n\n// ── ヘルパー: 状態構築の再利用 ──\n\n/**\n * 変数分析・競合解決・Settings 解決を経て CompositionState を構築する\n */\nexport async function buildState(opts: {\n branchOn: string;\n cases: LoadedCase[];\n goal?: string;\n output: string;\n}): Promise<CompositionState> {\n const { branchOn, cases, goal, output } = opts;\n\n // 変数分析\n const varAnalysis = analyzeVariables(cases);\n displayVariableMergePreview(varAnalysis, branchOn);\n const resolutions = await resolveVariableConflicts(varAnalysis);\n\n // Settings 解決\n const settingsDiffs = diffSettings(cases);\n const settings = await resolveSettings(settingsDiffs, cases, cases[0].runbook.settings);\n\n const mergedVars = mergeVariables(\n varAnalysis,\n resolutions,\n branchOn,\n cases.map((c) => c.match),\n );\n\n const title = goal ?? cases[0].runbook.title;\n\n return {\n branchOn,\n cases,\n goal,\n output,\n mergedVariables: mergedVars,\n settings,\n metadata: {\n ...cases[0].runbook.metadata,\n goal: goal ?? cases[0].runbook.metadata.goal,\n },\n title,\n };\n}\n","/**\n * compose CLI エントリポイント\n *\n * 複数の生成済み手順書を1つの分岐付き手順書に対話的に合成する。\n * CLI 引数はプリフィルとして使用し、未指定分はプロンプトで収集。\n */\n\nimport { initLocale, t, tf } from \"../i18n\";\nimport { intro, outro } from \"../cli/prompts\";\nimport { parseComposeArgs } from \"./config\";\nimport { buildComposedRunbook, validateAndWriteYaml } from \"./composer\";\nimport {\n gatherBranchVariable,\n gatherCasesInteractively,\n loadProvidedCases,\n gatherGoal,\n buildState,\n editLoop,\n} from \"./interactive\";\n\nconst config = parseComposeArgs();\ninitLocale(config.locale);\nintro(t(\"compose.title\"));\n\ntry {\n // Phase 1: 入力収集(CLI 引数はプリフィル)\n const branchOn = config.branchOn ?? (await gatherBranchVariable());\n const cases =\n config.cases.length > 0\n ? await loadProvidedCases(config.cases)\n : await gatherCasesInteractively();\n const goal = config.goal ?? (await gatherGoal(cases[0]?.runbook.title));\n\n // Phase 2 & 3: 変数競合解決 + Settings 解決\n const state = await buildState({ branchOn, cases, goal, output: config.output });\n\n // Phase 4: プレビュー + 編集ループ\n await editLoop(state);\n\n // Phase 5: 書き出し\n const composed = buildComposedRunbook(state);\n const outputPath = await validateAndWriteYaml(composed, config.output);\n outro(tf(\"compose.complete\", { path: outputPath }));\n} catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`合成失敗: ${msg}`);\n process.exit(1);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-2H7UOFLK.js";
|
|
3
|
+
|
|
4
|
+
// src/harness/extraction-prompt.ts
|
|
5
|
+
var EXTRACT_SYSTEM_PROMPT = `\u3042\u306A\u305F\u306FWeb\u30DA\u30FC\u30B8\u304B\u3089\u30C7\u30FC\u30BF\u3092\u62BD\u51FA\u3059\u308BAI\u3067\u3059\u3002
|
|
6
|
+
|
|
7
|
+
## \u30EB\u30FC\u30EB
|
|
8
|
+
- \u62BD\u51FA\u6307\u793A\uFF08extractPrompt\uFF09\u306E\u610F\u56F3\u3092\u6B63\u78BA\u306B\u89E3\u91C8\u3057\u3001\u6307\u793A\u306B\u5408\u81F4\u3059\u308B\u30C7\u30FC\u30BF\u306E\u307F\u3092\u62BD\u51FA\u3059\u308B\u3053\u3068
|
|
9
|
+
- \u300C\u62BD\u51FA\u306E\u76EE\u6A19\u300D\u304C\u63D0\u4F9B\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001extractPrompt \u306E\u6307\u793A\u3068\u76EE\u6A19\u306E\u4E21\u65B9\u306B\u5408\u81F4\u3059\u308B\u30C7\u30FC\u30BF\u306E\u307F\u3092\u62BD\u51FA\u3059\u308B\u3053\u3068\u3002extractPrompt \u306E\u30B9\u30B3\u30FC\u30D7\u304C\u76EE\u6A19\u3088\u308A\u5E83\u3044\u5834\u5408\u306F\u3001\u76EE\u6A19\u306E\u30B9\u30B3\u30FC\u30D7\u3092\u512A\u5148\u3059\u308B\u3053\u3068
|
|
10
|
+
- \u62BD\u51FA\u6307\u793A\u306B\u30B9\u30B3\u30FC\u30D7\u6761\u4EF6\uFF08\u7279\u5B9A\u30AB\u30C6\u30B4\u30EA\u30FB\u30AD\u30FC\u30EF\u30FC\u30C9\u30FB\u7BC4\u56F2\u7B49\uFF09\u304C\u542B\u307E\u308C\u308B\u5834\u5408\u3001\u6761\u4EF6\u306B\u5408\u81F4\u3059\u308B\u30EC\u30B3\u30FC\u30C9\u306E\u307F\u3092\u8FD4\u3057\u3001\u6761\u4EF6\u5916\u306E\u30C7\u30FC\u30BF\u306F\u9664\u5916\u3059\u308B\u3053\u3068
|
|
11
|
+
- \u5168\u30EC\u30B3\u30FC\u30C9\u304C\u540C\u4E00\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u69CB\u6210\u3092\u6301\u3064\u3053\u3068\u3092\u78BA\u8A8D\u3059\u308B\u3053\u3068\u3002\u6307\u793A\u304C\u6C42\u3081\u308B\u69CB\u9020\u306B\u5408\u308F\u306A\u3044\u30EC\u30B3\u30FC\u30C9\uFF08\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u5927\u534A\u304C\u7A7A\u306A\u3069\uFF09\u306F\u542B\u3081\u306A\u3044\u3053\u3068
|
|
12
|
+
- \u540C\u4E00\u30AB\u30E9\u30E0\u5185\u306E\u5024\u306F\u4E00\u8CAB\u3057\u305F\u5F62\u5F0F\u30FB\u30D1\u30BF\u30FC\u30F3\u3092\u6301\u3064\u3053\u3068\u3002\u4ED6\u306E\u884C\u3068\u660E\u3089\u304B\u306B\u7570\u306A\u308B\u5F62\u5F0F\u306E\u5024\u3092\u6301\u3064\u884C\uFF08\u4F8B: \u6570\u5024\u30AB\u30E9\u30E0\u306B\u30C6\u30AD\u30B9\u30C8\u6587\u3001\u77ED\u3044\u540D\u79F0\u30AB\u30E9\u30E0\u306B\u9577\u6587\u306A\u3069\uFF09\u306F\u30CE\u30A4\u30BA\u3068\u3057\u3066\u9664\u5916\u3059\u308B\u3053\u3068
|
|
13
|
+
- \u7D50\u679C\u306FJSON\u914D\u5217\u5F62\u5F0F\u3067\u8FD4\u3059\u3053\u3068`;
|
|
14
|
+
export {
|
|
15
|
+
EXTRACT_SYSTEM_PROMPT
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=extraction-prompt-VDCKIFLB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harness/extraction-prompt.ts"],"sourcesContent":["/**\n * AI extraction (extractPrompt) 用のシステムプロンプト。\n * executor / generator 両方の trackedGenerateObject(\"extraction\", ...) で共有。\n */\nexport const EXTRACT_SYSTEM_PROMPT = `あなたはWebページからデータを抽出するAIです。\n\n## ルール\n- 抽出指示(extractPrompt)の意図を正確に解釈し、指示に合致するデータのみを抽出すること\n- 「抽出の目標」が提供されている場合、extractPrompt の指示と目標の両方に合致するデータのみを抽出すること。extractPrompt のスコープが目標より広い場合は、目標のスコープを優先すること\n- 抽出指示にスコープ条件(特定カテゴリ・キーワード・範囲等)が含まれる場合、条件に合致するレコードのみを返し、条件外のデータは除外すること\n- 全レコードが同一のフィールド構成を持つことを確認すること。指示が求める構造に合わないレコード(フィールドの大半が空など)は含めないこと\n- 同一カラム内の値は一貫した形式・パターンを持つこと。他の行と明らかに異なる形式の値を持つ行(例: 数値カラムにテキスト文、短い名称カラムに長文など)はノイズとして除外すること\n- 結果はJSON配列形式で返すこと`;\n"],"mappings":";;;;AAIO,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
|
|
@@ -2,26 +2,28 @@
|
|
|
2
2
|
import {
|
|
3
3
|
checkHelpFlag,
|
|
4
4
|
parseModelConfig
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-A5X2VF5G.js";
|
|
6
6
|
import {
|
|
7
7
|
generatePatch
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-MYITSQYV.js";
|
|
9
9
|
import "./chunk-D5SI2PHK.js";
|
|
10
10
|
import {
|
|
11
11
|
cancel,
|
|
12
|
-
initLocale,
|
|
13
12
|
intro,
|
|
14
13
|
log,
|
|
15
14
|
outro,
|
|
16
15
|
promptConfirm,
|
|
17
|
-
promptSelect
|
|
18
|
-
|
|
19
|
-
tf
|
|
20
|
-
} from "./chunk-7UCVPKD4.js";
|
|
16
|
+
promptSelect
|
|
17
|
+
} from "./chunk-NRKZJVPE.js";
|
|
21
18
|
import {
|
|
22
19
|
initModel
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-KFNW4XR2.js";
|
|
21
|
+
import "./chunk-LZDZGI4M.js";
|
|
22
|
+
import {
|
|
23
|
+
initLocale,
|
|
24
|
+
t,
|
|
25
|
+
tf
|
|
26
|
+
} from "./chunk-6FGCPMBU.js";
|
|
25
27
|
import "./chunk-2H7UOFLK.js";
|
|
26
28
|
|
|
27
29
|
// src/fix-runbook/index.ts
|
|
@@ -291,4 +293,4 @@ main().catch((error) => {
|
|
|
291
293
|
}
|
|
292
294
|
process.exit(1);
|
|
293
295
|
});
|
|
294
|
-
//# sourceMappingURL=fix-runbook-
|
|
296
|
+
//# sourceMappingURL=fix-runbook-6L5ZMA5G.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fix-runbook/index.ts","../../../src/fix-runbook/config.ts","../../../src/fix-runbook/report-parser.ts"],"sourcesContent":["/**\n * fix-runbook CLI — レポートから修正提案を抽出し、runbook YAML に適用する\n *\n * Usage:\n * pnpm fix-runbook -- \\\n * --runbook ./runbooks/login-flow.yaml \\\n * --report ./runbooks/login-flow-report.md\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { parseArgs } from \"./config\";\nimport { initModel } from \"../harness/ai-model\";\nimport { extractSuggestions, type ExtractedSuggestion } from \"./report-parser\";\nimport { generatePatch } from \"./yaml-patcher\";\nimport { intro, outro, log, cancel, promptSelect, promptConfirm } from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\n\nasync function main() {\n const config = await parseArgs();\n await initModel(config.aiModelConfig);\n\n intro(\"fix-runbook\");\n log.info(`Runbook: ${config.runbookPath}`);\n log.info(`Report: ${config.reportPath}`);\n\n // レポートからAI Agent Summaryを読み取り、修正提案を抽出\n const reportContent = await readFile(config.reportPath, \"utf-8\");\n const suggestions = extractSuggestions(reportContent);\n\n if (suggestions.length === 0) {\n log.warn(t(\"fix.noSuggestions\"));\n log.info(t(\"fix.noSuggestionsHint\"));\n outro(t(\"fix.complete\"));\n return;\n }\n\n log.info(tf(\"fix.suggestionCount\", { count: suggestions.length }));\n\n // runbook YAML を読み込み\n const originalYaml = await readFile(config.runbookPath, \"utf-8\");\n\n // 各提案を対話的に処理\n const appliedSuggestions: ExtractedSuggestion[] = [];\n let currentYaml = originalYaml;\n\n for (const suggestion of suggestions) {\n log.step(`Step #${suggestion.stepOrdinal}: ${suggestion.description}`);\n log.info(tf(\"fix.errorLabel\", { error: suggestion.error }));\n if (suggestion.category) {\n log.info(tf(\"fix.categoryLabel\", { category: suggestion.category }));\n }\n if (suggestion.yamlFix) {\n log.info(tf(\"fix.yamlFixLabel\", { fix: suggestion.yamlFix }));\n }\n if (suggestion.contextFix) {\n log.info(tf(\"fix.contextFixLabel\", { fix: suggestion.contextFix }));\n }\n if (suggestion.recoveryHint) {\n log.info(tf(\"fix.recoveryHintLabel\", { hint: suggestion.recoveryHint }));\n }\n\n if (!suggestion.yamlFix) {\n log.warn(t(\"fix.noYamlFix\"));\n continue;\n }\n\n const action = await promptSelect(t(\"fix.applyPrompt\"), [\n { value: \"apply\", label: t(\"fix.applyLabel\"), hint: t(\"fix.applyHint\") },\n { value: \"skip\", label: t(\"fix.skipLabel\"), hint: t(\"fix.skipHint\") },\n { value: \"abort\", label: t(\"fix.abortLabel\"), hint: t(\"fix.abortHint\") },\n ]);\n\n if (action === \"abort\") {\n break;\n }\n\n if (action === \"apply\") {\n const patchResult = await generatePatch(currentYaml, suggestion);\n if (patchResult.success) {\n log.success(t(\"fix.patchGenerated\"));\n showDiff(currentYaml, patchResult.patchedYaml);\n\n const confirmed = await promptConfirm(t(\"fix.confirmApply\"));\n if (confirmed) {\n currentYaml = patchResult.patchedYaml;\n appliedSuggestions.push(suggestion);\n log.success(tf(\"fix.applied\", { ordinal: suggestion.stepOrdinal }));\n } else {\n log.info(t(\"fix.skippedMsg\"));\n }\n } else {\n log.error(tf(\"fix.patchFailed\", { error: patchResult.error ?? \"unknown\" }));\n }\n }\n }\n\n // 変更があればファイルに書き込み\n if (appliedSuggestions.length > 0) {\n const shouldWrite = await promptConfirm(\n tf(\"fix.writePrompt\", { count: appliedSuggestions.length, path: config.runbookPath }),\n );\n\n if (shouldWrite) {\n await writeFile(config.runbookPath, currentYaml, \"utf-8\");\n log.success(tf(\"fix.writeSuccess\", { path: config.runbookPath }));\n\n log.info(`\\n${t(\"fix.verifyCommand\")}`);\n log.info(` pnpm execute -- --runbook ${config.runbookPath} --self-heal`);\n } else {\n log.info(t(\"fix.writeCancelled\"));\n }\n } else {\n log.info(t(\"fix.noChanges\"));\n }\n\n outro(t(\"fix.complete\"));\n}\n\nfunction showDiff(original: string, patched: string): void {\n const origLines = original.split(\"\\n\");\n const patchLines = patched.split(\"\\n\");\n\n // 簡易差分表示: 変更のあった行を +- で表示\n const maxLines = Math.max(origLines.length, patchLines.length);\n const diffLines: string[] = [];\n let contextBefore = 0;\n\n for (let i = 0; i < maxLines; i++) {\n const orig = origLines[i];\n const patch = patchLines[i];\n\n if (orig !== patch) {\n // 変更前のコンテキスト行(最大2行)\n if (contextBefore === 0) {\n for (let j = Math.max(0, i - 2); j < i; j++) {\n if (origLines[j] !== undefined) {\n diffLines.push(` ${origLines[j]}`);\n }\n }\n }\n if (orig !== undefined) {\n diffLines.push(`- ${orig}`);\n }\n if (patch !== undefined) {\n diffLines.push(`+ ${patch}`);\n }\n contextBefore = 3;\n } else if (contextBefore > 0) {\n diffLines.push(` ${orig}`);\n contextBefore--;\n }\n }\n\n if (diffLines.length > 0) {\n log.info(diffLines.join(\"\\n\"));\n } else {\n log.info(t(\"fix.noDiff\"));\n }\n}\n\nmain().catch((error) => {\n cancel(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n if (error instanceof Error && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n","/**\n * apply-fix CLI 引数パース\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { existsSync } from \"node:fs\";\nimport { t, initLocale } from \"../i18n\";\nimport type { AIModelConfig } from \"../harness/ai-model\";\nimport { parseModelConfig } from \"../cli/config-helpers\";\nimport { checkHelpFlag } from \"../cli/help\";\n\nexport interface ApplyFixConfig {\n runbookPath: string;\n reportPath: string;\n /** AIモデル設定 */\n aiModelConfig: AIModelConfig;\n}\n\nexport async function parseArgs(): Promise<ApplyFixConfig> {\n checkHelpFlag(\"fix-runbook\");\n const { values } = nodeParseArgs({\n options: {\n runbook: { type: \"string\" },\n report: { type: \"string\" },\n model: { type: \"string\" },\n \"model-provider\": { type: \"string\" },\n \"model-base-url\": { type: \"string\" },\n \"model-review\": { type: \"string\" },\n locale: { type: \"string\" },\n },\n strict: true,\n });\n\n initLocale(values.locale);\n\n if (!values.runbook) {\n throw new Error(t(\"cli.runbookRequired\"));\n }\n if (!values.report) {\n throw new Error(t(\"cli.reportRequired\"));\n }\n\n if (!existsSync(values.runbook)) {\n throw new Error(`Runbook file not found: ${values.runbook}`);\n }\n if (!existsSync(values.report)) {\n throw new Error(`Report file not found: ${values.report}`);\n }\n\n const aiModelConfig = parseModelConfig(values);\n\n return {\n runbookPath: values.runbook,\n reportPath: values.report,\n aiModelConfig,\n };\n}\n","/**\n * report-parser — レポート Markdown から修正提案を抽出する\n *\n * AI Agent Summary セクションをパースし、各失敗ステップの修正情報を抽出。\n * フォールバックとして Failed Step Diagnostics セクションからも情報を取得。\n */\n\nexport interface ExtractedSuggestion {\n stepOrdinal: number;\n description: string;\n error: string;\n category?: string;\n recoveryHint?: string;\n currentSelector?: string;\n yamlFix?: string;\n contextFix?: string;\n suggestedStrategy?: string;\n lastSnapshotPreview?: string;\n}\n\n/**\n * レポート Markdown から修正提案を抽出する。\n * AI Agent Summary セクションを優先的にパースし、存在しない場合は\n * Failed Step Diagnostics から情報を抽出する。\n */\nexport function extractSuggestions(reportContent: string): ExtractedSuggestion[] {\n const suggestions = extractFromAiAgentSummary(reportContent);\n if (suggestions.length > 0) return suggestions;\n\n // フォールバック: Failed Step Diagnostics から抽出\n return extractFromDiagnostics(reportContent);\n}\n\n/**\n * AI Agent Summary セクションから修正提案を抽出する。\n */\nfunction extractFromAiAgentSummary(content: string): ExtractedSuggestion[] {\n const summaryStart = content.indexOf(\"## AI Agent Summary\");\n if (summaryStart === -1) return [];\n\n // セクション終端を探す(次の ## まで)\n const afterSummary = content.slice(summaryStart + \"## AI Agent Summary\".length);\n const nextSection = afterSummary.search(/\\n## [^#]/);\n const summaryContent = nextSection === -1 ? afterSummary : afterSummary.slice(0, nextSection);\n\n const suggestions: ExtractedSuggestion[] = [];\n\n // #### Step #N: description パターンで各ステップを分割\n const stepPattern = /#### Step #(\\d+): (.+)/g;\n let match: RegExpExecArray | null;\n const stepPositions: { ordinal: number; description: string; start: number }[] = [];\n\n while ((match = stepPattern.exec(summaryContent)) !== null) {\n stepPositions.push({\n ordinal: parseInt(match[1], 10),\n description: match[2].trim(),\n start: match.index + match[0].length,\n });\n }\n\n for (let i = 0; i < stepPositions.length; i++) {\n const pos = stepPositions[i];\n const end = i + 1 < stepPositions.length ? stepPositions[i + 1].start : summaryContent.length;\n const stepContent = summaryContent.slice(pos.start, end);\n\n const suggestion: ExtractedSuggestion = {\n stepOrdinal: pos.ordinal,\n description: pos.description,\n error: extractField(stepContent, \"エラー\") ?? \"Unknown\",\n category: extractField(stepContent, \"分類\")?.replace(/`/g, \"\"),\n recoveryHint: extractField(stepContent, \"推奨対応\"),\n yamlFix: extractField(stepContent, \"YAML 修正提案\"),\n contextFix: extractField(stepContent, \"Context 修正提案\"),\n suggestedStrategy: extractField(stepContent, \"推奨戦略\"),\n currentSelector: extractCodeBlock(stepContent, \"現在のセレクタ\"),\n lastSnapshotPreview: extractCodeBlock(stepContent, \"最終スナップショット\"),\n };\n\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n\n/**\n * Failed Step Diagnostics セクションから基本情報を抽出する(フォールバック)。\n */\nfunction extractFromDiagnostics(content: string): ExtractedSuggestion[] {\n const diagStart = content.indexOf(\"## Failed Step Diagnostics\");\n if (diagStart === -1) return [];\n\n const afterDiag = content.slice(diagStart);\n const nextSection = afterDiag.search(/\\n## [^#]/);\n const diagContent = nextSection === -1 ? afterDiag : afterDiag.slice(0, nextSection);\n\n // 同一 ordinal の複数セクション(Retry Details + Diagnostics + Error Info)を統合\n const stepPattern = /### Step #(\\d+) — (?:Diagnostics|Error Info|Retry Details)/g;\n let match: RegExpExecArray | null;\n const ordinalContents = new Map<number, string>();\n\n while ((match = stepPattern.exec(diagContent)) !== null) {\n const ordinal = parseInt(match[1], 10);\n const sectionStart = match.index + match[0].length;\n const rest = diagContent.slice(sectionStart);\n const nextStep = rest.search(/\\n### Step #/);\n const sectionContent = nextStep === -1 ? rest : rest.slice(0, nextStep);\n\n const existing = ordinalContents.get(ordinal) ?? \"\";\n ordinalContents.set(ordinal, existing + \"\\n\" + sectionContent);\n }\n\n const suggestions: ExtractedSuggestion[] = [];\n\n for (const [ordinal, stepContent] of ordinalContents) {\n const recoveryHint = extractField(stepContent, \"Recovery Hint\");\n const error = extractField(stepContent, \"Error\") ?? \"Unknown\";\n\n // Step Results セクションから description を取得\n const stepResultPattern = new RegExp(`${ordinal}\\\\. \\\\[FAILED\\\\] (.+?) \\\\(`);\n const descMatch = content.match(stepResultPattern);\n\n suggestions.push({\n stepOrdinal: ordinal,\n description: descMatch?.[1] ?? `Step #${ordinal}`,\n error,\n recoveryHint,\n currentSelector: extractCodeBlock(stepContent, \"Step Action\"),\n });\n }\n\n return suggestions;\n}\n\n/**\n * `- **label**: value` または `**label**: value` パターンからフィールド値を抽出する。\n */\nfunction extractField(content: string, label: string): string | undefined {\n // `- **label**: value` パターン(AI Agent Summary 形式)\n const listPattern = new RegExp(`- \\\\*\\\\*${escapeRegex(label)}\\\\*\\\\*: (.+?)(?:\\n|$)`);\n const listMatch = content.match(listPattern);\n if (listMatch) return listMatch[1].trim();\n\n // `**label**: value` パターン(Diagnostics 形式)\n const boldPattern = new RegExp(`\\\\*\\\\*${escapeRegex(label)}\\\\*\\\\*: (.+?)(?:\\n|$)`);\n const boldMatch = content.match(boldPattern);\n return boldMatch?.[1]?.trim();\n}\n\n/**\n * ラベルの後に続くコードブロック(```...```)を抽出する。\n */\nfunction extractCodeBlock(content: string, label: string): string | undefined {\n const labelIdx = content.indexOf(`**${label}**`);\n if (labelIdx === -1) return undefined;\n\n const afterLabel = content.slice(labelIdx);\n const codeStart = afterLabel.indexOf(\"```\");\n if (codeStart === -1) return undefined;\n\n const codeContentStart = afterLabel.indexOf(\"\\n\", codeStart) + 1;\n const codeEnd = afterLabel.indexOf(\"```\", codeContentStart);\n if (codeEnd === -1) return undefined;\n\n return afterLabel.slice(codeContentStart, codeEnd).trim();\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/fix-runbook/index.ts","../../../src/fix-runbook/config.ts","../../../src/fix-runbook/report-parser.ts"],"sourcesContent":["/**\n * fix-runbook CLI — レポートから修正提案を抽出し、runbook YAML に適用する\n *\n * Usage:\n * pnpm fix-runbook -- \\\n * --runbook ./runbooks/login-flow.yaml \\\n * --report ./runbooks/login-flow-report.md\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { parseArgs } from \"./config\";\nimport { initModel } from \"../harness/ai-model\";\nimport { extractSuggestions, type ExtractedSuggestion } from \"./report-parser\";\nimport { generatePatch } from \"./yaml-patcher\";\nimport { intro, outro, log, cancel, promptSelect, promptConfirm } from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\n\nasync function main() {\n const config = await parseArgs();\n await initModel(config.aiModelConfig);\n\n intro(\"fix-runbook\");\n log.info(`Runbook: ${config.runbookPath}`);\n log.info(`Report: ${config.reportPath}`);\n\n // レポートからAI Agent Summaryを読み取り、修正提案を抽出\n const reportContent = await readFile(config.reportPath, \"utf-8\");\n const suggestions = extractSuggestions(reportContent);\n\n if (suggestions.length === 0) {\n log.warn(t(\"fix.noSuggestions\"));\n log.info(t(\"fix.noSuggestionsHint\"));\n outro(t(\"fix.complete\"));\n return;\n }\n\n log.info(tf(\"fix.suggestionCount\", { count: suggestions.length }));\n\n // runbook YAML を読み込み\n const originalYaml = await readFile(config.runbookPath, \"utf-8\");\n\n // 各提案を対話的に処理\n const appliedSuggestions: ExtractedSuggestion[] = [];\n let currentYaml = originalYaml;\n\n for (const suggestion of suggestions) {\n log.step(`Step #${suggestion.stepOrdinal}: ${suggestion.description}`);\n log.info(tf(\"fix.errorLabel\", { error: suggestion.error }));\n if (suggestion.category) {\n log.info(tf(\"fix.categoryLabel\", { category: suggestion.category }));\n }\n if (suggestion.yamlFix) {\n log.info(tf(\"fix.yamlFixLabel\", { fix: suggestion.yamlFix }));\n }\n if (suggestion.contextFix) {\n log.info(tf(\"fix.contextFixLabel\", { fix: suggestion.contextFix }));\n }\n if (suggestion.recoveryHint) {\n log.info(tf(\"fix.recoveryHintLabel\", { hint: suggestion.recoveryHint }));\n }\n\n if (!suggestion.yamlFix) {\n log.warn(t(\"fix.noYamlFix\"));\n continue;\n }\n\n const action = await promptSelect(t(\"fix.applyPrompt\"), [\n { value: \"apply\", label: t(\"fix.applyLabel\"), hint: t(\"fix.applyHint\") },\n { value: \"skip\", label: t(\"fix.skipLabel\"), hint: t(\"fix.skipHint\") },\n { value: \"abort\", label: t(\"fix.abortLabel\"), hint: t(\"fix.abortHint\") },\n ]);\n\n if (action === \"abort\") {\n break;\n }\n\n if (action === \"apply\") {\n const patchResult = await generatePatch(currentYaml, suggestion);\n if (patchResult.success) {\n log.success(t(\"fix.patchGenerated\"));\n showDiff(currentYaml, patchResult.patchedYaml);\n\n const confirmed = await promptConfirm(t(\"fix.confirmApply\"));\n if (confirmed) {\n currentYaml = patchResult.patchedYaml;\n appliedSuggestions.push(suggestion);\n log.success(tf(\"fix.applied\", { ordinal: suggestion.stepOrdinal }));\n } else {\n log.info(t(\"fix.skippedMsg\"));\n }\n } else {\n log.error(tf(\"fix.patchFailed\", { error: patchResult.error ?? \"unknown\" }));\n }\n }\n }\n\n // 変更があればファイルに書き込み\n if (appliedSuggestions.length > 0) {\n const shouldWrite = await promptConfirm(\n tf(\"fix.writePrompt\", { count: appliedSuggestions.length, path: config.runbookPath }),\n );\n\n if (shouldWrite) {\n await writeFile(config.runbookPath, currentYaml, \"utf-8\");\n log.success(tf(\"fix.writeSuccess\", { path: config.runbookPath }));\n\n log.info(`\\n${t(\"fix.verifyCommand\")}`);\n log.info(` pnpm execute -- --runbook ${config.runbookPath} --self-heal`);\n } else {\n log.info(t(\"fix.writeCancelled\"));\n }\n } else {\n log.info(t(\"fix.noChanges\"));\n }\n\n outro(t(\"fix.complete\"));\n}\n\nfunction showDiff(original: string, patched: string): void {\n const origLines = original.split(\"\\n\");\n const patchLines = patched.split(\"\\n\");\n\n // 簡易差分表示: 変更のあった行を +- で表示\n const maxLines = Math.max(origLines.length, patchLines.length);\n const diffLines: string[] = [];\n let contextBefore = 0;\n\n for (let i = 0; i < maxLines; i++) {\n const orig = origLines[i];\n const patch = patchLines[i];\n\n if (orig !== patch) {\n // 変更前のコンテキスト行(最大2行)\n if (contextBefore === 0) {\n for (let j = Math.max(0, i - 2); j < i; j++) {\n if (origLines[j] !== undefined) {\n diffLines.push(` ${origLines[j]}`);\n }\n }\n }\n if (orig !== undefined) {\n diffLines.push(`- ${orig}`);\n }\n if (patch !== undefined) {\n diffLines.push(`+ ${patch}`);\n }\n contextBefore = 3;\n } else if (contextBefore > 0) {\n diffLines.push(` ${orig}`);\n contextBefore--;\n }\n }\n\n if (diffLines.length > 0) {\n log.info(diffLines.join(\"\\n\"));\n } else {\n log.info(t(\"fix.noDiff\"));\n }\n}\n\nmain().catch((error) => {\n cancel(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n if (error instanceof Error && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n","/**\n * apply-fix CLI 引数パース\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { existsSync } from \"node:fs\";\nimport { t, initLocale } from \"../i18n\";\nimport type { AIModelConfig } from \"../harness/ai-model\";\nimport { parseModelConfig } from \"../cli/config-helpers\";\nimport { checkHelpFlag } from \"../cli/help\";\n\nexport interface ApplyFixConfig {\n runbookPath: string;\n reportPath: string;\n /** AIモデル設定 */\n aiModelConfig: AIModelConfig;\n}\n\nexport async function parseArgs(): Promise<ApplyFixConfig> {\n checkHelpFlag(\"fix-runbook\");\n const { values } = nodeParseArgs({\n options: {\n runbook: { type: \"string\" },\n report: { type: \"string\" },\n model: { type: \"string\" },\n \"model-provider\": { type: \"string\" },\n \"model-base-url\": { type: \"string\" },\n \"model-review\": { type: \"string\" },\n locale: { type: \"string\" },\n },\n strict: true,\n });\n\n initLocale(values.locale);\n\n if (!values.runbook) {\n throw new Error(t(\"cli.runbookRequired\"));\n }\n if (!values.report) {\n throw new Error(t(\"cli.reportRequired\"));\n }\n\n if (!existsSync(values.runbook)) {\n throw new Error(`Runbook file not found: ${values.runbook}`);\n }\n if (!existsSync(values.report)) {\n throw new Error(`Report file not found: ${values.report}`);\n }\n\n const aiModelConfig = parseModelConfig(values);\n\n return {\n runbookPath: values.runbook,\n reportPath: values.report,\n aiModelConfig,\n };\n}\n","/**\n * report-parser — レポート Markdown から修正提案を抽出する\n *\n * AI Agent Summary セクションをパースし、各失敗ステップの修正情報を抽出。\n * フォールバックとして Failed Step Diagnostics セクションからも情報を取得。\n */\n\nexport interface ExtractedSuggestion {\n stepOrdinal: number;\n description: string;\n error: string;\n category?: string;\n recoveryHint?: string;\n currentSelector?: string;\n yamlFix?: string;\n contextFix?: string;\n suggestedStrategy?: string;\n lastSnapshotPreview?: string;\n}\n\n/**\n * レポート Markdown から修正提案を抽出する。\n * AI Agent Summary セクションを優先的にパースし、存在しない場合は\n * Failed Step Diagnostics から情報を抽出する。\n */\nexport function extractSuggestions(reportContent: string): ExtractedSuggestion[] {\n const suggestions = extractFromAiAgentSummary(reportContent);\n if (suggestions.length > 0) return suggestions;\n\n // フォールバック: Failed Step Diagnostics から抽出\n return extractFromDiagnostics(reportContent);\n}\n\n/**\n * AI Agent Summary セクションから修正提案を抽出する。\n */\nfunction extractFromAiAgentSummary(content: string): ExtractedSuggestion[] {\n const summaryStart = content.indexOf(\"## AI Agent Summary\");\n if (summaryStart === -1) return [];\n\n // セクション終端を探す(次の ## まで)\n const afterSummary = content.slice(summaryStart + \"## AI Agent Summary\".length);\n const nextSection = afterSummary.search(/\\n## [^#]/);\n const summaryContent = nextSection === -1 ? afterSummary : afterSummary.slice(0, nextSection);\n\n const suggestions: ExtractedSuggestion[] = [];\n\n // #### Step #N: description パターンで各ステップを分割\n const stepPattern = /#### Step #(\\d+): (.+)/g;\n let match: RegExpExecArray | null;\n const stepPositions: { ordinal: number; description: string; start: number }[] = [];\n\n while ((match = stepPattern.exec(summaryContent)) !== null) {\n stepPositions.push({\n ordinal: parseInt(match[1], 10),\n description: match[2].trim(),\n start: match.index + match[0].length,\n });\n }\n\n for (let i = 0; i < stepPositions.length; i++) {\n const pos = stepPositions[i];\n const end = i + 1 < stepPositions.length ? stepPositions[i + 1].start : summaryContent.length;\n const stepContent = summaryContent.slice(pos.start, end);\n\n const suggestion: ExtractedSuggestion = {\n stepOrdinal: pos.ordinal,\n description: pos.description,\n error: extractField(stepContent, \"エラー\") ?? \"Unknown\",\n category: extractField(stepContent, \"分類\")?.replace(/`/g, \"\"),\n recoveryHint: extractField(stepContent, \"推奨対応\"),\n yamlFix: extractField(stepContent, \"YAML 修正提案\"),\n contextFix: extractField(stepContent, \"Context 修正提案\"),\n suggestedStrategy: extractField(stepContent, \"推奨戦略\"),\n currentSelector: extractCodeBlock(stepContent, \"現在のセレクタ\"),\n lastSnapshotPreview: extractCodeBlock(stepContent, \"最終スナップショット\"),\n };\n\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n\n/**\n * Failed Step Diagnostics セクションから基本情報を抽出する(フォールバック)。\n */\nfunction extractFromDiagnostics(content: string): ExtractedSuggestion[] {\n const diagStart = content.indexOf(\"## Failed Step Diagnostics\");\n if (diagStart === -1) return [];\n\n const afterDiag = content.slice(diagStart);\n const nextSection = afterDiag.search(/\\n## [^#]/);\n const diagContent = nextSection === -1 ? afterDiag : afterDiag.slice(0, nextSection);\n\n // 同一 ordinal の複数セクション(Retry Details + Diagnostics + Error Info)を統合\n const stepPattern = /### Step #(\\d+) — (?:Diagnostics|Error Info|Retry Details)/g;\n let match: RegExpExecArray | null;\n const ordinalContents = new Map<number, string>();\n\n while ((match = stepPattern.exec(diagContent)) !== null) {\n const ordinal = parseInt(match[1], 10);\n const sectionStart = match.index + match[0].length;\n const rest = diagContent.slice(sectionStart);\n const nextStep = rest.search(/\\n### Step #/);\n const sectionContent = nextStep === -1 ? rest : rest.slice(0, nextStep);\n\n const existing = ordinalContents.get(ordinal) ?? \"\";\n ordinalContents.set(ordinal, existing + \"\\n\" + sectionContent);\n }\n\n const suggestions: ExtractedSuggestion[] = [];\n\n for (const [ordinal, stepContent] of ordinalContents) {\n const recoveryHint = extractField(stepContent, \"Recovery Hint\");\n const error = extractField(stepContent, \"Error\") ?? \"Unknown\";\n\n // Step Results セクションから description を取得\n const stepResultPattern = new RegExp(`${ordinal}\\\\. \\\\[FAILED\\\\] (.+?) \\\\(`);\n const descMatch = content.match(stepResultPattern);\n\n suggestions.push({\n stepOrdinal: ordinal,\n description: descMatch?.[1] ?? `Step #${ordinal}`,\n error,\n recoveryHint,\n currentSelector: extractCodeBlock(stepContent, \"Step Action\"),\n });\n }\n\n return suggestions;\n}\n\n/**\n * `- **label**: value` または `**label**: value` パターンからフィールド値を抽出する。\n */\nfunction extractField(content: string, label: string): string | undefined {\n // `- **label**: value` パターン(AI Agent Summary 形式)\n const listPattern = new RegExp(`- \\\\*\\\\*${escapeRegex(label)}\\\\*\\\\*: (.+?)(?:\\n|$)`);\n const listMatch = content.match(listPattern);\n if (listMatch) return listMatch[1].trim();\n\n // `**label**: value` パターン(Diagnostics 形式)\n const boldPattern = new RegExp(`\\\\*\\\\*${escapeRegex(label)}\\\\*\\\\*: (.+?)(?:\\n|$)`);\n const boldMatch = content.match(boldPattern);\n return boldMatch?.[1]?.trim();\n}\n\n/**\n * ラベルの後に続くコードブロック(```...```)を抽出する。\n */\nfunction extractCodeBlock(content: string, label: string): string | undefined {\n const labelIdx = content.indexOf(`**${label}**`);\n if (labelIdx === -1) return undefined;\n\n const afterLabel = content.slice(labelIdx);\n const codeStart = afterLabel.indexOf(\"```\");\n if (codeStart === -1) return undefined;\n\n const codeContentStart = afterLabel.indexOf(\"\\n\", codeStart) + 1;\n const codeEnd = afterLabel.indexOf(\"```\", codeContentStart);\n if (codeEnd === -1) return undefined;\n\n return afterLabel.slice(codeContentStart, codeEnd).trim();\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createReviewPrompt,
|
|
4
|
+
reviewResponseSchema
|
|
5
|
+
} from "./chunk-IGJNT457.js";
|
|
6
|
+
import "./chunk-GC7I5SGK.js";
|
|
7
|
+
import "./chunk-6FGCPMBU.js";
|
|
8
|
+
import "./chunk-2H7UOFLK.js";
|
|
9
|
+
export {
|
|
10
|
+
createReviewPrompt,
|
|
11
|
+
reviewResponseSchema
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=prompts-AGUYYIOM.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
buildRunbookYaml
|
|
4
|
+
} from "./chunk-RBZK7T76.js";
|
|
5
|
+
import "./chunk-YTVEYQGA.js";
|
|
6
|
+
import "./chunk-LZDZGI4M.js";
|
|
7
|
+
import "./chunk-2H7UOFLK.js";
|
|
8
|
+
export {
|
|
9
|
+
buildRunbookYaml
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=runbook-builder-2ZLE2AEO.js.map
|
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
copyVersionData,
|
|
5
5
|
insertSteps,
|
|
6
6
|
loadVersionDetail
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-VVXNFUPL.js";
|
|
8
|
+
import "./chunk-CMWLFQXD.js";
|
|
9
9
|
import "./chunk-2H7UOFLK.js";
|
|
10
10
|
export {
|
|
11
11
|
buildFlatRunbook,
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
insertSteps,
|
|
14
14
|
loadVersionDetail
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=runbook-data-helpers-
|
|
16
|
+
//# sourceMappingURL=runbook-data-helpers-5UAO65TZ.js.map
|