@jaguilar87/gaia 5.0.0-rc1
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 +1212 -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 +237 -0
- package/agents/gaia-planner.md +53 -0
- package/agents/gaia-system.md +70 -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 +628 -0
- package/bin/cli/history.py +305 -0
- package/bin/cli/memory.py +464 -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 +816 -0
- package/bin/pre-publish-validate.js +610 -0
- package/bin/python-detect.js +60 -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 +421 -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 +237 -0
- package/dist/gaia-ops/agents/gaia-planner.md +53 -0
- package/dist/gaia-ops/agents/gaia-system.md +70 -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 +421 -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 +163 -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 +232 -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_start.py +81 -0
- package/dist/gaia-ops/hooks/stop_hook.py +82 -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 +154 -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 +182 -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 +82 -0
- package/dist/gaia-ops/skills/gaia-release/reference.md +102 -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/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 +360 -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 +84 -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 +232 -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_start.py +81 -0
- package/dist/gaia-security/hooks/stop_hook.py +82 -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 +232 -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_start.py +81 -0
- package/hooks/stop_hook.py +82 -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 +99 -0
- package/pyproject.toml +32 -0
- package/skills/README.md +154 -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 +182 -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 +82 -0
- package/skills/gaia-release/reference.md +102 -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/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 +360 -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,182 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brief-spec
|
|
3
|
+
description: Use when the user wants to create a brief or spec for a feature before planning
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: technique
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Brief Spec
|
|
10
|
+
|
|
11
|
+
Conversational brief creation. The orchestrator loads this inline to
|
|
12
|
+
co-create a brief with the user before dispatching to gaia-planner.
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
1. **Size the work**
|
|
17
|
+
|
|
18
|
+
| Size | Signal | Questions |
|
|
19
|
+
|------|--------|-----------|
|
|
20
|
+
| S | Bug fix, config tweak, single-file | 0-1 |
|
|
21
|
+
| M | Feature, endpoint, integration | 2-3 |
|
|
22
|
+
| L | Project, multi-agent, cross-surface | 4-6 |
|
|
23
|
+
|
|
24
|
+
For S: skip brief, tell the user to describe what they want and
|
|
25
|
+
dispatch directly to the appropriate agent.
|
|
26
|
+
|
|
27
|
+
3. **Ask questions** (M/L) -- Target gaps, not completeness:
|
|
28
|
+
- **Surface type** (always, before AC): Is this a UI a human uses, an API,
|
|
29
|
+
or a background job? Determines valid evidence types for the ACs.
|
|
30
|
+
- What problem does this solve?
|
|
31
|
+
- What constraints matter? (cloud, performance, security, timeline)
|
|
32
|
+
- How will you verify each AC yourself? (reproduce steps, not just "it works")
|
|
33
|
+
- What artifact do you want to review after execution?
|
|
34
|
+
(log file, screenshot, JSON snapshot, HTTP response, diff)
|
|
35
|
+
- If this failed silently, what symptom would you look for?
|
|
36
|
+
- What is explicitly NOT in scope?
|
|
37
|
+
|
|
38
|
+
One question per round via AskUserQuestion. Stop when each AC has
|
|
39
|
+
a declared evidence type and every question above has an answer or
|
|
40
|
+
an explicit "N/A".
|
|
41
|
+
|
|
42
|
+
4. **Write brief.md** -- Use the structure below. Write to:
|
|
43
|
+
`.claude/project-context/briefs/open_{feature-name}/brief.md`
|
|
44
|
+
where `{feature-name}` is a kebab-case slug.
|
|
45
|
+
|
|
46
|
+
**Directory prefix convention:**
|
|
47
|
+
- `open_` -- draft or ready, no work started yet (this skill always creates with `open_`)
|
|
48
|
+
- `in-progress_` -- work has begun
|
|
49
|
+
- `closed_` -- complete, verified, or done
|
|
50
|
+
|
|
51
|
+
Transitions between prefixes are done with `gaia plans rename`. This skill
|
|
52
|
+
only ever creates with `open_`.
|
|
53
|
+
|
|
54
|
+
## Brief Structure
|
|
55
|
+
|
|
56
|
+
The frontmatter is the executable source of truth (orchestrator parses it
|
|
57
|
+
with `yaml.safe_load`). The body's `## Acceptance Criteria` section mirrors
|
|
58
|
+
it as a human summary.
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
---
|
|
62
|
+
status: draft
|
|
63
|
+
surface_type: ui | api | job | cli
|
|
64
|
+
acceptance_criteria:
|
|
65
|
+
- id: AC-1
|
|
66
|
+
description: "Login button visible on /login"
|
|
67
|
+
evidence:
|
|
68
|
+
type: url
|
|
69
|
+
shape:
|
|
70
|
+
method: GET
|
|
71
|
+
url: http://localhost:3000/login
|
|
72
|
+
expect:
|
|
73
|
+
status: 200
|
|
74
|
+
body_contains: "Sign in"
|
|
75
|
+
artifact: evidence/AC-1.json
|
|
76
|
+
- id: AC-2
|
|
77
|
+
description: "pytest auth suite green"
|
|
78
|
+
evidence:
|
|
79
|
+
type: command
|
|
80
|
+
shape:
|
|
81
|
+
run: "pytest tests/auth/ -q"
|
|
82
|
+
expect: "exit 0"
|
|
83
|
+
artifact: evidence/AC-2.txt
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
# [Feature Name]
|
|
87
|
+
|
|
88
|
+
## Objective
|
|
89
|
+
[1-3 sentences: what problem, why now, who benefits]
|
|
90
|
+
|
|
91
|
+
## Context
|
|
92
|
+
[Project constraints relevant to this feature]
|
|
93
|
+
|
|
94
|
+
## Approach
|
|
95
|
+
[High-level strategy, not implementation details. 3-5 sentences max]
|
|
96
|
+
|
|
97
|
+
## Acceptance Criteria
|
|
98
|
+
Human-readable summary. Source of truth lives in frontmatter.
|
|
99
|
+
- AC-1: Login button visible on /login (evidence: url)
|
|
100
|
+
- AC-2: pytest auth suite green (evidence: command)
|
|
101
|
+
|
|
102
|
+
## Milestones (M/L features only)
|
|
103
|
+
- M1: [name] -- [what is shippable after this]
|
|
104
|
+
- M2: [name] -- [what is shippable after this]
|
|
105
|
+
|
|
106
|
+
## Out of Scope
|
|
107
|
+
[Explicit boundaries -- what this feature does NOT include]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Acceptance Criteria Rules
|
|
111
|
+
|
|
112
|
+
- Every AC has a description (user observation) and an evidence block.
|
|
113
|
+
- Evidence must be reproducible by the user -- not only by the agent.
|
|
114
|
+
- Every AC declares an `artifact` path; the orchestrator persists the
|
|
115
|
+
verification output there so the user can read it after completion.
|
|
116
|
+
- Vague ACs get pushed back: "Fast means what? Under 200ms p95?"
|
|
117
|
+
- Surface type restricts valid evidence types (see table).
|
|
118
|
+
|
|
119
|
+
### Evidence Types
|
|
120
|
+
|
|
121
|
+
The shapes below are frontmatter fragments under `acceptance_criteria:`.
|
|
122
|
+
The body's `## Acceptance Criteria` section mirrors them for human reading;
|
|
123
|
+
the frontmatter is the executable source of truth.
|
|
124
|
+
|
|
125
|
+
| type | shape | valid surface |
|
|
126
|
+
|------|-------|---------------|
|
|
127
|
+
| `command` | `run: "bash command"; expect: exit_code \| substring` | any |
|
|
128
|
+
| `url` | `method: GET\|POST; url; expect: {status, body_contains}` | ui, api |
|
|
129
|
+
| `playwright` | `url; steps: [...]; assert: "selector visible" \| screenshot` | ui |
|
|
130
|
+
| `artifact` | `path; kind: json\|log\|screenshot; assert: schema \| contains` | any |
|
|
131
|
+
| `metric` | `query; threshold: "p95 < 200ms"` | api, job |
|
|
132
|
+
|
|
133
|
+
Shape examples (frontmatter fragments):
|
|
134
|
+
|
|
135
|
+
```yaml
|
|
136
|
+
# command
|
|
137
|
+
evidence:
|
|
138
|
+
type: command
|
|
139
|
+
shape:
|
|
140
|
+
run: "pytest tests/auth/ -q"
|
|
141
|
+
expect: "exit 0"
|
|
142
|
+
|
|
143
|
+
# url
|
|
144
|
+
evidence:
|
|
145
|
+
type: url
|
|
146
|
+
shape:
|
|
147
|
+
method: GET
|
|
148
|
+
url: http://localhost:3000/health
|
|
149
|
+
expect:
|
|
150
|
+
status: 200
|
|
151
|
+
body_contains: '"status":"ok"'
|
|
152
|
+
|
|
153
|
+
# playwright
|
|
154
|
+
evidence:
|
|
155
|
+
type: playwright
|
|
156
|
+
shape:
|
|
157
|
+
url: http://localhost:3000/login
|
|
158
|
+
steps:
|
|
159
|
+
- fill: "#email with user@test.com"
|
|
160
|
+
- click: "button[type=submit]"
|
|
161
|
+
assert: "selector [data-testid=dashboard] visible"
|
|
162
|
+
|
|
163
|
+
# artifact
|
|
164
|
+
evidence:
|
|
165
|
+
type: artifact
|
|
166
|
+
shape:
|
|
167
|
+
path: dist/build-report.json
|
|
168
|
+
kind: json
|
|
169
|
+
assert: ".summary.errors == 0"
|
|
170
|
+
|
|
171
|
+
# metric
|
|
172
|
+
evidence:
|
|
173
|
+
type: metric
|
|
174
|
+
shape:
|
|
175
|
+
query: "curl -s http://localhost:3000/metrics | grep http_p95"
|
|
176
|
+
threshold: "< 200"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## After Brief
|
|
180
|
+
|
|
181
|
+
Present the full brief. Ask: "Does this capture what you want?"
|
|
182
|
+
When confirmed, suggest dispatching to gaia-planner to create a plan.
|
|
@@ -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** — agent cwd resets between calls; relative paths break silently.
|
|
41
|
+
5. **Quote variables** — unquoted `${VAR}` with spaces becomes multiple arguments.
|
|
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,87 @@
|
|
|
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
|
+
type: technique
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Context Updater
|
|
10
|
+
|
|
11
|
+
project-context.json is shared memory across agents. When you discover something
|
|
12
|
+
about the project that other agents would need, you are the only one who saw it.
|
|
13
|
+
If you do not write it, the next agent starts from zero on that question.
|
|
14
|
+
|
|
15
|
+
## When to Emit CONTEXT_UPDATE
|
|
16
|
+
|
|
17
|
+
Emit a `CONTEXT_UPDATE` block when ANY of these are true:
|
|
18
|
+
|
|
19
|
+
1. **Empty section** — A section you own exists but has no data
|
|
20
|
+
2. **Drift detected** — Discovered data differs from current section
|
|
21
|
+
3. **New resources found** — Resources not currently listed
|
|
22
|
+
4. **Pattern discovered** — Investigation revealed a pattern, structure, or config not yet captured
|
|
23
|
+
|
|
24
|
+
Skip when findings match existing data exactly -- redundant writes
|
|
25
|
+
create noise in the audit trail without adding information.
|
|
26
|
+
|
|
27
|
+
## How to Emit
|
|
28
|
+
|
|
29
|
+
**Step 1: Check permissions**
|
|
30
|
+
|
|
31
|
+
Do **not** memorize a static table from this skill. Your write permissions are
|
|
32
|
+
shown in the injected context under **Your Write Permissions**. The
|
|
33
|
+
`writable_sections` list there is the source of truth.
|
|
34
|
+
|
|
35
|
+
If `write_permissions` is absent, fall back to your agent contract in
|
|
36
|
+
`config/context-contracts.json`. Do not invent section names. Writing to a
|
|
37
|
+
section you do not own will be rejected by the hook. `gaia-system` and `gaia-planner` do not write to project-context -- they
|
|
38
|
+
manage gaia-ops internals and planning respectively.
|
|
39
|
+
|
|
40
|
+
**Step 2: Build the CONTEXT_UPDATE block**
|
|
41
|
+
|
|
42
|
+
Place this block after analysis and before the `json:contract` block:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
CONTEXT_UPDATE:
|
|
46
|
+
{
|
|
47
|
+
"section_name": {
|
|
48
|
+
"key": "value"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Rules: valid JSON, section names must match writable sections, one block per
|
|
54
|
+
response (combine all updates), include only keys to add or update.
|
|
55
|
+
|
|
56
|
+
**Step 3: Apply merge semantics**
|
|
57
|
+
|
|
58
|
+
| Operation | Behavior |
|
|
59
|
+
|-----------|----------|
|
|
60
|
+
| **ADD** | New keys inserted into the section |
|
|
61
|
+
| **MERGE** | Existing dicts recursively merged |
|
|
62
|
+
| **UNION** | Lists merged, no duplicates |
|
|
63
|
+
| **OVERWRITE** | Scalar values replaced |
|
|
64
|
+
| **NO-DELETE** | Keys you don't mention are preserved |
|
|
65
|
+
|
|
66
|
+
## Prioritization
|
|
67
|
+
|
|
68
|
+
When a section you own is empty or sparse, prioritize high-value keys first.
|
|
69
|
+
|
|
70
|
+
| Priority | What to capture | Why |
|
|
71
|
+
|----------|----------------|-----|
|
|
72
|
+
| **P0** | Resource identifiers (names, IDs, paths) | Enables direct targeting in future searches |
|
|
73
|
+
| **P1** | Structural relationships (what connects to what) | Enables cross-agent reasoning |
|
|
74
|
+
| **P2** | Configuration values (versions, replicas, limits) | Enables drift detection |
|
|
75
|
+
| **P3** | Behavioral patterns (conventions, naming schemes) | Enables consistency enforcement |
|
|
76
|
+
|
|
77
|
+
Capture P0 keys on every investigation. P1-P3 when naturally encountered -- do
|
|
78
|
+
not investigate solely to populate context.
|
|
79
|
+
|
|
80
|
+
For concrete examples, read `examples.md` in this directory.
|
|
81
|
+
|
|
82
|
+
## Anti-Patterns
|
|
83
|
+
|
|
84
|
+
- Emitting updates without checking writable sections
|
|
85
|
+
- Overwriting user-curated fields with generic values
|
|
86
|
+
- Waiting until task completion to emit (emit as you discover)
|
|
87
|
+
- Skipping P0 fields while enriching lower-priority ones
|
|
@@ -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
|
+
## 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,50 @@
|
|
|
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
|
+
Reference conventions for Node.js/TypeScript and Python. The codebase is the authority -- these patterns help you find and interpret what's already there.
|
|
12
|
+
|
|
13
|
+
For config file templates (tsconfig.json, pyproject.toml, jest.config.ts), read `reference.md` in this directory.
|
|
14
|
+
|
|
15
|
+
## Discover the Project's Conventions
|
|
16
|
+
|
|
17
|
+
Before writing code, understand how THIS project is organized.
|
|
18
|
+
|
|
19
|
+
1. **Find the entry points.** Look for `src/`, `lib/`, `app/`, or the package.json `main`/`exports` field. The layout varies -- what matters is where this project puts its code.
|
|
20
|
+
2. **Read 2-3 existing modules.** How are tests organized -- co-located or in a `tests/` directory? What import style is used? What tooling does the config reflect?
|
|
21
|
+
3. **Check the existing toolchain.** Read `package.json` scripts, `tsconfig.json`, `pyproject.toml`, or equivalent. The project's configured tools are your tools.
|
|
22
|
+
4. **Follow the majority pattern.** If the project uses Vitest, don't introduce Jest. If tests live in `__tests__/`, put yours there too. Consistency with the project matters more than what you'd choose on a greenfield.
|
|
23
|
+
|
|
24
|
+
## Node.js / TypeScript (Reference)
|
|
25
|
+
|
|
26
|
+
Common conventions -- defer to the project's actual configuration.
|
|
27
|
+
|
|
28
|
+
- **Strict TypeScript** — `strict: true` catches entire categories of null/undefined bugs at compile time rather than runtime
|
|
29
|
+
- **Tests co-located** — `{file}.test.ts` next to `{file}.ts` keeps test and implementation in sync; but some projects prefer `__tests__/` directories, and that's fine
|
|
30
|
+
- **Absolute imports** — path aliases in tsconfig eliminate fragile `../../../` chains that break on refactors
|
|
31
|
+
- **Barrel exports with care** — re-export files (`index.ts`) create circular dependency risks in larger projects; use them intentionally
|
|
32
|
+
- **Lock file committed** — reproducible installs across environments; without it, CI and local can diverge silently
|
|
33
|
+
|
|
34
|
+
## Python (Reference)
|
|
35
|
+
|
|
36
|
+
Common conventions -- defer to the project's actual configuration.
|
|
37
|
+
|
|
38
|
+
- **src layout** — package under `src/` prevents accidental imports of the uninstalled package during development
|
|
39
|
+
- **pyproject.toml** — single source of truth for packaging; `setup.py` and `setup.cfg` are legacy unless the project already uses them
|
|
40
|
+
- **Type hints** — return types, parameter types; `Any` without a comment explaining why is a hole in the type safety net
|
|
41
|
+
- **Fixtures in conftest.py** — shared fixtures at directory level prevent duplication; pytest discovers them automatically
|
|
42
|
+
- **Lock file committed** — same reason as Node: reproducible installs
|
|
43
|
+
|
|
44
|
+
## Key Rules (Both Stacks)
|
|
45
|
+
|
|
46
|
+
1. **Tests with code** — untested code is unverified code; CI should enforce this, and if it doesn't, that's worth flagging
|
|
47
|
+
2. **Linter runs clean** — disabling a lint rule without a comment explaining why creates invisible technical debt
|
|
48
|
+
3. **No secrets in code** — environment variables only; `.env.example` documents what's needed so new developers don't have to guess
|
|
49
|
+
4. **Dependency pinning** — lock files committed; without them, "works on my machine" is the default state
|
|
50
|
+
5. **Security scanning** — `npm audit` / `pip-audit` catches known vulnerabilities before they reach production
|
|
@@ -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
|
+
```
|