claude-code-conductor 0.3.4__tar.gz → 0.4.2__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 (66) hide show
  1. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/tdd-develop.md +6 -6
  2. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/tester.md +3 -1
  3. claude_code_conductor-0.4.2/.claude/hooks/pre_compact.py +59 -0
  4. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/pre_tool.py +0 -15
  5. claude_code_conductor-0.4.2/.claude/hooks/session_utils.py +42 -0
  6. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/stop.py +47 -37
  7. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/settings.json +25 -21
  8. claude_code_conductor-0.4.2/.claude/settings.local.json +33 -0
  9. claude_code_conductor-0.4.2/.claude/skills/code-review/SKILL.md +14 -0
  10. claude_code_conductor-0.3.4/.claude/skills/dev-workflow.md → claude_code_conductor-0.4.2/.claude/skills/dev-workflow/SKILL.md +11 -5
  11. claude_code_conductor-0.4.2/.claude/skills/develop/SKILL.md +16 -0
  12. claude_code_conductor-0.3.4/.claude/commands/doc.md → claude_code_conductor-0.4.2/.claude/skills/doc/SKILL.md +6 -1
  13. claude_code_conductor-0.3.4/.claude/commands/extract-lib.md → claude_code_conductor-0.4.2/.claude/skills/extract-lib/SKILL.md +7 -2
  14. claude_code_conductor-0.3.4/.claude/commands/init-session.md → claude_code_conductor-0.4.2/.claude/skills/init-session/SKILL.md +6 -1
  15. claude_code_conductor-0.3.4/.claude/commands/mcp.md → claude_code_conductor-0.4.2/.claude/skills/mcp-config/SKILL.md +6 -1
  16. claude_code_conductor-0.3.4/.claude/commands/promote-pattern.md → claude_code_conductor-0.4.2/.claude/skills/promote-pattern/SKILL.md +25 -14
  17. claude_code_conductor-0.3.4/.claude/commands/setup.md → claude_code_conductor-0.4.2/.claude/skills/setup/SKILL.md +6 -1
  18. claude_code_conductor-0.3.4/.claude/commands/start.md → claude_code_conductor-0.4.2/.claude/skills/start/SKILL.md +8 -3
  19. claude_code_conductor-0.3.4/.claude/skills/wave-execution.md → claude_code_conductor-0.4.2/.claude/skills/wave-execution/SKILL.md +10 -4
  20. claude_code_conductor-0.3.4/.claude/skills/worktree-tdd-workflow.md → claude_code_conductor-0.4.2/.claude/skills/worktree-tdd-workflow/SKILL.md +7 -0
  21. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/CHANGELOG.md +45 -0
  22. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/PKG-INFO +26 -19
  23. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/README.md +25 -18
  24. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/hatch_build.py +1 -0
  25. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/__init__.py +1 -1
  26. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/_excludes.py +1 -0
  27. claude_code_conductor-0.3.4/.claude/commands/develop.md +0 -11
  28. claude_code_conductor-0.3.4/.claude/commands/review.md +0 -9
  29. claude_code_conductor-0.3.4/.claude/hooks/pre_compact.py +0 -86
  30. claude_code_conductor-0.3.4/.claude/pytest_temp.ini +0 -2
  31. claude_code_conductor-0.3.4/.claude/settings.local.json +0 -128
  32. claude_code_conductor-0.3.4/.claude/skills/promoted/index.md +0 -5
  33. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/CLAUDE.md +0 -0
  34. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/architect.md +0 -0
  35. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/code-reviewer.md +0 -0
  36. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/developer.md +0 -0
  37. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/doc-writer.md +0 -0
  38. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/interviewer.md +0 -0
  39. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/planner.md +0 -0
  40. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/project-setup.md +0 -0
  41. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/agents/security-reviewer.md +0 -0
  42. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/docs/parallel-orchestra-manifest.md +0 -0
  43. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/clear_file_history.py +0 -0
  44. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/enable_sandbox.py +0 -0
  45. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/statusline.py +0 -0
  46. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/validate_skill_change.py +0 -0
  47. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/hooks/worktree_guard.py +0 -0
  48. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/memory/.gitkeep +0 -0
  49. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/rules/code-review-checklist.md +0 -0
  50. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/rules/promoted/index.md +0 -0
  51. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.claude/rules/security-review-checklist.md +0 -0
  52. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/.gitignore +0 -0
  53. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/LICENSE +0 -0
  54. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/pyproject.toml +0 -0
  55. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/__main__.py +0 -0
  56. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/cli.py +0 -0
  57. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/cli_doctor.py +0 -0
  58. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/cli_init.py +0 -0
  59. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/cli_list.py +0 -0
  60. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/cli_po.py +0 -0
  61. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/cli_update.py +0 -0
  62. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/paths.py +0 -0
  63. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/po/__init__.py +0 -0
  64. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/po/detect.py +0 -0
  65. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/po/manifest.py +0 -0
  66. {claude_code_conductor-0.3.4 → claude_code_conductor-0.4.2}/src/c3/po/run.py +0 -0
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: tdd-develop
3
3
  model: sonnet
