@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,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gaia-verify
|
|
3
|
+
description: Use when the user wants to verify a Gaia installation -- "probemos", "verify", "test installation", "gaia-verify"
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: true
|
|
6
|
+
type: technique
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Gaia Verify
|
|
10
|
+
|
|
11
|
+
Verify that a Gaia installation works correctly across 4 modes. Each mode tests a different delivery surface. Use the mode that matches what was just changed or installed.
|
|
12
|
+
|
|
13
|
+
## Decision Tree
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
"probemos" / "verify" / "test installation"
|
|
17
|
+
├─ Just edited source code? -> live
|
|
18
|
+
├─ About to publish to npm? -> dry-run
|
|
19
|
+
├─ Just published @beta? -> beta
|
|
20
|
+
└─ Just published @latest? -> release
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
If the user does not specify a mode, ask: "Which mode -- live, dry-run, beta, or release?"
|
|
24
|
+
|
|
25
|
+
## Mode: live
|
|
26
|
+
|
|
27
|
+
Tests the current symlinked installation. Source code is live -- no build step.
|
|
28
|
+
|
|
29
|
+
**When:** After editing source files in `gaia-dev/`
|
|
30
|
+
|
|
31
|
+
Commands: run `gaia-doctor` then `gaia-status` directly (already installed, no npx needed).
|
|
32
|
+
|
|
33
|
+
**No temp directory.** No cleanup needed.
|
|
34
|
+
|
|
35
|
+
## Mode: dry-run
|
|
36
|
+
|
|
37
|
+
Tests the build pipeline -- does `npm pack` + local install produce a working installation?
|
|
38
|
+
|
|
39
|
+
**When:** Before publishing to npm
|
|
40
|
+
|
|
41
|
+
Step-by-step commands in `reference.md`. Core flow: `npm pack` in `gaia-dev` -> install `.tgz` in `/tmp/gaia-dry-run-{timestamp}` -> `npx gaia-doctor` + `npx gaia-status` -> clean up.
|
|
42
|
+
|
|
43
|
+
## Mode: beta
|
|
44
|
+
|
|
45
|
+
Tests the published `@beta` tag on the npm registry.
|
|
46
|
+
|
|
47
|
+
**When:** After publishing a beta release via the pipeline
|
|
48
|
+
|
|
49
|
+
Step-by-step commands in `reference.md`. Core flow: fresh `/tmp/gaia-beta-verify-{timestamp}` -> `npm install @jaguilar87/gaia@beta` -> `npx gaia-doctor` + `npx gaia-status` -> clean up.
|
|
50
|
+
|
|
51
|
+
## Mode: release
|
|
52
|
+
|
|
53
|
+
Tests the published `@latest` tag on the npm registry.
|
|
54
|
+
|
|
55
|
+
**When:** After publishing a stable release via the pipeline
|
|
56
|
+
|
|
57
|
+
Step-by-step commands in `reference.md`. Core flow: fresh `/tmp/gaia-release-verify-{timestamp}` -> `npm install @jaguilar87/gaia@latest` -> `npx gaia-doctor` + `npx gaia-status` -> clean up.
|
|
58
|
+
|
|
59
|
+
## All Modes: Reporting
|
|
60
|
+
|
|
61
|
+
Every mode ends with a structured result:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
Mode: <live | dry-run | beta | release>
|
|
65
|
+
Version: <version string installed, or "symlinked source" for live>
|
|
66
|
+
Doctor: PASS | FAIL
|
|
67
|
+
Status: <gaia-status output summary>
|
|
68
|
+
Cleanup: done | n/a (live)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
If `gaia-doctor` fails, report the exact error and stop -- do not continue to `gaia-status`.
|
|
72
|
+
|
|
73
|
+
## Anti-Patterns
|
|
74
|
+
|
|
75
|
+
- **Skipping the mode question** -- each mode tests a different surface; running the wrong one gives false confidence.
|
|
76
|
+
- **Skipping cleanup** -- `/tmp/gaia-{mode}-*` directories accumulate; always delete after reporting.
|
|
77
|
+
- **Continuing after doctor failure** -- a failing doctor means the installation is broken; status output is meaningless.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Gaia Verify Reference
|
|
2
|
+
|
|
3
|
+
Exact commands for each mode. Copy and run -- no interpretation needed.
|
|
4
|
+
|
|
5
|
+
## Mode: live
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
gaia-doctor
|
|
9
|
+
gaia-status
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
No temp directory. No cleanup.
|
|
13
|
+
|
|
14
|
+
## Mode: dry-run
|
|
15
|
+
|
|
16
|
+
1. Go to the source repo (renamed to `gaia-dev` post-rename):
|
|
17
|
+
`cd /home/jorge/ws/me/gaia-dev`
|
|
18
|
+
|
|
19
|
+
2. Pack the package (from the gaia source repo; path below uses the future rename but current dir is still `gaia-ops-dev`):
|
|
20
|
+
`npm pack`
|
|
21
|
+
Note the `.tgz` filename output (e.g., `jaguilar87-gaia-5.3.0.tgz`).
|
|
22
|
+
|
|
23
|
+
3. Create a clean temp project (use actual timestamp):
|
|
24
|
+
`mkdir /tmp/gaia-dry-run-$(date +%Y%m%d%H%M%S)`
|
|
25
|
+
|
|
26
|
+
4. Initialize:
|
|
27
|
+
`npm init -y` (run inside the temp dir)
|
|
28
|
+
|
|
29
|
+
5. Install from tarball (use absolute path):
|
|
30
|
+
`npm install /home/jorge/ws/me/gaia-dev/jaguilar87-gaia-X.Y.Z.tgz`
|
|
31
|
+
|
|
32
|
+
6. Verify:
|
|
33
|
+
`npx gaia-doctor`
|
|
34
|
+
`npx gaia-status`
|
|
35
|
+
|
|
36
|
+
7. Clean up:
|
|
37
|
+
`rm -rf /tmp/gaia-dry-run-*`
|
|
38
|
+
|
|
39
|
+
## Mode: beta
|
|
40
|
+
|
|
41
|
+
1. Create a clean temp project (use actual timestamp):
|
|
42
|
+
`mkdir /tmp/gaia-beta-verify-$(date +%Y%m%d%H%M%S)`
|
|
43
|
+
|
|
44
|
+
2. Initialize:
|
|
45
|
+
`npm init -y` (run inside the temp dir)
|
|
46
|
+
|
|
47
|
+
3. Install from npm registry:
|
|
48
|
+
`npm install @jaguilar87/gaia@beta`
|
|
49
|
+
|
|
50
|
+
4. Verify:
|
|
51
|
+
`npx gaia-doctor`
|
|
52
|
+
`npx gaia-status`
|
|
53
|
+
|
|
54
|
+
5. Clean up:
|
|
55
|
+
`rm -rf /tmp/gaia-beta-verify-*`
|
|
56
|
+
|
|
57
|
+
## Mode: release
|
|
58
|
+
|
|
59
|
+
1. Create a clean temp project (use actual timestamp):
|
|
60
|
+
`mkdir /tmp/gaia-release-verify-$(date +%Y%m%d%H%M%S)`
|
|
61
|
+
|
|
62
|
+
2. Initialize:
|
|
63
|
+
`npm init -y` (run inside the temp dir)
|
|
64
|
+
|
|
65
|
+
3. Install from npm registry:
|
|
66
|
+
`npm install @jaguilar87/gaia@latest`
|
|
67
|
+
|
|
68
|
+
4. Verify:
|
|
69
|
+
`npx gaia-doctor`
|
|
70
|
+
`npx gaia-status`
|
|
71
|
+
|
|
72
|
+
5. Clean up:
|
|
73
|
+
`rm -rf /tmp/gaia-release-verify-*`
|
|
74
|
+
|
|
75
|
+
## Notes
|
|
76
|
+
|
|
77
|
+
- Run each command separately and verify exit code before proceeding (command-execution discipline).
|
|
78
|
+
- For dry-run, `npm pack` must be run from `gaia-dev` -- the `.tgz` lands in the current working directory.
|
|
79
|
+
- For beta/release, the install step requires network access to the npm registry. If it fails with `E404`, the version has not published yet -- wait and retry.
|
|
80
|
+
- `npx gaia-doctor` exits non-zero on failure. If it fails, stop and report the error. Do not run `gaia-status`.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: git-conventions
|
|
3
|
+
description: Use when creating a git commit or preparing changes for a pull request
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: reference
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Git Conventions
|
|
10
|
+
|
|
11
|
+
## Commit Format
|
|
12
|
+
|
|
13
|
+
| Element | Rule |
|
|
14
|
+
|---------|------|
|
|
15
|
+
| Format | `type(scope): short description` |
|
|
16
|
+
| Types | feat, fix, refactor, docs, test, chore, ci, perf, style, build |
|
|
17
|
+
| Scope | Optional, reflects module/area changed |
|
|
18
|
+
| Subject | Max 72 chars, lowercase start, imperative mood, no period, no emoji |
|
|
19
|
+
| Body | Optional, blank line after subject, 72 char line wrap |
|
|
20
|
+
| Footers | `BREAKING CHANGE:`, `Refs:`, `Closes:`, `Fixes:`, `Implements:`, `See:` |
|
|
21
|
+
|
|
22
|
+
## Examples
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
feat(helmrelease): add Phase 3.3 services
|
|
26
|
+
fix(pg-non-prod): correct API key environment variable mappings
|
|
27
|
+
refactor: simplify context provider logic
|
|
28
|
+
chore(deps): update terraform to v1.6.0
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Git Path Flags
|
|
32
|
+
|
|
33
|
+
`git -C <path>`, `git --git-dir=<path>`, and `git --work-tree=<path>` break
|
|
34
|
+
the permission system. Allow/deny rules match command prefixes like
|
|
35
|
+
`git commit:*` -- path flags inserted before the subcommand shift the prefix
|
|
36
|
+
and bypass all rules silently. Run `cd` as a separate Bash call, then run git.
|
|
37
|
+
|
|
38
|
+
## Push Defaults
|
|
39
|
+
|
|
40
|
+
Push to the feature branch. Only push directly to `main` when explicitly
|
|
41
|
+
instructed or when the work is already on main. Force-push (`--force`)
|
|
42
|
+
requires explicit user instruction.
|
|
43
|
+
|
|
44
|
+
## Hook Enforcement
|
|
45
|
+
|
|
46
|
+
The `commit_validator.py` hook validates against `config/git_standards.json`.
|
|
47
|
+
Format violations block the commit. Body line length triggers warnings only.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gitops-patterns
|
|
3
|
+
description: Use when creating, modifying, or reviewing Kubernetes manifests, HelmReleases, or Flux configuration
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: domain
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# GitOps Patterns
|
|
10
|
+
|
|
11
|
+
Reference conventions for Kubernetes, HelmRelease, and Flux. The codebase is the authority -- these patterns help you find and interpret what's already there.
|
|
12
|
+
|
|
13
|
+
For YAML examples, troubleshooting, and resource limit defaults, read `reference.md` in this directory.
|
|
14
|
+
|
|
15
|
+
## Discover the Project's GitOps Layout
|
|
16
|
+
|
|
17
|
+
Before creating any manifest, understand how THIS project organizes its GitOps repo.
|
|
18
|
+
|
|
19
|
+
1. **Find the repo root.** Check project-context for `gitops_repo_path`. If absent, look for a directory containing `clusters/`, `flux-system/`, or Kustomization files.
|
|
20
|
+
2. **Read 2-3 existing HelmReleases.** How are values structured? What chart sources are used? What reconciliation intervals are set?
|
|
21
|
+
3. **Check namespace organization.** Some projects use one directory per namespace; others group by service or environment. Follow what exists.
|
|
22
|
+
4. **Follow the majority pattern.** If existing services use `kebab-case` names and `{service}-config` ConfigMaps, yours should too.
|
|
23
|
+
|
|
24
|
+
## Repository Structure (Reference)
|
|
25
|
+
|
|
26
|
+
Common layout -- defer to what the project actually uses.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
{gitops_repo_path}/
|
|
30
|
+
├── clusters/{cluster-name}/ # Flux entrypoint per cluster
|
|
31
|
+
├── infrastructure/
|
|
32
|
+
│ ├── base/ # Shared: namespaces, sources
|
|
33
|
+
│ └── overlays/{env}/ # Per-environment patches
|
|
34
|
+
└── apps/
|
|
35
|
+
├── base/{service}/ # Per-service Kustomize base
|
|
36
|
+
└── overlays/{env}/ # Per-environment patches
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Naming Conventions
|
|
40
|
+
|
|
41
|
+
| Resource | Pattern | Example |
|
|
42
|
+
|----------|---------|---------|
|
|
43
|
+
| Namespace | `kebab-case` | `common`, `mobile-backend` |
|
|
44
|
+
| Service / HelmRelease | `kebab-case` | `products-service` |
|
|
45
|
+
| ConfigMap | `{service}-config` | `products-service-config` |
|
|
46
|
+
| Secret | `{service}-secret` | `products-service-secret` |
|
|
47
|
+
| Kustomization | `{scope}-{env}` | `apps-oci-dev` |
|
|
48
|
+
|
|
49
|
+
## Image Versioning
|
|
50
|
+
|
|
51
|
+
Flux ImagePolicy uses semver ranges (e.g., `>=1.0.0`) to auto-promote tags. Mutable tags like `latest`, `main`, or `dev` break this -- Flux cannot determine which is newer, so reconciliation either picks the wrong image or loops indefinitely. Always use semantic versioning: `v1.0.xxx`.
|
|
52
|
+
|
|
53
|
+
## Key Rules
|
|
54
|
+
|
|
55
|
+
1. **Git is the single source of truth** — `kubectl apply` directly bypasses reconciliation, creating drift that Flux will either revert (losing your change) or conflict with (breaking the next deploy)
|
|
56
|
+
2. **Semver tags only** — mutable tags break image automation (see above)
|
|
57
|
+
3. **Secrets via SealedSecrets** — plain secrets in Git are readable by anyone with repo access; SealedSecrets encrypt at rest and decrypt only in-cluster
|
|
58
|
+
4. **Resource limits on every workload** — without limits, a single pod can starve the node; without requests, the scheduler cannot bin-pack efficiently
|
|
59
|
+
5. **Verify cluster context first** — `kubectl config current-context` before any operation; applying to the wrong cluster is the most common and most damaging mistake
|
|
60
|
+
6. **Post-push verification** — after pushing manifests, verify Flux reconciled successfully; a merged manifest that fails to apply is worse than no change at all. See `reference.md` for the exact command sequence
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# GitOps Patterns — YAML Reference
|
|
2
|
+
|
|
3
|
+
Structural patterns for Kubernetes and Flux. Use placeholders — replace with values from project-context.
|
|
4
|
+
|
|
5
|
+
For cloud-specific resource examples, discover patterns from the existing codebase using the `investigation` skill.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## HelmRelease
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
apiVersion: helm.toolkit.fluxcd.io/v2beta1
|
|
13
|
+
kind: HelmRelease
|
|
14
|
+
metadata:
|
|
15
|
+
name: {service-name}
|
|
16
|
+
namespace: {namespace}
|
|
17
|
+
spec:
|
|
18
|
+
interval: 5m
|
|
19
|
+
chart:
|
|
20
|
+
spec:
|
|
21
|
+
chart: {chart-name}
|
|
22
|
+
version: '>=1.0.0'
|
|
23
|
+
sourceRef:
|
|
24
|
+
kind: GitRepository
|
|
25
|
+
name: helm-charts
|
|
26
|
+
namespace: flux-system
|
|
27
|
+
interval: 1m
|
|
28
|
+
values:
|
|
29
|
+
image:
|
|
30
|
+
repository: {registry}/{service-name}
|
|
31
|
+
tag: v1.0.0
|
|
32
|
+
resources:
|
|
33
|
+
requests:
|
|
34
|
+
memory: "256Mi"
|
|
35
|
+
cpu: "100m"
|
|
36
|
+
limits:
|
|
37
|
+
memory: "512Mi"
|
|
38
|
+
cpu: "500m"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Namespace
|
|
42
|
+
|
|
43
|
+
```yaml
|
|
44
|
+
apiVersion: v1
|
|
45
|
+
kind: Namespace
|
|
46
|
+
metadata:
|
|
47
|
+
name: {namespace}
|
|
48
|
+
labels:
|
|
49
|
+
name: {namespace}
|
|
50
|
+
environment: {env}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## ConfigMap
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
apiVersion: v1
|
|
57
|
+
kind: ConfigMap
|
|
58
|
+
metadata:
|
|
59
|
+
name: {service-name}-config
|
|
60
|
+
namespace: {namespace}
|
|
61
|
+
data:
|
|
62
|
+
KEY: "value"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## SealedSecret
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
apiVersion: bitnami.com/v1alpha1
|
|
69
|
+
kind: SealedSecret
|
|
70
|
+
metadata:
|
|
71
|
+
name: {service-name}-secret
|
|
72
|
+
namespace: {namespace}
|
|
73
|
+
spec:
|
|
74
|
+
encryptedData:
|
|
75
|
+
SECRET_KEY: AgB... # Encrypted with kubeseal
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Kustomization
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
|
82
|
+
kind: Kustomization
|
|
83
|
+
metadata:
|
|
84
|
+
name: {scope}-{env}
|
|
85
|
+
namespace: flux-system
|
|
86
|
+
spec:
|
|
87
|
+
interval: 1m
|
|
88
|
+
path: ./clusters/{cluster-name}
|
|
89
|
+
prune: true
|
|
90
|
+
sourceRef:
|
|
91
|
+
kind: GitRepository
|
|
92
|
+
name: flux-system
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## ImagePolicy
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
apiVersion: image.toolkit.fluxcd.io/v1beta1
|
|
99
|
+
kind: ImagePolicy
|
|
100
|
+
metadata:
|
|
101
|
+
name: {service-name}
|
|
102
|
+
spec:
|
|
103
|
+
imageRepositoryRef:
|
|
104
|
+
name: {service-name}
|
|
105
|
+
policy:
|
|
106
|
+
semver:
|
|
107
|
+
range: '>=1.0.0'
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Health Probes
|
|
111
|
+
|
|
112
|
+
```yaml
|
|
113
|
+
livenessProbe:
|
|
114
|
+
httpGet:
|
|
115
|
+
path: /health
|
|
116
|
+
port: {port}
|
|
117
|
+
initialDelaySeconds: 30
|
|
118
|
+
periodSeconds: 10
|
|
119
|
+
timeoutSeconds: 5
|
|
120
|
+
failureThreshold: 3
|
|
121
|
+
readinessProbe:
|
|
122
|
+
httpGet:
|
|
123
|
+
path: /ready
|
|
124
|
+
port: {port}
|
|
125
|
+
initialDelaySeconds: 5
|
|
126
|
+
periodSeconds: 5
|
|
127
|
+
timeoutSeconds: 3
|
|
128
|
+
failureThreshold: 3
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Troubleshooting
|
|
132
|
+
|
|
133
|
+
| Issue | Check | Solution |
|
|
134
|
+
|-------|-------|----------|
|
|
135
|
+
| Pod not starting | `kubectl describe pod {name} -n {ns}` | Check events, resource limits, image pull |
|
|
136
|
+
| HelmRelease failed | `flux get helmrelease {name} -n {ns}` | Check chart version, values syntax |
|
|
137
|
+
| Image not found | `kubectl describe pod {name} -n {ns}` | Verify image exists in registry, check tag |
|
|
138
|
+
| Service pending | `kubectl get svc -n {ns}` | Check cloud quotas, subnet/network config |
|
|
139
|
+
| Flux not reconciling | `flux get kustomizations` | Check source sync, path exists |
|
|
140
|
+
|
|
141
|
+
## Post-Push Verification
|
|
142
|
+
|
|
143
|
+
After pushing manifests to Git (T3), verify Flux reconciled successfully. Run each command separately:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
flux reconcile helmrelease {name} -n {namespace} --timeout=30s
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
kubectl wait --for=condition=Ready helmrelease/{name} -n {namespace} --timeout=120s
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
kubectl get helmrelease {name} -n {namespace} -o jsonpath='{.status.conditions[?(@.type=="Ready")]}'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Debug Commands
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
flux get helmrelease {service-name} -n {namespace} --verbose
|
|
161
|
+
kubectl logs -n {namespace} deployment/{service-name} --tail=100
|
|
162
|
+
kubectl get events -n {namespace} --sort-by='.lastTimestamp'
|
|
163
|
+
kubectl top pods -n {namespace}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Resource Limits
|
|
167
|
+
|
|
168
|
+
Always set both requests AND limits:
|
|
169
|
+
|
|
170
|
+
| Size | CPU Req | CPU Lim | Mem Req | Mem Lim |
|
|
171
|
+
|------|---------|---------|---------|---------|
|
|
172
|
+
| Small | 100m | 500m | 256Mi | 512Mi |
|
|
173
|
+
| Medium | 250m | 1000m | 512Mi | 1Gi |
|
|
174
|
+
| Large | 500m | 2000m | 1Gi | 2Gi |
|
|
175
|
+
|
|
176
|
+
## Secrets Management
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
Preference order:
|
|
180
|
+
1. SealedSecrets (Bitnami) — encrypted in Git, decrypted in cluster
|
|
181
|
+
2. External Secrets — from cloud secret store (Secret Manager, Vault)
|
|
182
|
+
3. NEVER plain Kubernetes Secrets in Git
|
|
183
|
+
```
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gmail-policy
|
|
3
|
+
description: Use when managing Gmail messages, labels, or email workflows via gws CLI or Gmail MCP tools
|
|
4
|
+
metadata:
|
|
5
|
+
user-invocable: false
|
|
6
|
+
type: technique
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Gmail Policy
|
|
10
|
+
|
|
11
|
+
## Reading User Intent Before Acting
|
|
12
|
+
|
|
13
|
+
The most common mistake is treating every email-related request as an execution command. Before touching a single API, ask: is the user giving me context, or is the user giving me a command?
|
|
14
|
+
|
|
15
|
+
This is a reasoning step, not a checklist. Run it silently before every response.
|
|
16
|
+
|
|
17
|
+
### The Four Questions
|
|
18
|
+
|
|
19
|
+
1. **Context or command?** Is the user describing a situation, or directing an action?
|
|
20
|
+
2. **If command -- explicit or ambiguous?** Explicit means the verb leaves no doubt (send, dile que sí y envíaselo). Ambiguous means the verb could be draft or send.
|
|
21
|
+
3. **Reversible or sensitive?** A simple scheduling reply is reversible. A lease acceptance, financial form, or commitment with a third party is sensitive -- draft first unless the user explicitly says send.
|
|
22
|
+
4. **Am I in a proactive triage context?** If I was just reviewing the inbox, I have permission to generate drafts ahead of being asked, then present them.
|
|
23
|
+
|
|
24
|
+
### Intent Classification Table
|
|
25
|
+
|
|
26
|
+
| Lo que dice el user | Intent real | Acción correcta |
|
|
27
|
+
|---------------------|-------------|-----------------|
|
|
28
|
+
| "necesito analizar un correo y enviar unos correos importantes" | Contexto -- está contándote el plan, no ejecutando | No hacer nada de envío; esperar el comando específico |
|
|
29
|
+
| "chequea mis correos y ve si hay algo importante" | Review + iniciativa concedida | Leer inbox, triage, **generar drafts** para los que merezcan respuesta, presentar lista al user |
|
|
30
|
+
| "dile que aceptamos y envíaselo" | Comando explícito de envío | Crear y enviar directamente (un solo ciclo T3, no draft→send) |
|
|
31
|
+
| "mándale un correo a X diciéndole Y" | Ambiguo | Preguntar: ¿quiere draft para revisar o envío directo? |
|
|
32
|
+
| "respóndele a Assetplan aceptando" | Ambiguo, tendencia a draft | Default a draft si el contenido involucra datos personales, decisiones comerciales, o formularios |
|
|
33
|
+
| "dile que llego a las 5pm" | Comando simple, contenido reversible | Envío directo está bien sin pasar por draft |
|
|
34
|
+
| "prepara una respuesta para X" | Draft explícito | Crear draft y reportar |
|
|
35
|
+
|
|
36
|
+
### The Anti-Drift Rule
|
|
37
|
+
|
|
38
|
+
There is no fixed pipeline where every send goes through draft→approve→send. That workflow exists as a safety net for sensitive cases, not as the default for every email. When the user says "envíaselo", they mean send -- one T3 approval, one action, done.
|
|
39
|
+
|
|
40
|
+
The question is not "should I always draft first?" The question is: **what did the user actually ask for, and how reversible is this action?**
|
|
41
|
+
|
|
42
|
+
If you're uncertain, ask once. Do not silently choose draft when the user said send.
|
|
43
|
+
|
|
44
|
+
## Proactive Draft Generation (Triage Context)
|
|
45
|
+
|
|
46
|
+
During a triage or inbox review session ("chequea mis correos", "ve si hay algo importante"), the user grants implicit permission for proactive drafts. You do not need to ask for approval before creating each one.
|
|
47
|
+
|
|
48
|
+
Pattern:
|
|
49
|
+
1. Read inbox, identify threads that clearly need a response
|
|
50
|
+
2. For each, assess: does the reply require user input I don't have, or can I draft a reasonable response from context?
|
|
51
|
+
3. If draftable -- draft it. Store the draft in Gmail. Note the draft ID.
|
|
52
|
+
4. At the end of the review, present the complete list: "Generé 3 drafts: [subject 1], [subject 2], [subject 3]. ¿Quieres revisarlos?"
|
|
53
|
+
|
|
54
|
+
The user reviews and approves individual drafts before sending. The generation step does not require one-by-one confirmation -- the presentation step does.
|
|
55
|
+
|
|
56
|
+
Do not generate drafts proactively outside triage context. If the user opens a conversation about a single email, default to their explicit instruction.
|
|
57
|
+
|
|
58
|
+
## Sending: When Draft and When Direct
|
|
59
|
+
|
|
60
|
+
| Scenario | Default action |
|
|
61
|
+
|----------|---------------|
|
|
62
|
+
| User says "envíaselo" / "mándalo" / "dile que sí y envíaselo" | Send direct -- T3 approval for `send`, not for draft then send again |
|
|
63
|
+
| User says "prepara una respuesta" / "redacta" | Draft |
|
|
64
|
+
| Reply contains PII (RUT, cuenta bancaria, dirección, DOB) | Draft even if user said "mándale" -- confirm before send |
|
|
65
|
+
| Reply is a business commitment (arrendamiento, contrato, formulario) | Draft unless user explicitly says send |
|
|
66
|
+
| Simple logistics (hora, confirmación de asistencia, "llegaré tarde") | Direct send fine |
|
|
67
|
+
| Ambiguous command + first time with this recipient | Ask once |
|
|
68
|
+
|
|
69
|
+
When you do create a draft, verify it with `gws gmail users drafts list` and report the draft ID and snippet to the user. This closes the loop.
|
|
70
|
+
|
|
71
|
+
## Multi-Source Data Completion
|
|
72
|
+
|
|
73
|
+
Before asking the user for a datum (RUT, dirección, cuenta bancaria, etc.), check these sources in order:
|
|
74
|
+
|
|
75
|
+
1. **Other Gmail threads** (priority 1) -- search for related threads. A user's RUT might appear in a Colmena thread. A property address might appear in a previous landlord thread. Connecting emails is the preferred path.
|
|
76
|
+
2. **Local structured documents** -- `~/Documents/personal/**/data.json`, spreadsheets
|
|
77
|
+
3. **PDFs** -- notarial documents (compraventa, hipoteca, tasación) carry DOB, nationality, m², civil status
|
|
78
|
+
4. Only ask the user for data not found in any source
|
|
79
|
+
|
|
80
|
+
When you find data in another thread, cite the source: "Tu RUT lo saqué de un correo de Colmena del 2024-03." This builds trust and shows the search was real.
|
|
81
|
+
|
|
82
|
+
## PII Hygiene
|
|
83
|
+
|
|
84
|
+
Any `.eml` or temporary file containing PII (RUT, cuenta bancaria, teléfono, DOB, dirección) must be deleted with `rm` after the draft is created. Verify deletion with Glob or `ls`. Report: "Archivo temporal eliminado."
|
|
85
|
+
|
|
86
|
+
## Security Tier Classification
|
|
87
|
+
|
|
88
|
+
| Operation | Tier | Notes |
|
|
89
|
+
|-----------|------|-------|
|
|
90
|
+
| `gws gmail users messages list` | T0 | Search/filter messages |
|
|
91
|
+
| `gws gmail users messages get` | T0 | Read message content |
|
|
92
|
+
| `gws gmail users labels list` | T0 | List available labels |
|
|
93
|
+
| `gws gmail users labels get` | T0 | Read label details |
|
|
94
|
+
| `gws gmail +search` | T0 | Macro search (syntactic sugar over list) |
|
|
95
|
+
| `gws gmail users messages modify --addLabelIds` | T0 | Add any `_gaia/*` label (non-destructive) |
|
|
96
|
+
| `gws gmail users messages modify --removeLabelIds` | T2 | Changes message visibility |
|
|
97
|
+
| `gws gmail users messages modify` (action→waiting after send) | T2 | Auto-transition after user reply -- logged, no approval |
|
|
98
|
+
| `gws gmail users drafts create` | T3 | Creates draft on user's behalf |
|
|
99
|
+
| `gws gmail users drafts list` | T0 | Verify draft was created |
|
|
100
|
+
| `gws gmail +reply --message-id --body` | T3 | Sends reply on user's behalf |
|
|
101
|
+
| `gws gmail users messages send --params` | T3 | Sends/replies via raw RFC 2822 |
|
|
102
|
+
| `gws gmail users labels create` | T3 | Creates new label |
|
|
103
|
+
|
|
104
|
+
### Blocked Operations
|
|
105
|
+
|
|
106
|
+
Permanently denied by the hook -- `gmail.modify` OAuth scope excludes delete at the API level.
|
|
107
|
+
|
|
108
|
+
| Operation | Reason |
|
|
109
|
+
|-----------|--------|
|
|
110
|
+
| `gws gmail users messages delete` | Permanent, unrecoverable |
|
|
111
|
+
| `gws gmail users messages trash` | Moves to trash (use `_gaia/trash` label instead) |
|
|
112
|
+
| `gws gmail users messages purge` | Permanent purge |
|
|
113
|
+
| `gws gmail users drafts delete` | Draft deletion |
|
|
114
|
+
|
|
115
|
+
### Macro Prefix Handling
|
|
116
|
+
|
|
117
|
+
`gws` CLI exposes convenience macros prefixed with `+` (e.g. `+reply`, `+send`, `+search`). The hook strips the leading `+` before the verb taxonomy lookup inside `detect_mutative_command()`, so each macro classifies like its base verb:
|
|
118
|
+
|
|
119
|
+
- `gws gmail +reply` → token `reply` → match in MUTATIVE_VERBS → T3 block
|
|
120
|
+
- `gws gmail +send` → token `send` → match in MUTATIVE_VERBS → T3 block
|
|
121
|
+
- `gws gmail +search` → token `search` → match in READ_ONLY_VERBS → safe
|
|
122
|
+
|
|
123
|
+
Fix applied 2026-04-17 in `hooks/modules/security/mutative_verbs.py` after a `+reply` invocation slipped through as "safe by elimination" during a Gmail session.
|
|
124
|
+
|
|
125
|
+
## Sending Replies
|
|
126
|
+
|
|
127
|
+
### When to use `+reply` vs `send --params`
|
|
128
|
+
|
|
129
|
+
| Use case | Command | Pros | Cons |
|
|
130
|
+
|----------|---------|------|------|
|
|
131
|
+
| Simple plaintext reply | `gws gmail +reply --message-id <id> --body "<text>"` | Simple, handles threading headers automatically | Plaintext only, no HTML, no collapsed quote, no signature |
|
|
132
|
+
| HTML reply with signature + collapsed quote | `gws gmail users messages send --params '{"userId":"me","threadId":"<tid>","raw":"<base64url>"}'` | Full control over MIME, looks native in Gmail | Must construct RFC 2822 manually and base64url-encode |
|
|
133
|
+
|
|
134
|
+
Use `+reply` for quick operational replies where formatting does not matter. Use `send --params` when the recipient will see the mail in a mail client and visual quality matters.
|
|
135
|
+
|
|
136
|
+
For the correct `gws gmail users drafts create` schema, RFC 2822 template, base64url encoding pipeline, and other technical patterns -- see `reference.md` in this skill directory.
|
|
137
|
+
|
|
138
|
+
## Label Convention
|
|
139
|
+
|
|
140
|
+
### Workflow Labels (Layer 0 -- `_gaia/*`)
|
|
141
|
+
|
|
142
|
+
| Label | Purpose | Lifecycle |
|
|
143
|
+
|-------|---------|-----------|
|
|
144
|
+
| `_gaia/action` | I need to do something (respond, pay, read) | Clears when user acts → moves to `waiting` or removed |
|
|
145
|
+
| `_gaia/waiting` | I already acted, waiting for the other party | Clears when other party responds → back to `action` or removed |
|
|
146
|
+
| `_gaia/someday` | Interesting but no urgency (promos, articles, ideas) | Resurfaces in weekly review, user clears manually |
|
|
147
|
+
| `_gaia/pending` | Staging area during mass triage | Empties during triage sessions |
|
|
148
|
+
| `_gaia/trash` | Soft delete | Accumulates, user reviews |
|
|
149
|
+
|
|
150
|
+
No `_gaia/*` label = processed/done. No extra label needed.
|
|
151
|
+
|
|
152
|
+
### State Transitions
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
inbox ──→ action (user or AI: I need to act)
|
|
156
|
+
inbox ──→ waiting (AI detects user already replied in thread)
|
|
157
|
+
inbox ──→ someday (user defers, no urgency)
|
|
158
|
+
inbox ──→ trash (not wanted)
|
|
159
|
+
inbox ──→ pending (mass triage staging)
|
|
160
|
+
|
|
161
|
+
action ──→ waiting (user replied/acted → auto T1 transition)
|
|
162
|
+
action ──→ done (handled, no follow-up → remove label)
|
|
163
|
+
action ──→ someday (user defers)
|
|
164
|
+
|
|
165
|
+
waiting ──→ action (other party replied → needs user attention)
|
|
166
|
+
waiting ──→ done (resolved → remove label)
|
|
167
|
+
|
|
168
|
+
someday ──→ action (user decides to act)
|
|
169
|
+
someday ──→ trash (not worth it)
|
|
170
|
+
someday ──→ done (reviewed, no action needed → remove label)
|
|
171
|
+
|
|
172
|
+
pending ──→ {action, waiting, someday, trash, done} (triage output)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Calendar Rule
|
|
176
|
+
|
|
177
|
+
When an email contains a specific date/time deadline (bill due date, event, appointment): create a calendar event AND label the email `_gaia/action`. The calendar is the time-trigger; the label is the state-tracker.
|
|
178
|
+
|
|
179
|
+
### Content Labels (Layer 1)
|
|
180
|
+
|
|
181
|
+
| Category | Labels |
|
|
182
|
+
|----------|--------|
|
|
183
|
+
| Finance | `Finance/Bank`, `Finance/Transfers`, `Finance/Insurance` |
|
|
184
|
+
| Jobs | `Jobs/Alerts`, `Jobs/Academic` |
|
|
185
|
+
| Shopping | `Shopping/Promos`, `Shopping/Orders` |
|
|
186
|
+
| Music | `Music/Nucleo`, `Music/DJ` |
|
|
187
|
+
| Social | `Social/LinkedIn`, `Social/Facebook` |
|
|
188
|
+
| Services | `Services/Subscriptions`, `Services/Utilities` |
|
|
189
|
+
| Tech | `Tech/Programming`, `Tech/SalesForce` |
|
|
190
|
+
| Personal | `Personal/Notes`, `Personal/Travel`, `Personal/Downloads` |
|
|
191
|
+
| Legacy | `_gaia/legacy` -- retired: Buzz!!, Isercon, WaReS, +1, multi-forward, GDrive, PokerStar |
|
|
192
|
+
|
|
193
|
+
## OAuth Scope
|
|
194
|
+
|
|
195
|
+
Use `gmail.modify` scope (read + label + move, no delete). Full access scope (`https://mail.google.com/`) is blocked -- it includes delete permissions that bypass both hook and label controls.
|
|
196
|
+
|
|
197
|
+
## Related Skills
|
|
198
|
+
|
|
199
|
+
- `gmail-triage` -- interactive triage workflow
|
|
200
|
+
- `gws-setup` -- CLI installation and authentication
|