@refrainai/cli 0.4.1 → 0.4.2

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 (83) hide show
  1. package/dist/{ai-model-FM6GWCID.js → ai-model-DP5PKGM6.js} +2 -2
  2. package/dist/{chunk-2BVDAJZT.js → chunk-65CTEK2K.js} +9 -6
  3. package/dist/chunk-65CTEK2K.js.map +1 -0
  4. package/dist/chunk-BGC75OVR.js +30 -0
  5. package/dist/chunk-BGC75OVR.js.map +1 -0
  6. package/dist/{chunk-H47NWH7N.js → chunk-CJM3IU5Q.js} +611 -73
  7. package/dist/chunk-CJM3IU5Q.js.map +1 -0
  8. package/dist/{chunk-CLYJHKPY.js → chunk-CMWLFQXD.js} +43 -42
  9. package/dist/chunk-CMWLFQXD.js.map +1 -0
  10. package/dist/{chunk-IGFCYKHC.js → chunk-CNJ5KCDN.js} +252 -295
  11. package/dist/chunk-CNJ5KCDN.js.map +1 -0
  12. package/dist/{chunk-DJVUITRB.js → chunk-ELQ23L4Z.js} +898 -1135
  13. package/dist/chunk-ELQ23L4Z.js.map +1 -0
  14. package/dist/chunk-EMAYENG4.js +1146 -0
  15. package/dist/chunk-EMAYENG4.js.map +1 -0
  16. package/dist/{chunk-7UCVPKD4.js → chunk-F7WTOQIQ.js} +12 -72
  17. package/dist/chunk-F7WTOQIQ.js.map +1 -0
  18. package/dist/{chunk-WEYR56ZN.js → chunk-HHRHHFSK.js} +4 -4
  19. package/dist/{chunk-UGPXCQY3.js → chunk-KFNW4XR2.js} +13 -4
  20. package/dist/chunk-KFNW4XR2.js.map +1 -0
  21. package/dist/{chunk-RT664YIO.js → chunk-LZDZGI4M.js} +3 -1
  22. package/dist/chunk-LZDZGI4M.js.map +1 -0
  23. package/dist/chunk-RBZK7T76.js +349 -0
  24. package/dist/chunk-RBZK7T76.js.map +1 -0
  25. package/dist/{chunk-HQDXLWAY.js → chunk-SDV3X5UN.js} +2 -2
  26. package/dist/{chunk-Z33FCOTZ.js → chunk-VVXNFUPL.js} +4 -2
  27. package/dist/chunk-VVXNFUPL.js.map +1 -0
  28. package/dist/chunk-XIVS7N3V.js +74 -0
  29. package/dist/chunk-XIVS7N3V.js.map +1 -0
  30. package/dist/chunk-YTVEYQGA.js +64 -0
  31. package/dist/chunk-YTVEYQGA.js.map +1 -0
  32. package/dist/{chunk-RYIJPYM3.js → chunk-YW46VP57.js} +25 -8
  33. package/dist/chunk-YW46VP57.js.map +1 -0
  34. package/dist/cli.js +5 -5
  35. package/dist/{compose-MTSIJY5D.js → compose-B2IAO7YW.js} +9 -7
  36. package/dist/{compose-MTSIJY5D.js.map → compose-B2IAO7YW.js.map} +1 -1
  37. package/dist/extraction-prompt-VDCKIFLB.js +17 -0
  38. package/dist/extraction-prompt-VDCKIFLB.js.map +1 -0
  39. package/dist/{fix-runbook-ZSBOTLC2.js → fix-runbook-JJN4HVIP.js} +12 -10
  40. package/dist/{fix-runbook-ZSBOTLC2.js.map → fix-runbook-JJN4HVIP.js.map} +1 -1
  41. package/dist/prompts-XMJXIITW.js +13 -0
  42. package/dist/runbook-builder-2ZLE2AEO.js +11 -0
  43. package/dist/{runbook-data-helpers-KRR2SH76.js → runbook-data-helpers-5UAO65TZ.js} +3 -3
  44. package/dist/{runbook-executor-K7T6RJWJ.js → runbook-executor-TVV5EG6Q.js} +41 -444
  45. package/dist/runbook-executor-TVV5EG6Q.js.map +1 -0
  46. package/dist/{runbook-generator-MPXJBQ5N.js → runbook-generator-4XKNV2B7.js} +61 -136
  47. package/dist/runbook-generator-4XKNV2B7.js.map +1 -0
  48. package/dist/{runbook-schema-3T6TP3JJ.js → runbook-schema-X7DW725O.js} +2 -2
  49. package/dist/runbook-store-S24PXIHD.js +11 -0
  50. package/dist/{schema-5G6UQSPT.js → schema-XFSD5EWN.js} +2 -2
  51. package/dist/{server-AG3LXQBI.js → server-5XARL5N7.js} +1176 -128
  52. package/dist/server-5XARL5N7.js.map +1 -0
  53. package/dist/{tenant-ai-config-QPFEJUVJ.js → tenant-ai-config-4NHKRW7O.js} +4 -4
  54. package/dist/tenant-ai-config-4NHKRW7O.js.map +1 -0
  55. package/dist/yaml-patcher-32QBPXT2.js +18 -0
  56. package/dist/yaml-patcher-32QBPXT2.js.map +1 -0
  57. package/package.json +3 -2
  58. package/dist/chunk-2BVDAJZT.js.map +0 -1
  59. package/dist/chunk-7UCVPKD4.js.map +0 -1
  60. package/dist/chunk-CLYJHKPY.js.map +0 -1
  61. package/dist/chunk-DJVUITRB.js.map +0 -1
  62. package/dist/chunk-H47NWH7N.js.map +0 -1
  63. package/dist/chunk-IGFCYKHC.js.map +0 -1
  64. package/dist/chunk-RT664YIO.js.map +0 -1
  65. package/dist/chunk-RYIJPYM3.js.map +0 -1
  66. package/dist/chunk-UGPXCQY3.js.map +0 -1
  67. package/dist/chunk-VPK2MQAZ.js +0 -589
  68. package/dist/chunk-VPK2MQAZ.js.map +0 -1
  69. package/dist/chunk-Z33FCOTZ.js.map +0 -1
  70. package/dist/runbook-executor-K7T6RJWJ.js.map +0 -1
  71. package/dist/runbook-generator-MPXJBQ5N.js.map +0 -1
  72. package/dist/runbook-store-G5GUOWRR.js +0 -11
  73. package/dist/server-AG3LXQBI.js.map +0 -1
  74. package/dist/yaml-patcher-VGUS2JGH.js +0 -15
  75. /package/dist/{ai-model-FM6GWCID.js.map → ai-model-DP5PKGM6.js.map} +0 -0
  76. /package/dist/{chunk-WEYR56ZN.js.map → chunk-HHRHHFSK.js.map} +0 -0
  77. /package/dist/{chunk-HQDXLWAY.js.map → chunk-SDV3X5UN.js.map} +0 -0
  78. /package/dist/{runbook-data-helpers-KRR2SH76.js.map → prompts-XMJXIITW.js.map} +0 -0
  79. /package/dist/{runbook-schema-3T6TP3JJ.js.map → runbook-builder-2ZLE2AEO.js.map} +0 -0
  80. /package/dist/{runbook-store-G5GUOWRR.js.map → runbook-data-helpers-5UAO65TZ.js.map} +0 -0
  81. /package/dist/{schema-5G6UQSPT.js.map → runbook-schema-X7DW725O.js.map} +0 -0
  82. /package/dist/{tenant-ai-config-QPFEJUVJ.js.map → runbook-store-S24PXIHD.js.map} +0 -0
  83. /package/dist/{yaml-patcher-VGUS2JGH.js.map → schema-XFSD5EWN.js.map} +0 -0