4
- description: ヘッドレス専用 TDD コンダクター。**必ず最初に `.claude/skills/worktree-tdd-workflow.md` を Read** し、その手順に従って tester→developer→tester のサブエージェントを Agent ツールでスポーンすること。インライン実装は絶対禁止。AskUserQuestion を使わない。
4
+ description: ヘッドレス専用 TDD コンダクター。**必ず最初に `.claude/skills/worktree-tdd-workflow/SKILL.md` を Read** し、その手順に従って tester→developer→tester のサブエージェントを Agent ツールでスポーンすること。インライン実装は絶対禁止。AskUserQuestion を使わない。
5
5
  tools:
6
6
  - Read
7
7
  - Write
@@ -19,7 +19,7 @@ tools:
19
19
 
20
20
  **いかなるタスクであっても、最初に必ず以下を実行すること:**
21
21
 
22
- 1. `Read` ツールで `.claude/skills/worktree-tdd-workflow.md` を読み込む
22
+ 1. `Read` ツールで `.claude/skills/worktree-tdd-workflow/SKILL.md` を読み込む
23
23
  2. 読み込んだワークフローに従って tester → developer → tester の順で **必ず Agent ツールでサブエージェントをスポーン**する
24
24
  3. **絶対にインラインで pytest や Edit を直接実行して実装してはならない**
25
25
  4. 「自分で実装した方が早い」と感じても、必ず Agent 経由で tester/developer に委譲すること
@@ -31,13 +31,13 @@ tools:
31
31
  ## Core Mandate
32
32
 
33
33
  ヘッドレス環境で TDD サイクルを自律実行するコンダクター。
34
- `.claude/skills/worktree-tdd-workflow.md` を読み込み、上限付きループで実行する。
34
+ `.claude/skills/worktree-tdd-workflow/SKILL.md` を読み込み、上限付きループで実行する。
35
35
  全テスト合格またはループ上限到達で終了する。
36
36
 
37
37
  ## Key Scope
38
38
 
39
39
  ✅ 担当すること:
40
- - `.claude/skills/worktree-tdd-workflow.md` の手順に従った TDD サイクルの実行
40
+ - `.claude/skills/worktree-tdd-workflow/SKILL.md` の手順に従った TDD サイクルの実行
41
41
  - ループカウンターの管理と終了判定
42
42
  - tester / developer へのコンテキスト(plan-report・test-report のパス)の受け渡し
43
43
  - 最終結果の出力
@@ -58,14 +58,14 @@ tools:
58
58
 
59
59
  ### Step 0: 初期化
60
60
 
61
- 1. `.claude/skills/worktree-tdd-workflow.md` を Read してサイクル手順を把握する
61
+ 1. `.claude/skills/worktree-tdd-workflow/SKILL.md` を Read してサイクル手順を把握する
62
62
  2. Glob で `.claude/reports/plan-report-*.md` の最新ファイルの存在を確認する
63
63
  - 存在しない場合: 「plan-report が見つかりません。Parallel Orchestra のマニフェストに plan-report のパスを含めるか、事前に計画フェーズを完了してください」と出力して終了する
64
64
  3. ループカウンターを `0` に初期化する
65
65
 
66
66
  ### Step 1: TDD サイクル実行
