phasegate 0.160.21 → 0.162.0

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 (96) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +6 -1
  3. package/docs/contracts/requirement-test-matrix.schema.json +1 -1
  4. package/docs/guide/cli-reference.md +1 -1
  5. package/docs/guide/configuration.md +31 -1
  6. package/docs/guide/skills-overview.md +2 -0
  7. package/docs/principles/model-routing.md +1 -0
  8. package/docs/templates/personal/phasegate-local-config.json +4 -1
  9. package/docs/templates/project/phasegate.config.json +4 -1
  10. package/package.json +6 -3
  11. package/scripts/harness/agent-integration/domain/services/bash-write-target-extractor.ts +91 -23
  12. package/scripts/harness/agent-integration/domain/value-objects/protected-file-list.ts +4 -0
  13. package/scripts/harness/agent-integration/domain/value-objects/write-target-scope.ts +54 -5
  14. package/scripts/harness/agent-integration/infrastructure/adapters/ci-governance-baseline-grandfather-adapter.ts +25 -2
  15. package/scripts/harness/agent-integration/infrastructure/adapters/phase-gate-query-adapter.ts +17 -2
  16. package/scripts/harness/biome-ast-engine/domain/value-objects/import-graph.ts +28 -1
  17. package/scripts/harness/config-foundation/application/mappers/validator-system-config-mapper.ts +6 -1
  18. package/scripts/harness/config-foundation/domain/harness-config.ts +10 -0
  19. package/scripts/harness/config-foundation/domain/services/preset-resolution-service.ts +2 -0
  20. package/scripts/harness/config-foundation/domain/value-objects/l3-config.ts +4 -0
  21. package/scripts/harness/config-foundation/domain/value-objects/layers-config.ts +1 -1
  22. package/scripts/harness/config-foundation/domain/value-objects/project-config.ts +20 -5
  23. package/scripts/harness/config-foundation/infrastructure/presets/minimal.json +2 -1
  24. package/scripts/harness/config-foundation/infrastructure/presets/standard.json +2 -1
  25. package/scripts/harness/config-foundation/infrastructure/presets/strict.json +2 -1
  26. package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v2.schema.json +39 -9
  27. package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v3.schema.json +39 -9
  28. package/scripts/harness/harness-api/infrastructure/adapters/phase-dependency-model-query-adapter.ts +18 -4
  29. package/scripts/harness/harness-api/infrastructure/adapters/validator-system-execution-adapter.ts +27 -4
  30. package/scripts/harness/installation/application/ports/model-delegation-port.ts +10 -0
  31. package/scripts/harness/installation/application/usecases/run-install.ts +67 -5
  32. package/scripts/harness/installation/application/usecases/run-reconcile.ts +53 -5
  33. package/scripts/harness/installation/composition-root.ts +4 -2
  34. package/scripts/harness/installation/infrastructure/adapters/skill-deployer-model-delegation-adapter.ts +16 -0
  35. package/scripts/harness/installation/presentation/cli/install-handler.ts +2 -1
  36. package/scripts/harness/main.ts +99 -13
  37. package/scripts/harness/nyquist-validation/application/dto/generate-matrix-output.ts +9 -7
  38. package/scripts/harness/nyquist-validation/domain/services/matrix-validation-service.ts +27 -2
  39. package/scripts/harness/nyquist-validation/domain/services/requirement-intent-coverage-service.ts +4 -4
  40. package/scripts/harness/nyquist-validation/domain/value-objects/intent-coverage.ts +33 -0
  41. package/scripts/harness/nyquist-validation/infrastructure/adapters/markdown-requirement-source-adapter.ts +3 -1
  42. package/scripts/harness/quick-mode/application/usecases/classify-change-category-usecase.ts +8 -3
  43. package/scripts/harness/quick-mode/composition-root.ts +3 -0
  44. package/scripts/harness/quick-mode/domain/value-objects/quick-mode-config.ts +6 -1
  45. package/scripts/harness/quick-mode/infrastructure/adapters/validator-system-quick-mode-execution-adapter.ts +18 -0
  46. package/scripts/harness/quick-mode/presentation/handlers/ci-check-quick-mode-handler.ts +51 -5
  47. package/scripts/harness/setup/skill-deployer.ts +47 -0
  48. package/scripts/harness/skill-quality/domain/services/skill-structure-validator.ts +21 -0
  49. package/scripts/harness/skill-quality/domain/value-objects/skill-structure.ts +2 -0
  50. package/scripts/harness/skill-quality/infrastructure/adapters/l1-biome-validator-adapter.ts +12 -2
  51. package/scripts/harness/skill-quality/infrastructure/adapters/l2-validator-system-adapter.ts +12 -2
  52. package/scripts/harness/traceability-model/application/usecases/apply-work-item-status-usecase.ts +6 -1
  53. package/scripts/harness/traceability-model/infrastructure/parsers/story-catalog-parser.ts +28 -9
  54. package/scripts/harness/validator-system/application/use-cases/run-l3-validators-usecase.ts +76 -25
  55. package/scripts/harness/validator-system/application/use-cases/run-l4-validators-usecase.ts +20 -8
  56. package/scripts/harness/validator-system/composition-root.ts +8 -1
  57. package/scripts/harness/validator-system/domain/ports/validator-config-port.ts +2 -0
  58. package/scripts/harness/validator-system/domain/services/validator-language-capability-service.ts +64 -0
  59. package/scripts/harness/validator-system/infrastructure/adapters/file-system-security-pattern-scanner-adapter.ts +16 -6
  60. package/scripts/harness/validator-system/infrastructure/adapters/file-system-work-item-reflection-adapter.ts +10 -1
  61. package/scripts/harness/validator-system/infrastructure/adapters/harness-config-validator-config-adapter.ts +7 -1
  62. package/scripts/harness/validator-system/infrastructure/adapters/import-graph-source-analysis-adapter.ts +35 -3
  63. package/scripts/harness/validator-system/infrastructure/adapters/nyquist-ac-coverage-policy-adapter.ts +86 -14
  64. package/scripts/harness/validator-system/infrastructure/adapters/phase-dependency-phase-gate-policy-adapter.ts +29 -3
  65. package/skills/cascade-updater/SKILL.md +1 -0
  66. package/skills/codebase-mapper/SKILL.md +1 -0
  67. package/skills/codex-delegator/SKILL.md +1 -0
  68. package/skills/consistency-checker/SKILL.md +1 -0
  69. package/skills/doc-freshness-checker/SKILL.md +1 -0
  70. package/skills/domain-designer/SKILL.md +1 -0
  71. package/skills/engineering-perspective/SKILL.md +1 -0
  72. package/skills/environment-designer/SKILL.md +1 -0
  73. package/skills/implementation-planner/SKILL.md +1 -0
  74. package/skills/implementation-readiness-checker/SKILL.md +1 -0
  75. package/skills/it-test-designer/SKILL.md +1 -0
  76. package/skills/it-test-logic-designer/SKILL.md +1 -0
  77. package/skills/logical-designer/SKILL.md +1 -0
  78. package/skills/mock-designer/SKILL.md +1 -0
  79. package/skills/phasegate-config-doctor/SKILL.md +1 -0
  80. package/skills/phasegate-toolkit-guide/SKILL.md +1 -0
  81. package/skills/pointer-validator/SKILL.md +1 -0
  82. package/skills/product-architect/SKILL.md +1 -0
  83. package/skills/quick-implementor/SKILL.md +1 -0
  84. package/skills/scenario-test-designer/SKILL.md +1 -0
  85. package/skills/scenario-test-logic-designer/SKILL.md +1 -0
  86. package/skills/skill-creator/SKILL.md +1 -0
  87. package/skills/story-implementor/SKILL.md +1 -0
  88. package/skills/story-mapper/SKILL.md +1 -0
  89. package/skills/story-writer/SKILL.md +1 -0
  90. package/skills/test-coverage-checker/SKILL.md +1 -0
  91. package/skills/uiux-designer/SKILL.md +1 -0
  92. package/skills/unit-designer/SKILL.md +1 -0
  93. package/skills/unit-test-designer/SKILL.md +1 -0
  94. package/skills/unit-test-logic-designer/SKILL.md +1 -0
  95. package/templates/.claude/scripts/deny-check.sh +73 -12
  96. package/templates/.claude/settings.json +4 -0
