@red-codes/agentguard 1.0.0 → 1.1.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.
- package/README.md +179 -298
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +29185 -0
- package/dist/bin.js.map +7 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js.map +1 -0
- package/dist/commands/adoption.d.ts +2 -0
- package/dist/commands/adoption.d.ts.map +1 -0
- package/dist/commands/adoption.js +172 -0
- package/dist/commands/adoption.js.map +1 -0
- package/dist/commands/analytics.d.ts +3 -0
- package/dist/commands/analytics.d.ts.map +1 -0
- package/dist/commands/analytics.js +7 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit-verify.d.ts +3 -0
- package/dist/commands/audit-verify.d.ts.map +1 -0
- package/dist/commands/audit-verify.js +94 -0
- package/dist/commands/audit-verify.js.map +1 -0
- package/dist/commands/auto-setup.d.ts +28 -0
- package/dist/commands/auto-setup.d.ts.map +1 -0
- package/dist/commands/auto-setup.js +146 -0
- package/dist/commands/auto-setup.js.map +1 -0
- package/dist/commands/ci-check.d.ts +13 -0
- package/dist/commands/ci-check.d.ts.map +1 -0
- package/dist/commands/ci-check.js +286 -0
- package/dist/commands/ci-check.js.map +1 -0
- package/dist/commands/claude-hook.d.ts +2 -0
- package/dist/commands/claude-hook.d.ts.map +1 -0
- package/dist/commands/claude-hook.js +254 -0
- package/dist/commands/claude-hook.js.map +1 -0
- package/dist/commands/claude-init.d.ts.map +1 -0
- package/dist/commands/claude-init.js +401 -0
- package/dist/commands/claude-init.js.map +1 -0
- package/dist/commands/config.d.ts +39 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +368 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/demo.d.ts +2 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +100 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +364 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/evidence-pr.d.ts +3 -0
- package/dist/commands/evidence-pr.d.ts.map +1 -0
- package/dist/commands/evidence-pr.js +162 -0
- package/dist/commands/evidence-pr.js.map +1 -0
- package/dist/commands/export.d.ts +22 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +92 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/guard.d.ts +21 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +272 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/{cli/commands → commands}/import.js +25 -26
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1288 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +4 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/{cli/commands → commands}/inspect.js +97 -70
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/learn.d.ts +2 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +264 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +270 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/{cli/commands → commands}/plugin.js +2 -2
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/policy-verify.d.ts +46 -0
- package/dist/commands/policy-verify.d.ts.map +1 -0
- package/dist/commands/policy-verify.js +173 -0
- package/dist/commands/policy-verify.js.map +1 -0
- package/dist/commands/policy.d.ts +27 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +590 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/{cli/commands → commands}/replay.d.ts +2 -1
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/{cli/commands → commands}/replay.js +78 -12
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/session-viewer.d.ts +5 -0
- package/dist/commands/session-viewer.d.ts.map +1 -0
- package/dist/commands/session-viewer.js +462 -0
- package/dist/commands/session-viewer.js.map +1 -0
- package/dist/commands/simulate.d.ts +7 -0
- package/dist/commands/simulate.d.ts.map +1 -0
- package/dist/commands/simulate.js +505 -0
- package/dist/commands/simulate.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +212 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/traces.d.ts +24 -0
- package/dist/commands/traces.d.ts.map +1 -0
- package/dist/commands/traces.js +282 -0
- package/dist/commands/traces.js.map +1 -0
- package/dist/commands/trust.d.ts +6 -0
- package/dist/commands/trust.d.ts.map +1 -0
- package/dist/commands/trust.js +129 -0
- package/dist/commands/trust.js.map +1 -0
- package/dist/evidence-summary.d.ts +35 -0
- package/dist/evidence-summary.d.ts.map +1 -0
- package/dist/evidence-summary.js +202 -0
- package/dist/evidence-summary.js.map +1 -0
- package/dist/{cli/file-event-store.d.ts → file-event-store.d.ts} +1 -1
- package/dist/file-event-store.d.ts.map +1 -0
- package/dist/{cli/file-event-store.js → file-event-store.js} +1 -1
- package/dist/file-event-store.js.map +1 -0
- package/{hooks → dist/hooks}/post-commit +3 -1
- package/{hooks → dist/hooks}/post-merge +3 -1
- package/dist/hooks/pre-commit +29 -0
- package/dist/policy-resolver.d.ts +32 -0
- package/dist/policy-resolver.d.ts.map +1 -0
- package/dist/policy-resolver.js +171 -0
- package/dist/policy-resolver.js.map +1 -0
- package/dist/{cli/recorder.d.ts → recorder.d.ts} +1 -1
- package/dist/recorder.d.ts.map +1 -0
- package/dist/{cli/recorder.js → recorder.js} +1 -1
- package/dist/recorder.js.map +1 -0
- package/dist/replay-timeline-html.d.ts +21 -0
- package/dist/replay-timeline-html.d.ts.map +1 -0
- package/dist/replay-timeline-html.js +414 -0
- package/dist/replay-timeline-html.js.map +1 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/{cli/replay.js → replay.js} +92 -1
- package/dist/replay.js.map +1 -0
- package/dist/{cli/session-store.d.ts → session-store.d.ts} +5 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/{cli/session-store.js → session-store.js} +1 -0
- package/dist/session-store.js.map +1 -0
- package/dist/session-viewer-html.d.ts +10 -0
- package/dist/session-viewer-html.d.ts.map +1 -0
- package/dist/session-viewer-html.js +737 -0
- package/dist/session-viewer-html.js.map +1 -0
- package/dist/templates/ci-only.yaml +103 -0
- package/dist/templates/development.yaml +107 -0
- package/dist/templates/permissive.yaml +87 -0
- package/dist/templates/strict.yaml +112 -0
- package/dist/tui.d.ts +3 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +2 -0
- package/dist/tui.js.map +1 -0
- package/package.json +42 -53
- package/dist/adapters/claude-code.d.ts +0 -24
- package/dist/adapters/claude-code.d.ts.map +0 -1
- package/dist/adapters/claude-code.js +0 -99
- package/dist/adapters/claude-code.js.map +0 -1
- package/dist/adapters/file.d.ts +0 -3
- package/dist/adapters/file.d.ts.map +0 -1
- package/dist/adapters/file.js +0 -35
- package/dist/adapters/file.js.map +0 -1
- package/dist/adapters/git.d.ts +0 -3
- package/dist/adapters/git.d.ts.map +0 -1
- package/dist/adapters/git.js +0 -61
- package/dist/adapters/git.js.map +0 -1
- package/dist/adapters/registry.d.ts +0 -5
- package/dist/adapters/registry.d.ts.map +0 -1
- package/dist/adapters/registry.js +0 -15
- package/dist/adapters/registry.js.map +0 -1
- package/dist/adapters/shell.d.ts +0 -8
- package/dist/adapters/shell.d.ts.map +0 -1
- package/dist/adapters/shell.js +0 -27
- package/dist/adapters/shell.js.map +0 -1
- package/dist/cli/args.d.ts.map +0 -1
- package/dist/cli/args.js.map +0 -1
- package/dist/cli/bin.d.ts.map +0 -1
- package/dist/cli/bin.js +0 -5769
- package/dist/cli/bin.js.map +0 -7
- package/dist/cli/colors.d.ts.map +0 -1
- package/dist/cli/colors.js.map +0 -1
- package/dist/cli/commands/claude-hook.d.ts +0 -2
- package/dist/cli/commands/claude-hook.d.ts.map +0 -1
- package/dist/cli/commands/claude-hook.js +0 -110
- package/dist/cli/commands/claude-hook.js.map +0 -1
- package/dist/cli/commands/claude-init.d.ts.map +0 -1
- package/dist/cli/commands/claude-init.js +0 -150
- package/dist/cli/commands/claude-init.js.map +0 -1
- package/dist/cli/commands/export.d.ts +0 -11
- package/dist/cli/commands/export.d.ts.map +0 -1
- package/dist/cli/commands/export.js +0 -113
- package/dist/cli/commands/export.js.map +0 -1
- package/dist/cli/commands/guard.d.ts +0 -12
- package/dist/cli/commands/guard.d.ts.map +0 -1
- package/dist/cli/commands/guard.js +0 -145
- package/dist/cli/commands/guard.js.map +0 -1
- package/dist/cli/commands/import.d.ts +0 -2
- package/dist/cli/commands/import.d.ts.map +0 -1
- package/dist/cli/commands/import.js.map +0 -1
- package/dist/cli/commands/inspect.d.ts +0 -3
- package/dist/cli/commands/inspect.d.ts.map +0 -1
- package/dist/cli/commands/inspect.js.map +0 -1
- package/dist/cli/commands/plugin.d.ts.map +0 -1
- package/dist/cli/commands/plugin.js.map +0 -1
- package/dist/cli/commands/replay.d.ts.map +0 -1
- package/dist/cli/commands/replay.js.map +0 -1
- package/dist/cli/file-event-store.d.ts.map +0 -1
- package/dist/cli/file-event-store.js.map +0 -1
- package/dist/cli/policy-resolver.d.ts +0 -4
- package/dist/cli/policy-resolver.d.ts.map +0 -1
- package/dist/cli/policy-resolver.js +0 -62
- package/dist/cli/policy-resolver.js.map +0 -1
- package/dist/cli/recorder.d.ts.map +0 -1
- package/dist/cli/recorder.js.map +0 -1
- package/dist/cli/replay.d.ts.map +0 -1
- package/dist/cli/replay.js.map +0 -1
- package/dist/cli/session-store.d.ts.map +0 -1
- package/dist/cli/session-store.js.map +0 -1
- package/dist/cli/tui.d.ts +0 -24
- package/dist/cli/tui.d.ts.map +0 -1
- package/dist/cli/tui.js +0 -197
- package/dist/cli/tui.js.map +0 -1
- package/dist/core/actions.d.ts +0 -11
- package/dist/core/actions.d.ts.map +0 -1
- package/dist/core/actions.js +0 -112
- package/dist/core/actions.js.map +0 -1
- package/dist/core/adapters.d.ts +0 -19
- package/dist/core/adapters.d.ts.map +0 -1
- package/dist/core/adapters.js +0 -85
- package/dist/core/adapters.js.map +0 -1
- package/dist/core/execution-log/bridge.d.ts +0 -12
- package/dist/core/execution-log/bridge.d.ts.map +0 -1
- package/dist/core/execution-log/bridge.js +0 -112
- package/dist/core/execution-log/bridge.js.map +0 -1
- package/dist/core/execution-log/event-log.d.ts +0 -7
- package/dist/core/execution-log/event-log.d.ts.map +0 -1
- package/dist/core/execution-log/event-log.js +0 -103
- package/dist/core/execution-log/event-log.js.map +0 -1
- package/dist/core/execution-log/event-projections.d.ts +0 -28
- package/dist/core/execution-log/event-projections.d.ts.map +0 -1
- package/dist/core/execution-log/event-projections.js +0 -272
- package/dist/core/execution-log/event-projections.js.map +0 -1
- package/dist/core/execution-log/event-schema.d.ts +0 -56
- package/dist/core/execution-log/event-schema.d.ts.map +0 -1
- package/dist/core/execution-log/event-schema.js +0 -160
- package/dist/core/execution-log/event-schema.js.map +0 -1
- package/dist/core/execution-log/index.d.ts +0 -7
- package/dist/core/execution-log/index.d.ts.map +0 -1
- package/dist/core/execution-log/index.js +0 -13
- package/dist/core/execution-log/index.js.map +0 -1
- package/dist/core/hash.d.ts +0 -5
- package/dist/core/hash.d.ts.map +0 -1
- package/dist/core/hash.js +0 -13
- package/dist/core/hash.js.map +0 -1
- package/dist/core/rng.d.ts +0 -29
- package/dist/core/rng.d.ts.map +0 -1
- package/dist/core/rng.js +0 -48
- package/dist/core/rng.js.map +0 -1
- package/dist/core/types.d.ts +0 -746
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -8
- package/dist/core/types.js.map +0 -1
- package/dist/events/bus.d.ts +0 -24
- package/dist/events/bus.d.ts.map +0 -1
- package/dist/events/bus.js +0 -64
- package/dist/events/bus.js.map +0 -1
- package/dist/events/decision-jsonl.d.ts +0 -8
- package/dist/events/decision-jsonl.d.ts.map +0 -1
- package/dist/events/decision-jsonl.js +0 -44
- package/dist/events/decision-jsonl.js.map +0 -1
- package/dist/events/jsonl.d.ts +0 -8
- package/dist/events/jsonl.d.ts.map +0 -1
- package/dist/events/jsonl.js +0 -46
- package/dist/events/jsonl.js.map +0 -1
- package/dist/events/schema.d.ts +0 -59
- package/dist/events/schema.d.ts.map +0 -1
- package/dist/events/schema.js +0 -296
- package/dist/events/schema.js.map +0 -1
- package/dist/events/store.d.ts +0 -7
- package/dist/events/store.d.ts.map +0 -1
- package/dist/events/store.js +0 -64
- package/dist/events/store.js.map +0 -1
- package/dist/invariants/checker.d.ts +0 -15
- package/dist/invariants/checker.d.ts.map +0 -1
- package/dist/invariants/checker.js +0 -52
- package/dist/invariants/checker.js.map +0 -1
- package/dist/invariants/definitions.d.ts +0 -33
- package/dist/invariants/definitions.d.ts.map +0 -1
- package/dist/invariants/definitions.js +0 -168
- package/dist/invariants/definitions.js.map +0 -1
- package/dist/kernel/aab.d.ts +0 -26
- package/dist/kernel/aab.d.ts.map +0 -1
- package/dist/kernel/aab.js +0 -149
- package/dist/kernel/aab.js.map +0 -1
- package/dist/kernel/blast-radius.d.ts +0 -60
- package/dist/kernel/blast-radius.d.ts.map +0 -1
- package/dist/kernel/blast-radius.js +0 -146
- package/dist/kernel/blast-radius.js.map +0 -1
- package/dist/kernel/decision.d.ts +0 -40
- package/dist/kernel/decision.d.ts.map +0 -1
- package/dist/kernel/decision.js +0 -92
- package/dist/kernel/decision.js.map +0 -1
- package/dist/kernel/decisions/factory.d.ts +0 -12
- package/dist/kernel/decisions/factory.d.ts.map +0 -1
- package/dist/kernel/decisions/factory.js +0 -56
- package/dist/kernel/decisions/factory.js.map +0 -1
- package/dist/kernel/decisions/types.d.ts +0 -70
- package/dist/kernel/decisions/types.d.ts.map +0 -1
- package/dist/kernel/decisions/types.js +0 -5
- package/dist/kernel/decisions/types.js.map +0 -1
- package/dist/kernel/evidence.d.ts +0 -29
- package/dist/kernel/evidence.d.ts.map +0 -1
- package/dist/kernel/evidence.js +0 -61
- package/dist/kernel/evidence.js.map +0 -1
- package/dist/kernel/kernel.d.ts +0 -47
- package/dist/kernel/kernel.d.ts.map +0 -1
- package/dist/kernel/kernel.js +0 -377
- package/dist/kernel/kernel.js.map +0 -1
- package/dist/kernel/monitor.d.ts +0 -35
- package/dist/kernel/monitor.d.ts.map +0 -1
- package/dist/kernel/monitor.js +0 -144
- package/dist/kernel/monitor.js.map +0 -1
- package/dist/kernel/replay-comparator.d.ts +0 -72
- package/dist/kernel/replay-comparator.d.ts.map +0 -1
- package/dist/kernel/replay-comparator.js +0 -251
- package/dist/kernel/replay-comparator.js.map +0 -1
- package/dist/kernel/replay-engine.d.ts +0 -108
- package/dist/kernel/replay-engine.d.ts.map +0 -1
- package/dist/kernel/replay-engine.js +0 -241
- package/dist/kernel/replay-engine.js.map +0 -1
- package/dist/kernel/replay-processor.d.ts +0 -109
- package/dist/kernel/replay-processor.d.ts.map +0 -1
- package/dist/kernel/replay-processor.js +0 -118
- package/dist/kernel/replay-processor.js.map +0 -1
- package/dist/kernel/simulation/filesystem-simulator.d.ts +0 -3
- package/dist/kernel/simulation/filesystem-simulator.d.ts.map +0 -1
- package/dist/kernel/simulation/filesystem-simulator.js +0 -81
- package/dist/kernel/simulation/filesystem-simulator.js.map +0 -1
- package/dist/kernel/simulation/git-simulator.d.ts +0 -5
- package/dist/kernel/simulation/git-simulator.d.ts.map +0 -1
- package/dist/kernel/simulation/git-simulator.js +0 -115
- package/dist/kernel/simulation/git-simulator.js.map +0 -1
- package/dist/kernel/simulation/package-simulator.d.ts +0 -5
- package/dist/kernel/simulation/package-simulator.d.ts.map +0 -1
- package/dist/kernel/simulation/package-simulator.js +0 -164
- package/dist/kernel/simulation/package-simulator.js.map +0 -1
- package/dist/kernel/simulation/registry.d.ts +0 -3
- package/dist/kernel/simulation/registry.d.ts.map +0 -1
- package/dist/kernel/simulation/registry.js +0 -24
- package/dist/kernel/simulation/registry.js.map +0 -1
- package/dist/kernel/simulation/types.d.ts +0 -35
- package/dist/kernel/simulation/types.d.ts.map +0 -1
- package/dist/kernel/simulation/types.js +0 -4
- package/dist/kernel/simulation/types.js.map +0 -1
- package/dist/plugins/discovery.d.ts +0 -45
- package/dist/plugins/discovery.d.ts.map +0 -1
- package/dist/plugins/discovery.js +0 -89
- package/dist/plugins/discovery.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -7
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/registry.d.ts +0 -52
- package/dist/plugins/registry.d.ts.map +0 -1
- package/dist/plugins/registry.js +0 -148
- package/dist/plugins/registry.js.map +0 -1
- package/dist/plugins/sandbox.d.ts +0 -87
- package/dist/plugins/sandbox.d.ts.map +0 -1
- package/dist/plugins/sandbox.js +0 -122
- package/dist/plugins/sandbox.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -61
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/plugins/types.js +0 -16
- package/dist/plugins/types.js.map +0 -1
- package/dist/plugins/validator.d.ts +0 -36
- package/dist/plugins/validator.d.ts.map +0 -1
- package/dist/plugins/validator.js +0 -276
- package/dist/plugins/validator.js.map +0 -1
- package/dist/policy/evaluator.d.ts +0 -41
- package/dist/policy/evaluator.d.ts.map +0 -1
- package/dist/policy/evaluator.js +0 -111
- package/dist/policy/evaluator.js.map +0 -1
- package/dist/policy/loader.d.ts +0 -13
- package/dist/policy/loader.d.ts.map +0 -1
- package/dist/policy/loader.js +0 -118
- package/dist/policy/loader.js.map +0 -1
- package/dist/policy/pack-loader.d.ts +0 -40
- package/dist/policy/pack-loader.d.ts.map +0 -1
- package/dist/policy/pack-loader.js +0 -138
- package/dist/policy/pack-loader.js.map +0 -1
- package/dist/policy/yaml-loader.d.ts +0 -23
- package/dist/policy/yaml-loader.d.ts.map +0 -1
- package/dist/policy/yaml-loader.js +0 -222
- package/dist/policy/yaml-loader.js.map +0 -1
- package/dist/renderers/index.d.ts +0 -6
- package/dist/renderers/index.d.ts.map +0 -1
- package/dist/renderers/index.js +0 -4
- package/dist/renderers/index.js.map +0 -1
- package/dist/renderers/registry.d.ts +0 -39
- package/dist/renderers/registry.d.ts.map +0 -1
- package/dist/renderers/registry.js +0 -97
- package/dist/renderers/registry.js.map +0 -1
- package/dist/renderers/tui-renderer.d.ts +0 -18
- package/dist/renderers/tui-renderer.d.ts.map +0 -1
- package/dist/renderers/tui-renderer.js +0 -57
- package/dist/renderers/tui-renderer.js.map +0 -1
- package/dist/renderers/types.d.ts +0 -52
- package/dist/renderers/types.d.ts.map +0 -1
- package/dist/renderers/types.js +0 -4
- package/dist/renderers/types.js.map +0 -1
- package/dist/telemetry/index.d.ts +0 -3
- package/dist/telemetry/index.d.ts.map +0 -1
- package/dist/telemetry/index.js +0 -2
- package/dist/telemetry/index.js.map +0 -1
- package/dist/telemetry/runtimeLogger.d.ts +0 -9
- package/dist/telemetry/runtimeLogger.d.ts.map +0 -1
- package/dist/telemetry/runtimeLogger.js +0 -68
- package/dist/telemetry/runtimeLogger.js.map +0 -1
- package/dist/telemetry/types.d.ts +0 -22
- package/dist/telemetry/types.d.ts.map +0 -1
- package/dist/telemetry/types.js +0 -4
- package/dist/telemetry/types.js.map +0 -1
- package/hooks/pre-commit +0 -28
- /package/dist/{cli/args.d.ts → args.d.ts} +0 -0
- /package/dist/{cli/args.js → args.js} +0 -0
- /package/dist/{cli/bin.d.ts → bin.d.ts} +0 -0
- /package/dist/{cli/colors.d.ts → colors.d.ts} +0 -0
- /package/dist/{cli/colors.js → colors.js} +0 -0
- /package/dist/{cli/commands → commands}/claude-init.d.ts +0 -0
- /package/dist/{cli/commands → commands}/plugin.d.ts +0 -0
- /package/dist/{cli/replay.d.ts → replay.d.ts} +0 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// CLI command: agentguard ci-check — CI governance verification.
|
|
2
|
+
//
|
|
3
|
+
// Reads an exported governance session (or the most recent local run),
|
|
4
|
+
// summarises governance outcomes, and exits with code 1 when violations
|
|
5
|
+
// or denials exceed the configured threshold. Designed for CI pipelines.
|
|
6
|
+
// Supports both JSONL (default) and SQLite storage backends.
|
|
7
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { parseArgs } from '../args.js';
|
|
11
|
+
import { loadReplaySession, getLatestRunId, buildReplaySession } from '@red-codes/kernel';
|
|
12
|
+
import { aggregateEvents, formatEvidenceMarkdown } from '../evidence-summary.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Session Loading
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Load a replay session from an exported `.agentguard.jsonl` file.
|
|
18
|
+
* Parses the header, extracts events, and builds a ReplaySession.
|
|
19
|
+
*/
|
|
20
|
+
function loadSessionFromExport(filePath) {
|
|
21
|
+
const content = readFileSync(filePath, 'utf8');
|
|
22
|
+
const lines = content.split('\n').filter((l) => l.trim());
|
|
23
|
+
if (lines.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
let header;
|
|
26
|
+
try {
|
|
27
|
+
header = JSON.parse(lines[0]);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (header.__agentguard_export !== true || header.version !== 1) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const eventLines = lines.slice(1, 1 + header.eventCount);
|
|
36
|
+
const events = [];
|
|
37
|
+
for (const line of eventLines) {
|
|
38
|
+
try {
|
|
39
|
+
events.push(JSON.parse(line));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Skip malformed lines
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (events.length === 0)
|
|
46
|
+
return null;
|
|
47
|
+
return buildReplaySession(header.runId, events);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load the most recent replay session from SQLite.
|
|
51
|
+
*/
|
|
52
|
+
async function loadLatestSessionSqlite(storageConfig) {
|
|
53
|
+
const { createStorageBundle } = await import('@red-codes/storage');
|
|
54
|
+
const { getLatestRunId: getLatestRunIdSqlite, loadRunEvents } = await import('@red-codes/storage');
|
|
55
|
+
const storage = await createStorageBundle(storageConfig);
|
|
56
|
+
if (!storage.db) {
|
|
57
|
+
process.stderr.write(' Error: SQLite storage backend did not initialize database.\n');
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const db = storage.db;
|
|
61
|
+
const runId = getLatestRunIdSqlite(db);
|
|
62
|
+
if (!runId) {
|
|
63
|
+
storage.close();
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const events = loadRunEvents(db, runId);
|
|
67
|
+
storage.close();
|
|
68
|
+
if (events.length === 0)
|
|
69
|
+
return null;
|
|
70
|
+
return buildReplaySession(runId, events);
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Core Logic
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
function evaluateSession(session, options) {
|
|
76
|
+
const { summary } = session;
|
|
77
|
+
let pass = true;
|
|
78
|
+
if (options.failOnDenial && summary.denied > 0) {
|
|
79
|
+
pass = false;
|
|
80
|
+
}
|
|
81
|
+
if (options.failOnViolation && summary.violations > 0) {
|
|
82
|
+
pass = false;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
runId: session.runId,
|
|
86
|
+
totalActions: summary.totalActions,
|
|
87
|
+
allowed: summary.allowed,
|
|
88
|
+
denied: summary.denied,
|
|
89
|
+
violations: summary.violations,
|
|
90
|
+
escalations: summary.escalations,
|
|
91
|
+
denialReasons: summary.denialReasons,
|
|
92
|
+
pass,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// Output Formatting
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
function formatTerminal(result) {
|
|
99
|
+
const icon = result.pass ? '\x1b[32m\u2713\x1b[0m' : '\x1b[31m\u2717\x1b[0m';
|
|
100
|
+
const verdict = result.pass ? '\x1b[32mPASS\x1b[0m' : '\x1b[31mFAIL\x1b[0m';
|
|
101
|
+
const lines = [];
|
|
102
|
+
lines.push('');
|
|
103
|
+
lines.push(` ${icon} Governance CI Check — ${verdict}`);
|
|
104
|
+
lines.push(` Run: ${result.runId}`);
|
|
105
|
+
lines.push('');
|
|
106
|
+
lines.push(` Actions: ${result.totalActions}`);
|
|
107
|
+
lines.push(` Allowed: ${result.allowed}`);
|
|
108
|
+
lines.push(` Denied: ${result.denied}`);
|
|
109
|
+
lines.push(` Violations: ${result.violations}`);
|
|
110
|
+
lines.push(` Escalations: ${result.escalations}`);
|
|
111
|
+
if (result.denialReasons.length > 0) {
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push(' Denial reasons:');
|
|
114
|
+
for (const reason of result.denialReasons) {
|
|
115
|
+
lines.push(` - ${reason}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
lines.push('');
|
|
119
|
+
return lines.join('\n');
|
|
120
|
+
}
|
|
121
|
+
function formatGitHubAnnotation(result) {
|
|
122
|
+
const lines = [];
|
|
123
|
+
if (!result.pass) {
|
|
124
|
+
const reasons = result.denialReasons.join('; ');
|
|
125
|
+
lines.push(`::error title=Governance Check Failed::${result.denied} action(s) denied, ${result.violations} violation(s). ${reasons}`);
|
|
126
|
+
}
|
|
127
|
+
// Always output summary as a notice
|
|
128
|
+
lines.push(`::notice title=Governance Summary::Actions: ${result.totalActions} | Allowed: ${result.allowed} | Denied: ${result.denied} | Violations: ${result.violations} | Escalations: ${result.escalations}`);
|
|
129
|
+
return lines.join('\n');
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Evidence Posting
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
const COMMENT_MARKER = '<!-- agentguard-evidence-report -->';
|
|
135
|
+
function detectPrNumber() {
|
|
136
|
+
try {
|
|
137
|
+
const result = execSync('gh pr view --json number --jq .number 2>/dev/null', {
|
|
138
|
+
encoding: 'utf8',
|
|
139
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
140
|
+
}).trim();
|
|
141
|
+
return result || null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function postEvidenceComment(prNumber, markdown) {
|
|
148
|
+
const body = `${COMMENT_MARKER}\n${markdown}`;
|
|
149
|
+
// Delete any existing evidence comments
|
|
150
|
+
try {
|
|
151
|
+
const commentsJson = execSync(`gh pr view ${prNumber} --json comments --jq '.comments[] | select(.body | startswith("${COMMENT_MARKER}")) | .id'`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
152
|
+
if (commentsJson) {
|
|
153
|
+
const commentIds = commentsJson.split('\n').filter((id) => /^\d+$/.test(id));
|
|
154
|
+
for (const id of commentIds) {
|
|
155
|
+
try {
|
|
156
|
+
execSync(`gh api repos/{owner}/{repo}/issues/comments/${id} -X DELETE`, {
|
|
157
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Ignore delete failures
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// No existing comments
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
execSync(`gh pr comment ${prNumber} --body -`, {
|
|
171
|
+
input: body,
|
|
172
|
+
encoding: 'utf8',
|
|
173
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
174
|
+
});
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// CLI Entry Point
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
export async function ciCheck(args, storageConfig) {
|
|
185
|
+
const parsed = parseArgs(args, {
|
|
186
|
+
boolean: ['--fail-on-violation', '--fail-on-denial', '--json', '--last', '--post-evidence'],
|
|
187
|
+
string: ['--base-dir', '--pr', '--artifact-url'],
|
|
188
|
+
alias: { '-d': '--base-dir', '-n': '--pr' },
|
|
189
|
+
});
|
|
190
|
+
const failOnViolation = !!parsed.flags['fail-on-violation'];
|
|
191
|
+
const failOnDenial = !!parsed.flags['fail-on-denial'];
|
|
192
|
+
const jsonOutput = !!parsed.flags.json;
|
|
193
|
+
const useLast = !!parsed.flags.last;
|
|
194
|
+
const postEvidence = !!parsed.flags['post-evidence'];
|
|
195
|
+
const baseDir = parsed.flags['base-dir'] || '.agentguard';
|
|
196
|
+
const prNumberFlag = parsed.flags.pr || null;
|
|
197
|
+
const artifactUrl = parsed.flags['artifact-url'] || undefined;
|
|
198
|
+
const sessionFile = parsed.positional[0];
|
|
199
|
+
const isGitHubActions = !!process.env.GITHUB_ACTIONS;
|
|
200
|
+
const useSqlite = storageConfig?.backend === 'sqlite';
|
|
201
|
+
// Resolve the session
|
|
202
|
+
let session = null;
|
|
203
|
+
if (sessionFile) {
|
|
204
|
+
// Session file is always JSONL format (portable export)
|
|
205
|
+
const resolvedPath = resolve(sessionFile);
|
|
206
|
+
if (!existsSync(resolvedPath)) {
|
|
207
|
+
process.stderr.write(`\n \x1b[31mError:\x1b[0m Session file not found: ${resolvedPath}\n\n`);
|
|
208
|
+
return 1;
|
|
209
|
+
}
|
|
210
|
+
session = loadSessionFromExport(resolvedPath);
|
|
211
|
+
if (!session) {
|
|
212
|
+
process.stderr.write(`\n \x1b[31mError:\x1b[0m Could not parse session file: ${resolvedPath}\n\n`);
|
|
213
|
+
return 1;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else if (useLast) {
|
|
217
|
+
if (useSqlite) {
|
|
218
|
+
session = await loadLatestSessionSqlite(storageConfig);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const runId = getLatestRunId(baseDir);
|
|
222
|
+
if (!runId) {
|
|
223
|
+
process.stderr.write('\n \x1b[31mError:\x1b[0m No governance runs found.\n\n');
|
|
224
|
+
return 1;
|
|
225
|
+
}
|
|
226
|
+
session = loadReplaySession(runId, { baseDir });
|
|
227
|
+
}
|
|
228
|
+
if (!session) {
|
|
229
|
+
process.stderr.write('\n \x1b[31mError:\x1b[0m Could not load the most recent run.\n\n');
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
process.stderr.write('\n Usage: agentguard ci-check <session-file> [flags]\n');
|
|
235
|
+
process.stderr.write(' agentguard ci-check --last [flags]\n\n');
|
|
236
|
+
process.stderr.write(' Flags:\n');
|
|
237
|
+
process.stderr.write(' --fail-on-violation Exit 1 if invariant violations found\n');
|
|
238
|
+
process.stderr.write(' --fail-on-denial Exit 1 if any actions were denied\n');
|
|
239
|
+
process.stderr.write(' --json Output as JSON\n');
|
|
240
|
+
process.stderr.write(' --last Use the most recent local run\n');
|
|
241
|
+
process.stderr.write(' --post-evidence Post evidence report as PR comment\n');
|
|
242
|
+
process.stderr.write(' --pr, -n <number> Target PR number (auto-detected if omitted)\n');
|
|
243
|
+
process.stderr.write(' --artifact-url <url> Link to full session artifact\n');
|
|
244
|
+
process.stderr.write(' --base-dir, -d <dir> Base directory for events\n');
|
|
245
|
+
process.stderr.write(' --store <backend> Storage backend (sqlite)\n\n');
|
|
246
|
+
return 1;
|
|
247
|
+
}
|
|
248
|
+
// Evaluate
|
|
249
|
+
const result = evaluateSession(session, { failOnViolation, failOnDenial });
|
|
250
|
+
// Output
|
|
251
|
+
if (jsonOutput) {
|
|
252
|
+
process.stdout.write(JSON.stringify(result, null, 2) + '\n');
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
process.stderr.write(formatTerminal(result));
|
|
256
|
+
}
|
|
257
|
+
// GitHub Actions annotations
|
|
258
|
+
if (isGitHubActions) {
|
|
259
|
+
process.stdout.write(formatGitHubAnnotation(result) + '\n');
|
|
260
|
+
}
|
|
261
|
+
// Post evidence report to PR
|
|
262
|
+
if (postEvidence) {
|
|
263
|
+
const prNumber = prNumberFlag || detectPrNumber();
|
|
264
|
+
if (!prNumber) {
|
|
265
|
+
process.stderr.write('\n \x1b[33mWarning:\x1b[0m --post-evidence: could not determine PR number. ' +
|
|
266
|
+
'Use --pr <number> or run from a branch with an open PR.\n\n');
|
|
267
|
+
}
|
|
268
|
+
else if (!/^\d+$/.test(prNumber)) {
|
|
269
|
+
process.stderr.write('\n \x1b[33mWarning:\x1b[0m --post-evidence: PR number must be numeric.\n\n');
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const evidenceSummary = aggregateEvents([...session.events]);
|
|
273
|
+
const markdownOptions = { artifactUrl };
|
|
274
|
+
const markdown = formatEvidenceMarkdown(evidenceSummary, markdownOptions);
|
|
275
|
+
const posted = postEvidenceComment(prNumber, markdown);
|
|
276
|
+
if (posted) {
|
|
277
|
+
process.stderr.write(` \x1b[32m\u2713\x1b[0m Evidence report posted to PR #${prNumber}\n\n`);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
process.stderr.write(`\n \x1b[33mWarning:\x1b[0m Failed to post evidence report to PR #${prNumber}.\n\n`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return result.pass ? 0 : 1;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=ci-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-check.js","sourceRoot":"","sources":["../../src/commands/ci-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-hook.d.ts","sourceRoot":"","sources":["../../src/commands/claude-hook.ts"],"names":[],"mappings":"AAwBA,wBAAsB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C3F"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// AgentGuard Claude Code hook — PreToolUse governance + PostToolUse error monitoring + Notification session viewer.
|
|
2
|
+
// PreToolUse: routes actions through the kernel for policy/invariant enforcement.
|
|
3
|
+
// PostToolUse: reports Bash stderr errors (informational only).
|
|
4
|
+
// Notification: auto-opens the session viewer when the agent pauses for human input.
|
|
5
|
+
// Stop: generates session viewer HTML (no browser open — Notification handles that).
|
|
6
|
+
// Always exits 0 — hooks must never fail.
|
|
7
|
+
// Supports both JSONL (default) and SQLite storage backends via --store flag or AGENTGUARD_STORE env var.
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { execSync, spawn } from 'node:child_process';
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
import { resolveMainRepoRoot } from '@red-codes/core';
|
|
14
|
+
/** Resolve the CLI command — use local bin.js if in the agentguard dev repo, else bare `agentguard`. */
|
|
15
|
+
function resolveCliCommand() {
|
|
16
|
+
const mainRoot = resolveMainRepoRoot();
|
|
17
|
+
const localBin = join(mainRoot, 'apps', 'cli', 'dist', 'bin.js');
|
|
18
|
+
if (existsSync(localBin))
|
|
19
|
+
return `node ${localBin}`;
|
|
20
|
+
return 'agentguard';
|
|
21
|
+
}
|
|
22
|
+
export async function claudeHook(hookType, extraArgs = []) {
|
|
23
|
+
try {
|
|
24
|
+
// Stop hook has no stdin payload — generates session viewer HTML quietly (no browser open)
|
|
25
|
+
if (hookType === 'stop') {
|
|
26
|
+
await handleStop(extraArgs);
|
|
27
|
+
process.exit(0);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Notification hook — fires when the agent pauses for human input.
|
|
31
|
+
// Auto-opens the session viewer in the browser so the user can review governance decisions.
|
|
32
|
+
if (hookType === 'notify') {
|
|
33
|
+
await handleNotification(extraArgs);
|
|
34
|
+
process.exit(0);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const input = await readStdin();
|
|
38
|
+
if (!input)
|
|
39
|
+
process.exit(0);
|
|
40
|
+
let data;
|
|
41
|
+
try {
|
|
42
|
+
data = JSON.parse(input);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
process.exit(0);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Determine hook type: explicit CLI arg > payload field > inference from tool_output
|
|
49
|
+
const isPreToolUse = hookType === 'pre' || data.hook === 'PreToolUse' || (!hookType && !data.tool_output);
|
|
50
|
+
if (isPreToolUse) {
|
|
51
|
+
// Resolve session_id: payload field > environment variable > undefined
|
|
52
|
+
const sessionId = data.session_id || process.env.CLAUDE_SESSION_ID || undefined;
|
|
53
|
+
const payload = { ...data, session_id: sessionId };
|
|
54
|
+
await handlePreToolUse(payload, extraArgs);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
handlePostToolUse(data, extraArgs);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Swallow all errors — hooks must never fail
|
|
62
|
+
}
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
65
|
+
async function handlePreToolUse(payload, cliArgs) {
|
|
66
|
+
const { processClaudeCodeHook, formatHookResponse } = await import('@red-codes/adapters');
|
|
67
|
+
const { createKernel } = await import('@red-codes/kernel');
|
|
68
|
+
const { loadPolicyDefs } = await import('../policy-resolver.js');
|
|
69
|
+
const { resolveStorageConfig, createStorageBundle } = await import('@red-codes/storage');
|
|
70
|
+
// Ensure hook field is set
|
|
71
|
+
const normalizedPayload = {
|
|
72
|
+
...payload,
|
|
73
|
+
hook: 'PreToolUse',
|
|
74
|
+
};
|
|
75
|
+
// Load policy (fail-open: empty policy if none found)
|
|
76
|
+
let policyDefs = [];
|
|
77
|
+
try {
|
|
78
|
+
policyDefs = loadPolicyDefs();
|
|
79
|
+
}
|
|
80
|
+
catch (policyErr) {
|
|
81
|
+
// Policy loading failure is non-fatal — continue with no policy (allow all)
|
|
82
|
+
process.stderr.write(`agentguard: warning — no policy loaded (${policyErr instanceof Error ? policyErr.message : 'unknown error'}). All actions will be allowed.\n`);
|
|
83
|
+
}
|
|
84
|
+
// Generate run ID
|
|
85
|
+
const runId = `hook_${Date.now()}_${randomUUID().replace(/-/g, '').slice(0, 8)}`;
|
|
86
|
+
// Resolve storage backend from CLI args (e.g. --store sqlite) or AGENTGUARD_STORE env var
|
|
87
|
+
const storageConfig = resolveStorageConfig(cliArgs);
|
|
88
|
+
let storage = null;
|
|
89
|
+
let eventSink;
|
|
90
|
+
let decisionSink;
|
|
91
|
+
try {
|
|
92
|
+
storage = await createStorageBundle(storageConfig);
|
|
93
|
+
eventSink = storage.createEventSink(runId);
|
|
94
|
+
decisionSink = storage.createDecisionSink(runId);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Sink creation failure is non-fatal
|
|
98
|
+
}
|
|
99
|
+
// Build kernel — dryRun: true = evaluate policies/invariants only (no adapter execution).
|
|
100
|
+
// Claude Code handles actual tool execution; the hook only governs (allow/deny).
|
|
101
|
+
// Events and decision records are still emitted and persisted to the configured storage backend.
|
|
102
|
+
const kernel = createKernel({
|
|
103
|
+
runId,
|
|
104
|
+
policyDefs,
|
|
105
|
+
dryRun: true,
|
|
106
|
+
evaluateOptions: { defaultDeny: false },
|
|
107
|
+
sinks: eventSink ? [eventSink] : [],
|
|
108
|
+
decisionSinks: [decisionSink].filter(Boolean),
|
|
109
|
+
});
|
|
110
|
+
// Record session in the sessions table (SQLite only).
|
|
111
|
+
// Uses session_id from Claude Code so multiple hook invocations share one session row.
|
|
112
|
+
const sessionKey = normalizedPayload.session_id || runId;
|
|
113
|
+
if (storage?.sessions) {
|
|
114
|
+
storage.sessions.start(sessionKey, 'claude-hook', {
|
|
115
|
+
storageBackend: storageConfig.backend,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Resolve agent persona from environment variables.
|
|
119
|
+
// Persona enriches telemetry and enables persona-based policy conditions.
|
|
120
|
+
const { personaFromEnv: readPersonaFromEnv, resolvePersona } = await import('@red-codes/core');
|
|
121
|
+
const envPersona = readPersonaFromEnv();
|
|
122
|
+
const resolvedPersona = envPersona ? resolvePersona(undefined, envPersona) : undefined;
|
|
123
|
+
const result = await processClaudeCodeHook(kernel, normalizedPayload, {}, resolvedPersona);
|
|
124
|
+
kernel.shutdown();
|
|
125
|
+
// Close storage (important for SQLite to flush WAL)
|
|
126
|
+
if (storage) {
|
|
127
|
+
try {
|
|
128
|
+
storage.close();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Non-fatal
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// If denied, output to stdout — this tells Claude Code to block the action
|
|
135
|
+
if (!result.allowed) {
|
|
136
|
+
const response = formatHookResponse(result);
|
|
137
|
+
if (response) {
|
|
138
|
+
process.stdout.write(response);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function handlePostToolUse(data, cliArgs = []) {
|
|
143
|
+
if (data.tool_name !== 'Bash')
|
|
144
|
+
return;
|
|
145
|
+
const output = (data.tool_output || {});
|
|
146
|
+
const exitCode = (output.exit_code ?? output.exitCode ?? 0);
|
|
147
|
+
const stderr = (output.stderr || '');
|
|
148
|
+
const stdout = (output.stdout || '');
|
|
149
|
+
if (exitCode !== 0 && stderr.trim()) {
|
|
150
|
+
process.stdout.write('\n');
|
|
151
|
+
process.stdout.write(` \x1b[1m\x1b[31mError detected:\x1b[0m ${stderr.trim().split('\n')[0].slice(0, 80)}\n`);
|
|
152
|
+
process.stdout.write('\n');
|
|
153
|
+
}
|
|
154
|
+
// Track rtk-optimized commands (informational — for session viewer visibility)
|
|
155
|
+
const toolInput = (data.tool_input || data.command || '');
|
|
156
|
+
if (toolInput.startsWith('rtk ') || toolInput.includes('/rtk ')) {
|
|
157
|
+
process.stderr.write(` \x1b[36m\u26A1\x1b[0m rtk: token-optimized output\n`);
|
|
158
|
+
}
|
|
159
|
+
// Detect PR creation — suggest opening the session viewer
|
|
160
|
+
const isPrCreate = toolInput.includes('gh pr create') || toolInput.includes('gh pr merge');
|
|
161
|
+
if (isPrCreate && exitCode === 0 && stdout.trim()) {
|
|
162
|
+
generateSessionViewerQuietly(cliArgs);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function generateSessionViewerQuietly(cliArgs) {
|
|
166
|
+
try {
|
|
167
|
+
const storeFlagIdx = cliArgs.indexOf('--store');
|
|
168
|
+
const storeFlag = storeFlagIdx !== -1 ? ` --store ${cliArgs[storeFlagIdx + 1]}` : '';
|
|
169
|
+
const dbPathIdx = cliArgs.indexOf('--db-path');
|
|
170
|
+
const dbPathFlag = dbPathIdx !== -1 ? ` --db-path "${cliArgs[dbPathIdx + 1]}"` : '';
|
|
171
|
+
const cli = resolveCliCommand();
|
|
172
|
+
execSync(`${cli} session-viewer --last --no-open${storeFlag}${dbPathFlag}`, {
|
|
173
|
+
stdio: 'ignore',
|
|
174
|
+
timeout: 10000,
|
|
175
|
+
});
|
|
176
|
+
process.stderr.write('\n \x1b[36m\u2139\x1b[0m PR detected — session viewer generated. Run \x1b[1magentguard session-viewer --last\x1b[0m to open.\n\n');
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Non-fatal — viewer generation is best-effort
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function handleNotification(cliArgs) {
|
|
183
|
+
// Agent paused for human input — open the session viewer in the browser.
|
|
184
|
+
// If a live server is already running, skip — the live page polls for new data.
|
|
185
|
+
// Otherwise, spawn a detached live server process so events stream in without hard refresh.
|
|
186
|
+
try {
|
|
187
|
+
const { detectLiveServer } = await import('./session-viewer.js');
|
|
188
|
+
if (detectLiveServer() !== null) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Spawn the live server as a detached process so the hook can exit immediately.
|
|
192
|
+
// The live server stays running and the browser page polls it for updates.
|
|
193
|
+
const cli = resolveCliCommand();
|
|
194
|
+
const storeFlagIdx = cliArgs.indexOf('--store');
|
|
195
|
+
const storeFlag = storeFlagIdx !== -1 ? ['--store', cliArgs[storeFlagIdx + 1]] : [];
|
|
196
|
+
const dbPathIdx = cliArgs.indexOf('--db-path');
|
|
197
|
+
const dbPathFlag = dbPathIdx !== -1 ? ['--db-path', cliArgs[dbPathIdx + 1]] : [];
|
|
198
|
+
const cliParts = cli.split(' ');
|
|
199
|
+
const cmd = cliParts[0];
|
|
200
|
+
const baseArgs = [
|
|
201
|
+
...cliParts.slice(1),
|
|
202
|
+
'session-viewer',
|
|
203
|
+
'--last',
|
|
204
|
+
'--live',
|
|
205
|
+
...storeFlag,
|
|
206
|
+
...dbPathFlag,
|
|
207
|
+
];
|
|
208
|
+
const child = spawn(cmd, baseArgs, {
|
|
209
|
+
detached: true,
|
|
210
|
+
stdio: 'ignore',
|
|
211
|
+
});
|
|
212
|
+
child.unref();
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Non-fatal — viewer generation is best-effort
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async function handleStop(cliArgs) {
|
|
219
|
+
// On session end, generate the session viewer HTML quietly (no browser open).
|
|
220
|
+
// If a live server is running, skip — it already has the latest data.
|
|
221
|
+
try {
|
|
222
|
+
const { detectLiveServer, sessionViewer } = await import('./session-viewer.js');
|
|
223
|
+
if (detectLiveServer() !== null) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const { resolveStorageConfig } = await import('@red-codes/storage');
|
|
227
|
+
const storageConfig = resolveStorageConfig(cliArgs);
|
|
228
|
+
await sessionViewer(['--last', '--no-open', ...cliArgs], storageConfig);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Non-fatal — viewer generation is best-effort
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function readStdin() {
|
|
235
|
+
return new Promise((resolve) => {
|
|
236
|
+
let input = '';
|
|
237
|
+
process.stdin.setEncoding('utf8');
|
|
238
|
+
process.stdin.on('data', (chunk) => {
|
|
239
|
+
input += chunk;
|
|
240
|
+
});
|
|
241
|
+
process.stdin.on('end', () => resolve(input));
|
|
242
|
+
process.stdin.on('error', () => resolve(''));
|
|
243
|
+
if (process.stdin.isTTY)
|
|
244
|
+
resolve('');
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// Entry point: when run directly via `node claude-hook.js pre|post`, invoke claudeHook().
|
|
248
|
+
// Without this, the file only exports the function and nothing executes.
|
|
249
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
250
|
+
const hookArg = process.argv[2]; // 'pre' or 'post'
|
|
251
|
+
const extra = process.argv.slice(3); // e.g., ['--store', 'sqlite']
|
|
252
|
+
claudeHook(hookArg, extra);
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=claude-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-hook.js","sourceRoot":"","sources":["../../src/commands/claude-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-init.d.ts","sourceRoot":"","sources":["../../src/commands/claude-init.ts"],"names":[],"mappings":"AA2CA,wBAAsB,UAAU,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyNnE"}
|