67
67
 
68
- `.claude/skills/worktree-tdd-workflow.md` の Step 1〜4 を実行する。
68
+ `.claude/skills/worktree-tdd-workflow/SKILL.md` の Step 1〜4 を実行する。
69
69
 
70
70
  ### Step 2: 結果判定
71
71
 
@@ -38,10 +38,12 @@ tools:
38
38
  - テスト結果は合格・不合格・スキップの件数を記録する
39
39
 
40
40
  **After:**
41
- - `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` に Write して出力する
41
+ - **必ず** `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` に Write して出力する
42
+ - test-report を Write せずにターンを終了することは禁止
42
43
 
43
44
  ## Tools & Constraints
44
45
  制限: プロダクションコードのソースファイルを編集・書き込みしない
46
+ 必須: 毎回必ず test-report を `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` に Write すること(出力なしでの終了は不可)
45
47
 
46
48
  ## Related Agents
47
49
  - 上流: planner(plan-report を受け取る)
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env python3
2
+ """PreCompact hook: append checkpoint marker to today's session file."""
3
+
4
+ import json
5
+ import os
6
+ import sys
7
+ from datetime import datetime, timezone
8
+
9
+ sys.stdout.reconfigure(encoding='utf-8')
10
+ sys.stderr.reconfigure(encoding='utf-8')
11
+
12
+ _HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
13
+ _CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
14
+ SESSIONS_DIR = os.path.join(_CLAUDE_DIR, 'memory', 'sessions')
15
+
16
+ from session_utils import is_worktree, create_session_template
17
+
18
+
19
+ def main():
20
+ try:
21
+ payload = json.loads(sys.stdin.read())
22
+ except (json.JSONDecodeError, ValueError):
23
+ payload = {}
24
+
25
+ cwd = os.getcwd()
26
+ if is_worktree(cwd):
27
+ sys.exit(0)
28
+
29
+ trigger = payload.get('trigger', 'unknown')
30
+ context_items_before = payload.get('context_items_before', 0)
31
+
32
+ os.makedirs(SESSIONS_DIR, exist_ok=True)
33
+
34
+ now = datetime.now(timezone.utc)
35
+ date_str = now.strftime('%Y%m%d')
36
+ session_file = os.path.join(SESSIONS_DIR, f'{date_str}.tmp')
37
+
38
+ try:
39
+ with open(session_file, 'x', encoding='utf-8') as f:
40
+ f.write(create_session_template(date_str))
41
+ except FileExistsError:
42
+ pass # already created by stop.py or another process
43
+
44
+ ts = now.isoformat()
45
+ checkpoint = (
46
+ f'\n'
47
+ f'## [PreCompact checkpoint: {trigger} - {ts}]\n'
48
+ f'コンテキスト圧縮 ({trigger}) が発生しました。圧縮前: {context_items_before} アイテム。\n'
49
+ f'このポイント以前の詳細な文脈は失われています。\n'
50
+ )
51
+
52
+ with open(session_file, 'a', encoding='utf-8') as f:
53
+ f.write(checkpoint)
54
+
55
+ print(f'[PreCompact] セッション状態を {session_file} に保存しました', file=sys.stderr)
56
+
57
+
58
+ if __name__ == '__main__':
59
+ main()
@@ -32,21 +32,6 @@ def main():
32
32
  print('[PreToolUse WARNING] 破壊的な DB 操作を検出しました。本番環境での実行でないことを確認してください。',
33
33
  file=sys.stderr)
34
34
 
35
- # cd コマンド: CWD 固定バグを防ぐためブロック
36
- # Bash ツールで cd を実行すると以降の全コマンドの CWD が変わり、
37
- # フックが相対パスで .claude/hooks/ を参照できなくなる。
38
- # サブシェル $( )・バックティック・eval・改行セパレータ経由のバイパスも検出する。
39
- if re.search(r'(?:^|[;&|\n`]|\$\()\s*cd(?:\s|$)', cmd) or \
40
- re.search(r'\beval\b.*\bcd\b', cmd):
41
- print(
42
- '[PreToolUse BLOCK] cd コマンドをブロックしました。\n'
43
- 'Bash ツールで cd を実行すると CWD が変わり、以降のフックが失敗します。\n'
44
- 'cd を使わず、プロジェクトルートからの相対パスで実行してください。\n'
45
- '例: python -m pytest test1/tests -v (cd test1 && python -m pytest の代わり)',
46
- file=sys.stderr
47
- )
48
- sys.exit(2)
49
-
50
35
  # rm -rf 系: ブロック