@@ -6,6 +6,7 @@ description: |
6
6
  使用タイミング: 「codexに委任して」「codexで並列に作成」「codexに実装させて」「agentに依頼して」など、
7
7
  codex CLIへのタスク委任・並列実行が必要な場面。
8
8
  model: codex
9
+ languages: [typescript]
9
10
  ---
10
11
 
11
12
  # Codex Delegator
@@ -3,6 +3,7 @@ name: consistency-checker
3
3
  description: AIDLC設計文書群のレイヤー間整合性チェック・矛盾/漏れ検出
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Consistency Checker
@@ -3,6 +3,7 @@ name: doc-freshness-checker
3
3
  description: 設計文書の鮮度チェック(L4バリデータ拡張)。`phasegate check-freshness` CLIを使い、設計文書の最終更新日が閾値を超えていないか、コード変更と設計文書の乖離がないかを検出する。使用タイミング: 「設計文書が古くなっていないか確認して」「ドキュメントの鮮度チェックを実行して」「L4 freshness チェック」「設計とコードの乖離を調べて」など。
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Doc Freshness Checker
@@ -2,6 +2,7 @@
2
2
  name: domain-designer
3
3
  description: DDD戦術パターンでドメインモデル(集約・エンティティ・VO・イベント)を設計(AIDLC Step 2.1)
