@jaguilar87/gaia 5.0.0-rc.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/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +26 -0
- package/ARCHITECTURE.md +335 -0
- package/CHANGELOG.md +1298 -0
- package/CODE_OF_CONDUCT.md +11 -0
- package/CONTRIBUTING.md +146 -0
- package/INSTALL.md +436 -0
- package/LICENSE +21 -0
- package/README.md +222 -0
- package/SECURITY.md +47 -0
- package/agents/README.md +78 -0
- package/agents/cloud-troubleshooter.md +73 -0
- package/agents/developer.md +65 -0
- package/agents/gaia-operator.md +64 -0
- package/agents/gaia-orchestrator.md +111 -0
- package/agents/gaia-planner.md +53 -0
- package/agents/gaia-system.md +71 -0
- package/agents/gitops-operator.md +61 -0
- package/agents/terraform-architect.md +63 -0
- package/bin/README.md +106 -0
- package/bin/cli/__init__.py +1 -0
- package/bin/cli/approvals.py +740 -0
- package/bin/cli/cleanup.py +562 -0
- package/bin/cli/context.py +283 -0
- package/bin/cli/doctor.py +651 -0
- package/bin/cli/history.py +305 -0
- package/bin/cli/memory.py +483 -0
- package/bin/cli/metrics.py +1068 -0
- package/bin/cli/plans.py +515 -0
- package/bin/cli/status.py +302 -0
- package/bin/cli/update.py +382 -0
- package/bin/gaia +112 -0
- package/bin/gaia-cleanup.js +531 -0
- package/bin/gaia-doctor.js +635 -0
- package/bin/gaia-evidence +126 -0
- package/bin/gaia-history.js +251 -0
- package/bin/gaia-metrics.js +1278 -0
- package/bin/gaia-review.js +269 -0
- package/bin/gaia-scan +44 -0
- package/bin/gaia-scan.py +589 -0
- package/bin/gaia-skills-diagnose.js +929 -0
- package/bin/gaia-status.js +278 -0
- package/bin/gaia-uninstall.js +111 -0
- package/bin/gaia-update.js +919 -0
- package/bin/pre-publish-validate.js +610 -0
- package/bin/python-detect.js +60 -0
- package/bin/validate-sandbox.sh +601 -0
- package/commands/README.md +64 -0
- package/commands/gaia.md +37 -0
- package/commands/scan-project.md +67 -0
- package/config/README.md +71 -0
- package/config/cloud/aws.json +134 -0
- package/config/cloud/gcp.json +139 -0
- package/config/context-contracts.json +158 -0
- package/config/crons-schema.md +81 -0
- package/config/git_standards.json +72 -0
- package/config/surface-routing.json +417 -0
- package/config/universal-rules.json +102 -0
- package/dist/gaia-ops/.claude-plugin/plugin.json +24 -0
- package/dist/gaia-ops/README.md +80 -0
- package/dist/gaia-ops/agents/cloud-troubleshooter.md +73 -0
- package/dist/gaia-ops/agents/developer.md +65 -0
- package/dist/gaia-ops/agents/gaia-operator.md +64 -0
- package/dist/gaia-ops/agents/gaia-orchestrator.md +111 -0
- package/dist/gaia-ops/agents/gaia-planner.md +53 -0
- package/dist/gaia-ops/agents/gaia-system.md +71 -0
- package/dist/gaia-ops/agents/gitops-operator.md +61 -0
- package/dist/gaia-ops/agents/terraform-architect.md +63 -0
- package/dist/gaia-ops/commands/gaia.md +37 -0
- package/dist/gaia-ops/config/README.md +71 -0
- package/dist/gaia-ops/config/cloud/aws.json +134 -0
- package/dist/gaia-ops/config/cloud/gcp.json +139 -0
- package/dist/gaia-ops/config/context-contracts.json +158 -0
- package/dist/gaia-ops/config/crons-schema.md +81 -0
- package/dist/gaia-ops/config/git_standards.json +72 -0
- package/dist/gaia-ops/config/surface-routing.json +417 -0
- package/dist/gaia-ops/config/universal-rules.json +102 -0
- package/dist/gaia-ops/hooks/adapters/__init__.py +52 -0
- package/dist/gaia-ops/hooks/adapters/base.py +219 -0
- package/dist/gaia-ops/hooks/adapters/channel.py +17 -0
- package/dist/gaia-ops/hooks/adapters/claude_code.py +1890 -0
- package/dist/gaia-ops/hooks/adapters/types.py +194 -0
- package/dist/gaia-ops/hooks/adapters/utils.py +25 -0
- package/dist/gaia-ops/hooks/hooks.json +192 -0
- package/dist/gaia-ops/hooks/modules/__init__.py +15 -0
- package/dist/gaia-ops/hooks/modules/agents/__init__.py +29 -0
- package/dist/gaia-ops/hooks/modules/agents/contract_validator.py +647 -0
- package/dist/gaia-ops/hooks/modules/agents/response_contract.py +496 -0
- package/dist/gaia-ops/hooks/modules/agents/skill_injection_verifier.py +120 -0
- package/dist/gaia-ops/hooks/modules/agents/state_tracker.py +267 -0
- package/dist/gaia-ops/hooks/modules/agents/task_info_builder.py +74 -0
- package/dist/gaia-ops/hooks/modules/agents/transcript_analyzer.py +458 -0
- package/dist/gaia-ops/hooks/modules/agents/transcript_reader.py +152 -0
- package/dist/gaia-ops/hooks/modules/audit/__init__.py +28 -0
- package/dist/gaia-ops/hooks/modules/audit/event_detector.py +168 -0
- package/dist/gaia-ops/hooks/modules/audit/logger.py +131 -0
- package/dist/gaia-ops/hooks/modules/audit/metrics.py +134 -0
- package/dist/gaia-ops/hooks/modules/audit/workflow_auditor.py +611 -0
- package/dist/gaia-ops/hooks/modules/audit/workflow_recorder.py +296 -0
- package/dist/gaia-ops/hooks/modules/context/__init__.py +11 -0
- package/dist/gaia-ops/hooks/modules/context/agentic_loop_detector.py +165 -0
- package/dist/gaia-ops/hooks/modules/context/anchor_tracker.py +317 -0
- package/dist/gaia-ops/hooks/modules/context/compact_context_builder.py +218 -0
- package/dist/gaia-ops/hooks/modules/context/context_freshness.py +145 -0
- package/dist/gaia-ops/hooks/modules/context/context_injector.py +558 -0
- package/dist/gaia-ops/hooks/modules/context/context_writer.py +530 -0
- package/dist/gaia-ops/hooks/modules/context/contracts_loader.py +161 -0
- package/dist/gaia-ops/hooks/modules/core/__init__.py +40 -0
- package/dist/gaia-ops/hooks/modules/core/hook_entry.py +78 -0
- package/dist/gaia-ops/hooks/modules/core/paths.py +160 -0
- package/dist/gaia-ops/hooks/modules/core/plugin_mode.py +149 -0
- package/dist/gaia-ops/hooks/modules/core/plugin_setup.py +577 -0
- package/dist/gaia-ops/hooks/modules/core/state.py +179 -0
- package/dist/gaia-ops/hooks/modules/core/stdin.py +24 -0
- package/dist/gaia-ops/hooks/modules/events/__init__.py +1 -0
- package/dist/gaia-ops/hooks/modules/events/event_writer.py +210 -0
- package/dist/gaia-ops/hooks/modules/memory/__init__.py +8 -0
- package/dist/gaia-ops/hooks/modules/memory/episode_writer.py +216 -0
- package/dist/gaia-ops/hooks/modules/orchestrator/__init__.py +1 -0
- package/dist/gaia-ops/hooks/modules/orchestrator/delegate_mode.py +122 -0
- package/dist/gaia-ops/hooks/modules/scanning/__init__.py +8 -0
- package/dist/gaia-ops/hooks/modules/scanning/scan_trigger.py +84 -0
- package/dist/gaia-ops/hooks/modules/security/__init__.py +120 -0
- package/dist/gaia-ops/hooks/modules/security/approval_cleanup.py +87 -0
- package/dist/gaia-ops/hooks/modules/security/approval_constants.py +23 -0
- package/dist/gaia-ops/hooks/modules/security/approval_grants.py +1638 -0
- package/dist/gaia-ops/hooks/modules/security/approval_messages.py +71 -0
- package/dist/gaia-ops/hooks/modules/security/approval_scopes.py +222 -0
- package/dist/gaia-ops/hooks/modules/security/blocked_commands.py +595 -0
- package/dist/gaia-ops/hooks/modules/security/blocked_message_formatter.py +87 -0
- package/dist/gaia-ops/hooks/modules/security/command_semantics.py +181 -0
- package/dist/gaia-ops/hooks/modules/security/composition_rules.py +547 -0
- package/dist/gaia-ops/hooks/modules/security/flag_classifiers.py +873 -0
- package/dist/gaia-ops/hooks/modules/security/gitops_validator.py +179 -0
- package/dist/gaia-ops/hooks/modules/security/mutative_verbs.py +1131 -0
- package/dist/gaia-ops/hooks/modules/security/network_hosts.py +481 -0
- package/dist/gaia-ops/hooks/modules/security/prompt_validator.py +40 -0
- package/dist/gaia-ops/hooks/modules/security/shell_unwrapper.py +165 -0
- package/dist/gaia-ops/hooks/modules/security/tiers.py +196 -0
- package/dist/gaia-ops/hooks/modules/session/__init__.py +10 -0
- package/dist/gaia-ops/hooks/modules/session/pending_scanner.py +174 -0
- package/dist/gaia-ops/hooks/modules/session/session_context_writer.py +100 -0
- package/dist/gaia-ops/hooks/modules/session/session_event_injector.py +160 -0
- package/dist/gaia-ops/hooks/modules/session/session_manager.py +31 -0
- package/dist/gaia-ops/hooks/modules/session/session_registry.py +333 -0
- package/dist/gaia-ops/hooks/modules/tools/__init__.py +29 -0
- package/dist/gaia-ops/hooks/modules/tools/bash_validator.py +1008 -0
- package/dist/gaia-ops/hooks/modules/tools/cloud_pipe_validator.py +231 -0
- package/dist/gaia-ops/hooks/modules/tools/hook_response.py +55 -0
- package/dist/gaia-ops/hooks/modules/tools/shell_parser.py +227 -0
- package/dist/gaia-ops/hooks/modules/tools/stage_decomposer.py +315 -0
- package/dist/gaia-ops/hooks/modules/tools/task_validator.py +294 -0
- package/dist/gaia-ops/hooks/modules/validation/__init__.py +23 -0
- package/dist/gaia-ops/hooks/modules/validation/commit_validator.py +380 -0
- package/dist/gaia-ops/hooks/post_compact.py +43 -0
- package/dist/gaia-ops/hooks/post_tool_use.py +54 -0
- package/dist/gaia-ops/hooks/pre_compact.py +60 -0
- package/dist/gaia-ops/hooks/pre_tool_use.py +413 -0
- package/dist/gaia-ops/hooks/session_end_hook.py +77 -0
- package/dist/gaia-ops/hooks/session_start.py +81 -0
- package/dist/gaia-ops/hooks/stop_hook.py +70 -0
- package/dist/gaia-ops/hooks/subagent_start.py +71 -0
- package/dist/gaia-ops/hooks/subagent_stop.py +295 -0
- package/dist/gaia-ops/hooks/task_completed.py +70 -0
- package/dist/gaia-ops/hooks/user_prompt_submit.py +246 -0
- package/dist/gaia-ops/settings.json +72 -0
- package/dist/gaia-ops/skills/README.md +158 -0
- package/dist/gaia-ops/skills/agent-creation/SKILL.md +87 -0
- package/dist/gaia-ops/skills/agent-creation/examples.md +170 -0
- package/dist/gaia-ops/skills/agent-creation/reference.md +191 -0
- package/dist/gaia-ops/skills/agent-protocol/SKILL.md +93 -0
- package/dist/gaia-ops/skills/agent-protocol/examples.md +223 -0
- package/dist/gaia-ops/skills/agent-response/SKILL.md +69 -0
- package/dist/gaia-ops/skills/agentic-loop/SKILL.md +80 -0
- package/dist/gaia-ops/skills/agentic-loop/reference.md +378 -0
- package/dist/gaia-ops/skills/blog-writing/SKILL.md +98 -0
- package/dist/gaia-ops/skills/blog-writing/reference.md +130 -0
- package/dist/gaia-ops/skills/brief-spec/SKILL.md +185 -0
- package/dist/gaia-ops/skills/command-execution/SKILL.md +64 -0
- package/dist/gaia-ops/skills/command-execution/reference.md +83 -0
- package/dist/gaia-ops/skills/context-updater/SKILL.md +87 -0
- package/dist/gaia-ops/skills/context-updater/examples.md +71 -0
- package/dist/gaia-ops/skills/developer-patterns/SKILL.md +50 -0
- package/dist/gaia-ops/skills/developer-patterns/reference.md +112 -0
- package/dist/gaia-ops/skills/execution/SKILL.md +99 -0
- package/dist/gaia-ops/skills/fast-queries/SKILL.md +43 -0
- package/dist/gaia-ops/skills/gaia-compact/SKILL.md +74 -0
- package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +108 -0
- package/dist/gaia-ops/skills/gaia-patterns/reference.md +395 -0
- package/dist/gaia-ops/skills/gaia-planner/SKILL.md +37 -0
- package/dist/gaia-ops/skills/gaia-planner/reference.md +107 -0
- package/dist/gaia-ops/skills/gaia-release/SKILL.md +85 -0
- package/dist/gaia-ops/skills/gaia-release/reference.md +92 -0
- package/dist/gaia-ops/skills/gaia-self-check/SKILL.md +114 -0
- package/dist/gaia-ops/skills/gaia-self-check/reference.md +453 -0
- package/dist/gaia-ops/skills/gaia-verify/SKILL.md +77 -0
- package/dist/gaia-ops/skills/gaia-verify/reference.md +80 -0
- package/dist/gaia-ops/skills/git-conventions/SKILL.md +47 -0
- package/dist/gaia-ops/skills/gitops-patterns/SKILL.md +60 -0
- package/dist/gaia-ops/skills/gitops-patterns/reference.md +183 -0
- package/dist/gaia-ops/skills/gmail-policy/SKILL.md +200 -0
- package/dist/gaia-ops/skills/gmail-policy/reference.md +150 -0
- package/dist/gaia-ops/skills/gmail-triage/SKILL.md +100 -0
- package/dist/gaia-ops/skills/gws-setup/SKILL.md +99 -0
- package/dist/gaia-ops/skills/gws-setup/reference.md +73 -0
- package/dist/gaia-ops/skills/investigation/SKILL.md +100 -0
- package/dist/gaia-ops/skills/memory-curation/SKILL.md +83 -0
- package/dist/gaia-ops/skills/memory-search/SKILL.md +88 -0
- package/dist/gaia-ops/skills/orchestrator-approval/SKILL.md +160 -0
- package/dist/gaia-ops/skills/orchestrator-approval/reference.md +174 -0
- package/dist/gaia-ops/skills/pending-approvals/SKILL.md +72 -0
- package/dist/gaia-ops/skills/pending-approvals/reference.md +214 -0
- package/dist/gaia-ops/skills/readme-writing/SKILL.md +71 -0
- package/dist/gaia-ops/skills/readme-writing/reference.md +188 -0
- package/dist/gaia-ops/skills/reference.md +135 -0
- package/dist/gaia-ops/skills/request-approval/SKILL.md +140 -0
- package/dist/gaia-ops/skills/request-approval/examples.md +140 -0
- package/dist/gaia-ops/skills/request-approval/reference.md +57 -0
- package/dist/gaia-ops/skills/schedule-task/SKILL.md +64 -0
- package/dist/gaia-ops/skills/schedule-task/reference.md +233 -0
- package/dist/gaia-ops/skills/security-tiers/SKILL.md +141 -0
- package/dist/gaia-ops/skills/security-tiers/destructive-commands-reference.md +623 -0
- package/dist/gaia-ops/skills/security-tiers/reference.md +39 -0
- package/dist/gaia-ops/skills/session-reflection/SKILL.md +69 -0
- package/dist/gaia-ops/skills/skill-creation/SKILL.md +92 -0
- package/dist/gaia-ops/skills/skill-creation/reference.md +29 -0
- package/dist/gaia-ops/skills/terraform-patterns/SKILL.md +89 -0
- package/dist/gaia-ops/skills/terraform-patterns/reference.md +93 -0
- package/dist/gaia-ops/tools/__init__.py +9 -0
- package/dist/gaia-ops/tools/agentic-loop/decide-status.py +210 -0
- package/dist/gaia-ops/tools/agentic-loop/parse-metric.py +106 -0
- package/dist/gaia-ops/tools/agentic-loop/record-iteration.py +221 -0
- package/dist/gaia-ops/tools/context/README.md +132 -0
- package/dist/gaia-ops/tools/context/__init__.py +42 -0
- package/dist/gaia-ops/tools/context/_paths.py +20 -0
- package/dist/gaia-ops/tools/context/context_provider.py +721 -0
- package/dist/gaia-ops/tools/context/context_section_reader.py +342 -0
- package/dist/gaia-ops/tools/context/deep_merge.py +159 -0
- package/dist/gaia-ops/tools/context/pending_updates.py +760 -0
- package/dist/gaia-ops/tools/context/surface_router.py +278 -0
- package/dist/gaia-ops/tools/fast-queries/README.md +65 -0
- package/dist/gaia-ops/tools/fast-queries/__init__.py +30 -0
- package/dist/gaia-ops/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
- package/dist/gaia-ops/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
- package/dist/gaia-ops/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
- package/dist/gaia-ops/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
- package/dist/gaia-ops/tools/fast-queries/run_triage.sh +59 -0
- package/dist/gaia-ops/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
- package/dist/gaia-ops/tools/gaia_simulator/__init__.py +33 -0
- package/dist/gaia-ops/tools/gaia_simulator/cli.py +354 -0
- package/dist/gaia-ops/tools/gaia_simulator/extractor.py +457 -0
- package/dist/gaia-ops/tools/gaia_simulator/reporter.py +258 -0
- package/dist/gaia-ops/tools/gaia_simulator/routing_simulator.py +334 -0
- package/dist/gaia-ops/tools/gaia_simulator/runner.py +539 -0
- package/dist/gaia-ops/tools/gaia_simulator/skills_mapper.py +264 -0
- package/dist/gaia-ops/tools/memory/README.md +0 -0
- package/dist/gaia-ops/tools/memory/__init__.py +20 -0
- package/dist/gaia-ops/tools/memory/backfill_fts5.py +107 -0
- package/dist/gaia-ops/tools/memory/conflict_detector.py +295 -0
- package/dist/gaia-ops/tools/memory/episodic.py +1210 -0
- package/dist/gaia-ops/tools/memory/git_invalidator.py +262 -0
- package/dist/gaia-ops/tools/memory/paths.py +102 -0
- package/dist/gaia-ops/tools/memory/scoring.py +193 -0
- package/dist/gaia-ops/tools/memory/search_store.py +375 -0
- package/dist/gaia-ops/tools/persist_transcript_analysis.py +85 -0
- package/dist/gaia-ops/tools/review/__init__.py +1 -0
- package/dist/gaia-ops/tools/review/review_engine.py +157 -0
- package/dist/gaia-ops/tools/scan/__init__.py +35 -0
- package/dist/gaia-ops/tools/scan/config.py +247 -0
- package/dist/gaia-ops/tools/scan/merge.py +212 -0
- package/dist/gaia-ops/tools/scan/orchestrator.py +549 -0
- package/dist/gaia-ops/tools/scan/registry.py +127 -0
- package/dist/gaia-ops/tools/scan/scanners/__init__.py +18 -0
- package/dist/gaia-ops/tools/scan/scanners/base.py +137 -0
- package/dist/gaia-ops/tools/scan/scanners/environment.py +349 -0
- package/dist/gaia-ops/tools/scan/scanners/git.py +570 -0
- package/dist/gaia-ops/tools/scan/scanners/infrastructure.py +875 -0
- package/dist/gaia-ops/tools/scan/scanners/orchestration.py +600 -0
- package/dist/gaia-ops/tools/scan/scanners/stack.py +1085 -0
- package/dist/gaia-ops/tools/scan/scanners/tools.py +260 -0
- package/dist/gaia-ops/tools/scan/setup.py +686 -0
- package/dist/gaia-ops/tools/scan/tests/__init__.py +1 -0
- package/dist/gaia-ops/tools/scan/tests/conftest.py +796 -0
- package/dist/gaia-ops/tools/scan/tests/test_environment.py +323 -0
- package/dist/gaia-ops/tools/scan/tests/test_git.py +419 -0
- package/dist/gaia-ops/tools/scan/tests/test_infrastructure.py +382 -0
- package/dist/gaia-ops/tools/scan/tests/test_integration.py +920 -0
- package/dist/gaia-ops/tools/scan/tests/test_merge.py +269 -0
- package/dist/gaia-ops/tools/scan/tests/test_orchestration.py +304 -0
- package/dist/gaia-ops/tools/scan/tests/test_stack.py +604 -0
- package/dist/gaia-ops/tools/scan/tests/test_tools.py +349 -0
- package/dist/gaia-ops/tools/scan/ui.py +624 -0
- package/dist/gaia-ops/tools/scan/verify.py +270 -0
- package/dist/gaia-ops/tools/scan/walk.py +118 -0
- package/dist/gaia-ops/tools/scan/workspace.py +85 -0
- package/dist/gaia-ops/tools/validation/README.md +244 -0
- package/dist/gaia-ops/tools/validation/__init__.py +17 -0
- package/dist/gaia-ops/tools/validation/approval_gate.py +321 -0
- package/dist/gaia-ops/tools/validation/validate_skills.py +189 -0
- package/dist/gaia-security/.claude-plugin/plugin.json +24 -0
- package/dist/gaia-security/README.md +90 -0
- package/dist/gaia-security/config/universal-rules.json +102 -0
- package/dist/gaia-security/hooks/adapters/__init__.py +52 -0
- package/dist/gaia-security/hooks/adapters/base.py +219 -0
- package/dist/gaia-security/hooks/adapters/channel.py +17 -0
- package/dist/gaia-security/hooks/adapters/claude_code.py +1890 -0
- package/dist/gaia-security/hooks/adapters/types.py +194 -0
- package/dist/gaia-security/hooks/adapters/utils.py +25 -0
- package/dist/gaia-security/hooks/hooks.json +113 -0
- package/dist/gaia-security/hooks/modules/__init__.py +15 -0
- package/dist/gaia-security/hooks/modules/agents/__init__.py +29 -0
- package/dist/gaia-security/hooks/modules/agents/contract_validator.py +647 -0
- package/dist/gaia-security/hooks/modules/agents/response_contract.py +496 -0
- package/dist/gaia-security/hooks/modules/agents/skill_injection_verifier.py +120 -0
- package/dist/gaia-security/hooks/modules/agents/state_tracker.py +267 -0
- package/dist/gaia-security/hooks/modules/agents/task_info_builder.py +74 -0
- package/dist/gaia-security/hooks/modules/agents/transcript_analyzer.py +458 -0
- package/dist/gaia-security/hooks/modules/agents/transcript_reader.py +152 -0
- package/dist/gaia-security/hooks/modules/audit/__init__.py +28 -0
- package/dist/gaia-security/hooks/modules/audit/event_detector.py +168 -0
- package/dist/gaia-security/hooks/modules/audit/logger.py +131 -0
- package/dist/gaia-security/hooks/modules/audit/metrics.py +134 -0
- package/dist/gaia-security/hooks/modules/audit/workflow_auditor.py +611 -0
- package/dist/gaia-security/hooks/modules/audit/workflow_recorder.py +296 -0
- package/dist/gaia-security/hooks/modules/context/__init__.py +11 -0
- package/dist/gaia-security/hooks/modules/context/agentic_loop_detector.py +165 -0
- package/dist/gaia-security/hooks/modules/context/anchor_tracker.py +317 -0
- package/dist/gaia-security/hooks/modules/context/compact_context_builder.py +218 -0
- package/dist/gaia-security/hooks/modules/context/context_freshness.py +145 -0
- package/dist/gaia-security/hooks/modules/context/context_injector.py +558 -0
- package/dist/gaia-security/hooks/modules/context/context_writer.py +530 -0
- package/dist/gaia-security/hooks/modules/context/contracts_loader.py +161 -0
- package/dist/gaia-security/hooks/modules/core/__init__.py +40 -0
- package/dist/gaia-security/hooks/modules/core/hook_entry.py +78 -0
- package/dist/gaia-security/hooks/modules/core/paths.py +160 -0
- package/dist/gaia-security/hooks/modules/core/plugin_mode.py +149 -0
- package/dist/gaia-security/hooks/modules/core/plugin_setup.py +577 -0
- package/dist/gaia-security/hooks/modules/core/state.py +179 -0
- package/dist/gaia-security/hooks/modules/core/stdin.py +24 -0
- package/dist/gaia-security/hooks/modules/events/__init__.py +1 -0
- package/dist/gaia-security/hooks/modules/events/event_writer.py +210 -0
- package/dist/gaia-security/hooks/modules/memory/__init__.py +8 -0
- package/dist/gaia-security/hooks/modules/memory/episode_writer.py +216 -0
- package/dist/gaia-security/hooks/modules/orchestrator/__init__.py +1 -0
- package/dist/gaia-security/hooks/modules/orchestrator/delegate_mode.py +122 -0
- package/dist/gaia-security/hooks/modules/scanning/__init__.py +8 -0
- package/dist/gaia-security/hooks/modules/scanning/scan_trigger.py +84 -0
- package/dist/gaia-security/hooks/modules/security/__init__.py +120 -0
- package/dist/gaia-security/hooks/modules/security/approval_cleanup.py +87 -0
- package/dist/gaia-security/hooks/modules/security/approval_constants.py +23 -0
- package/dist/gaia-security/hooks/modules/security/approval_grants.py +1638 -0
- package/dist/gaia-security/hooks/modules/security/approval_messages.py +71 -0
- package/dist/gaia-security/hooks/modules/security/approval_scopes.py +222 -0
- package/dist/gaia-security/hooks/modules/security/blocked_commands.py +595 -0
- package/dist/gaia-security/hooks/modules/security/blocked_message_formatter.py +87 -0
- package/dist/gaia-security/hooks/modules/security/command_semantics.py +181 -0
- package/dist/gaia-security/hooks/modules/security/composition_rules.py +547 -0
- package/dist/gaia-security/hooks/modules/security/flag_classifiers.py +873 -0
- package/dist/gaia-security/hooks/modules/security/gitops_validator.py +179 -0
- package/dist/gaia-security/hooks/modules/security/mutative_verbs.py +1131 -0
- package/dist/gaia-security/hooks/modules/security/network_hosts.py +481 -0
- package/dist/gaia-security/hooks/modules/security/prompt_validator.py +40 -0
- package/dist/gaia-security/hooks/modules/security/shell_unwrapper.py +165 -0
- package/dist/gaia-security/hooks/modules/security/tiers.py +196 -0
- package/dist/gaia-security/hooks/modules/session/__init__.py +10 -0
- package/dist/gaia-security/hooks/modules/session/pending_scanner.py +174 -0
- package/dist/gaia-security/hooks/modules/session/session_context_writer.py +100 -0
- package/dist/gaia-security/hooks/modules/session/session_event_injector.py +160 -0
- package/dist/gaia-security/hooks/modules/session/session_manager.py +31 -0
- package/dist/gaia-security/hooks/modules/session/session_registry.py +333 -0
- package/dist/gaia-security/hooks/modules/tools/__init__.py +29 -0
- package/dist/gaia-security/hooks/modules/tools/bash_validator.py +1008 -0
- package/dist/gaia-security/hooks/modules/tools/cloud_pipe_validator.py +231 -0
- package/dist/gaia-security/hooks/modules/tools/hook_response.py +55 -0
- package/dist/gaia-security/hooks/modules/tools/shell_parser.py +227 -0
- package/dist/gaia-security/hooks/modules/tools/stage_decomposer.py +315 -0
- package/dist/gaia-security/hooks/modules/tools/task_validator.py +294 -0
- package/dist/gaia-security/hooks/modules/validation/__init__.py +23 -0
- package/dist/gaia-security/hooks/modules/validation/commit_validator.py +380 -0
- package/dist/gaia-security/hooks/post_tool_use.py +54 -0
- package/dist/gaia-security/hooks/pre_tool_use.py +413 -0
- package/dist/gaia-security/hooks/session_end_hook.py +77 -0
- package/dist/gaia-security/hooks/session_start.py +81 -0
- package/dist/gaia-security/hooks/stop_hook.py +70 -0
- package/dist/gaia-security/hooks/user_prompt_submit.py +246 -0
- package/dist/gaia-security/settings.json +58 -0
- package/git-hooks/commit-msg +41 -0
- package/hooks/README.md +100 -0
- package/hooks/adapters/__init__.py +52 -0
- package/hooks/adapters/base.py +219 -0
- package/hooks/adapters/channel.py +17 -0
- package/hooks/adapters/claude_code.py +1890 -0
- package/hooks/adapters/types.py +194 -0
- package/hooks/adapters/utils.py +25 -0
- package/hooks/elicitation_result.py +179 -0
- package/hooks/hooks.json +84 -0
- package/hooks/modules/README.md +189 -0
- package/hooks/modules/__init__.py +15 -0
- package/hooks/modules/agents/__init__.py +29 -0
- package/hooks/modules/agents/contract_validator.py +647 -0
- package/hooks/modules/agents/response_contract.py +496 -0
- package/hooks/modules/agents/skill_injection_verifier.py +120 -0
- package/hooks/modules/agents/state_tracker.py +267 -0
- package/hooks/modules/agents/task_info_builder.py +74 -0
- package/hooks/modules/agents/transcript_analyzer.py +458 -0
- package/hooks/modules/agents/transcript_reader.py +152 -0
- package/hooks/modules/audit/__init__.py +28 -0
- package/hooks/modules/audit/event_detector.py +168 -0
- package/hooks/modules/audit/logger.py +131 -0
- package/hooks/modules/audit/metrics.py +134 -0
- package/hooks/modules/audit/workflow_auditor.py +611 -0
- package/hooks/modules/audit/workflow_recorder.py +296 -0
- package/hooks/modules/context/__init__.py +11 -0
- package/hooks/modules/context/agentic_loop_detector.py +165 -0
- package/hooks/modules/context/anchor_tracker.py +317 -0
- package/hooks/modules/context/compact_context_builder.py +218 -0
- package/hooks/modules/context/context_freshness.py +145 -0
- package/hooks/modules/context/context_injector.py +558 -0
- package/hooks/modules/context/context_writer.py +530 -0
- package/hooks/modules/context/contracts_loader.py +161 -0
- package/hooks/modules/core/__init__.py +40 -0
- package/hooks/modules/core/hook_entry.py +78 -0
- package/hooks/modules/core/paths.py +160 -0
- package/hooks/modules/core/plugin_mode.py +149 -0
- package/hooks/modules/core/plugin_setup.py +577 -0
- package/hooks/modules/core/state.py +179 -0
- package/hooks/modules/core/stdin.py +24 -0
- package/hooks/modules/events/__init__.py +1 -0
- package/hooks/modules/events/event_writer.py +210 -0
- package/hooks/modules/evidence/__init__.py +34 -0
- package/hooks/modules/evidence/assertions.py +137 -0
- package/hooks/modules/evidence/index_writer.py +57 -0
- package/hooks/modules/evidence/loader.py +126 -0
- package/hooks/modules/evidence/runner.py +241 -0
- package/hooks/modules/memory/__init__.py +8 -0
- package/hooks/modules/memory/episode_writer.py +216 -0
- package/hooks/modules/orchestrator/__init__.py +1 -0
- package/hooks/modules/orchestrator/delegate_mode.py +122 -0
- package/hooks/modules/scanning/__init__.py +8 -0
- package/hooks/modules/scanning/scan_trigger.py +84 -0
- package/hooks/modules/security/__init__.py +120 -0
- package/hooks/modules/security/approval_cleanup.py +87 -0
- package/hooks/modules/security/approval_constants.py +23 -0
- package/hooks/modules/security/approval_grants.py +1638 -0
- package/hooks/modules/security/approval_messages.py +71 -0
- package/hooks/modules/security/approval_scopes.py +222 -0
- package/hooks/modules/security/blocked_commands.py +595 -0
- package/hooks/modules/security/blocked_message_formatter.py +87 -0
- package/hooks/modules/security/command_semantics.py +181 -0
- package/hooks/modules/security/composition_rules.py +547 -0
- package/hooks/modules/security/flag_classifiers.py +873 -0
- package/hooks/modules/security/gitops_validator.py +179 -0
- package/hooks/modules/security/mutative_verbs.py +1131 -0
- package/hooks/modules/security/network_hosts.py +481 -0
- package/hooks/modules/security/prompt_validator.py +40 -0
- package/hooks/modules/security/shell_unwrapper.py +165 -0
- package/hooks/modules/security/tiers.py +196 -0
- package/hooks/modules/session/__init__.py +10 -0
- package/hooks/modules/session/pending_scanner.py +174 -0
- package/hooks/modules/session/session_context_writer.py +100 -0
- package/hooks/modules/session/session_event_injector.py +160 -0
- package/hooks/modules/session/session_manager.py +31 -0
- package/hooks/modules/session/session_registry.py +333 -0
- package/hooks/modules/tools/__init__.py +29 -0
- package/hooks/modules/tools/bash_validator.py +1008 -0
- package/hooks/modules/tools/cloud_pipe_validator.py +231 -0
- package/hooks/modules/tools/hook_response.py +55 -0
- package/hooks/modules/tools/shell_parser.py +227 -0
- package/hooks/modules/tools/stage_decomposer.py +315 -0
- package/hooks/modules/tools/task_validator.py +294 -0
- package/hooks/modules/validation/__init__.py +23 -0
- package/hooks/modules/validation/commit_validator.py +380 -0
- package/hooks/post_compact.py +43 -0
- package/hooks/post_tool_use.py +54 -0
- package/hooks/pre_compact.py +60 -0
- package/hooks/pre_tool_use.py +413 -0
- package/hooks/session_end_hook.py +77 -0
- package/hooks/session_start.py +81 -0
- package/hooks/stop_hook.py +70 -0
- package/hooks/subagent_start.py +71 -0
- package/hooks/subagent_stop.py +295 -0
- package/hooks/task_completed.py +70 -0
- package/hooks/user_prompt_submit.py +246 -0
- package/index.js +83 -0
- package/package.json +103 -0
- package/pyproject.toml +32 -0
- package/skills/README.md +158 -0
- package/skills/agent-creation/SKILL.md +87 -0
- package/skills/agent-creation/examples.md +170 -0
- package/skills/agent-creation/reference.md +191 -0
- package/skills/agent-protocol/SKILL.md +93 -0
- package/skills/agent-protocol/examples.md +223 -0
- package/skills/agent-response/SKILL.md +69 -0
- package/skills/agentic-loop/SKILL.md +80 -0
- package/skills/agentic-loop/reference.md +378 -0
- package/skills/blog-writing/SKILL.md +98 -0
- package/skills/blog-writing/reference.md +130 -0
- package/skills/brief-spec/SKILL.md +185 -0
- package/skills/command-execution/SKILL.md +64 -0
- package/skills/command-execution/reference.md +83 -0
- package/skills/context-updater/SKILL.md +87 -0
- package/skills/context-updater/examples.md +71 -0
- package/skills/developer-patterns/SKILL.md +50 -0
- package/skills/developer-patterns/reference.md +112 -0
- package/skills/execution/SKILL.md +99 -0
- package/skills/fast-queries/SKILL.md +43 -0
- package/skills/gaia-compact/SKILL.md +74 -0
- package/skills/gaia-patterns/SKILL.md +108 -0
- package/skills/gaia-patterns/reference.md +395 -0
- package/skills/gaia-planner/SKILL.md +37 -0
- package/skills/gaia-planner/reference.md +107 -0
- package/skills/gaia-release/SKILL.md +85 -0
- package/skills/gaia-release/reference.md +92 -0
- package/skills/gaia-self-check/SKILL.md +114 -0
- package/skills/gaia-self-check/reference.md +453 -0
- package/skills/gaia-verify/SKILL.md +77 -0
- package/skills/gaia-verify/reference.md +80 -0
- package/skills/git-conventions/SKILL.md +47 -0
- package/skills/gitops-patterns/SKILL.md +60 -0
- package/skills/gitops-patterns/reference.md +183 -0
- package/skills/gmail-policy/SKILL.md +200 -0
- package/skills/gmail-policy/reference.md +150 -0
- package/skills/gmail-triage/SKILL.md +100 -0
- package/skills/gws-setup/SKILL.md +99 -0
- package/skills/gws-setup/reference.md +73 -0
- package/skills/investigation/SKILL.md +100 -0
- package/skills/memory-curation/SKILL.md +83 -0
- package/skills/memory-search/SKILL.md +88 -0
- package/skills/orchestrator-approval/SKILL.md +160 -0
- package/skills/orchestrator-approval/reference.md +174 -0
- package/skills/pending-approvals/SKILL.md +72 -0
- package/skills/pending-approvals/reference.md +214 -0
- package/skills/readme-writing/SKILL.md +71 -0
- package/skills/readme-writing/reference.md +188 -0
- package/skills/reference.md +135 -0
- package/skills/request-approval/SKILL.md +140 -0
- package/skills/request-approval/examples.md +140 -0
- package/skills/request-approval/reference.md +57 -0
- package/skills/schedule-task/SKILL.md +64 -0
- package/skills/schedule-task/reference.md +233 -0
- package/skills/security-tiers/SKILL.md +141 -0
- package/skills/security-tiers/destructive-commands-reference.md +623 -0
- package/skills/security-tiers/reference.md +39 -0
- package/skills/session-reflection/SKILL.md +69 -0
- package/skills/skill-creation/SKILL.md +92 -0
- package/skills/skill-creation/reference.md +29 -0
- package/skills/terraform-patterns/SKILL.md +89 -0
- package/skills/terraform-patterns/reference.md +93 -0
- package/templates/README.md +69 -0
- package/templates/managed-settings.template.json +43 -0
- package/tools/__init__.py +9 -0
- package/tools/agentic-loop/decide-status.py +210 -0
- package/tools/agentic-loop/parse-metric.py +106 -0
- package/tools/agentic-loop/record-iteration.py +221 -0
- package/tools/context/README.md +132 -0
- package/tools/context/__init__.py +42 -0
- package/tools/context/_paths.py +20 -0
- package/tools/context/context_provider.py +721 -0
- package/tools/context/context_section_reader.py +342 -0
- package/tools/context/deep_merge.py +159 -0
- package/tools/context/pending_updates.py +760 -0
- package/tools/context/surface_router.py +278 -0
- package/tools/fast-queries/README.md +65 -0
- package/tools/fast-queries/__init__.py +30 -0
- package/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
- package/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
- package/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
- package/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
- package/tools/fast-queries/run_triage.sh +59 -0
- package/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
- package/tools/gaia_simulator/__init__.py +33 -0
- package/tools/gaia_simulator/cli.py +354 -0
- package/tools/gaia_simulator/extractor.py +457 -0
- package/tools/gaia_simulator/reporter.py +258 -0
- package/tools/gaia_simulator/routing_simulator.py +334 -0
- package/tools/gaia_simulator/runner.py +539 -0
- package/tools/gaia_simulator/skills_mapper.py +264 -0
- package/tools/memory/README.md +0 -0
- package/tools/memory/__init__.py +20 -0
- package/tools/memory/backfill_fts5.py +107 -0
- package/tools/memory/conflict_detector.py +295 -0
- package/tools/memory/episodic.py +1210 -0
- package/tools/memory/git_invalidator.py +262 -0
- package/tools/memory/paths.py +102 -0
- package/tools/memory/scoring.py +193 -0
- package/tools/memory/search_store.py +375 -0
- package/tools/persist_transcript_analysis.py +85 -0
- package/tools/review/__init__.py +1 -0
- package/tools/review/review_engine.py +157 -0
- package/tools/scan/__init__.py +35 -0
- package/tools/scan/config.py +247 -0
- package/tools/scan/merge.py +212 -0
- package/tools/scan/orchestrator.py +549 -0
- package/tools/scan/registry.py +127 -0
- package/tools/scan/scanners/__init__.py +18 -0
- package/tools/scan/scanners/base.py +137 -0
- package/tools/scan/scanners/environment.py +349 -0
- package/tools/scan/scanners/git.py +570 -0
- package/tools/scan/scanners/infrastructure.py +875 -0
- package/tools/scan/scanners/orchestration.py +600 -0
- package/tools/scan/scanners/stack.py +1085 -0
- package/tools/scan/scanners/tools.py +260 -0
- package/tools/scan/setup.py +686 -0
- package/tools/scan/tests/__init__.py +1 -0
- package/tools/scan/tests/conftest.py +796 -0
- package/tools/scan/tests/test_environment.py +323 -0
- package/tools/scan/tests/test_git.py +419 -0
- package/tools/scan/tests/test_infrastructure.py +382 -0
- package/tools/scan/tests/test_integration.py +920 -0
- package/tools/scan/tests/test_merge.py +269 -0
- package/tools/scan/tests/test_orchestration.py +304 -0
- package/tools/scan/tests/test_stack.py +604 -0
- package/tools/scan/tests/test_tools.py +349 -0
- package/tools/scan/ui.py +624 -0
- package/tools/scan/verify.py +270 -0
- package/tools/scan/walk.py +118 -0
- package/tools/scan/workspace.py +85 -0
- package/tools/validation/README.md +244 -0
- package/tools/validation/__init__.py +17 -0
- package/tools/validation/approval_gate.py +321 -0
- package/tools/validation/validate_skills.py +189 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Orchestrator delegate mode enforcement.
|
|
2
|
+
|
|
3
|
+
When GAIA is installed, delegate mode is always active. The orchestrator
|
|
4
|
+
(main session) is restricted to dispatch-only tools. Direct investigation
|
|
5
|
+
tools (Bash, Read, Edit, etc.) are blocked so the orchestrator must
|
|
6
|
+
delegate to specialist agents.
|
|
7
|
+
|
|
8
|
+
Detection: Claude Code includes ``agent_id`` and ``agent_type`` in the
|
|
9
|
+
PreToolUse payload ONLY when the hook fires inside a subagent. Their absence
|
|
10
|
+
means the call originates from the main session (orchestrator).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from typing import Any, Dict, Optional
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
# Tools the orchestrator is allowed to use in delegate mode.
|
|
22
|
+
# Everything NOT in this set is blocked for the main session.
|
|
23
|
+
ORCHESTRATOR_ALLOWED_TOOLS = frozenset({
|
|
24
|
+
# Dispatch and communication
|
|
25
|
+
"agent",
|
|
26
|
+
"task",
|
|
27
|
+
"sendmessage",
|
|
28
|
+
|
|
29
|
+
# On-demand skills / procedures
|
|
30
|
+
"skill",
|
|
31
|
+
|
|
32
|
+
# Agent teams task management
|
|
33
|
+
"taskcreate",
|
|
34
|
+
"taskupdate",
|
|
35
|
+
"tasklist",
|
|
36
|
+
"taskget",
|
|
37
|
+
|
|
38
|
+
# Tool discovery
|
|
39
|
+
"toolsearch",
|
|
40
|
+
|
|
41
|
+
# Web research (read-only, T0)
|
|
42
|
+
"websearch",
|
|
43
|
+
"webfetch",
|
|
44
|
+
|
|
45
|
+
# User interaction (built-in, may not always trigger hooks)
|
|
46
|
+
"askuserquestion",
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass(frozen=True)
|
|
51
|
+
class DelegateModeResult:
|
|
52
|
+
"""Result of delegate mode check."""
|
|
53
|
+
|
|
54
|
+
blocked: bool
|
|
55
|
+
reason: Optional[str] = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def is_orchestrator_context(hook_payload: Dict[str, Any]) -> bool:
|
|
59
|
+
"""Determine if the hook is firing in the main session (orchestrator).
|
|
60
|
+
|
|
61
|
+
Claude Code includes ``agent_id`` in the PreToolUse payload only when
|
|
62
|
+
the tool call originates from a subagent. Its absence means the call
|
|
63
|
+
is from the main session.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
hook_payload: The full stdin JSON dict from Claude Code.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
True if this is the orchestrator (main session), False if subagent.
|
|
70
|
+
"""
|
|
71
|
+
agent_id = hook_payload.get("agent_id")
|
|
72
|
+
# agent_id is absent or empty string for the main session
|
|
73
|
+
return not agent_id
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def check_delegate_mode(
|
|
77
|
+
tool_name: str, hook_payload: Dict[str, Any]
|
|
78
|
+
) -> DelegateModeResult:
|
|
79
|
+
"""Check whether a tool call should be blocked by delegate mode.
|
|
80
|
+
|
|
81
|
+
This is the single entry point. Call it early in the PreToolUse flow.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
tool_name: The tool being invoked (e.g., "Bash", "Read", "Edit").
|
|
85
|
+
hook_payload: The full stdin JSON dict from Claude Code.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
DelegateModeResult with blocked=True and a reason if the call
|
|
89
|
+
should be denied, or blocked=False if it should proceed.
|
|
90
|
+
"""
|
|
91
|
+
is_orchestrator = is_orchestrator_context(hook_payload)
|
|
92
|
+
if not is_orchestrator:
|
|
93
|
+
# Subagents have full tool access -- delegate mode does not apply
|
|
94
|
+
agent_id = hook_payload.get("agent_id", "<none>")
|
|
95
|
+
logger.debug(
|
|
96
|
+
"delegate_mode check: SKIP (subagent %s) tool=%s",
|
|
97
|
+
agent_id,
|
|
98
|
+
tool_name,
|
|
99
|
+
)
|
|
100
|
+
return DelegateModeResult(blocked=False)
|
|
101
|
+
|
|
102
|
+
normalized = tool_name.lower().strip()
|
|
103
|
+
if normalized in ORCHESTRATOR_ALLOWED_TOOLS:
|
|
104
|
+
logger.debug(
|
|
105
|
+
"delegate_mode check: ALLOW (orchestrator allowed tool) tool=%s",
|
|
106
|
+
tool_name,
|
|
107
|
+
)
|
|
108
|
+
return DelegateModeResult(blocked=False)
|
|
109
|
+
|
|
110
|
+
logger.warning(
|
|
111
|
+
"DELEGATE_MODE blocked tool '%s' for orchestrator (main session)",
|
|
112
|
+
tool_name,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return DelegateModeResult(
|
|
116
|
+
blocked=True,
|
|
117
|
+
reason=(
|
|
118
|
+
f"DELEGATION REQUIRED: '{tool_name}' is not available.\n"
|
|
119
|
+
f"Dispatch a specialist agent for this task.\n"
|
|
120
|
+
f"The routing recommendation in your last message indicates which agent to use."
|
|
121
|
+
),
|
|
122
|
+
)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Lightweight scan trigger for SessionStart hook.
|
|
3
|
+
|
|
4
|
+
Runs a subset of project scanners (e.g., tools + environment) to refresh
|
|
5
|
+
project-context.json without significant startup delay (<3s target).
|
|
6
|
+
|
|
7
|
+
Uses the scan engine directly (in-process) — no dependency on bin/gaia-scan.py.
|
|
8
|
+
Works in both npm and plugin mode since tools/scan/ is always available.
|
|
9
|
+
|
|
10
|
+
Public API:
|
|
11
|
+
- trigger_lightweight_scan(project_root: Path, scanners: list) -> bool
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
import sys
|
|
16
|
+
import time
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import List
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def trigger_lightweight_scan(
|
|
24
|
+
project_root: Path,
|
|
25
|
+
scanners: List[str] = None,
|
|
26
|
+
) -> bool:
|
|
27
|
+
"""Run a lightweight scan using the scan engine directly.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
project_root: Working directory for the scan.
|
|
31
|
+
scanners: List of scanner names to run. Defaults to
|
|
32
|
+
["tools", "environment"].
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
True on success, False on failure. Designed to complete in <3s.
|
|
36
|
+
"""
|
|
37
|
+
if scanners is None:
|
|
38
|
+
scanners = ["tools", "environment"]
|
|
39
|
+
|
|
40
|
+
# Ensure tools.scan is importable by adding plugin root to sys.path
|
|
41
|
+
hooks_dir = Path(__file__).resolve().parents[2] # hooks/
|
|
42
|
+
plugin_root = hooks_dir.parent
|
|
43
|
+
if str(plugin_root) not in sys.path:
|
|
44
|
+
sys.path.insert(0, str(plugin_root))
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
from tools.scan.config import ScanConfig
|
|
48
|
+
from tools.scan.orchestrator import ScanOrchestrator
|
|
49
|
+
from tools.scan.registry import ScannerRegistry
|
|
50
|
+
except ImportError as e:
|
|
51
|
+
logger.warning("Cannot import scan engine: %s", e)
|
|
52
|
+
return False
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
start = time.monotonic()
|
|
56
|
+
|
|
57
|
+
config = ScanConfig(
|
|
58
|
+
scanners=scanners,
|
|
59
|
+
project_root=project_root,
|
|
60
|
+
)
|
|
61
|
+
registry = ScannerRegistry()
|
|
62
|
+
orchestrator = ScanOrchestrator(registry=registry, config=config)
|
|
63
|
+
output = orchestrator.run(project_root=project_root)
|
|
64
|
+
elapsed = time.monotonic() - start
|
|
65
|
+
|
|
66
|
+
if output.errors:
|
|
67
|
+
logger.warning(
|
|
68
|
+
"Lightweight scan completed with errors in %.1fs: %s",
|
|
69
|
+
elapsed,
|
|
70
|
+
output.errors[:3],
|
|
71
|
+
)
|
|
72
|
+
return False
|
|
73
|
+
|
|
74
|
+
logger.info(
|
|
75
|
+
"Lightweight scan completed in %.1fs (scanners: %s, sections: %d)",
|
|
76
|
+
elapsed,
|
|
77
|
+
", ".join(scanners),
|
|
78
|
+
output.sections_updated,
|
|
79
|
+
)
|
|
80
|
+
return True
|
|
81
|
+
|
|
82
|
+
except Exception as e:
|
|
83
|
+
logger.warning("Failed to run lightweight scan: %s", e)
|
|
84
|
+
return False
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Security module - Security tiers, blocked patterns, mutative verb detection.
|
|
3
|
+
|
|
4
|
+
Provides:
|
|
5
|
+
- tiers: SecurityTier enum and classification
|
|
6
|
+
- blocked_commands: Permanently blocked pattern matching
|
|
7
|
+
- mutative_verbs: Mutative verb detection (user approval workflow)
|
|
8
|
+
- gitops_validator: kubectl/helm/flux validation
|
|
9
|
+
- approval_constants: Approval token patterns (legacy APPROVE: and ElicitationResult)
|
|
10
|
+
- approval_grants: Time-limited T3 command passthrough after user approval
|
|
11
|
+
- shell_unwrapper: Detect and strip wrapper shells for inner command classification
|
|
12
|
+
- flag_classifiers: Flag-dependent classifiers for 15 command families
|
|
13
|
+
- composition_rules: Cross-stage pipe composition rules (exfiltration, RCE, obfuscation)
|
|
14
|
+
- network_hosts: Network host classification for curl/wget/httpie targets
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from .tiers import SecurityTier, classify_command_tier
|
|
18
|
+
from .command_semantics import analyze_command, CommandSemantics
|
|
19
|
+
from .blocked_commands import (
|
|
20
|
+
is_blocked_command,
|
|
21
|
+
get_blocked_patterns,
|
|
22
|
+
BlockedCommandResult,
|
|
23
|
+
)
|
|
24
|
+
from .gitops_validator import validate_gitops_workflow, GitOpsValidationResult
|
|
25
|
+
from .mutative_verbs import (
|
|
26
|
+
CLI_FAMILY_LOOKUP,
|
|
27
|
+
CATEGORY_MUTATIVE,
|
|
28
|
+
CATEGORY_SIMULATION,
|
|
29
|
+
CATEGORY_READ_ONLY,
|
|
30
|
+
CATEGORY_UNKNOWN,
|
|
31
|
+
)
|
|
32
|
+
from .approval_constants import NONCE_APPROVAL_PATTERN, NONCE_APPROVAL_PREFIX
|
|
33
|
+
from .approval_messages import (
|
|
34
|
+
CANONICAL_APPROVAL_TOKEN,
|
|
35
|
+
CANONICAL_APPROVAL_TOKEN_FORMAT,
|
|
36
|
+
CANONICAL_APPROVAL_TOKEN_GUIDANCE,
|
|
37
|
+
CANONICAL_APPROVAL_FORMAT_GUIDANCE,
|
|
38
|
+
LATEST_BLOCKED_COMMAND_PHRASE,
|
|
39
|
+
)
|
|
40
|
+
from .approval_scopes import (
|
|
41
|
+
ApprovalSignature,
|
|
42
|
+
SCOPE_EXACT_COMMAND,
|
|
43
|
+
SCOPE_SEMANTIC_SIGNATURE,
|
|
44
|
+
build_approval_signature,
|
|
45
|
+
matches_approval_signature,
|
|
46
|
+
)
|
|
47
|
+
from .approval_grants import (
|
|
48
|
+
check_approval_grant,
|
|
49
|
+
cleanup_expired_grants,
|
|
50
|
+
get_latest_pending_approval,
|
|
51
|
+
last_check_found_expired,
|
|
52
|
+
ApprovalGrant,
|
|
53
|
+
)
|
|
54
|
+
from .shell_unwrapper import ShellUnwrapper
|
|
55
|
+
from .flag_classifiers import classify_by_flags, FlagClassifierResult
|
|
56
|
+
from .composition_rules import (
|
|
57
|
+
check_composition,
|
|
58
|
+
build_composition_stages,
|
|
59
|
+
CompositionResult,
|
|
60
|
+
CompositionStage,
|
|
61
|
+
CompositionDecision,
|
|
62
|
+
StageType,
|
|
63
|
+
)
|
|
64
|
+
from .network_hosts import classify_host, extract_url_from_tokens, HostClassification
|
|
65
|
+
|
|
66
|
+
__all__ = [
|
|
67
|
+
# Tiers
|
|
68
|
+
"SecurityTier",
|
|
69
|
+
"classify_command_tier",
|
|
70
|
+
"analyze_command",
|
|
71
|
+
"CommandSemantics",
|
|
72
|
+
# Blocked commands
|
|
73
|
+
"is_blocked_command",
|
|
74
|
+
"get_blocked_patterns",
|
|
75
|
+
"BlockedCommandResult",
|
|
76
|
+
# GitOps
|
|
77
|
+
"validate_gitops_workflow",
|
|
78
|
+
"GitOpsValidationResult",
|
|
79
|
+
# Mutative verbs
|
|
80
|
+
"CLI_FAMILY_LOOKUP",
|
|
81
|
+
"CATEGORY_MUTATIVE",
|
|
82
|
+
"CATEGORY_SIMULATION",
|
|
83
|
+
"CATEGORY_READ_ONLY",
|
|
84
|
+
"CATEGORY_UNKNOWN",
|
|
85
|
+
# Approval
|
|
86
|
+
"NONCE_APPROVAL_PREFIX",
|
|
87
|
+
"NONCE_APPROVAL_PATTERN",
|
|
88
|
+
"CANONICAL_APPROVAL_TOKEN",
|
|
89
|
+
"CANONICAL_APPROVAL_TOKEN_FORMAT",
|
|
90
|
+
"CANONICAL_APPROVAL_TOKEN_GUIDANCE",
|
|
91
|
+
"CANONICAL_APPROVAL_FORMAT_GUIDANCE",
|
|
92
|
+
"LATEST_BLOCKED_COMMAND_PHRASE",
|
|
93
|
+
"ApprovalSignature",
|
|
94
|
+
"SCOPE_EXACT_COMMAND",
|
|
95
|
+
"SCOPE_SEMANTIC_SIGNATURE",
|
|
96
|
+
"build_approval_signature",
|
|
97
|
+
"matches_approval_signature",
|
|
98
|
+
# Approval Grants
|
|
99
|
+
"check_approval_grant",
|
|
100
|
+
"cleanup_expired_grants",
|
|
101
|
+
"get_latest_pending_approval",
|
|
102
|
+
"last_check_found_expired",
|
|
103
|
+
"ApprovalGrant",
|
|
104
|
+
# Shell unwrapper
|
|
105
|
+
"ShellUnwrapper",
|
|
106
|
+
# Flag classifiers
|
|
107
|
+
"classify_by_flags",
|
|
108
|
+
"FlagClassifierResult",
|
|
109
|
+
# Composition rules
|
|
110
|
+
"check_composition",
|
|
111
|
+
"build_composition_stages",
|
|
112
|
+
"CompositionResult",
|
|
113
|
+
"CompositionStage",
|
|
114
|
+
"CompositionDecision",
|
|
115
|
+
"StageType",
|
|
116
|
+
# Network hosts
|
|
117
|
+
"classify_host",
|
|
118
|
+
"extract_url_from_tokens",
|
|
119
|
+
"HostClassification",
|
|
120
|
+
]
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Approval file cleanup for the subagent stop hook.
|
|
3
|
+
|
|
4
|
+
Cleans up pending approval files after an agent completes, using the current
|
|
5
|
+
per-nonce file layout under .claude/cache/approvals/pending-{nonce}.json.
|
|
6
|
+
|
|
7
|
+
Provides:
|
|
8
|
+
- cleanup(): Delete pending approval files that match agent session
|
|
9
|
+
- consume_approval_file(): Backward-compatible alias for cleanup()
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import logging
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from ..core.paths import find_claude_dir
|
|
18
|
+
from ..core.state import get_session_id
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _get_approvals_dir() -> Path:
|
|
24
|
+
"""Return the approvals cache directory."""
|
|
25
|
+
return find_claude_dir() / "cache" / "approvals"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def cleanup(agent_type: str, session_id: Optional[str] = None) -> bool:
|
|
29
|
+
"""
|
|
30
|
+
Delete pending-{nonce}.json files for the current session after agent completion.
|
|
31
|
+
|
|
32
|
+
Scans .claude/cache/approvals/ for pending files scoped to the current
|
|
33
|
+
session and removes them, preventing stale pending approvals from
|
|
34
|
+
accumulating after the agent run finishes.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
agent_type: The agent type that just completed (for logging).
|
|
38
|
+
session_id: Session ID to scope cleanup (defaults to CLAUDE_SESSION_ID).
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
True if any pending approval files were consumed, False otherwise.
|
|
42
|
+
"""
|
|
43
|
+
if session_id is None:
|
|
44
|
+
session_id = get_session_id()
|
|
45
|
+
|
|
46
|
+
approvals_dir = _get_approvals_dir()
|
|
47
|
+
if not approvals_dir.exists():
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
consumed = False
|
|
51
|
+
try:
|
|
52
|
+
for pending_file in approvals_dir.glob("pending-*.json"):
|
|
53
|
+
# Skip the per-session index files
|
|
54
|
+
if pending_file.name.startswith("pending-index-"):
|
|
55
|
+
continue
|
|
56
|
+
try:
|
|
57
|
+
data = json.loads(pending_file.read_text())
|
|
58
|
+
if data.get("session_id") != session_id:
|
|
59
|
+
continue
|
|
60
|
+
|
|
61
|
+
pending_file.unlink(missing_ok=True)
|
|
62
|
+
logger.info(
|
|
63
|
+
"Consumed pending approval for agent '%s' "
|
|
64
|
+
"(nonce: %s, command: %s)",
|
|
65
|
+
agent_type,
|
|
66
|
+
data.get("nonce", "unknown"),
|
|
67
|
+
data.get("command", "unknown"),
|
|
68
|
+
)
|
|
69
|
+
consumed = True
|
|
70
|
+
|
|
71
|
+
except (json.JSONDecodeError, TypeError):
|
|
72
|
+
# Corrupt file -- remove it
|
|
73
|
+
pending_file.unlink(missing_ok=True)
|
|
74
|
+
consumed = True
|
|
75
|
+
except Exception as e:
|
|
76
|
+
logger.debug(
|
|
77
|
+
"Failed to process pending file %s (non-fatal): %s",
|
|
78
|
+
pending_file.name, e,
|
|
79
|
+
)
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.debug("Failed to scan approvals dir (non-fatal): %s", e)
|
|
82
|
+
|
|
83
|
+
return consumed
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# Backward-compatible alias
|
|
87
|
+
consume_approval_file = cleanup
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Approval token patterns and deprecated approval phrases for T3 operation resumes.
|
|
2
|
+
|
|
3
|
+
The APPROVE: prefix is a legacy path (SendMessage-based nonce relay). The primary
|
|
4
|
+
approval flow now uses ElicitationResult (AskUserQuestion -> user clicks Approve).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
|
|
9
|
+
NONCE_APPROVAL_PREFIX = "APPROVE:"
|
|
10
|
+
NONCE_APPROVAL_PATTERN = re.compile(r"\bAPPROVE:([a-f0-9]{32})\b")
|
|
11
|
+
|
|
12
|
+
# Deprecated approval phrases that agents should not use.
|
|
13
|
+
# Moved here from pre_tool_use.py so all approval-related constants live together.
|
|
14
|
+
DEPRECATED_APPROVAL_PHRASES = (
|
|
15
|
+
"user approved:",
|
|
16
|
+
"user approval received",
|
|
17
|
+
"approved by user",
|
|
18
|
+
"approval confirmed",
|
|
19
|
+
"approved. execute",
|
|
20
|
+
"approved, execute",
|
|
21
|
+
"proceed with execution",
|
|
22
|
+
"confirmed. proceed",
|
|
23
|
+
)
|