51
36
  # rm の直後のフラグのみを収集することで、前のコマンドのフラグを誤検出しない
52
37
  if re.search(r'\brm\b', cmd):
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python3
2
+ """Shared utilities for session management hooks (stop.py, pre_compact.py)."""
3
+
4
+ import os
5
+
6
+ _HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
7
+ _CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
8
+ SESSIONS_DIR = os.path.join(_CLAUDE_DIR, 'memory', 'sessions')
9
+
10
+ SESSION_JSON_MARKER = 'C3:SESSION:JSON'
11
+
12
+
13
+ def is_worktree(cwd: str) -> bool:
14
+ git_path = os.path.join(cwd, '.git')
15
+ return os.path.exists(git_path) and os.path.isfile(git_path)
16
+
17
+
18
+ def create_session_template(date_str: str) -> str:
19
+ return (
20
+ f"SESSION: {date_str}\n"
21
+ f"AGENT: \n"
22
+ f"DURATION: \n"
23
+ f"\n"
24
+ f"## うまくいったアプローチ\n"
25
+ f"\n"
26
+ f"## 試みたが失敗したアプローチ\n"
27
+ f"\n"
28
+ f"## 残タスク\n"
29
+ f"\n"
30
+ f"## 事実ログ(自動生成 / stop.py)\n"
31
+ f"- 記録時刻: \n"
32
+ f"\n"
33
+ f"<!-- {SESSION_JSON_MARKER}\n"
34
+ f"{{\n"
35
+ f' "session": "{date_str}",\n'
36
+ f' "patterns": [],\n'
37
+ f' "successes": [],\n'
38
+ f' "failures": [],\n'
39
+ f' "todos": []\n'
40
+ f"}}\n"
41
+ f"-->\n"
42
+ )
@@ -10,58 +10,28 @@ import os
10
10
  import re
11
11
  from datetime import date, datetime, timezone
12
12
 
13
+ sys.stdin.reconfigure(encoding='utf-8')
13
14
  sys.stdout.reconfigure(encoding='utf-8')
14
15
  sys.stderr.reconfigure(encoding='utf-8')
15
16
 
16
17
  _HOOKS_DIR = os.path.dirname(os.path.abspath(__file__))
17
18
  _CLAUDE_DIR = os.path.dirname(_HOOKS_DIR)
18
- SESSIONS_DIR = os.path.join(_CLAUDE_DIR, 'memory', 'sessions')
19
19
  PATTERNS_FILE = os.path.join(_CLAUDE_DIR, 'memory', 'patterns.json')
20
20
 
21
+ from session_utils import SESSION_JSON_MARKER, is_worktree, create_session_template, SESSIONS_DIR
22
+
21
23
  EXPIRY_DAYS = 30
22
24
  PROMOTION_THRESHOLD = 0.8
23
25
  COOLING_DAYS = 3
24
- SESSION_JSON_MARKER = 'C3:SESSION:JSON'
25
26
  MAX_ID_LENGTH = 64
26
27
  MAX_DESCRIPTION_LENGTH = 500
27
-
28
-
29
- def is_worktree(cwd: str) -> bool:
30
- git_path = os.path.join(cwd, '.git')
31
- return os.path.exists(git_path) and os.path.isfile(git_path)
28
+ MAX_LAST_MSG = 500
32
29
 
33
30
 
34
31
  def get_session_path(date_str: str) -> str:
35
32
  return os.path.join(SESSIONS_DIR, f'{date_str}.tmp')
36
33
 
37
34
 