4
4
  model: opus
5
+ languages: [typescript]
5
6
  ---
6
7
 
7
8
  # Domain Designer
@@ -9,6 +9,7 @@ description: |
9
9
  (4) TDD/リファクタリング/DDDのベストプラクティスを適用したい
10
10
  (5) チーム議論で共通認識を構築したい
11
11
  トリガー例: 「レビューして」「これどう思う?」「設計見て」「SOLID的にどう?」「リファクタ必要?」「ドメイン的に正しい?」
12
+ languages: [typescript]
12
13
  ---
13
14
 
14
15
  # Engineering Perspective
@@ -3,6 +3,7 @@ name: environment-designer
3
3
  description: ローカル開発環境のプラットフォーム構成設計。コードと環境のブリッジ(AIDLC Step 2.2並行)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Environment Designer
@@ -3,6 +3,7 @@ name: implementation-planner
3
3
  description: "Unit仕様とドメインモデル設計を元に実装計画を立てる。WI IDや機能名から関連Unitを特定し、API設計・レイヤー別実装方針を整理してmdファイルで出力する。使用タイミング: 実装計画を立てて、WI-XXXの実装方針を決めて、この機能の設計を整理して、など実装前の計画策定時。"
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Implementation Planner
@@ -3,6 +3,7 @@ name: implementation-readiness-checker
3
3
  description: 実装開始前の準備状況を自動検証 - テスト設計・カバレッジ・ロジック設計の存在チェックとギャップ分析
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Implementation Readiness Checker
@@ -3,6 +3,7 @@ name: it-test-designer
3
3
  description: 論理設計からIT(結合テスト)ケースを設計(AIDLC Step 8の前段)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # IT Test Designer
@@ -3,6 +3,7 @@ name: it-test-logic-designer
3
3
  description: ITテストケース設計を元にVitest実装ロジックを設計 - DB・Repository・UseCase・Controller統合テストの疑似コード付き詳細設計
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # IT Test Logic Designer
@@ -2,6 +2,7 @@
2
2
  name: logical-designer
3
3
  description: ドメインモデルから論理設計を作成。横断設計とストーリー固有設計の2モード(AIDLC Step 2.2)
4
4
  model: opus
5
+ languages: [typescript]
5
6
  ---
6
7
 
