claude-code-conductor 2.8.0__tar.gz → 2.9.0__tar.gz

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 (146) hide show
  1. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/permission_handler.py +5 -0
  2. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/record_tier_outcome.py +35 -0
  3. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/restore_session.py +9 -0
  4. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/select_tier.py +13 -11
  5. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/session_utils.py +0 -1
  6. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/statusline.py +9 -17
  7. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/stop.py +4 -0
  8. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/subagent_log.py +2 -2
  9. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/worktree_guard.py +4 -0
  10. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/settings.json +1 -1
  11. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/dev-workflow/SKILL.md +65 -40
  12. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/init-session/SKILL.md +1 -4
  13. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/parallel-agents/SKILL.md +5 -0
  14. claude_code_conductor-2.9.0/.claude/skills/start/SKILL.md +136 -0
  15. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.gitignore +1 -0
  16. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/CHANGELOG.md +57 -1
  17. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/PKG-INFO +1 -1
  18. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/hatch_build.py +1 -0
  19. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/__init__.py +1 -1
  20. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/_excludes.py +1 -0
  21. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/_terminal.py +1 -1
  22. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_plan.py +11 -7
  23. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_tier.py +1 -1
  24. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/db.py +14 -7
  25. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/mcp_server.py +13 -0
  26. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/plan_validator.py +2 -1
  27. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/question.py +3 -0
  28. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_consolidate_memory.py +9 -12
  29. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_permission_handler.py +55 -0
  30. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_restore_session.py +9 -0
  31. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_session_stop.py +2 -1
  32. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_session_utils.py +9 -13
  33. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_statusline.py +13 -34
  34. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_statusline_template_sync.py +6 -0
  35. claude_code_conductor-2.9.0/tests/skills/_skill_helpers.py +137 -0
  36. claude_code_conductor-2.9.0/tests/skills/test_dev_workflow_no_task_type.py +151 -0
  37. claude_code_conductor-2.9.0/tests/skills/test_init_session_no_task_type.py +47 -0
  38. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/skills/test_session_backlog_reconciliation.py +23 -35
  39. claude_code_conductor-2.9.0/tests/skills/test_start_skill_bugfix_flow.py +50 -0
  40. claude_code_conductor-2.9.0/tests/skills/test_start_skill_new_flow.py +128 -0
  41. claude_code_conductor-2.9.0/tests/skills/test_start_skill_security_audit_phase.py +77 -0
  42. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_pre_compact.py +3 -5
  43. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_pre_tool_hook.py +14 -15
  44. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_session_utils_additional.py +9 -10
  45. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_statusline.py +27 -62
  46. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_stop_additional.py +5 -5
  47. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_stop_hook.py +6 -6
  48. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_template_pre_tool_hook.py +6 -7
  49. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_worktree_guard.py +15 -2
  50. claude_code_conductor-2.8.0/.claude/skills/start/SKILL.md +0 -355
  51. claude_code_conductor-2.8.0/.claude/skills/task-routing/SKILL.md +0 -201
  52. claude_code_conductor-2.8.0/tests/skills/test_start_skill_bugfix_flow.py +0 -56
  53. claude_code_conductor-2.8.0/tests/skills/test_start_skill_security_audit_phase.py +0 -419
  54. claude_code_conductor-2.8.0/tests/skills/test_task_routing_skill.py +0 -77
  55. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/CLAUDE.md +0 -0
  56. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/architect.md +0 -0
  57. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/code-reviewer.md +0 -0
  58. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/developer.md +0 -0
  59. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/doc-writer.md +0 -0
  60. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/interviewer.md +0 -0
  61. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/planner.md +0 -0
  62. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/project-setup.md +0 -0
  63. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/security-reviewer.md +0 -0
  64. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/summarize-memory.md +0 -0
  65. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/systematic-debugger.md +0 -0
  66. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/tester.md +0 -0
  67. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/wt_developer.md +0 -0
  68. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  69. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/agents/wt_tester.md +0 -0
  70. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/docs/platform-adapters.md +0 -0
  71. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/docs/settings.json.md +0 -0
  72. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/consolidate_memory.py +0 -0
  73. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/permission_handler_toast.py +0 -0
  74. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/post_tool.py +0 -0
  75. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/pre_compact.py +0 -0
  76. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/pre_tool.py +0 -0
  77. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/record_review_decision.py +0 -0
  78. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/review_hint_inject.py +0 -0
  79. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/schema.sql +0 -0
  80. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/session_start.py +0 -0
  81. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/hooks/session_stop.py +0 -0
  82. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/memory/.gitkeep +0 -0
  83. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/permission_rules.json +0 -0
  84. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/rules/code-review-checklist.md +0 -0
  85. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/rules/promoted/index.md +0 -0
  86. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/rules/security-review-checklist.md +0 -0
  87. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/code-review/SKILL.md +0 -0
  88. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/codex-review/SKILL.md +0 -0
  89. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/develop/SKILL.md +0 -0
  90. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/doc/SKILL.md +0 -0
  91. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  92. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  93. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  94. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  95. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  96. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  97. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/setup/SKILL.md +0 -0
  98. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/skills/summarize-memory/SKILL.md +0 -0
  99. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/.claude/state/.gitkeep +0 -0
  100. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/LICENSE +0 -0
  101. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/README.md +0 -0
  102. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/pyproject.toml +0 -0
  103. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/__main__.py +0 -0
  104. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/adapters.py +0 -0
  105. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli.py +0 -0
  106. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_ask.py +0 -0
  107. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_doctor.py +0 -0
  108. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_init.py +0 -0
  109. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_list.py +0 -0
  110. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/cli_update.py +0 -0
  111. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/paths.py +0 -0
  112. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/src/c3/platforms.py +0 -0
  113. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/__init__.py +0 -0
  114. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/conftest.py +0 -0
  115. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/__init__.py +0 -0
  116. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  117. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  118. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_planner_check.py +0 -0
  119. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_post_tool.py +0 -0
  120. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_pre_tool.py +0 -0
  121. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_record_tier_outcome.py +0 -0
  122. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_review_hint_inject.py +0 -0
  123. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_select_tier.py +0 -0
  124. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  125. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_session_start.py +0 -0
  126. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  127. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_similarity_boost.py +0 -0
  128. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_subagent_log.py +0 -0
  129. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_sync_check.py +0 -0
  130. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/hooks/test_template_guard.py +0 -0
  131. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/skills/__init__.py +0 -0
  132. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_adapters.py +0 -0
  133. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_cli_ask.py +0 -0
  134. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_cli_init.py +0 -0
  135. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_cli_list.py +0 -0
  136. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_cli_plan.py +0 -0
  137. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_cli_tier.py +0 -0
  138. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_docstring_consistency.py +0 -0
  139. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_excludes.py +0 -0
  140. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_mcp_server_elicit.py +0 -0
  141. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_paths.py +0 -0
  142. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_plan_validator.py +0 -0
  143. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_precompact_additional.py +0 -0
  144. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_precompact_toctou_fixes.py +0 -0
  145. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_stop_precompact_fixes.py +0 -0
  146. {claude_code_conductor-2.8.0 → claude_code_conductor-2.9.0}/tests/test_sync_template_stop.py +0 -0