38
- def create_session_template(date_str: str) -> str:
39
- return (
40
- f"SESSION: {date_str}\n"
41
- f"AGENT: \n"
42
- f"DURATION: \n"
43
- f"\n"
44
- f"## うまくいったアプローチ\n"
45
- f"\n"
46
- f"## 試みたが失敗したアプローチ\n"
47
- f"\n"
48
- f"## 残タスク\n"
49
- f"\n"
50
- f"## 事実ログ(自動生成 / stop.py)\n"
51
- f"- 記録時刻: \n"
52
- f"\n"
53
- f"<!-- {SESSION_JSON_MARKER}\n"
54
- f"{{\n"
55
- f' "session": "{date_str}",\n'
56
- f' "patterns": [],\n'
57
- f' "successes": [],\n'
58
- f' "failures": [],\n'
59
- f' "todos": []\n'
60
- f"}}\n"
61
- f"-->\n"
62
- )
63
-
64
-
65
35
  def ensure_session_file(date_str: str) -> None:
66
36
  os.makedirs(SESSIONS_DIR, exist_ok=True)
67
37
  path = get_session_path(date_str)
@@ -71,7 +41,37 @@ def ensure_session_file(date_str: str) -> None:
71
41
  f.write(create_session_template(date_str))
72
42
  print(f'[Stop] セッションファイルを作成しました: {path}', file=sys.stderr)
73
43
  except FileExistsError:
74
- _update_facts_timestamp(path)
44
+ # /exit による中断等でファイルが空の場合はテンプレートを書き直す
45
+ if os.path.getsize(path) == 0:
46
+ with open(path, 'w', encoding='utf-8') as f:
47
+ f.write(create_session_template(date_str))
48
+ print(f'[Stop] 空セッションファイルを再初期化しました: {path}', file=sys.stderr)
49
+ else:
50
+ _update_facts_timestamp(path)
51
+
52
+
53
+ def _append_last_message(path: str, message: str) -> None:
54
+ with open(path, 'r', encoding='utf-8') as f:
55
+ content = f.read()
56
+
57
+ if '- 最終応答:' in content:
58
+ return
59
+
60
+ single_line = ' '.join(message.split())
61
+ # サロゲート文字など UTF-8 非互換文字を除去(JSON デコード時に生成される場合がある)
62
+ single_line = single_line.encode('utf-8', errors='replace').decode('utf-8')
63
+ truncated = single_line[:MAX_LAST_MSG]
64
+ if len(single_line) > MAX_LAST_MSG:
65
+ truncated += '…(省略)'
66
+
67
+ updated = re.sub(
68
+ r'(- 記録時刻: [^\n]*)',
69
+ lambda m: m.group(0) + f'\n- 最終応答: {truncated}',
70
+ content
71
+ )
72
+ if updated != content:
73
+ with open(path, 'w', encoding='utf-8') as f:
74
+ f.write(updated)
75
75
 
76
76
 
77
77
  def _update_facts_timestamp(path: str) -> None:
@@ -209,9 +209,14 @@ def update_patterns(date_str: str) -> None:
209
209
 
210
210
  def main():
211
211
  try:
212
- json.loads(sys.stdin.read())
212
+ payload = json.loads(sys.stdin.read())
213
213
  except (json.JSONDecodeError, ValueError):
214
- pass
214
+ payload = {}
215
+
216
+ # stop_hook_active=true は Stop hook が decision:block を返した後の 2 回目呼び出し。
217
+ # セッション処理は初回のみ実行する。
218
+ if payload.get('stop_hook_active'):
219
+ sys.exit(0)
215
220
 
216
221
  cwd = os.getcwd()
217
222
  if is_worktree(cwd):
@@ -219,6 +224,11 @@ def main():
219
224
 
220
225
  today_str = date.today().strftime('%Y%m%d')
221
226
  ensure_session_file(today_str)
227
+
228
+ last_msg = payload.get('last_assistant_message', '').strip()
229
+ if last_msg:
230
+ _append_last_message(get_session_path(today_str), last_msg)
231
+
222
232
  update_patterns(today_str)
223
233
 
224
234
 
@@ -8,17 +8,32 @@
8
8
  "Bash(python .claude/hooks/pre_compact.py*)",
9
9
  "Bash(python .claude/hooks/validate_skill_change.py*)",
10
10
  "Bash(python .claude/hooks/statusline.py*)",