7
8
  # Logical Designer
@@ -3,6 +3,7 @@ name: mock-designer
3
3
  description: ユーザーストーリーからUIモックを作成。UI/UXの検証とフィードバック(AIDLC Step 2)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Mock Designer
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: phasegate-config-doctor
3
3
  description: 現在の phasegate.config.json を schema + プロジェクト検出結果と突き合わせて改善提案する診断スキル。read-only Q&A の phasegate-toolkit-guide とは異なり、設定変更を伴う相談に応える。使用タイミング:「phasegate のセットアップを最適化して」「architecture preset 入ってないけど何が適切?」「Quick Mode の relaxedGates に推奨設定教えて」「baseline 有効化しても大丈夫?」「monorepo に対して targetDirs / formatter が正しく検出されてる?」「v2 schema warning が出る、何を直せばいい?」など、現状 config の診断と改善 diff 提案を求める質問。
4
+ languages: [typescript]
4
5
  ---
5
6
 
6
7
  # Phasegate Config Doctor
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: phasegate-toolkit-guide
3
3
  description: phasegate ツールキット自体に関する Q&A スキル。ユーザーが phasegate の概念 (L0-L4 レイヤーモデル / 防御プリセット / アーキプリセット / Quick Mode と Full Mode / Hook 仕様 / config 全般) について質問したとき、対応する canonical doc を読み込んでから回答する。使用タイミング:「phasegate の L1 と L2 の違いは?」「Quick Mode で許可されるカテゴリを増やしたい」「architecture.preset の使い分けは?」「phasegate の hook って何が動いている?」「phasegate.config.json の relaxedGates は何のため?」など phasegate ツールキット内部の仕様・設定を尋ねる質問。
4
+ languages: [typescript]
4
5
  ---
5
6
 
6
7
  # Phasegate Toolkit Guide
@@ -3,6 +3,7 @@ name: pointer-validator
3
3
  description: 設計文書内のファイルポインタ(相対パス参照)の有効性を検証するスキル(L4バリデータ拡張)。`phasegate validate-pointers` CLIを使い、ドキュメント内で参照されているファイルパスが実際に存在するかチェックする。使用タイミング: 「ドキュメントのリンク切れを確認して」「ポインタ検証を実行して」「broken pointer を探して」「設計文書の参照が正しいか確認して」など。
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Pointer Validator
@@ -2,6 +2,7 @@
2
2
  name: product-architect
3
3
  description: ビジネス要求からプロダクト全体像を定義。ドメイン・アーキテクチャ・技術選定・制約(AIDLC Step 0)
4
4
  model: opus
5
+ languages: [typescript]
5
6
  ---
6
7
 
7
8
  # Product Architect
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: quick-implementor
3
3
  description: Quick Mode下でのad-hoc実装スキル。story-implementorの緩和版。バグ修正・ドキュメント修正・テスト追加・設定変更など軽微な変更に使用。L1全維持、L2はphase-gate緩和、L3はsecurityのみ、L4スキップ。使用タイミング: 「Quick Modeで修正して」「バグ修正して」「テスト追加して」「設定変更して」「ドキュメント修正して」など、フルハーネスが過剰な軽微変更時。除外: 新機能追加、API契約変更、新ドメインモデル追加にはstory-implementorを使用すること。
4
+ languages: [typescript]
4
5
  ---
5
6
 
6
7
  # Quick Implementor
@@ -3,6 +3,7 @@ name: scenario-test-designer
3
3
  description: ユーザーストーリー・論理設計・モックからシナリオテストケースを設計(AIDLC Step 6)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Scenario Test Designer
@@ -3,6 +3,7 @@ name: scenario-test-logic-designer
3
3
  description: シナリオテストケース設計を元にPlaywright実装ロジックを設計 - E2Eテストの疑似コード・セレクタ戦略・シードデータ付き詳細設計
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Scenario Test Logic Designer
@@ -2,6 +2,7 @@
2
2
  name: skill-creator
3
3
  description: Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
4
4
  model: opus