@@ -369,6 +369,11 @@ def main() -> None:
369
369
  rules = load_rules()
370
370
  description = describe_tool(tool_name, tool_input)
371
371
 
372
+ # AskUserQuestion は通知のみ。自動承認対象外として扱う。
373
+ if tool_name == 'AskUserQuestion':
374
+ notify(f'-> 質問: {description}')
375
+ return
376
+
372
377
  for pattern in rules.get('auto_allow', []):
373
378
  if matches_pattern(tool_name, tool_input, pattern):
374
379
  if rules.get('notify_on_auto', True):
@@ -87,6 +87,40 @@ def _delete_tier_selection() -> None:
87
87
  )
88
88
 
89
89
 
90
+ # prompt-history.jsonl の上限サイズ(バイト)。超過時は末尾 _PROMPT_HISTORY_TRUNCATE_LINES 行
91
+ # だけを残してローテーションする。読み込み側 (select_tier._PROMPT_HISTORY_SCAN_LINES=1000) と
92
+ # 同じオーダーで保持し、ディスク消費を抑える [SR-V-001]。
93
+ _PROMPT_HISTORY_MAX_BYTES = 10 * 1024 * 1024 # 10 MB
94
+ _PROMPT_HISTORY_TRUNCATE_LINES = 2000
95
+
96
+
97
+ def _rotate_prompt_history_if_needed() -> None:
98
+ """prompt-history.jsonl が上限超過なら末尾 N 行を残して切り詰める。
99
+
100
+ 書き込み側のサイズ無制限成長を防ぐシンプルなローテーション。失敗時は警告のみ。
101
+ """
102
+ try:
103
+ size = os.path.getsize(PROMPT_HISTORY_PATH)
104
+ except OSError:
105
+ return
106
+ if size <= _PROMPT_HISTORY_MAX_BYTES:
107
+ return
108
+ try:
109
+ # 末尾 N 行のみ deque で保持して上書きする(ファイル全体は走査するが I/O のみ)
110
+ import collections as _c
111
+ with open(PROMPT_HISTORY_PATH, "r", encoding="utf-8") as f:
112
+ tail = list(_c.deque(f, maxlen=_PROMPT_HISTORY_TRUNCATE_LINES))
113
+ tmp_path = PROMPT_HISTORY_PATH + ".tmp"
114
+ with open(tmp_path, "w", encoding="utf-8") as f:
115
+ f.writelines(tail)
116
+ os.replace(tmp_path, PROMPT_HISTORY_PATH)
117
+ except OSError as exc:
118
+ print(
119
+ f"[record_tier_outcome] prompt-history rotate skipped: {exc}",
120
+ file=sys.stderr,
121
+ )
122
+
123
+
90
124
  def _append_prompt_history(selection: dict, success: bool) -> None:
91
125
  """Phase 2-C: prompt-history.jsonl に 1 行追記する。
92
126
 
@@ -108,6 +142,7 @@ def _append_prompt_history(selection: dict, success: bool) -> None:
108
142
  }
109
143
  try:
110
144
  os.makedirs(os.path.dirname(PROMPT_HISTORY_PATH), exist_ok=True)
145
+ _rotate_prompt_history_if_needed()
111
146
  with open(PROMPT_HISTORY_PATH, "a", encoding="utf-8") as f:
112
147
  f.write(json.dumps(record, ensure_ascii=False) + "\n")
113
148
  except OSError as exc:
@@ -41,6 +41,15 @@ def find_latest_session() -> str | None:
41
41
  return os.path.join(SESSIONS_DIR, max(files))
42
42
 
43
43
 
44
+ def extract_section(content: str, heading: str) -> str:
45
+ """``session_utils.extract_section`` への薄いラッパー(後方互換用)。
46
+
47
+ 過去にこのモジュール直下にあった ``extract_section`` を呼び出すテスト・スクリプトとの
48
+ 互換維持のため、モジュールレベルで公開する。実体は :mod:`session_utils` 側にある。
49
+ """
50
+ return _load_session_utils().extract_section(content, heading)
51
+
52
+
44
53
  def main():
45
54
  path = find_latest_session()
46
55
  if not path or not os.path.exists(path):
@@ -94,11 +94,15 @@ def _mask_secrets(text: str) -> str:
94
94
 
95
95
  キー名やプレフィックスは残し、値のみを置換することで
96
96
  「何が含まれていたか」は伝わらないようにする。
97
- PEM ブロックは開始タグ〜終了タグ全体を *** に置換する。
97
+ PEM ブロックは開始タグ + *** + 終了タグ に置換する。
98
98
  """
99
99
  result = text
100
100
  for pattern in _MASK_PATTERNS:
101
- result = pattern.sub(lambda m: m.group(1) + "***", result)
101
+ # group(2) があれば PEM ブロック (BEGIN...END)、なければプレフィックス系
102
+ result = pattern.sub(
103
+ lambda m: m.group(1) + "***" + (m.group(2) if m.lastindex and m.lastindex >= 2 else ""),
104
+ result,
105
+ )
102
106
  return result
103
107
 
104
108
  # prompt-history.jsonl の末尾から読む最大行数(パフォーマンス対策)
@@ -325,11 +329,11 @@ def write_tier_selection(
325
329
  record_tier_outcome.py がこの json を読んで α/β を更新する。
326
330
  既存ファイルは上書きされる(最新 1 件のみ保持)。
327
331
 
328
- tier-routing Phase 2-A: ``suggested_model`` も併せて書く。runner.py がこれを読んで
329
- PO 経由のサブエージェント起動時に ``claude --agents`` で動的に上書きする。
330
- tier 名と model の短縮名は同一とする。
332
+ ``suggested_model`` を併せて書く。tier 名と model の短縮名は同一とする。
333
+ PO 廃止前は runner.py が読んで ``claude --agents`` 用に使っていたが、v2.0.0 以降は
334
+ 記録目的のみ。将来再利用する余地のために維持する。)
331
335
 
332
- tier-routing Phase 2-B: ``escalated`` / ``escalation_reason`` を任意で含める。
336
+ ``escalated`` / ``escalation_reason`` を任意で含める。
333
337
  failure rate に基づく昇格が起きた場合のみ True / 文字列が入る。
334
338
  """
335
339
  os.makedirs(os.path.dirname(TIER_SELECTION_PATH), exist_ok=True)
@@ -337,7 +341,7 @@ def write_tier_selection(
337
341
  "complexity": complexity,
338
342
  "tier": tier,
339
343
  "mode": mode,
340
- # Phase 2-A: tier はそのまま claude --agents の model 短縮名として使える
344
+ # tier はそのまま claude --agents の model 短縮名として使える
341
345
  "suggested_model": tier,
342
346
  }
343
347
  if escalated:
@@ -383,10 +387,8 @@ def build_additional_context(
383
387
 
384
388
  return (
385
389
  f"[tier-routing 推奨] 複雑度: {complexity} / 推奨 Tier: {tier}({confidence})。"
386
- f"PO 経由のサブエージェント起動時はこの推奨が claude --agents JSON "
387
- f" 自動適用されます(Phase 2-A)。親 Claude の Agent ツール経由は依然"
388
- f" frontmatter 指定が優先されるため、コスト最適化したい場合は手動切替"
389
- f" してください。{suffix}"
390
+ f" Claude Agent ツール経由ではエージェント定義の frontmatter 指定が"
391
+ f" 優先されるため、コスト最適化したい場合は手動切替してください。{suffix}"
390
392
  )
391
393
 
392
394
 
@@ -20,7 +20,6 @@ def is_worktree(cwd: str) -> bool:
20
20
  def create_session_template(date_str: str) -> str:
21
21
  return (
22
22
  f"SESSION: {date_str}\n"
23
- f"TASK_TYPE: \n"
24
23
  f"AGENT: \n"
25
24
  f"DURATION: \n"
26
25
  f"\n"
@@ -1,6 +1,10 @@
1
1
  #!/usr/bin/env python3
2
- """Context gauge statusline script.
3
- Displays context usage + optional rate limit gauges (when plan provides rate_limits data).
2
+ """Statusline script for Claude Code.
3
+
4
+ Displays: [model display name] effort | ctx used X% | 5h lim X% | 7d lim X%
5
+
6
+ context_window_size (200K / 1M) は ctx used X% と情報重複のため表示しない。
7
+ gauge バー描画も省スペース優先で表示しない。
4
8
  """
5
9
 
6
10
  import json
@@ -35,14 +39,6 @@ def pct_color(pct: int) -> str:
35
39
  return GREEN
36
40
 
37
41
 
38
- def format_context_size(size: int) -> str:
39
- if size >= 900_000:
40
- return '1M'
41
- elif size >= 100_000:
42
- return '200K'
43
- return str(size)
44
-
45
-
46
42
  def format_reset_time(resets_at) -> str:
47
43
  if not resets_at:
48
44
  return ''
@@ -82,18 +78,13 @@ def render_output(raw: str) -> None:
82
78
  header: list[str] = []