11
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/clear_file_history.py\"*)",
12
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/enable_sandbox.py\"*)",
13
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/stop.py\"*)",
14
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/pre_tool.py\"*)",
15
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/pre_compact.py\"*)",
16
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/validate_skill_change.py\"*)",
17
+ "Bash(python \"$CLAUDE_PROJECT_DIR/.claude/hooks/statusline.py\"*)",
11
18
  "Read(**)",
12
19
  "Glob(**)",
13
20
  "Grep(**)",
14
21
  "Edit(.claude/reports/**)",
22
+ "Edit(.claude/memory/sessions/**)",
23
+ "Edit(.claude/memory/**)",
24
+ "Edit(.claude/rules/**)",
25
+ "Edit(.claude/rules/promoted/**)",
26
+ "Edit(.claude/skills/**)",
27
+ "Edit(.claude/settings.json)",
15
28
  "Write(.claude/reports/**)",
29
+ "Write(.claude/reports/archive/**)",
16
30
  "Write(.claude/tmp/**)",
17
31
  "Write(.claude/memory/**)",
18
- "Edit(.claude/memory/sessions/**)",
19
32
  "Write(.claude/memory/sessions/**)",
33
+ "Write(.claude/rules/**)",
20
34
  "Write(.claude/rules/promoted/**)",
21
- "Write(.claude/skills/promoted/**)",
35
+ "Write(.claude/skills/**)",
36
+ "Write(.claude/settings.json)",
22
37
  "Bash(git status*)",
23
38
  "Bash(git diff*)",
24
39
  "Bash(git log*)",
@@ -47,7 +62,7 @@
47
62
  },
48
63
  "statusLine": {
49
64
  "type": "command",
50
- "command": "python .claude/hooks/statusline.py"
65
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/statusline.py\""
51
66
  },
52
67
  "hooks": {
53
68
  "PreToolUse": [
@@ -56,7 +71,7 @@
56
71
  "hooks": [
57
72
  {
58
73
  "type": "command",
59
- "command": "python .claude/hooks/pre_tool.py"
74
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/pre_tool.py\""
60
75
  }
61
76
  ]
62
77
  },
@@ -65,7 +80,7 @@
65
80
  "hooks": [
66
81
  {
67
82
  "type": "command",
68
- "command": "python .claude/hooks/worktree_guard.py"
83
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/worktree_guard.py\""
69
84
  }
70
85
  ]
71
86
  },
@@ -74,7 +89,7 @@
74
89
  "hooks": [
75
90
  {
76
91
  "type": "command",
77
- "command": "python .claude/hooks/worktree_guard.py"
92
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/worktree_guard.py\""
78
93
  }
79
94
  ]
80
95
  }
@@ -85,7 +100,7 @@
85
100
  "hooks": [
86
101
  {
87
102
  "type": "command",
88
- "command": "python .claude/hooks/validate_skill_change.py"
103
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/validate_skill_change.py\""
89
104
  }
90
105
  ]
91
106
  },
@@ -94,7 +109,7 @@
94
109
  "hooks": [
95
110
  {
96
111
  "type": "command",
97
- "command": "python .claude/hooks/validate_skill_change.py"
112
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/validate_skill_change.py\""
98
113
  }
99
114
  ]
100
115
  }
@@ -105,7 +120,7 @@
105
120
  "hooks": [
106
121
  {
107
122
  "type": "command",
108
- "command": "python .claude/hooks/pre_compact.py"
123
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/pre_compact.py\""
109
124
  }
110
125
  ]
111
126
  }