5
+ languages: [typescript]
5
6
  ---
6
7
 
7
8
  # Skill Creator
@@ -2,6 +2,7 @@
2
2
  name: story-implementor
3
3
  description: 論理設計+環境設計に基づくTDD実装。環境検証と教訓フィードバック付き(AIDLC Step 2.3-2.7)
4
4
  model: codex
5
+ languages: [typescript]
5
6
  ---
6
7
 
7
8
  # Story Implementor
@@ -3,6 +3,7 @@ name: story-mapper
3
3
  description: ストーリーのMVPスコープ整理・優先順位定義。発散後の収束フェーズ(AIDLC Step 1.5)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Story Mapper
@@ -3,6 +3,7 @@ name: story-writer
3
3
  description: 要求文書からWho/What/Why形式のユーザーストーリーと受け入れ基準を作成(AIDLC Step 1.1)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Story Writer
@@ -3,6 +3,7 @@ name: test-coverage-checker
3
3
  description: テストケース設計の網羅性検証 - 受け入れ基準・ドメインロジック・UseCaseのカバレッジチェック
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Test Coverage Checker
@@ -2,6 +2,7 @@
2
2
  name: uiux-designer
3
3
  description: テストケース・論理設計・既存UIを加味して最終的なUI/UX定義を策定(AIDLC Step 7)
4
4
  model: opus
5
+ languages: [typescript]
5
6
  ---
6
7
 
7
8
  # UIUX Designer
@@ -3,6 +3,7 @@ name: unit-designer
3
3
  description: ストーリーを独立構築可能なUnitにグルーピングし統合契約を定義(AIDLC Step 1.2)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Unit Designer
@@ -3,6 +3,7 @@ name: unit-test-designer
3
3
  description: ドメインモデルからユニットテスト(単体テスト)ケースを設計(AIDLC Step 8の前段)
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Unit Test Designer
@@ -3,6 +3,7 @@ name: unit-test-logic-designer
3
3
  description: Unitテストケース設計を元にVitest実装ロジックを設計 - 疑似コード付きの詳細設計
4
4
  model: sonnet
5
5
  review: opus
6
+ languages: [typescript]
6
7
  ---
7
8
 
8
9
  # Unit Test Logic Designer
@@ -4,14 +4,33 @@
4
4
  # Reads JSON from stdin, exits with code 2 to block dangerous commands.
5
5
  # Deny patterns are read from .claude/settings.json permissions.deny.
6
6
 
7
- DEBUG_LOG="/tmp/claude_deny_check_debug.log"
8
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] deny-check.sh started" >> "$DEBUG_LOG"
7
+ # Debug logging is OFF by default to avoid leaking command contents to a
8
+ # world-readable file. Set CLAUDE_DENY_CHECK_DEBUG=1 to enable. When enabled,
9
+ # the log is created with restrictive (owner-only) permissions.
10
+ DEBUG_LOG="${CLAUDE_DENY_CHECK_DEBUG_LOG:-$HOME/.cache/claude/deny-check-debug.log}"
11
+
12
+ debug_log() {
13
+ if [[ "$CLAUDE_DENY_CHECK_DEBUG" == "1" ]]; then
14
+ local dir
15
+ dir=$(dirname "$DEBUG_LOG")
16
+ mkdir -p "$dir" 2>/dev/null || return 0
17
+ # Restrict permissions before writing anything sensitive.
18
+ ( umask 077; touch "$DEBUG_LOG" 2>/dev/null ) || return 0
19
+ chmod 600 "$DEBUG_LOG" 2>/dev/null || true
20
+ printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >> "$DEBUG_LOG" 2>/dev/null || true
21
+ fi
22
+ }
23
+
24
+ debug_log "deny-check.sh started"
9
25
 
10
26
  INPUT_JSON=$(cat)
11
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] Input JSON: $INPUT_JSON" >> "$DEBUG_LOG"
27
+ debug_log "input received (${#INPUT_JSON} bytes)"
12
28
 