83
79
  metrics: list[str] = []
84
80
 
85
- # [model display name] context_size effort — スペース区切り
81
+ # [model display name] effort — スペース区切り
82
+ # (context_window_size は ctx used X% と情報重複のため表示しない)
86
83
  model = data.get('model') or {}
87
84
  display_name = model.get('display_name', '')
88
85
  if display_name:
89
86
  header.append(f'[{display_name}]')
90
87
 
91
- # context window size: 200K / 1M
92
- ctx_window = data.get('context_window') or {}
93
- ctx_size = ctx_window.get('context_window_size')
94
- if ctx_size:
95
- header.append(format_context_size(int(ctx_size)))
96
-
97
88
  # effort level
98
89
  effort = data.get('effort') or {}
99
90
  effort_level = effort.get('level', '')
@@ -101,6 +92,7 @@ def render_output(raw: str) -> None:
101
92
  header.append(effort_level)
102
93
 
103
94
  # ctx usg %
95
+ ctx_window = data.get('context_window') or {}
104
96
  ctx_pct = round(ctx_window.get('used_percentage') or 0)
105
97
  metrics.append('ctx used ' + pct_color(ctx_pct) + str(ctx_pct) + '%' + RESET)
106
98
 
@@ -251,6 +251,10 @@ def update_patterns(date_str: str) -> None:
251
251
  continue
252
252
 
253
253
  registered = _parse_session_date(pattern['registered_date'])
254
+ if registered is None:
255
+ # registered_date が parse 不能ならパターンを保持して継続(クラッシュ回避)
256
+ active.append(pattern)
257
+ continue
254
258
  days_elapsed = (today - registered).days
255
259
 
256
260
  if days_elapsed >= EXPIRY_DAYS:
@@ -78,8 +78,8 @@ _SAFE_PAYLOAD_FIELDS = frozenset({
78
78
  # U+2028 (LINE SEPARATOR) / U+2029 (PARAGRAPH SEPARATOR) の定数 (sec-H-1)
79
79
  # ensure_ascii=False の json.dumps はこれらをエスケープしないため、
80
80
  # _append_log で明示的に \\u2028 / \\u2029 へ置換する。
81
- _U2028 = '
'
82
- _U2029 = '
'
81
+ _U2028 = '
' # LINE SEPARATOR
82
+ _U2029 = '
' # PARAGRAPH SEPARATOR
83
83
 
84
84
 
85
85
  def _now_iso() -> str:
@@ -5,6 +5,10 @@ PO_WORKTREE_GUARD=1 が設定されている場合のみ動作する。
5
5
  worktree 内で実装タスクを実行するワークフロー(parallel-agents skill が
6
6
  isolation:"worktree" 付きで起動する agent など)が事前にこの env を設定して有効化する。
7
7
  Write / Edit ツールの対象パスが CWD(worktree ルート)外であればブロックする。
8
+
9
+ NOTE [SR-V-002]: env 未設定時にガードが無効化されるリスクは parallel-agents/SKILL.md
10
+ で `PO_WORKTREE_GUARD=1` 設定を必須化することで運用上対処する。CWD parts チェック
11
+ 単独で自動有効化する設計変更は次回 major bump で検討予定。
8
12
  """
9
13
 
10
14
  import json
@@ -63,7 +63,7 @@
63
63
  },
64
64
  "statusLine": {
65
65
  "type": "command",
66
- "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/statusline.py\""
66
+ "command": "python \"${CLAUDE_PROJECT_DIR}/.claude/hooks/statusline.py\""
67
67
  },
68
68
  "hooks": {
69
69
  "PreToolUse": [
@@ -16,27 +16,6 @@ user-invocable: false
16
16
 
17
17
  `.claude/agents/interviewer.md` を Read してペルソナを採用する。
18
18
 
19
- ### TASK_TYPE の確認
20
-
21
- 今日のセッションファイル(`.claude/memory/sessions/YYYYMMDD.tmp`)の冒頭から
22
- `^TASK_TYPE: (\S+)$` を抽出してコンテキストに保持する。
23
-
24
- 抽出した値が `feature / bug-fix / refactor / security-audit / docs` のいずれでもない場合
25
- (空欄、enum 外の文字列など)は「TASK_TYPE 未確定」とみなして以下のフォールバックを実施する。
26
-
27
- `TASK_TYPE` が空欄や行が無い、または enum 外の場合(`/develop` 直接呼び出しなど Step 0.5 を経由しないケース):
28
- - Skill ツールで `task-routing` を呼ぶ。`args` に `from_start=true` を渡すことで
29
- 「種別確認のみモード」で動作させ、Step 2〜4 をスキップさせる(`/start` Step 0.5 と同じ呼び方):
30
- ```
31
- Skill(skill="task-routing", args="from_start=true")
32
- ```
33
- - 戻ってきた種別を当日 tmp 冒頭の `TASK_TYPE:` 行に Edit で書き込む(dev-workflow 側で書き込む)
34
- - これにより task-routing が再帰的に `/start` を Read して再び `task-routing` を呼ぶ事態を回避する
35
-
36
- `TASK_TYPE` が `feature` 以外(bug-fix / refactor / security-audit / docs)の場合は、
37
- 本来 dev-workflow フェーズ A〜E のフルパスを通す必要がない種別であることを通知し、
38
- ユーザーに本当に dev-workflow を実行するか確認する(誤起動の防止)。
39
-
40
19
  今日のセッションファイルに以下を追記する(未登録の場合のみ):
41
20
  - `- [ ] ヒアリング` / `- [ ] 設計` / `- [ ] 計画`
42
21
 
@@ -98,15 +77,6 @@ AskUserQuestion ツール:
98
77
  ### A-4: requirements-report の生成と承認
99
78
 
100
79
  収集した内容をもとに `.claude/reports/requirements-report-YYYYMMDD-HHMMSS.md` に Write する。
101
- ファイル冒頭のフロントマターに `task_type: {task_type}` を含めること(後段の architect / planner が参照する):
102
-
103
- ```yaml
104
- ---
105
- task_type: {task_type} # /start Step 0.5 で確定した種別(feature / bug-fix / refactor / security-audit / docs のいずれか)を埋める
106
- ---
107
- ```
108
-
109
- `{task_type}` は plain string で、前述の TASK_TYPE 確認フェーズで保持した値と同じものを書く。
110
80
 
111
81
  内容を提示した後、AskUserQuestion で確認する:
112
82
 
@@ -137,8 +107,6 @@ task_type: {task_type} # /start Step 0.5 で確定した種別(feature / bug
137
107
 
138
108
  **フェーズ A から続いている場合:** 要件はコンテキスト内にあるため読み直し不要。
139
109
  **直接開始の場合:** Glob で `.claude/reports/requirements-report-*.md` の最新を Read する。
140
- requirements-report のフロントマターに `task_type:` があれば読み取ってコンテキストに保持する
141
- (後段で agent 起動方針の判定に使う)。
142
110
 
143
111
  今日のセッションファイルに以下を追記する(未登録の場合のみ):
144
112
  - `- [ ] 設計` / `- [ ] 計画`
@@ -257,18 +225,30 @@ plan-report の全タスクを走査し、以下の形式でテキスト出力
257
225
  ## フェーズ D: 実装
258
226
 
259
227
  **フェーズ C から続いている場合:** plan-report はコンテキスト内にあるため読み直し不要。
260
- **直接開始の場合:** Glob で `.claude/reports/plan-report-*.md` の最新を Read する。存在しない場合はフェーズ C から始めるよう案内して終了する。
228
+ **直接開始の場合:** D-0 で実行モードを判定する。
261
229
 
262
230
  ### D-0: 実行モード自動判別
263
231
 
264
- plan-report の冒頭を Read し、YAML フロントマター(`---` で始まり `po_plan_version: "0.1"` を含む)の有無を確認する。
232
+ 以下の順で実行モードを判定する:
233
+
234
+ 1. Glob で `.claude/reports/plan-report-*.md` の最新が存在する場合、冒頭の YAML フロントマター
235
+ (`---` で始まり `po_plan_version: "0.1"` を含む)の有無を確認する。
236
+ 2. plan-report が存在せず、**当日タイムスタンプ**の `.claude/reports/debug-analysis-*.md` が存在する場合は **bug-fix モード** とする。
237
+ 当日判定は LLM のテキスト解釈ではなく以下の Bash で機械的に取得すること(前セッションの残骸 debug-analysis による意図しない bug-fix モード突入を防ぐ):
238
+
239
+ ```bash
240
+ python -c "import os, glob, datetime; today = datetime.datetime.now().strftime('%Y%m%d'); files = sorted(glob.glob('.claude/reports/debug-analysis-*.md')); today_files = [f for f in files if os.path.basename(f).startswith(f'debug-analysis-{today}-')]; print(today_files[-1] if today_files else '')"
241
+ ```
265
242
 
266
- **フロントマターありの場合:**
243
+ 標準出力が空でなければそのパスを bug-fix モードの入力として保持する。空なら debug-analysis を「無し」とみなし判定 3 へ進む。
244
+ 3. plan-report も当日 debug-analysis も存在しない場合はフェーズ C から始めるよう案内して終了する。
245
+
246
+ **フロントマターありの場合(parallel-agents モード):**
267
247
  1. **最初に必ず** `.claude/skills/parallel-agents/SKILL.md` を Read する(記憶・推測で進めない)
268
248
  2. `.claude/skills/parallel-agents/SKILL.md` の手順に完全に従って wave 単位で実装を進める
269
249
  3. 全 wave 完了後はフェーズ E(レビュー)へ進む(wave に reviewer タスクが含まれていれば E をスキップ可能と案内する)
270
250
 
271
- **フロントマターなしの場合(legacy フォールバック):**
251
+ **フロントマターなしの場合(legacy TDD モード):**
272
252
 
273
253
  今日のセッションファイルに以下を追記する(未登録の場合のみ):
274
254
  - `- [ ] tester: Red フェーズ`
@@ -278,6 +258,51 @@ plan-report の冒頭を Read し、YAML フロントマター(`---` で始ま
278
258
 
279
259
  D-1 へ進む。
280
260
 
261
+ **bug-fix モードの場合:**
262
+
263
+ Glob で当日の `.claude/reports/debug-analysis-*.md` の最新を取得し、ファイルパスのみコンテキストに保持する(内容は後段の agent 側で Read させる。プロンプトに直接展開しない[SR-AI-001] 対策)。
264
+
265
+ 今日のセッションファイルに以下を追記する(未登録の場合のみ):
266
+ - `- [ ] developer: 修正実装`
267
+ - `- [ ] tester: 動作確認`
268
+
269
+ bug-fix モードでは D-1(Red tester)と D-4(Refactor)をスキップする。
270
+ 以下の順で実行する: **D-2(bug-fix モード)→ D-2.5(Stuck チェック・bug-fix モード)→ D-3(bug-fix モード)→ フェーズ E**。
271
+
272
+ **D-2(bug-fix モード)**: Agent ツールで `developer` を起動する。プロンプトには debug-analysis の**ファイルパスのみ**を含め、内容は agent 側で Read させる(プロンプトに展開しない)。
273
+ 完了後、セッションファイルの `- [ ] developer: 修正実装` を `- [x]` に Edit する。
274
+
275
+ **D-2.5(bug-fix モード)**: 通常の D-2.5 と同じ Stuck チェック手順(debug-needed-*.md 検出時の systematic-debugger 起動・developer 再実行)を実行する。
276
+ ただし末尾の AskUserQuestion 承認後の Edit 対象は `- [ ] developer: 修正実装` ではなく既に D-2 で `[x]` 化済みのため**スキップする**(bug-fix モードの修正実装承認は D-3 の動作確認で代替する)。
277
+ 通常モードの「`- [ ] developer: Green フェーズ` を `[x]` に Edit する」は bug-fix モードでは適用しない。
278
+
279
+ **D-3(bug-fix モード)**: Agent ツールで `tester` を起動して全テストの Green を確認する。
280
+ AskUserQuestion で確認する:
281
+
282
+ ```json
283
+ {
284
+ "questions": [{
285
+ "question": "bug-fix の動作確認結果を確認してください。どうしますか?",
286
+ "options": [
287
+ { "label": "全合格・レビューへ進む", "description": "フェーズ E(レビュー)へ進む" },
288
+ { "label": "不合格あり・再修正を依頼する", "description": "D-2(developer)に戻って再修正する" },
289
+ { "label": "不合格あり・自分で修正する", "description": "自分で修正してから tester を再実行する" }
290
+ ]
291
+ }]
292
+ }
293
+ ```
294
+
295
+ 「全合格」承認後 → セッションファイルの `- [ ] tester: 動作確認` を `- [x]` に Edit して**フェーズ E** へ。
296
+ 「不合格あり」を選んだ場合 → D-2 に戻る。合格するまで繰り返す。
297
+
298
+ bug-fix モード固有の動作:
299
+ - D-1(Red フェーズ)をスキップする理由: 既存の不具合自体が「足りないテスト」を示しており、developer が修正と一緒に回帰テストを追加する運用とする
300
+ - D-4(Refactor フェーズ)をスキップする理由: 不具合修正のスコープを最小に保つため。リファクタが必要な場合は後段のレビュー指摘で改めて計画化する
301
+
302
+ フェーズ E(レビュー)で指摘があり「全て対応する」「対応する指摘を選ぶ」を選んだ場合は、
303
+ 通常通りフェーズ C(計画)へ戻る。次回からは plan-report が生成されるため、
304
+ legacy TDD モードまたは parallel-agents モードで実装される。
305
+
281
306
  ### D-1: tester(Red フェーズ)
282
307
 
283
308
  Agent ツールで `tester` エージェントを起動する。→ 失敗するテストを先に作成する。**必ず `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` を Write してから終了すること。**
@@ -293,9 +318,9 @@ Agent ツールで `developer` エージェントを起動する。→ テスト
293
318
  Glob で `.claude/reports/debug-needed-*.md` の最新を確認する。
294
319
 
295
320
  **ファイルが存在する場合:**
296
- 1. Agent ツールで `systematic-debugger` を起動する。プロンプトに debug-needed ファイルのパスと内容を含める
297
- 2. 生成された `.claude/reports/debug-analysis-*.md` を Glob で取得して Read する
298
- 3. D-2 の developer を再実行する。プロンプトに debug-analysis の内容を追加注入する
321
+ 1. Agent ツールで `systematic-debugger` を起動する。プロンプトに debug-needed ファイルのパスのみを含め、内容は agent 側で Read させる(プロンプトに直接展開しない)[SR-AI-001]
322
+ 2. 生成された `.claude/reports/debug-analysis-*.md` を Glob で取得してパスのみコンテキストに保持する(内容は次段で agent に Read させる)
323
+ 3. D-2 の developer を再実行する。プロンプトに debug-analysis の**ファイルパスのみ**を含め、内容は agent 側で Read させる(プロンプトに展開しない)[SR-AI-001]
299
324
  4. debug-needed ファイルを削除する
300
325
 
301
326
  **ファイルが存在しない場合:** そのまま次へ進む
@@ -314,7 +339,7 @@ AskUserQuestion で確認する:
314
339
  }
315
340
  ```
316
341
 
317
- 承認後 → セッションファイルの `- [ ] developer: Green フェーズ` を `- [x]` に Edit する。
342
+ 承認後 → セッションファイルの `- [ ] developer: Green フェーズ` を `- [x]` に Edit する(**bug-fix モードではこの Edit をスキップする**。D-2 で `- [ ] developer: 修正実装` を既に `[x]` 化済みのため、Green フェーズ行自体がセッションファイルに存在しない)。
318
343
 
319
344
  **知識蓄積:**
320
345
  - 「否認・再実装を依頼する」: `## 試みたが失敗したアプローチ` に教訓をルール形式で追記し `patterns` に追加する
@@ -18,8 +18,6 @@ description: セッション開始時に前回の作業状態・残タスク・
18
18
  Glob で `.claude/memory/sessions/*.tmp` を検索し、ファイル名(YYYYMMDD)が最大のものを Read する。
19
19
  ファイルが存在しない場合は「前回セッションなし」として Step 3 へ進む。
20
20
 
21
- 冒頭から `^TASK_TYPE: (\S+)$` を抽出して `prev_task_type` として記録する(存在すれば Step 3 のサマリに含める)。
22
-
23
21
  ---
24
22
 
25
23
  ## Step 1.5: 残タスクと git log を照合する(陳腐化チェック)
@@ -55,7 +53,6 @@ Glob で `.claude/memory/sessions/*.tmp` を検索し、ファイル名(YYYYMM
55
53
  ## セッション再開 ({今日の日付})
56
54
 
57
55
  ### 前回セッション ({前回の日付})
58
- **前回のタスク種別:** {prev_task_type があれば表示、なければ省略}
59
56
 
60
57
  **残タスク:**
61
58
  {残タスクリスト。完了済み [x] は省略する}
@@ -118,7 +115,7 @@ AskUserQuestion ツールで以下を提示する:
118
115
 
119
116
  **「ワークフローで始める」の場合:**
120
117
  Skill ツールで `start` スキルを呼び出す。
121
- (`/start` 内の Step 0.5 task-routing が自動実行されるため、ここで個別呼び出しは不要)
118
+ (`/start` Step 1 で開始地点を選んで対応する dev-workflow フェーズへ遷移する)
122
119
 
123
120
  **「直接指示する」の場合:**
124
121
  ```
@@ -153,6 +153,11 @@ AskUserQuestion ツール:
153
153
  - `run_in_background`: `true`
154
154
  - `description`: タスク id(5 単語以内)
155
155
  - `prompt`: 以下を含める(ペルソナ採用は不要、frontmatter / system prompt で自動適用される):
156
+ - **先頭に `PO_WORKTREE_GUARD=1` を export する Bash 1 行を必須で含める** [SR-V-002]:
157
+ ```
158
+ Bash でまず以下を実行: `export PO_WORKTREE_GUARD=1`(worktree_guard.py PreToolUse が worktree 外書き込みをブロックする条件)
159
+ ```
160
+ worktree_guard.py はこの env 未設定時 `sys.exit(0)` で完全無効化されるため、wt_* agent 起動プロンプトの先頭で必ず設定すること。
156
161
  - タスクの `prompt` 本文
157
162
  - 「**禁止事項: git add / git commit / git push を実行しないこと**。コミットは親 Claude がユーザー承認後に行う」
158
163
  - 「**返り値フォーマット厳守**:
@@ -0,0 +1,136 @@
1
+ ---
2
+ description: 開発ワークフローの入口。開始地点(標準ワークフローの各フェーズ / 実装 / デバッグ調査 / レビュー)を選び、対応する dev-workflow フェーズに遷移する。
3
+ ---
4
+
5
+ # start
6
+
7
+ 開発ワークフローの入口。フロー順序: **Step 0(レポート整理)→ Step 1(開始地点選択)→ Step 2(フェーズ遷移)**。
8
+
9
+ ワークフローは 2 つだけ:
10
+
11
+ - **標準ワークフロー**: ヒアリング → 設計 → 計画 → 実装(TDD) → レビュー → 指摘ありで計画へ戻る、なしで終了
12
+ - **デバッグワークフロー**: systematic-debugger → 実装(developer + tester Green) → レビュー → 指摘ありで標準ワークフローの計画へ、なしで終了
13
+
14
+ その他の単発タスク(ドキュメント作成など)は対応する個別コマンド(例: `/doc`)を直接使う。
15
+
16
+ ---
17
+
18
+ ## Step 0: レポートの整理
19
+
20
+ Glob で `.claude/reports/*.md` を検索する(`archive/` 配下は含まない)。
21
+ レポートが存在しない場合はこの Step をスキップして Step 1 へ進む。
22
+
23
+ レポートが存在する場合はファイル名の一覧をテキストで提示してから AskUserQuestion で確認する:
24
+
25
+ ```json
26
+ {
27
+ "questions": [{
28
+ "question": "既存のレポートがあります。どうしますか?",
29
+ "options": [
30
+ { "label": "全てアーカイブして新しく始める", "description": "全レポートを reports/archive/ に移動する" },
31
+ { "label": "アーカイブするフェーズを選ぶ", "description": "フェーズ単位で選んで一部だけ移動する" },
32
+ { "label": "そのまま引き継ぐ", "description": "レポートを変更せずに続ける" }
33
+ ]
34
+ }]
35
+ }
36
+ ```
37
+
38
+ **「全てアーカイブして新しく始める」の場合:**
39
+ Bash ツールで実行する:
40
+ ```bash
41
+ mkdir -p .claude/reports/archive && mv .claude/reports/*.md .claude/reports/archive/
42
+ ```
43
+
44
+ **「アーカイブするフェーズを選ぶ」の場合:**
45
+ AskUserQuestion で対象フェーズを確認する:
46
+
47
+ ```json
48
+ {
49
+ "questions": [{
50
+ "question": "アーカイブするフェーズを選んでください(複数選択可)",
51
+ "options": [
52
+ { "label": "要件定義", "description": "requirements-report-*.md" },
53
+ { "label": "設計", "description": "architecture-report-*.md" },
54
+ { "label": "計画", "description": "plan-report-*.md" },
55
+ { "label": "レビュー", "description": "code-review-report-*.md / security-review-report-*.md" }
56
+ ],
57
+ "multiSelect": true
58
+ }]
59
+ }
60
+ ```
61
+
62
+ 選択されたフェーズに対応するファイルを Bash ツールで移動する(ファイルが存在しない場合はスキップ):
63
+ - 要件定義: `mkdir -p .claude/reports/archive && mv .claude/reports/requirements-report-*.md .claude/reports/archive/ 2>/dev/null || true`
64
+ - 設計: `mkdir -p .claude/reports/archive && mv .claude/reports/architecture-report-*.md .claude/reports/archive/ 2>/dev/null || true`
65
+ - 計画: `mkdir -p .claude/reports/archive && mv .claude/reports/plan-report-*.md .claude/reports/archive/ 2>/dev/null || true`
66
+ - レビュー: `mkdir -p .claude/reports/archive && mv .claude/reports/code-review-report-*.md .claude/reports/archive/ 2>/dev/null || true && mv .claude/reports/security-review-report-*.md .claude/reports/archive/ 2>/dev/null || true`
67
+
68
+ ---
69
+
70
+ ## Step 1: 開始地点の選択
71
+
72
+ AskUserQuestion ツールで 4 択を提示する:
73
+
74
+ ```json
75
+ {
76
+ "questions": [{
77
+ "question": "どこから始めますか?",
78
+ "header": "開始地点",
79
+ "options": [
80
+ { "label": "標準ワークフロー", "description": "ヒアリング/設計/計画のどれかから始める(新機能・リファクタ・改善など)" },
81
+ { "label": "実装から", "description": "既存 plan-report を使って実装フェーズへ" },
82
+ { "label": "デバッグ調査から", "description": "不具合の原因調査から始める" },
83
+ { "label": "レビューから", "description": "既存コードをレビューする(指摘があれば修正サイクルへ)" }
84
+ ]
85
+ }]
86
+ }
87
+ ```
88
+
89
+ 「標準ワークフロー」を選んだ場合は続けて Step 1.5 のサブ選択を行う。
90
+ それ以外を選んだ場合は Step 1.5 をスキップして Step 2 へ進む。
91
+
92
+ ---
93
+
94
+ ## Step 1.5: 標準ワークフローのサブ選択
95
+
96
+ Step 1 で「標準ワークフロー」を選んだ場合のみ実行する。
97
+ AskUserQuestion で 3 択を提示する:
98
+
99
+ ```json
100
+ {
101
+ "questions": [{
102
+ "question": "標準ワークフローのどこから始めますか?",
103
+ "header": "標準サブ選択",
104
+ "options": [
105
+ { "label": "ヒアリング", "description": "要件を整理するところから始める(新規・大きな変更)" },
106
+ { "label": "設計", "description": "要件は明確なので設計から始める" },
107
+ { "label": "計画", "description": "設計済みなのでタスク計画から始める" }
108
+ ]
109
+ }]
110
+ }
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Step 2: フェーズ遷移
116
+
117
+ 確定した開始地点に応じて以下のマッピングで遷移する。
118
+
119
+ | 開始地点 | 遷移先 |
120
+ |---|---|
121
+ | 標準ワークフロー・ヒアリング | `.claude/skills/dev-workflow/SKILL.md` を Read して **フェーズ A** から |
122
+ | 標準ワークフロー・設計 | `.claude/skills/dev-workflow/SKILL.md` を Read して **フェーズ B** から |
123
+ | 標準ワークフロー・計画 | `.claude/skills/dev-workflow/SKILL.md` を Read して **フェーズ C** から |
124
+ | 実装から | `.claude/skills/dev-workflow/SKILL.md` を Read して **フェーズ D** から([注 1]) |
125
+ | デバッグ調査から | Agent ツールで `systematic-debugger` を起動 → `.claude/skills/dev-workflow/SKILL.md` を Read して **フェーズ D** へ([注 2]) |
126
+ | レビューから | `.claude/skills/dev-workflow/SKILL.md` を Read して **フェーズ E** から |
127
+
128
+ [注 1] **実装から** の D-0 判定: plan-report-*.md の YAML フロントマターに `po_plan_version` があれば parallel-agents モード、なければ legacy TDD モードで動作する。plan-report が無い場合はフェーズ C へ案内される。
129
+
130
+ [注 2] **デバッグ調査から** の D-0 判定: systematic-debugger が当日タイムスタンプの debug-analysis-*.md を出力するため、D-0 がそれを検出して bug-fix モードで動作する。D-1(Red tester)と D-4(Refactor)はスキップされる。
131
+
132
+ **最初に必ず** 遷移先の `dev-workflow/SKILL.md` を Read してから実行する。記憶・推測で進めず、各フェーズに記述された AskUserQuestion・Edit・セッションファイル更新の手順を省略しないこと。
133
+
134
+ 各エージェント完了後は通常の Approval Flow に従う。
135
+
136
+ レビューサイクルの loop-back(指摘ありで計画フェーズへ戻る)は dev-workflow フェーズ E が担う。`/start` 側で個別に管理する必要はない。
@@ -48,6 +48,7 @@ site/
48
48
  .claude/docs/c3候補機能採用.md
49
49
  .claude/docs/c3追加予定機能リスト.md
50
50
  .claude/docs/ruflo_research_result.md
51
+ .claude/docs/C3_hnsw_機能追加詳細設計.md
51
52
 
52
53
  # codex 対応調査メモ (個人作業ノート、配布・コミット対象外)
53
54
  .claude/docs/codex対応/