@@ -116,18 +131,7 @@
116
131
  "hooks": [
117
132
  {
118
133
  "type": "command",
119
- "command": "python .claude/hooks/stop.py"
120
- }
121
- ]
122
- }
123
- ],
124
- "UserPromptSubmit": [
125
- {
126
- "matcher": "",
127
- "hooks": [
128
- {
129
- "type": "command",
130
- "command": "python .claude/hooks/statusline.py"
134
+ "command": "python \"$CLAUDE_PROJECT_DIR/.claude/hooks/stop.py\""
131
135
  }
132
136
  ]
133
137
  }
@@ -0,0 +1,33 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(python .claude/hooks/clear_file_history.py*)",
5
+ "Bash(python .claude/hooks/enable_sandbox.py*)",
6
+ "Bash(python .claude/hooks/stop.py*)",
7
+ "Bash(python .claude/hooks/pre_tool.py*)",
8
+ "Bash(python .claude/hooks/pre_compact.py*)",
9
+ "Bash(python .claude/hooks/validate_skill_change.py*)",
10
+ "Bash(python .claude/hooks/statusline.py*)",
11
+ "Bash(python *)",
12
+ "Bash(pytest *)",
13
+ "Bash(xargs wc *)",
14
+ "Bash(git add*)",
15
+ "Bash(git commit*)",
16
+ "Bash(git status*)",
17
+ "Bash(git diff*)",
18
+ "Bash(git log*)",
19
+ "Bash(mkdir*)",
20
+ "Edit(**)",
21
+ "Glob(**)",
22
+ "Grep(**)",
23
+ "Read(**)",
24
+ "Write(**)",
25
+ "WebFetch(domain:github.com)",
26
+ "WebFetch(domain:pypi.org)",
27
+ "Bash(grep \"\\\\.py$\")",
28
+ "WebFetch(domain:raw.githubusercontent.com)",
29
+ "Bash(pip-audit)",
30
+ "Bash(c3 po *)"
31
+ ]
32
+ }
33
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ description: 実装済みコードの code-reviewer・security-reviewer によるレビュー(フェーズ E)を実行する。
3
+ disable-model-invocation: true
4
+ ---
5
+
6
+ # code-review
7
+
8
+ 実装済みコードのレビューを行う。
9
+
10
+ ## 必ず守ること
11
+
12
+ 1. **最初に必ず** `.claude/skills/dev-workflow/SKILL.md` を Read する。記憶・推測で進めない
13
+ 2. **フェーズ E(レビュー)** から実行する
14
+ 3. dev-workflow/SKILL.md の AskUserQuestion・Edit・セッションファイル更新の手順を省略しない
@@ -1,3 +1,9 @@
1
+ ---
2
+ description: ヒアリング→設計→計画→実装→レビューの全フェーズワークフロー。/start・/develop・/code-review コマンドが内部参照する。
3
+ disable-model-invocation: false
4
+ user-invocable: false
5
+ ---
6
+
1
7
  # Dev Workflow
2
8
 
3
9
  要件定義から実装・レビューまでを複数エージェントで連携させるフルワークフロー。
@@ -227,8 +233,8 @@ AskUserQuestion ツール:
227
233
  plan-report の冒頭を Read し、YAML フロントマター(`---` で始まり `po_plan_version: "0.1"` を含む)の有無を確認する。
228
234
 
229
235
  **フロントマターありの場合:**
230
- 1. **最初に必ず** `.claude/skills/wave-execution.md` を Read する(記憶・推測で進めない)
231
- 2. `wave-execution.md` の手順に完全に従って wave 単位で実装を進める
236
+ 1. **最初に必ず** `.claude/skills/wave-execution/SKILL.md` を Read する(記憶・推測で進めない)
237
+ 2. `wave-execution/SKILL.md` の手順に完全に従って wave 単位で実装を進める
232
238
  3. 全 wave 完了後はフェーズ E(レビュー)へ進む(wave に reviewer タスクが含まれていれば E をスキップ可能と案内する)
233
239
 
234
240
  **フロントマターなしの場合(legacy フォールバック):**
@@ -243,7 +249,7 @@ D-1 へ進む。
243
249
 
244
250
  ### D-1: tester(Red フェーズ)
245
251
 
246
- Agent ツールで `tester` エージェントを起動する。→ 失敗するテストを先に作成する。
252
+ Agent ツールで `tester` エージェントを起動する。→ 失敗するテストを先に作成する。**必ず `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` を Write してから終了すること。**
247
253
 
248
254
  完了後 → セッションファイルの `- [ ] tester: Red フェーズ` を `- [x]` に Edit する。
249
255
 
@@ -272,7 +278,7 @@ AskUserQuestion で確認する:
272
278
 
273
279
  ### D-3: tester(確認)
274
280
 
275
- Agent ツールで `tester` エージェントを起動する。→ 全テストの合否を確認する。
281
+ Agent ツールで `tester` エージェントを起動する。→ 全テストの合否を確認する。**必ず `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` を Write してから終了すること。**
276
282
 
