@jaguilar87/gaia-ops 4.4.0 → 4.7.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 +1 -1
- package/.claude-plugin/plugin.json +12 -3
- package/ARCHITECTURE.md +9 -8
- package/CHANGELOG.md +34 -0
- package/README.md +43 -11
- package/agents/terraform-architect.md +1 -1
- package/bin/README.md +2 -2
- package/bin/gaia-doctor.js +18 -5
- package/bin/gaia-history.js +0 -1
- package/bin/gaia-metrics.js +2 -2
- package/bin/gaia-scan.py +23 -1
- package/bin/gaia-update.js +346 -54
- package/bin/pre-publish-validate.js +33 -10
- package/commands/gaia.md +37 -0
- package/config/README.md +3 -9
- package/config/context-contracts.json +47 -15
- package/config/surface-routing.json +9 -1
- package/dist/gaia-ops/.claude-plugin/plugin.json +22 -0
- package/dist/gaia-ops/agents/cloud-troubleshooter.md +73 -0
- package/dist/gaia-ops/agents/devops-developer.md +57 -0
- package/dist/gaia-ops/agents/gaia-system.md +58 -0
- package/dist/gaia-ops/agents/gitops-operator.md +60 -0
- package/dist/gaia-ops/agents/speckit-planner.md +71 -0
- package/dist/gaia-ops/agents/terraform-architect.md +60 -0
- package/dist/gaia-ops/commands/gaia.md +37 -0
- package/dist/gaia-ops/config/README.md +58 -0
- package/dist/gaia-ops/config/cloud/aws.json +140 -0
- package/dist/gaia-ops/config/cloud/gcp.json +145 -0
- package/dist/gaia-ops/config/context-contracts.json +131 -0
- package/dist/gaia-ops/config/git_standards.json +72 -0
- package/dist/gaia-ops/config/surface-routing.json +197 -0
- package/dist/gaia-ops/config/universal-rules.json +10 -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 +1477 -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 +126 -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 +124 -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 +576 -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/anchor_tracker.py +317 -0
- package/dist/gaia-ops/hooks/modules/context/compact_context_builder.py +215 -0
- package/dist/gaia-ops/hooks/modules/context/context_cache.py +129 -0
- package/dist/gaia-ops/hooks/modules/context/context_freshness.py +145 -0
- package/dist/gaia-ops/hooks/modules/context/context_injector.py +427 -0
- package/dist/gaia-ops/hooks/modules/context/context_writer.py +518 -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 +558 -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/identity/__init__.py +0 -0
- package/dist/gaia-ops/hooks/modules/identity/identity_provider.py +21 -0
- package/dist/gaia-ops/hooks/modules/identity/ops_identity.py +34 -0
- package/dist/gaia-ops/hooks/modules/identity/security_identity.py +10 -0
- package/dist/gaia-ops/hooks/modules/memory/__init__.py +8 -0
- package/dist/gaia-ops/hooks/modules/memory/episode_writer.py +227 -0
- package/dist/gaia-ops/hooks/modules/orchestrator/__init__.py +1 -0
- package/dist/gaia-ops/hooks/modules/orchestrator/delegate_mode.py +128 -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 +89 -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 +912 -0
- package/dist/gaia-ops/hooks/modules/security/approval_messages.py +71 -0
- package/dist/gaia-ops/hooks/modules/security/approval_scopes.py +153 -0
- package/dist/gaia-ops/hooks/modules/security/blocked_commands.py +584 -0
- package/dist/gaia-ops/hooks/modules/security/blocked_message_formatter.py +86 -0
- package/dist/gaia-ops/hooks/modules/security/command_semantics.py +130 -0
- package/dist/gaia-ops/hooks/modules/security/gitops_validator.py +179 -0
- package/dist/gaia-ops/hooks/modules/security/mutative_verbs.py +850 -0
- package/dist/gaia-ops/hooks/modules/security/prompt_validator.py +40 -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/session_context_writer.py +100 -0
- package/dist/gaia-ops/hooks/modules/session/session_event_injector.py +158 -0
- package/dist/gaia-ops/hooks/modules/session/session_manager.py +31 -0
- package/dist/gaia-ops/hooks/modules/tools/__init__.py +25 -0
- package/dist/gaia-ops/hooks/modules/tools/bash_validator.py +708 -0
- package/dist/gaia-ops/hooks/modules/tools/cloud_pipe_validator.py +181 -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/task_validator.py +283 -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_tool_use.py +383 -0
- package/dist/gaia-ops/hooks/session_start.py +69 -0
- package/dist/gaia-ops/hooks/stop_hook.py +69 -0
- package/dist/gaia-ops/hooks/subagent_start.py +71 -0
- package/dist/gaia-ops/hooks/subagent_stop.py +288 -0
- package/dist/gaia-ops/hooks/task_completed.py +70 -0
- package/dist/gaia-ops/hooks/user_prompt_submit.py +177 -0
- package/dist/gaia-ops/settings.json +72 -0
- package/dist/gaia-ops/skills/README.md +109 -0
- package/dist/gaia-ops/skills/agent-protocol/SKILL.md +105 -0
- package/dist/gaia-ops/skills/agent-protocol/examples.md +170 -0
- package/dist/gaia-ops/skills/agent-response/SKILL.md +53 -0
- package/dist/gaia-ops/skills/approval/SKILL.md +85 -0
- package/dist/gaia-ops/skills/approval/examples.md +140 -0
- package/dist/gaia-ops/skills/approval/reference.md +57 -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 +76 -0
- package/dist/gaia-ops/skills/context-updater/examples.md +71 -0
- package/dist/gaia-ops/skills/developer-patterns/SKILL.md +93 -0
- package/dist/gaia-ops/skills/developer-patterns/reference.md +112 -0
- package/dist/gaia-ops/skills/execution/SKILL.md +66 -0
- package/dist/gaia-ops/skills/fast-queries/SKILL.md +47 -0
- package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +92 -0
- package/dist/gaia-ops/skills/gaia-patterns/reference.md +22 -0
- package/dist/gaia-ops/skills/git-conventions/SKILL.md +48 -0
- package/dist/gaia-ops/skills/gitops-patterns/SKILL.md +73 -0
- package/dist/gaia-ops/skills/gitops-patterns/reference.md +183 -0
- package/dist/gaia-ops/skills/investigation/SKILL.md +77 -0
- package/dist/gaia-ops/skills/orchestrator-approval/SKILL.md +64 -0
- package/dist/gaia-ops/skills/reference.md +134 -0
- package/dist/gaia-ops/skills/security-tiers/SKILL.md +61 -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/skill-creation/SKILL.md +119 -0
- package/dist/gaia-ops/skills/specification/SKILL.md +186 -0
- package/dist/gaia-ops/skills/speckit-workflow/SKILL.md +165 -0
- package/dist/gaia-ops/skills/speckit-workflow/reference.md +117 -0
- package/dist/gaia-ops/skills/terraform-patterns/SKILL.md +63 -0
- package/dist/gaia-ops/skills/terraform-patterns/reference.md +93 -0
- package/dist/gaia-ops/speckit/README.md +516 -0
- package/dist/gaia-ops/speckit/scripts/.gitkeep +0 -0
- package/dist/gaia-ops/speckit/templates/adr-template.md +118 -0
- package/dist/gaia-ops/speckit/templates/agent-file-template.md +23 -0
- package/dist/gaia-ops/speckit/templates/plan-template.md +227 -0
- package/dist/gaia-ops/speckit/templates/spec-template.md +140 -0
- package/dist/gaia-ops/speckit/templates/tasks-template.md +257 -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 +476 -0
- package/dist/gaia-ops/tools/context/context_section_reader.py +330 -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 +262 -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/episodic.py +1196 -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 +324 -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 +753 -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 +266 -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 +22 -0
- package/dist/gaia-security/config/universal-rules.json +10 -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 +1477 -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 +57 -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 +124 -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 +576 -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/anchor_tracker.py +317 -0
- package/dist/gaia-security/hooks/modules/context/compact_context_builder.py +215 -0
- package/dist/gaia-security/hooks/modules/context/context_cache.py +129 -0
- package/dist/gaia-security/hooks/modules/context/context_freshness.py +145 -0
- package/dist/gaia-security/hooks/modules/context/context_injector.py +427 -0
- package/dist/gaia-security/hooks/modules/context/context_writer.py +518 -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 +558 -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/identity/__init__.py +0 -0
- package/dist/gaia-security/hooks/modules/identity/identity_provider.py +21 -0
- package/dist/gaia-security/hooks/modules/identity/ops_identity.py +34 -0
- package/dist/gaia-security/hooks/modules/identity/security_identity.py +10 -0
- package/dist/gaia-security/hooks/modules/memory/__init__.py +8 -0
- package/dist/gaia-security/hooks/modules/memory/episode_writer.py +227 -0
- package/dist/gaia-security/hooks/modules/orchestrator/__init__.py +1 -0
- package/dist/gaia-security/hooks/modules/orchestrator/delegate_mode.py +128 -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 +89 -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 +912 -0
- package/dist/gaia-security/hooks/modules/security/approval_messages.py +71 -0
- package/dist/gaia-security/hooks/modules/security/approval_scopes.py +153 -0
- package/dist/gaia-security/hooks/modules/security/blocked_commands.py +584 -0
- package/dist/gaia-security/hooks/modules/security/blocked_message_formatter.py +86 -0
- package/dist/gaia-security/hooks/modules/security/command_semantics.py +130 -0
- package/dist/gaia-security/hooks/modules/security/gitops_validator.py +179 -0
- package/dist/gaia-security/hooks/modules/security/mutative_verbs.py +850 -0
- package/dist/gaia-security/hooks/modules/security/prompt_validator.py +40 -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/session_context_writer.py +100 -0
- package/dist/gaia-security/hooks/modules/session/session_event_injector.py +158 -0
- package/dist/gaia-security/hooks/modules/session/session_manager.py +31 -0
- package/dist/gaia-security/hooks/modules/tools/__init__.py +25 -0
- package/dist/gaia-security/hooks/modules/tools/bash_validator.py +708 -0
- package/dist/gaia-security/hooks/modules/tools/cloud_pipe_validator.py +181 -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/task_validator.py +283 -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 +383 -0
- package/dist/gaia-security/hooks/session_start.py +69 -0
- package/dist/gaia-security/hooks/stop_hook.py +69 -0
- package/dist/gaia-security/hooks/user_prompt_submit.py +177 -0
- package/dist/gaia-security/settings.json +58 -0
- package/git-hooks/commit-msg +41 -0
- package/hooks/README.md +8 -6
- package/hooks/adapters/channel.py +0 -25
- package/hooks/adapters/claude_code.py +364 -125
- package/hooks/elicitation_result.py +132 -0
- package/hooks/hooks.json +10 -1
- package/hooks/modules/README.md +3 -2
- package/hooks/modules/agents/contract_validator.py +3 -51
- package/hooks/modules/agents/response_contract.py +4 -8
- package/hooks/modules/agents/transcript_reader.py +4 -5
- package/hooks/modules/audit/__init__.py +4 -6
- package/hooks/modules/audit/event_detector.py +0 -2
- package/hooks/modules/audit/metrics.py +108 -187
- package/hooks/modules/audit/workflow_auditor.py +0 -4
- package/hooks/modules/audit/workflow_recorder.py +0 -5
- package/hooks/modules/context/compact_context_builder.py +1 -0
- package/hooks/modules/context/context_cache.py +129 -0
- package/hooks/modules/context/context_injector.py +18 -40
- package/hooks/modules/context/context_writer.py +1 -25
- package/hooks/modules/context/contracts_loader.py +7 -10
- package/hooks/modules/core/hook_entry.py +1 -0
- package/hooks/modules/core/paths.py +12 -13
- package/hooks/modules/core/plugin_mode.py +74 -4
- package/hooks/modules/core/plugin_setup.py +395 -23
- package/hooks/modules/events/__init__.py +1 -0
- package/hooks/modules/events/event_writer.py +210 -0
- package/hooks/modules/identity/ops_identity.py +18 -27
- package/hooks/modules/memory/episode_writer.py +1 -6
- package/hooks/modules/orchestrator/__init__.py +1 -0
- package/hooks/modules/orchestrator/delegate_mode.py +128 -0
- package/hooks/modules/security/__init__.py +2 -4
- package/hooks/modules/security/approval_constants.py +5 -1
- package/hooks/modules/security/approval_grants.py +189 -6
- package/hooks/modules/security/approval_messages.py +9 -21
- package/hooks/modules/security/blocked_commands.py +98 -34
- package/hooks/modules/security/command_semantics.py +0 -4
- package/hooks/modules/security/gitops_validator.py +1 -11
- package/hooks/modules/security/mutative_verbs.py +179 -38
- package/hooks/modules/security/tiers.py +1 -19
- package/hooks/modules/session/session_event_injector.py +1 -25
- package/hooks/modules/tools/bash_validator.py +310 -94
- package/hooks/modules/tools/shell_parser.py +0 -1
- package/hooks/modules/tools/task_validator.py +9 -29
- package/hooks/post_tool_use.py +0 -72
- package/hooks/pre_tool_use.py +42 -102
- package/hooks/session_start.py +4 -2
- package/hooks/subagent_start.py +6 -2
- package/hooks/subagent_stop.py +1 -13
- package/hooks/user_prompt_submit.py +119 -37
- package/index.js +1 -1
- package/package.json +5 -3
- package/skills/README.md +3 -5
- package/skills/agent-protocol/SKILL.md +17 -16
- package/skills/agent-protocol/examples.md +6 -6
- package/skills/agent-response/SKILL.md +11 -14
- package/skills/approval/SKILL.md +28 -13
- package/skills/approval/reference.md +2 -2
- package/skills/execution/SKILL.md +1 -1
- package/skills/gaia-patterns/SKILL.md +2 -3
- package/skills/orchestrator-approval/SKILL.md +22 -50
- package/skills/security-tiers/SKILL.md +1 -1
- package/templates/README.md +9 -9
- package/templates/managed-settings.template.json +43 -0
- package/tools/gaia_simulator/runner.py +34 -1
- package/tools/scan/orchestrator.py +13 -0
- package/tools/scan/scanners/base.py +8 -0
- package/tools/scan/scanners/git.py +78 -0
- package/tools/scan/scanners/infrastructure.py +65 -0
- package/tools/scan/scanners/stack.py +110 -0
- package/tools/scan/setup.py +120 -13
- package/tools/scan/workspace.py +85 -0
- package/config/context-contracts.aws.json +0 -42
- package/config/context-contracts.gcp.json +0 -39
- package/skills/project-dispatch/SKILL.md +0 -34
- package/templates/settings.template.json +0 -226
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Approval Plan Template
|
|
2
|
+
|
|
3
|
+
Use this template when presenting a T3 plan for user approval.
|
|
4
|
+
The fields below map directly to the `approval_request` object in your `json:contract` block.
|
|
5
|
+
|
|
6
|
+
```markdown
|
|
7
|
+
## Deployment Plan
|
|
8
|
+
|
|
9
|
+
### Summary (3-5 bullets)
|
|
10
|
+
- What will be changed
|
|
11
|
+
- Why this change is needed
|
|
12
|
+
- What the expected outcome is
|
|
13
|
+
|
|
14
|
+
### Changes Proposed
|
|
15
|
+
|
|
16
|
+
**Resources to CREATE:**
|
|
17
|
+
- [Resource]: [Description]
|
|
18
|
+
|
|
19
|
+
**Resources to MODIFY:**
|
|
20
|
+
- [Resource]: [What changes] (before -> after)
|
|
21
|
+
|
|
22
|
+
**Resources to DELETE:**
|
|
23
|
+
- [Resource]: [Why deletion]
|
|
24
|
+
|
|
25
|
+
### Validation Results
|
|
26
|
+
|
|
27
|
+
**Dry-run status:**
|
|
28
|
+
- `[simulation command]` - [result summary]
|
|
29
|
+
|
|
30
|
+
**Dependencies verified:**
|
|
31
|
+
- [Dependency]: Available
|
|
32
|
+
|
|
33
|
+
### approval_request fields
|
|
34
|
+
|
|
35
|
+
These 6 fields MUST appear in the `approval_request` object of your `json:contract`:
|
|
36
|
+
|
|
37
|
+
| Field | Example value |
|
|
38
|
+
|-------|---------------|
|
|
39
|
+
| `operation` | `"apply Terraform changes to dev VPC"` |
|
|
40
|
+
| `exact_content` | `"terraform -chdir=/infra/dev apply -auto-approve"` |
|
|
41
|
+
| `scope` | `"infra/dev/vpc.tf, infra/dev/subnets.tf -- dev environment only"` |
|
|
42
|
+
| `risk_level` | `"MEDIUM"` |
|
|
43
|
+
| `rollback` | `"terraform -chdir=/infra/dev apply -target=module.vpc -var='cidr=10.0.0.0/16'"` |
|
|
44
|
+
| `verification` | `"terraform -chdir=/infra/dev output vpc_id -- expect vpc-xxx"` |
|
|
45
|
+
|
|
46
|
+
When a hook blocked the command, also include:
|
|
47
|
+
| Field | Example value |
|
|
48
|
+
|-------|---------------|
|
|
49
|
+
| `approval_id` | `"a1b2c3d4e5f6..."` (hex from hook deny response) |
|
|
50
|
+
|
|
51
|
+
### Files Affected
|
|
52
|
+
|
|
53
|
+
**Git changes:**
|
|
54
|
+
- Modified: [files]
|
|
55
|
+
- Added: [files]
|
|
56
|
+
- Deleted: [files]
|
|
57
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: command-execution
|
|
3
|
+
description: Use when executing any bash command, CLI tool, or shell operation
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: discipline
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Command Execution
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
ONE COMMAND. ONE RESULT. ONE EXIT CODE.
|
|
13
|
+
NO PIPES. NO CHAINS. NO REDIRECTS.
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Mental Model
|
|
17
|
+
|
|
18
|
+
When you reach for a pipe, you have not looked for the flag yet.
|
|
19
|
+
CLIs have `--format`, `--filter`, `--limit` flags that do what pipes
|
|
20
|
+
do — without hiding exit codes or triggering extra permission prompts.
|
|
21
|
+
|
|
22
|
+
When you want to chain with `&&`, stop. Run one command, verify the
|
|
23
|
+
exit code, then run the next. Two verified commands beat one fragile chain.
|
|
24
|
+
|
|
25
|
+
For file I/O, always use Claude Code tools over Bash:
|
|
26
|
+
|
|
27
|
+
| Bash | Claude Code tool |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `cat`, `head`, `tail` | Read |
|
|
30
|
+
| `echo >`, heredocs | Write |
|
|
31
|
+
| `sed -i`, `awk` | Edit |
|
|
32
|
+
| `grep -r`, `rg` | Grep |
|
|
33
|
+
| `find` | Glob |
|
|
34
|
+
|
|
35
|
+
## Rules
|
|
36
|
+
|
|
37
|
+
1. **No pipes** — find the CLI's native flag first.
|
|
38
|
+
2. **One command per step** — no `&&` or `;`.
|
|
39
|
+
3. **Tools over Bash** — for file I/O, always.
|
|
40
|
+
4. **Absolute paths** — working directory is not reliable.
|
|
41
|
+
5. **Quote variables** — always `"${VAR}"`.
|
|
42
|
+
|
|
43
|
+
## Traps
|
|
44
|
+
|
|
45
|
+
| If you're thinking... | The reality is... |
|
|
46
|
+
|---|---|
|
|
47
|
+
| "I'll pipe to grep/awk/jq to filter" | Find `--filter` or `--format` flag |
|
|
48
|
+
| "I'll chain with && for efficiency" | Run separately, verify each exit code |
|
|
49
|
+
| "Let me cat/head this file" | Use the Read tool |
|
|
50
|
+
| "Let me cd first, then run" | Use absolute path or `-chdir` |
|
|
51
|
+
| "I need jq to parse JSON" | Use `--format json` at source |
|
|
52
|
+
| "A heredoc is cleanest for multi-line" | Use Write tool. Heredocs fail in batch. |
|
|
53
|
+
| "This pipe is read-only, it's safe" | Pipes still hide exit codes |
|
|
54
|
+
|
|
55
|
+
**Exception:** `git commit -m "$(cat <<'EOF' ...)"` heredocs are allowed.
|
|
56
|
+
|
|
57
|
+
## Anti-Patterns
|
|
58
|
+
|
|
59
|
+
- `kubectl get pods | grep Error` → use `-l` label selectors or `--field-selector`
|
|
60
|
+
- `cd dir && terraform plan` → `terraform -chdir=/absolute/path plan`
|
|
61
|
+
- `cat file | wc -l` → Read tool
|
|
62
|
+
|
|
63
|
+
The `cloud_pipe_validator.py` hook enforces no-pipes at runtime.
|
|
64
|
+
For mutation rules and cloud CLI examples, see `reference.md`.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Command Execution -- Reference
|
|
2
|
+
|
|
3
|
+
Read on-demand by infrastructure agents. Not injected automatically.
|
|
4
|
+
|
|
5
|
+
## Timeouts
|
|
6
|
+
|
|
7
|
+
| Operation | Timeout |
|
|
8
|
+
|-----------|---------|
|
|
9
|
+
| Read / query | 30s |
|
|
10
|
+
| Validation (lint, fmt) | 30s |
|
|
11
|
+
| Simulation (plan, diff) | 300s |
|
|
12
|
+
| Realization (apply, deploy) | 600s |
|
|
13
|
+
| Flux reconcile | 90s |
|
|
14
|
+
|
|
15
|
+
Use tool-native timeout flag first (`--request-timeout=30s`), fall back to `timeout 30s <cmd>`. Unreachable -- report and abort.
|
|
16
|
+
|
|
17
|
+
## Rule 5: Validate Before Mutate
|
|
18
|
+
|
|
19
|
+
Mutations are irreversible. Always dry-run, then diff, then apply -- each a separate, atomic confirmation.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
kubectl apply -f manifest.yaml --dry-run=server
|
|
23
|
+
kubectl diff -f manifest.yaml
|
|
24
|
+
kubectl apply -f manifest.yaml
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Rule 6: Files Over Inline Data
|
|
28
|
+
|
|
29
|
+
Inline JSON/YAML/HCL creates shell quoting fragility. Write to a temp file, reference by path: `helm upgrade app chart -f /tmp/values.yaml` instead of `--set "config={key: value}"`.
|
|
30
|
+
|
|
31
|
+
## Cloud CLI Examples
|
|
32
|
+
|
|
33
|
+
### No Pipes (Rule 1)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# BAD: kubectl get pods -o json | jq '.items[0].metadata.name'
|
|
37
|
+
# GOOD: kubectl get pods -o jsonpath='{.items[0].metadata.name}'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### One Command Per Step (Rule 2)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# BAD: terraform init && terraform validate && terraform plan
|
|
44
|
+
# GOOD: run each separately, verify each exit code
|
|
45
|
+
terraform init
|
|
46
|
+
terraform validate
|
|
47
|
+
terraform plan -out=/tmp/tfplan
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Absolute Paths (Rule 4)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# BAD: cd ../../shared/vpc && terraform plan
|
|
54
|
+
# GOOD: terraform plan -chdir="/abs/path/to/terraform/shared/vpc"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Additional Red Flags (Mutation-Specific)
|
|
58
|
+
|
|
59
|
+
- *"It won't hang"* -- Timeouts: apply it anyway
|
|
60
|
+
- *"Dry-run passed, I can apply"* -- Rule 5: dry-run, then diff, then apply -- three required steps
|
|
61
|
+
- *"Simple value, I'll inline it"* -- Rule 6: write to temp file first
|
|
62
|
+
|
|
63
|
+
## Rationalization Table
|
|
64
|
+
|
|
65
|
+
Every excuse an agent makes for violating a rule, and why it is wrong.
|
|
66
|
+
|
|
67
|
+
| Rationalization | Reality | Rule |
|
|
68
|
+
|----------------|---------|------|
|
|
69
|
+
| "This command is fast, no timeout needed" | External systems hang for reasons unrelated to command complexity | Timeouts |
|
|
70
|
+
| "It's just to filter output, not a real pipe" | Pipes hide exit codes and split the atomic contract regardless of intent | 1 |
|
|
71
|
+
| "I need `grep` to find what I'm looking for" | `gcloud`/`kubectl` `--filter` finds it natively, without a subprocess | 1 |
|
|
72
|
+
| "These steps always run together, chaining is fine" | Each command needs its own exit code verification -- chaining loses that | 2 |
|
|
73
|
+
| "I need to persist the output for later analysis" | Use the Write tool -- redirects in bash break the hook's structured output | 3 |
|
|
74
|
+
| "It's faster to use `cat` than the Read tool" | Bash subprocesses lose structured output and create unnecessary permission prompts | 3 |
|
|
75
|
+
| "The relative path should work here" | Working directory is not reliable across tool calls -- it will break | 4 |
|
|
76
|
+
| "Dry-run passed so apply is safe" | dry-run and diff are separate validations -- skip either and you miss drift | 5 |
|
|
77
|
+
| "The inline value is simple enough" | Shell quoting breaks at spaces, special chars, and nested quotes -- always | 6 |
|
|
78
|
+
| "This variable definitely won't have spaces" | It will, eventually -- and when it does, it breaks silently and is hard to debug | 7 |
|
|
79
|
+
| "I need to search file contents with grep" | Use the Grep tool -- it handles permissions, output formatting, and never needs piping | 3 |
|
|
80
|
+
|
|
81
|
+
## Anti-Patterns
|
|
82
|
+
|
|
83
|
+
Pipe as shortcut. Chain as convenience. Redirect as persistence. `cd` before command. Inline complex data. Unquoted variables.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-updater
|
|
3
|
+
description: Use when investigation reveals data that is missing from or differs from project-context.json
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Context Updater Protocol
|
|
9
|
+
|
|
10
|
+
## When to Emit CONTEXT_UPDATE
|
|
11
|
+
|
|
12
|
+
Emit a `CONTEXT_UPDATE` block when ANY of these are true:
|
|
13
|
+
|
|
14
|
+
1. **Empty section** — A section you own exists but has no data
|
|
15
|
+
2. **Drift detected** — Discovered data differs from current section
|
|
16
|
+
3. **New resources found** — Resources not currently listed
|
|
17
|
+
4. **Pattern discovered** — Investigation revealed a pattern, structure, or config not yet captured (see `investigation` skill DOCUMENT rule)
|
|
18
|
+
|
|
19
|
+
Do NOT emit if findings match existing data exactly.
|
|
20
|
+
|
|
21
|
+
## Format
|
|
22
|
+
|
|
23
|
+
Place this block after analysis and before the `json:contract` block:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
CONTEXT_UPDATE:
|
|
27
|
+
{
|
|
28
|
+
"section_name": {
|
|
29
|
+
"key": "value"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Rules:**
|
|
35
|
+
- Must be valid JSON
|
|
36
|
+
- Section names must match your writable sections
|
|
37
|
+
- One block per response (combine all updates)
|
|
38
|
+
- Include only keys to add or update
|
|
39
|
+
|
|
40
|
+
## Merge Rules
|
|
41
|
+
|
|
42
|
+
| Operation | Behavior |
|
|
43
|
+
|-----------|----------|
|
|
44
|
+
| **ADD** | New keys inserted into the section |
|
|
45
|
+
| **MERGE** | Existing dicts recursively merged |
|
|
46
|
+
| **UNION** | Lists merged, no duplicates |
|
|
47
|
+
| **OVERWRITE** | Scalar values replaced |
|
|
48
|
+
| **NO-DELETE** | Keys you don't mention are preserved |
|
|
49
|
+
|
|
50
|
+
## Writable Sections Source of Truth
|
|
51
|
+
|
|
52
|
+
Do **not** memorize a static table from this skill.
|
|
53
|
+
Your write permissions are shown in the injected context under
|
|
54
|
+
**Your Write Permissions**. The `writable_sections` list there is the source of truth.
|
|
55
|
+
|
|
56
|
+
If `write_permissions` is absent, fall back to your agent contract in
|
|
57
|
+
`config/context-contracts.json`. Do not invent section names.
|
|
58
|
+
|
|
59
|
+
Writing to a section you do not own will be rejected by the hook.
|
|
60
|
+
`gaia` and `speckit-planner` do not write to project-context — they manage
|
|
61
|
+
gaia-ops internals and specs respectively.
|
|
62
|
+
|
|
63
|
+
## Progressive Enrichment Targets
|
|
64
|
+
|
|
65
|
+
When a section you own is empty or sparse, prioritize populating it with high-value keys first.
|
|
66
|
+
|
|
67
|
+
| Priority | What to capture | Why |
|
|
68
|
+
|----------|----------------|-----|
|
|
69
|
+
| **P0** | Resource identifiers (names, IDs, paths) | Enables direct targeting in future searches |
|
|
70
|
+
| **P1** | Structural relationships (what connects to what) | Enables cross-agent reasoning |
|
|
71
|
+
| **P2** | Configuration values (versions, replicas, limits) | Enables drift detection |
|
|
72
|
+
| **P3** | Behavioral patterns (conventions, naming schemes) | Enables consistency enforcement |
|
|
73
|
+
|
|
74
|
+
Capture P0 keys on every investigation. P1-P3 when naturally encountered -- do not investigate solely to populate context.
|
|
75
|
+
|
|
76
|
+
For concrete examples, read `examples.md` in this directory.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# CONTEXT_UPDATE Examples
|
|
2
|
+
|
|
3
|
+
## cloud-troubleshooter
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
CONTEXT_UPDATE:
|
|
7
|
+
{
|
|
8
|
+
"cluster_details": {
|
|
9
|
+
"kubernetes_version": "1.29",
|
|
10
|
+
"node_pools": [
|
|
11
|
+
{"name": "default-pool", "machine_type": "e2-standard-4", "node_count": 3}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## gitops-operator
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
CONTEXT_UPDATE:
|
|
21
|
+
{
|
|
22
|
+
"gitops_configuration": {
|
|
23
|
+
"flux_version": "v2.6.1",
|
|
24
|
+
"reconciliation_interval": "1m"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## terraform-architect
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
CONTEXT_UPDATE:
|
|
33
|
+
{
|
|
34
|
+
"terraform_infrastructure": {
|
|
35
|
+
"modules": ["vpc", "eks", "rds"],
|
|
36
|
+
"backend": "s3"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## devops-developer
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
CONTEXT_UPDATE:
|
|
45
|
+
{
|
|
46
|
+
"application_services": {
|
|
47
|
+
"services": [
|
|
48
|
+
{"name": "graphql-server", "port": 3000, "namespace": "common"}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Fresh Install Enrichment
|
|
55
|
+
|
|
56
|
+
After investigating a new cluster, the gitops-operator discovers namespace structure:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
CONTEXT_UPDATE:
|
|
60
|
+
{
|
|
61
|
+
"cluster_details": {
|
|
62
|
+
"namespaces": {
|
|
63
|
+
"application": ["adm", "dev", "test"],
|
|
64
|
+
"infrastructure": ["flux-system", "ingress-nginx"],
|
|
65
|
+
"system": ["kube-system", "kube-public"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
This merges into existing `cluster_details`. Keys already present (like `kubernetes_version`) are preserved. The `namespaces` dict is added as a new key.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: developer-patterns
|
|
3
|
+
description: Use when creating, modifying, or reviewing application code in Node.js/TypeScript or Python
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: domain
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Developer Patterns
|
|
10
|
+
|
|
11
|
+
Project-agnostic conventions for application development. Use values from your injected project-context — never hardcode environment-specific configuration.
|
|
12
|
+
|
|
13
|
+
For config file templates (tsconfig.json, pyproject.toml, jest.config.ts), read `reference.md` in this directory.
|
|
14
|
+
|
|
15
|
+
## Node.js / TypeScript
|
|
16
|
+
|
|
17
|
+
### Project Structure
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
src/
|
|
21
|
+
├── index.ts # Entry point / public API
|
|
22
|
+
├── {module}/
|
|
23
|
+
│ ├── index.ts # Module public API
|
|
24
|
+
│ ├── {module}.ts # Implementation
|
|
25
|
+
│ └── {module}.test.ts # Co-located tests
|
|
26
|
+
├── types/ # Shared type definitions
|
|
27
|
+
└── utils/ # Shared utilities
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Toolchain
|
|
31
|
+
|
|
32
|
+
| Concern | Tool |
|
|
33
|
+
|---------|------|
|
|
34
|
+
| Type checking | TypeScript (`strict: true`) |
|
|
35
|
+
| Linting | ESLint |
|
|
36
|
+
| Formatting | Prettier |
|
|
37
|
+
| Testing | Jest or Vitest |
|
|
38
|
+
| Pre-commit | Husky + lint-staged |
|
|
39
|
+
| Security | `npm audit` |
|
|
40
|
+
|
|
41
|
+
### Key Conventions
|
|
42
|
+
|
|
43
|
+
- **Strict TypeScript** — `strict: true`, `noImplicitAny: true`, `strictNullChecks: true`
|
|
44
|
+
- **Tests co-located** — `{file}.test.ts` next to `{file}.ts`, not in a separate `/tests` folder
|
|
45
|
+
- **Absolute imports** — configure `paths` in tsconfig, never `../../../`
|
|
46
|
+
- **No barrel exports** unless intentional — they create circular dependency risks
|
|
47
|
+
- **Lock file committed** — `package-lock.json` or `pnpm-lock.yaml` always in Git
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Python
|
|
52
|
+
|
|
53
|
+
### Project Structure
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
src/
|
|
57
|
+
└── {package}/
|
|
58
|
+
├── __init__.py
|
|
59
|
+
├── {module}.py
|
|
60
|
+
└── tests/
|
|
61
|
+
├── conftest.py # Shared fixtures at directory level
|
|
62
|
+
└── test_{module}.py
|
|
63
|
+
pyproject.toml # Single source of truth
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Toolchain
|
|
67
|
+
|
|
68
|
+
| Concern | Tool |
|
|
69
|
+
|---------|------|
|
|
70
|
+
| Packaging + deps | Poetry or pip-tools |
|
|
71
|
+
| Linting + formatting | ruff (replaces black + isort + flake8) |
|
|
72
|
+
| Type checking | mypy |
|
|
73
|
+
| Testing | pytest |
|
|
74
|
+
| Security | `pip-audit` |
|
|
75
|
+
|
|
76
|
+
### Key Conventions
|
|
77
|
+
|
|
78
|
+
- **src layout** — package under `src/`, not at root — prevents import confusion during development
|
|
79
|
+
- **pyproject.toml only** — no `setup.py`, no `setup.cfg`, no bare `requirements.txt` for packaged code
|
|
80
|
+
- **ruff over black + flake8** — one tool, faster, same behavior
|
|
81
|
+
- **Type hints everywhere** — return types, parameter types; no `Any` without an inline comment explaining why
|
|
82
|
+
- **Fixtures in conftest.py** — shared fixtures at directory level, not duplicated across test files
|
|
83
|
+
- **Lock file committed** — `poetry.lock` always in Git
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Key Rules (Both Stacks)
|
|
88
|
+
|
|
89
|
+
1. **Tests before merge** — no code without tests; CI must enforce
|
|
90
|
+
2. **Linter is non-negotiable** — CI must fail on lint errors; never disable rules without comment
|
|
91
|
+
3. **No secrets in code** — environment variables only; `.env.example` documents what's needed
|
|
92
|
+
4. **Dependency pinning** — lock files always committed
|
|
93
|
+
5. **Security scanning** — `npm audit` / `pip-audit` before release, not just on CI failures
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Developer Patterns — Config Reference
|
|
2
|
+
|
|
3
|
+
Minimal config templates. Replace `{package-name}` and other placeholders with project values.
|
|
4
|
+
|
|
5
|
+
For project-specific examples, discover patterns from the existing codebase using the `investigation` skill.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## tsconfig.json (strict baseline)
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"compilerOptions": {
|
|
14
|
+
"target": "ES2022",
|
|
15
|
+
"module": "NodeNext",
|
|
16
|
+
"moduleResolution": "NodeNext",
|
|
17
|
+
"strict": true,
|
|
18
|
+
"noImplicitAny": true,
|
|
19
|
+
"strictNullChecks": true,
|
|
20
|
+
"noUncheckedIndexedAccess": true,
|
|
21
|
+
"outDir": "dist",
|
|
22
|
+
"rootDir": "src",
|
|
23
|
+
"paths": {
|
|
24
|
+
"@/*": ["src/*"]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"include": ["src"],
|
|
28
|
+
"exclude": ["node_modules", "dist"]
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## pyproject.toml (Poetry baseline)
|
|
33
|
+
|
|
34
|
+
```toml
|
|
35
|
+
[tool.poetry]
|
|
36
|
+
name = "{package-name}"
|
|
37
|
+
version = "0.1.0"
|
|
38
|
+
description = ""
|
|
39
|
+
packages = [{include = "{package-name}", from = "src"}]
|
|
40
|
+
|
|
41
|
+
[tool.poetry.dependencies]
|
|
42
|
+
python = "^3.12"
|
|
43
|
+
|
|
44
|
+
[tool.poetry.group.dev.dependencies]
|
|
45
|
+
pytest = "^8.0"
|
|
46
|
+
ruff = "^0.4"
|
|
47
|
+
mypy = "^1.10"
|
|
48
|
+
|
|
49
|
+
[tool.ruff]
|
|
50
|
+
line-length = 88
|
|
51
|
+
select = ["E", "F", "I", "N", "UP"]
|
|
52
|
+
|
|
53
|
+
[tool.mypy]
|
|
54
|
+
strict = true
|
|
55
|
+
python_version = "3.12"
|
|
56
|
+
|
|
57
|
+
[tool.pytest.ini_options]
|
|
58
|
+
testpaths = ["src"]
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## jest.config.ts (TypeScript)
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import type { Config } from 'jest'
|
|
65
|
+
|
|
66
|
+
const config: Config = {
|
|
67
|
+
preset: 'ts-jest',
|
|
68
|
+
testEnvironment: 'node',
|
|
69
|
+
moduleNameMapper: {
|
|
70
|
+
'^@/(.*)$': '<rootDir>/src/$1',
|
|
71
|
+
},
|
|
72
|
+
collectCoverageFrom: ['src/**/*.ts', '!src/**/*.test.ts'],
|
|
73
|
+
coverageThreshold: {
|
|
74
|
+
global: { lines: 80 }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default config
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## pytest conftest.py (fixture baseline)
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
import pytest
|
|
85
|
+
|
|
86
|
+
@pytest.fixture(scope="session")
|
|
87
|
+
def db_connection():
|
|
88
|
+
"""Session-scoped fixture for database connection."""
|
|
89
|
+
# Setup
|
|
90
|
+
conn = create_connection()
|
|
91
|
+
yield conn
|
|
92
|
+
# Teardown
|
|
93
|
+
conn.close()
|
|
94
|
+
|
|
95
|
+
@pytest.fixture(autouse=True)
|
|
96
|
+
def reset_state():
|
|
97
|
+
"""Auto-use fixture to reset state between tests."""
|
|
98
|
+
yield
|
|
99
|
+
# cleanup after each test
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## .env.example
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Required
|
|
106
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
|
|
107
|
+
API_KEY=your-api-key-here
|
|
108
|
+
|
|
109
|
+
# Optional
|
|
110
|
+
LOG_LEVEL=info
|
|
111
|
+
PORT=3000
|
|
112
|
+
```
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: execution
|
|
3
|
+
description: Use when the user has approved a T3 operation and execution is about to begin
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: discipline
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Execution
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.
|
|
13
|
+
Commands finishing is not success. Verification criteria passing is success.
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Mental Model
|
|
17
|
+
|
|
18
|
+
T3 operations modify live state. Live state changes can be
|
|
19
|
+
irreversible. You cannot claim COMPLETE until you have verified
|
|
20
|
+
the result — not assumed it. A command can exit 0 and leave the
|
|
21
|
+
system in a broken state.
|
|
22
|
+
|
|
23
|
+
## Pre-Execution Checklist
|
|
24
|
+
|
|
25
|
+
Before executing ANY approved operation:
|
|
26
|
+
|
|
27
|
+
- [ ] User approved via AskUserQuestion and ElicitationResult hook activated the grant
|
|
28
|
+
- [ ] Capture current state — know what you can roll back to
|
|
29
|
+
- [ ] Plan still valid — re-run dry-run if time has passed
|
|
30
|
+
- [ ] Commands will not prompt for interactive input
|
|
31
|
+
|
|
32
|
+
If ANY check fails → `BLOCKED`.
|
|
33
|
+
|
|
34
|
+
## Execution Protocol
|
|
35
|
+
|
|
36
|
+
1. Run each step separately — verify exit code before next
|
|
37
|
+
2. On failure — classify: recoverable (`IN_PROGRESS`) or not (`BLOCKED`)
|
|
38
|
+
3. After all steps — run Verification Criteria from the plan
|
|
39
|
+
|
|
40
|
+
## Error Reporting
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Error Type: [Transient | Validation | Permission | State conflict]
|
|
44
|
+
Error Message: [exact output]
|
|
45
|
+
Rollback Status: [what needs rollback if partial]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Rollback
|
|
49
|
+
|
|
50
|
+
Know your rollback path BEFORE executing. This varies by domain:
|
|
51
|
+
your domain skill defines the specific rollback strategy.
|
|
52
|
+
|
|
53
|
+
## Traps
|
|
54
|
+
|
|
55
|
+
| If you're thinking... | The reality is... |
|
|
56
|
+
|---|---|
|
|
57
|
+
| "The plan just ran, no drift possible" | State can change between planning and execution |
|
|
58
|
+
| "Dry-run passed during planning" | Stale dry-run ≠ current state — re-run |
|
|
59
|
+
| "All commands exited 0, I'm done" | Exit 0 ≠ desired state — run verification criteria |
|
|
60
|
+
| "It's only dev, fewer checks needed" | Irreversibility is irreversibility regardless of env |
|
|
61
|
+
|
|
62
|
+
## Anti-Patterns
|
|
63
|
+
|
|
64
|
+
- COMPLETE without running verification criteria — the most common failure mode
|
|
65
|
+
- Execute on approximate approval — "user approved something like this" is not the canonical token
|
|
66
|
+
- Mutate without knowing rollback path — if you can't undo it, you're not ready to do it
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fast-queries
|
|
3
|
+
description: Use when diagnosing an issue, checking system health, or validating infrastructure state before starting a task
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: reference
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Fast-Query Diagnostics
|
|
10
|
+
|
|
11
|
+
**Always run fast-queries FIRST** when investigating issues, checking status, or validating changes.
|
|
12
|
+
|
|
13
|
+
## Available Scripts
|
|
14
|
+
|
|
15
|
+
Run from project root. Use absolute path if calling from a different directory.
|
|
16
|
+
|
|
17
|
+
| Script | Command | Duration |
|
|
18
|
+
|--------|---------|----------|
|
|
19
|
+
| **All systems** | `bash .claude/tools/fast-queries/run_triage.sh [domain]` | 8-15s |
|
|
20
|
+
| **GitOps/K8s** | `bash .claude/tools/fast-queries/gitops/quicktriage_gitops_operator.sh [ns]` | 2-3s |
|
|
21
|
+
| **Terraform** | `bash .claude/tools/fast-queries/terraform/quicktriage_terraform_architect.sh [dir]` | 3-4s |
|
|
22
|
+
| **AWS** | `bash .claude/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh` | 4-5s |
|
|
23
|
+
| **GCP** | `bash .claude/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh [project]` | 4-5s |
|
|
24
|
+
|
|
25
|
+
**Domains for triage:** `all`, `gitops`, `terraform`, `cloud`, `appservices`
|
|
26
|
+
|
|
27
|
+
## Exit Codes
|
|
28
|
+
|
|
29
|
+
- `0` OK = All healthy — proceed
|
|
30
|
+
- `1` WARNING = Warnings found — review before proceeding, not necessarily blocking
|
|
31
|
+
- `2` ERROR = Errors found — stop and investigate before continuing
|
|
32
|
+
- `3` SCRIPT_ERROR = Script error (missing tools, permissions) — check setup
|
|
33
|
+
|
|
34
|
+
## Usage Pattern
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
1. User reports issue or asks for status
|
|
38
|
+
2. Run fast-queries for relevant domain
|
|
39
|
+
3. Interpret by exit code:
|
|
40
|
+
- 0 OK → proceed with task
|
|
41
|
+
- 1 WARNING → review each warning, decide if blocking before continuing
|
|
42
|
+
- 2 ERROR → report to user, do not proceed, investigate flagged issues
|
|
43
|
+
- 3 SCRIPT_ERROR → check tool availability and permissions
|
|
44
|
+
4. Deep-dive only on flagged issues (exit 1 or 2)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Use domain-specific scripts when you know the area. Use `all` only for general status checks.
|