29
+ # Fail CLOSED: without jq we cannot parse the deny policy, so deny the command
30
+ # rather than silently allowing it.
13
31
  if ! command -v jq &> /dev/null; then
14
- exit 0
32
+ echo "Security policy: jq is required to evaluate the deny policy but was not found; command blocked." >&2
33
+ exit 2
15
34
  fi
16
35
 
17
36
  TOOL_NAME=$(echo "$INPUT_JSON" | jq -r '.tool_name // empty')
@@ -43,13 +62,55 @@ if [[ ${#DENY_PATTERNS[@]} -eq 0 ]]; then
43
62
  exit 0
44
63
  fi
45
64
 
46
- for pattern in "${DENY_PATTERNS[@]}"; do
47
- regex_pattern=$(echo "$pattern" | sed 's/\*/.*/')
48
- if echo "$COMMAND" | grep -E "^$regex_pattern" &>/dev/null; then
49
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] BLOCKED: '$COMMAND' matches '$pattern'" >> "$DEBUG_LOG"
50
- echo "Security policy violation: command '$COMMAND' is denied by pattern '$pattern'" >&2
51
- exit 2
52
- fi
53
- done
65
+ # Split a shell command line into individual command segments so that denied
66
+ # commands smuggled behind chaining/grouping/substitution operators are still
67
+ # inspected. Operators handled: ; && || | & newline $( ) ` { } ( )
68
+ # We replace each operator with a newline, then treat each line as a segment.
69
+ split_command_segments() {
70
+ local cmd="$1"
71
+ # Order matters: multi-char operators first.
72
+ cmd=${cmd//&&/$'\n'}
73
+ cmd=${cmd//||/$'\n'}
74
+ cmd=${cmd//|/$'\n'}
75
+ cmd=${cmd//;/$'\n'}
76
+ cmd=${cmd//&/$'\n'}
77
+ cmd=${cmd//\$(/$'\n'}
78
+ cmd=${cmd//\`/$'\n'}
79
+ cmd=${cmd//(/$'\n'}
80
+ cmd=${cmd//)/$'\n'}
81
+ cmd=${cmd//\{/$'\n'}
82
+ cmd=${cmd//\}/$'\n'}
83
+ # Trailing newline ensures the final segment is emitted as a complete line
84
+ # so that `while read` does not drop an unterminated last segment.
85
+ printf '%s\n' "$cmd"
86
+ }
87
+
88
+ # Convert a settings glob pattern to an anchored regex. ALL '*' become '.*'.
89
+ glob_to_regex() {
90
+ printf '%s' "$1" | sed 's/\*/.*/g'
91
+ }
92
+
93
+ check_segment() {
94
+ local segment="$1"
95
+ # Strip leading whitespace so "^pattern" anchors match after operators.
96
+ segment="${segment#"${segment%%[![:space:]]*}"}"
97
+ [[ -z "$segment" ]] && return 0
98
+ for pattern in "${DENY_PATTERNS[@]}"; do
99
+ local regex_pattern
100
+ regex_pattern=$(glob_to_regex "$pattern")
101
+ if printf '%s' "$segment" | grep -E "^$regex_pattern" &>/dev/null; then
102
+ debug_log "BLOCKED segment '$segment' matches '$pattern'"
103
+ echo "Security policy violation: command segment '$segment' is denied by pattern '$pattern'" >&2
104
+ exit 2
105
+ fi
106
+ done
107
+ return 0
108
+ }
109
+
110
+ # Inspect the whole command AND each chained/substituted segment.
111
+ check_segment "$COMMAND"
112
+ while IFS= read -r segment; do
113
+ check_segment "$segment"
114
+ done < <(split_command_segments "$COMMAND")
54
115
 
55
116
  exit 0
@@ -7,6 +7,10 @@
7
7
  {
8
8
  "type": "command",
9
9
  "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/deny-check.sh"
10
+ },
11
+ {
12
+ "type": "command",
13
+ "command": "npx phasegate hook pre-tool-use"
10
14
  }
11
15
  ]
12
16
  },