277
283
  AskUserQuestion で確認する:
278
284
  ```json
@@ -298,7 +304,7 @@ Agent ツールで `developer` エージェントを起動する。→ テスト
298
304
 
299
305
  ### D-5: tester(最終確認)
300
306
 
301
- Agent ツールで `tester` エージェントを起動する。
307
+ Agent ツールで `tester` エージェントを起動する。**必ず `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` を Write してから終了すること。**
302
308
 
303
309
  AskUserQuestion で確認する:
304
310
  ```json
@@ -0,0 +1,16 @@
1
+ ---
2
+ description: plan-report に基づいて実装フェーズ(フェーズ D)を実行する。po_plan_version があれば PO 並列モード、なければ逐次 TDD を実行する。
3
+ disable-model-invocation: true
4
+ ---
5
+
6
+ # develop
7
+
8
+ plan-report に基づいて実装フェーズを実行する。
9
+
10
+ ## 必ず守ること
11
+
12
+ 1. **最初に必ず** `.claude/skills/dev-workflow/SKILL.md` を Read する。記憶・推測で進めない
13
+ 2. **フェーズ D(実装)** から実行する
14
+ 3. dev-workflow/SKILL.md の AskUserQuestion・Edit・セッションファイル更新の手順を省略しない
15
+ 4. D-0 で plan-report に YAML フロントマター(`po_plan_version`)が検出された場合は、続けて **必ず** `.claude/skills/wave-execution/SKILL.md` を Read してその手順に従う(C3 メイン + PO スポット並列モード)
16
+ 5. フロントマターが無い場合は legacy の D-1〜D-5 ceremony(tester→developer→tester の TDD 逐次実行)にフォールバックする
@@ -1,4 +1,9 @@
1
- # /doc コマンド
1
+ ---
2
+ description: ドキュメント種類・対象・読み手・目的・粒度をヒアリングして doc-writer エージェントにドキュメントを生成させる。
3
+ disable-model-invocation: true
4
+ ---
5
+
6
+ # doc
2
7
 
3
8
  ドキュメントを対話形式でヒアリングして生成する。
4
9
  対話部分は親 Claude が担当し、生成は doc-writer エージェントが行う。
@@ -1,4 +1,9 @@
1
- # /extract-lib コマンド
1
+ ---
2
+ description: 複数プロジェクトから共通コードを解析・抽出してライブラリ設計案とスケルトンコードを生成する。
3
+ disable-model-invocation: true
4
+ ---
5
+
6
+ # extract-lib
2
7
 
3
8
  複数プロジェクトのコードを横断解析し、共通要素を抽出してライブラリ設計・スケルトン生成を行う。
4
9
 
@@ -288,5 +293,5 @@ Agent ツールでスケルトンコード生成を行う:
288
293
  次のステップ:
289
294
  1. レポートの設計案を確認し、必要に応じて調整する
290
295
  2. 各プロジェクトの該当箇所をライブラリに置き換える
291
- 3. /review でライブラリのコードレビューを実施する
296
+ 3. /code-review でライブラリのコードレビューを実施する
292
297
  ```
@@ -1,4 +1,9 @@
1
- # /init-session コマンド
1
+ ---
2
+ description: セッション開始時に前回の作業状態・残タスク・昇格候補パターンを確認し、作業の開始方法を選ぶ。セッション開始時に手動で実行する。
3
+ disable-model-invocation: true
4
+ ---
5
+
6
+ # init-session
2
7
 
3
8
  セッションを初期化し、前回の作業状態を復元する。
4
9
  セッション開始時に手動で実行する。
@@ -1,4 +1,9 @@
1
- # /mcp コマンド
1
+ ---
2
+ description: MCP サーバーの追加・一覧・削除を対話形式で行い .claude/settings.json を更新する。
3
+ disable-model-invocation: true
4
+ ---
5
+
6
+ # mcp-config
2
7
 
3
8
  MCP サーバーの追加・一覧・削除を対話形式で行う。
4
9
  全ての設定は `.claude/settings.json` のプロジェクトスコープに書き込む。