@@ -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-2BVDAJZT.js";
5
+ } from "./chunk-65CTEK2K.js";
6
6
  import {
7
7
  generatePatch
8
- } from "./chunk-RYIJPYM3.js";
8
+ } from "./chunk-YW46VP57.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
- t,
19
- tf
20
- } from "./chunk-7UCVPKD4.js";
16
+ promptSelect
17
+ } from "./chunk-XIVS7N3V.js";
21
18
  import {
22
19
  initModel
23
- } from "./chunk-UGPXCQY3.js";
24
- import "./chunk-RT664YIO.js";
20
+ } from "./chunk-KFNW4XR2.js";
21
+ import "./chunk-LZDZGI4M.js";
22
+ import {
23
+ initLocale,
24
+ t,
25
+ tf
26
+ } from "./chunk-F7WTOQIQ.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-ZSBOTLC2.js.map
296
+ //# sourceMappingURL=fix-runbook-JJN4HVIP.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-BGC75OVR.js";
6
+ import "./chunk-EMAYENG4.js";
7
+ import "./chunk-F7WTOQIQ.js";
8
+ import "./chunk-2H7UOFLK.js";
9
+ export {
10
+ createReviewPrompt,
11
+ reviewResponseSchema
12
+ };
13
+ //# sourceMappingURL=prompts-XMJXIITW.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-Z33FCOTZ.js";
8
- import "./chunk-CLYJHKPY.js";
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-KRR2SH76.js.map
16
+ //# sourceMappingURL=runbook-data-helpers-5UAO65TZ.js.map