@jaguilar87/gaia 5.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +26 -0
  3. package/ARCHITECTURE.md +335 -0
  4. package/CHANGELOG.md +1298 -0
  5. package/CODE_OF_CONDUCT.md +11 -0
  6. package/CONTRIBUTING.md +146 -0
  7. package/INSTALL.md +436 -0
  8. package/LICENSE +21 -0
  9. package/README.md +222 -0
  10. package/SECURITY.md +47 -0
  11. package/agents/README.md +78 -0
  12. package/agents/cloud-troubleshooter.md +73 -0
  13. package/agents/developer.md +65 -0
  14. package/agents/gaia-operator.md +64 -0
  15. package/agents/gaia-orchestrator.md +111 -0
  16. package/agents/gaia-planner.md +53 -0
  17. package/agents/gaia-system.md +71 -0
  18. package/agents/gitops-operator.md +61 -0
  19. package/agents/terraform-architect.md +63 -0
  20. package/bin/README.md +106 -0
  21. package/bin/cli/__init__.py +1 -0
  22. package/bin/cli/approvals.py +740 -0
  23. package/bin/cli/cleanup.py +562 -0
  24. package/bin/cli/context.py +283 -0
  25. package/bin/cli/doctor.py +651 -0
  26. package/bin/cli/history.py +305 -0
  27. package/bin/cli/memory.py +483 -0
  28. package/bin/cli/metrics.py +1068 -0
  29. package/bin/cli/plans.py +515 -0
  30. package/bin/cli/status.py +302 -0
  31. package/bin/cli/update.py +382 -0
  32. package/bin/gaia +112 -0
  33. package/bin/gaia-cleanup.js +531 -0
  34. package/bin/gaia-doctor.js +635 -0
  35. package/bin/gaia-evidence +126 -0
  36. package/bin/gaia-history.js +251 -0
  37. package/bin/gaia-metrics.js +1278 -0
  38. package/bin/gaia-review.js +269 -0
  39. package/bin/gaia-scan +44 -0
  40. package/bin/gaia-scan.py +589 -0
  41. package/bin/gaia-skills-diagnose.js +929 -0
  42. package/bin/gaia-status.js +278 -0
  43. package/bin/gaia-uninstall.js +111 -0
  44. package/bin/gaia-update.js +919 -0
  45. package/bin/pre-publish-validate.js +610 -0
  46. package/bin/python-detect.js +60 -0
  47. package/bin/validate-sandbox.sh +601 -0
  48. package/commands/README.md +64 -0
  49. package/commands/gaia.md +37 -0
  50. package/commands/scan-project.md +67 -0
  51. package/config/README.md +71 -0
  52. package/config/cloud/aws.json +134 -0
  53. package/config/cloud/gcp.json +139 -0
  54. package/config/context-contracts.json +158 -0
  55. package/config/crons-schema.md +81 -0
  56. package/config/git_standards.json +72 -0
  57. package/config/surface-routing.json +417 -0
  58. package/config/universal-rules.json +102 -0
  59. package/dist/gaia-ops/.claude-plugin/plugin.json +24 -0
  60. package/dist/gaia-ops/README.md +80 -0
  61. package/dist/gaia-ops/agents/cloud-troubleshooter.md +73 -0
  62. package/dist/gaia-ops/agents/developer.md +65 -0
  63. package/dist/gaia-ops/agents/gaia-operator.md +64 -0
  64. package/dist/gaia-ops/agents/gaia-orchestrator.md +111 -0
  65. package/dist/gaia-ops/agents/gaia-planner.md +53 -0
  66. package/dist/gaia-ops/agents/gaia-system.md +71 -0
  67. package/dist/gaia-ops/agents/gitops-operator.md +61 -0
  68. package/dist/gaia-ops/agents/terraform-architect.md +63 -0
  69. package/dist/gaia-ops/commands/gaia.md +37 -0
  70. package/dist/gaia-ops/config/README.md +71 -0
  71. package/dist/gaia-ops/config/cloud/aws.json +134 -0
  72. package/dist/gaia-ops/config/cloud/gcp.json +139 -0
  73. package/dist/gaia-ops/config/context-contracts.json +158 -0
  74. package/dist/gaia-ops/config/crons-schema.md +81 -0
  75. package/dist/gaia-ops/config/git_standards.json +72 -0
  76. package/dist/gaia-ops/config/surface-routing.json +417 -0
  77. package/dist/gaia-ops/config/universal-rules.json +102 -0
  78. package/dist/gaia-ops/hooks/adapters/__init__.py +52 -0
  79. package/dist/gaia-ops/hooks/adapters/base.py +219 -0
  80. package/dist/gaia-ops/hooks/adapters/channel.py +17 -0
  81. package/dist/gaia-ops/hooks/adapters/claude_code.py +1890 -0
  82. package/dist/gaia-ops/hooks/adapters/types.py +194 -0
  83. package/dist/gaia-ops/hooks/adapters/utils.py +25 -0
  84. package/dist/gaia-ops/hooks/hooks.json +192 -0
  85. package/dist/gaia-ops/hooks/modules/__init__.py +15 -0
  86. package/dist/gaia-ops/hooks/modules/agents/__init__.py +29 -0
  87. package/dist/gaia-ops/hooks/modules/agents/contract_validator.py +647 -0
  88. package/dist/gaia-ops/hooks/modules/agents/response_contract.py +496 -0
  89. package/dist/gaia-ops/hooks/modules/agents/skill_injection_verifier.py +120 -0
  90. package/dist/gaia-ops/hooks/modules/agents/state_tracker.py +267 -0
  91. package/dist/gaia-ops/hooks/modules/agents/task_info_builder.py +74 -0
  92. package/dist/gaia-ops/hooks/modules/agents/transcript_analyzer.py +458 -0
  93. package/dist/gaia-ops/hooks/modules/agents/transcript_reader.py +152 -0
  94. package/dist/gaia-ops/hooks/modules/audit/__init__.py +28 -0
  95. package/dist/gaia-ops/hooks/modules/audit/event_detector.py +168 -0
  96. package/dist/gaia-ops/hooks/modules/audit/logger.py +131 -0
  97. package/dist/gaia-ops/hooks/modules/audit/metrics.py +134 -0
  98. package/dist/gaia-ops/hooks/modules/audit/workflow_auditor.py +611 -0
  99. package/dist/gaia-ops/hooks/modules/audit/workflow_recorder.py +296 -0
  100. package/dist/gaia-ops/hooks/modules/context/__init__.py +11 -0
  101. package/dist/gaia-ops/hooks/modules/context/agentic_loop_detector.py +165 -0
  102. package/dist/gaia-ops/hooks/modules/context/anchor_tracker.py +317 -0
  103. package/dist/gaia-ops/hooks/modules/context/compact_context_builder.py +218 -0
  104. package/dist/gaia-ops/hooks/modules/context/context_freshness.py +145 -0
  105. package/dist/gaia-ops/hooks/modules/context/context_injector.py +558 -0
  106. package/dist/gaia-ops/hooks/modules/context/context_writer.py +530 -0
  107. package/dist/gaia-ops/hooks/modules/context/contracts_loader.py +161 -0
  108. package/dist/gaia-ops/hooks/modules/core/__init__.py +40 -0
  109. package/dist/gaia-ops/hooks/modules/core/hook_entry.py +78 -0
  110. package/dist/gaia-ops/hooks/modules/core/paths.py +160 -0
  111. package/dist/gaia-ops/hooks/modules/core/plugin_mode.py +149 -0
  112. package/dist/gaia-ops/hooks/modules/core/plugin_setup.py +577 -0
  113. package/dist/gaia-ops/hooks/modules/core/state.py +179 -0
  114. package/dist/gaia-ops/hooks/modules/core/stdin.py +24 -0
  115. package/dist/gaia-ops/hooks/modules/events/__init__.py +1 -0
  116. package/dist/gaia-ops/hooks/modules/events/event_writer.py +210 -0
  117. package/dist/gaia-ops/hooks/modules/memory/__init__.py +8 -0
  118. package/dist/gaia-ops/hooks/modules/memory/episode_writer.py +216 -0
  119. package/dist/gaia-ops/hooks/modules/orchestrator/__init__.py +1 -0
  120. package/dist/gaia-ops/hooks/modules/orchestrator/delegate_mode.py +122 -0
  121. package/dist/gaia-ops/hooks/modules/scanning/__init__.py +8 -0
  122. package/dist/gaia-ops/hooks/modules/scanning/scan_trigger.py +84 -0
  123. package/dist/gaia-ops/hooks/modules/security/__init__.py +120 -0
  124. package/dist/gaia-ops/hooks/modules/security/approval_cleanup.py +87 -0
  125. package/dist/gaia-ops/hooks/modules/security/approval_constants.py +23 -0
  126. package/dist/gaia-ops/hooks/modules/security/approval_grants.py +1638 -0
  127. package/dist/gaia-ops/hooks/modules/security/approval_messages.py +71 -0
  128. package/dist/gaia-ops/hooks/modules/security/approval_scopes.py +222 -0
  129. package/dist/gaia-ops/hooks/modules/security/blocked_commands.py +595 -0
  130. package/dist/gaia-ops/hooks/modules/security/blocked_message_formatter.py +87 -0
  131. package/dist/gaia-ops/hooks/modules/security/command_semantics.py +181 -0
  132. package/dist/gaia-ops/hooks/modules/security/composition_rules.py +547 -0
  133. package/dist/gaia-ops/hooks/modules/security/flag_classifiers.py +873 -0
  134. package/dist/gaia-ops/hooks/modules/security/gitops_validator.py +179 -0
  135. package/dist/gaia-ops/hooks/modules/security/mutative_verbs.py +1131 -0
  136. package/dist/gaia-ops/hooks/modules/security/network_hosts.py +481 -0
  137. package/dist/gaia-ops/hooks/modules/security/prompt_validator.py +40 -0
  138. package/dist/gaia-ops/hooks/modules/security/shell_unwrapper.py +165 -0
  139. package/dist/gaia-ops/hooks/modules/security/tiers.py +196 -0
  140. package/dist/gaia-ops/hooks/modules/session/__init__.py +10 -0
  141. package/dist/gaia-ops/hooks/modules/session/pending_scanner.py +174 -0
  142. package/dist/gaia-ops/hooks/modules/session/session_context_writer.py +100 -0
  143. package/dist/gaia-ops/hooks/modules/session/session_event_injector.py +160 -0
  144. package/dist/gaia-ops/hooks/modules/session/session_manager.py +31 -0
  145. package/dist/gaia-ops/hooks/modules/session/session_registry.py +333 -0
  146. package/dist/gaia-ops/hooks/modules/tools/__init__.py +29 -0
  147. package/dist/gaia-ops/hooks/modules/tools/bash_validator.py +1008 -0
  148. package/dist/gaia-ops/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  149. package/dist/gaia-ops/hooks/modules/tools/hook_response.py +55 -0
  150. package/dist/gaia-ops/hooks/modules/tools/shell_parser.py +227 -0
  151. package/dist/gaia-ops/hooks/modules/tools/stage_decomposer.py +315 -0
  152. package/dist/gaia-ops/hooks/modules/tools/task_validator.py +294 -0
  153. package/dist/gaia-ops/hooks/modules/validation/__init__.py +23 -0
  154. package/dist/gaia-ops/hooks/modules/validation/commit_validator.py +380 -0
  155. package/dist/gaia-ops/hooks/post_compact.py +43 -0
  156. package/dist/gaia-ops/hooks/post_tool_use.py +54 -0
  157. package/dist/gaia-ops/hooks/pre_compact.py +60 -0
  158. package/dist/gaia-ops/hooks/pre_tool_use.py +413 -0
  159. package/dist/gaia-ops/hooks/session_end_hook.py +77 -0
  160. package/dist/gaia-ops/hooks/session_start.py +81 -0
  161. package/dist/gaia-ops/hooks/stop_hook.py +70 -0
  162. package/dist/gaia-ops/hooks/subagent_start.py +71 -0
  163. package/dist/gaia-ops/hooks/subagent_stop.py +295 -0
  164. package/dist/gaia-ops/hooks/task_completed.py +70 -0
  165. package/dist/gaia-ops/hooks/user_prompt_submit.py +246 -0
  166. package/dist/gaia-ops/settings.json +72 -0
  167. package/dist/gaia-ops/skills/README.md +158 -0
  168. package/dist/gaia-ops/skills/agent-creation/SKILL.md +87 -0
  169. package/dist/gaia-ops/skills/agent-creation/examples.md +170 -0
  170. package/dist/gaia-ops/skills/agent-creation/reference.md +191 -0
  171. package/dist/gaia-ops/skills/agent-protocol/SKILL.md +93 -0
  172. package/dist/gaia-ops/skills/agent-protocol/examples.md +223 -0
  173. package/dist/gaia-ops/skills/agent-response/SKILL.md +69 -0
  174. package/dist/gaia-ops/skills/agentic-loop/SKILL.md +80 -0
  175. package/dist/gaia-ops/skills/agentic-loop/reference.md +378 -0
  176. package/dist/gaia-ops/skills/blog-writing/SKILL.md +98 -0
  177. package/dist/gaia-ops/skills/blog-writing/reference.md +130 -0
  178. package/dist/gaia-ops/skills/brief-spec/SKILL.md +185 -0
  179. package/dist/gaia-ops/skills/command-execution/SKILL.md +64 -0
  180. package/dist/gaia-ops/skills/command-execution/reference.md +83 -0
  181. package/dist/gaia-ops/skills/context-updater/SKILL.md +87 -0
  182. package/dist/gaia-ops/skills/context-updater/examples.md +71 -0
  183. package/dist/gaia-ops/skills/developer-patterns/SKILL.md +50 -0
  184. package/dist/gaia-ops/skills/developer-patterns/reference.md +112 -0
  185. package/dist/gaia-ops/skills/execution/SKILL.md +99 -0
  186. package/dist/gaia-ops/skills/fast-queries/SKILL.md +43 -0
  187. package/dist/gaia-ops/skills/gaia-compact/SKILL.md +74 -0
  188. package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +108 -0
  189. package/dist/gaia-ops/skills/gaia-patterns/reference.md +395 -0
  190. package/dist/gaia-ops/skills/gaia-planner/SKILL.md +37 -0
  191. package/dist/gaia-ops/skills/gaia-planner/reference.md +107 -0
  192. package/dist/gaia-ops/skills/gaia-release/SKILL.md +85 -0
  193. package/dist/gaia-ops/skills/gaia-release/reference.md +92 -0
  194. package/dist/gaia-ops/skills/gaia-self-check/SKILL.md +114 -0
  195. package/dist/gaia-ops/skills/gaia-self-check/reference.md +453 -0
  196. package/dist/gaia-ops/skills/gaia-verify/SKILL.md +77 -0
  197. package/dist/gaia-ops/skills/gaia-verify/reference.md +80 -0
  198. package/dist/gaia-ops/skills/git-conventions/SKILL.md +47 -0
  199. package/dist/gaia-ops/skills/gitops-patterns/SKILL.md +60 -0
  200. package/dist/gaia-ops/skills/gitops-patterns/reference.md +183 -0
  201. package/dist/gaia-ops/skills/gmail-policy/SKILL.md +200 -0
  202. package/dist/gaia-ops/skills/gmail-policy/reference.md +150 -0
  203. package/dist/gaia-ops/skills/gmail-triage/SKILL.md +100 -0
  204. package/dist/gaia-ops/skills/gws-setup/SKILL.md +99 -0
  205. package/dist/gaia-ops/skills/gws-setup/reference.md +73 -0
  206. package/dist/gaia-ops/skills/investigation/SKILL.md +100 -0
  207. package/dist/gaia-ops/skills/memory-curation/SKILL.md +83 -0
  208. package/dist/gaia-ops/skills/memory-search/SKILL.md +88 -0
  209. package/dist/gaia-ops/skills/orchestrator-approval/SKILL.md +160 -0
  210. package/dist/gaia-ops/skills/orchestrator-approval/reference.md +174 -0
  211. package/dist/gaia-ops/skills/pending-approvals/SKILL.md +72 -0
  212. package/dist/gaia-ops/skills/pending-approvals/reference.md +214 -0
  213. package/dist/gaia-ops/skills/readme-writing/SKILL.md +71 -0
  214. package/dist/gaia-ops/skills/readme-writing/reference.md +188 -0
  215. package/dist/gaia-ops/skills/reference.md +135 -0
  216. package/dist/gaia-ops/skills/request-approval/SKILL.md +140 -0
  217. package/dist/gaia-ops/skills/request-approval/examples.md +140 -0
  218. package/dist/gaia-ops/skills/request-approval/reference.md +57 -0
  219. package/dist/gaia-ops/skills/schedule-task/SKILL.md +64 -0
  220. package/dist/gaia-ops/skills/schedule-task/reference.md +233 -0
  221. package/dist/gaia-ops/skills/security-tiers/SKILL.md +141 -0
  222. package/dist/gaia-ops/skills/security-tiers/destructive-commands-reference.md +623 -0
  223. package/dist/gaia-ops/skills/security-tiers/reference.md +39 -0
  224. package/dist/gaia-ops/skills/session-reflection/SKILL.md +69 -0
  225. package/dist/gaia-ops/skills/skill-creation/SKILL.md +92 -0
  226. package/dist/gaia-ops/skills/skill-creation/reference.md +29 -0
  227. package/dist/gaia-ops/skills/terraform-patterns/SKILL.md +89 -0
  228. package/dist/gaia-ops/skills/terraform-patterns/reference.md +93 -0
  229. package/dist/gaia-ops/tools/__init__.py +9 -0
  230. package/dist/gaia-ops/tools/agentic-loop/decide-status.py +210 -0
  231. package/dist/gaia-ops/tools/agentic-loop/parse-metric.py +106 -0
  232. package/dist/gaia-ops/tools/agentic-loop/record-iteration.py +221 -0
  233. package/dist/gaia-ops/tools/context/README.md +132 -0
  234. package/dist/gaia-ops/tools/context/__init__.py +42 -0
  235. package/dist/gaia-ops/tools/context/_paths.py +20 -0
  236. package/dist/gaia-ops/tools/context/context_provider.py +721 -0
  237. package/dist/gaia-ops/tools/context/context_section_reader.py +342 -0
  238. package/dist/gaia-ops/tools/context/deep_merge.py +159 -0
  239. package/dist/gaia-ops/tools/context/pending_updates.py +760 -0
  240. package/dist/gaia-ops/tools/context/surface_router.py +278 -0
  241. package/dist/gaia-ops/tools/fast-queries/README.md +65 -0
  242. package/dist/gaia-ops/tools/fast-queries/__init__.py +30 -0
  243. package/dist/gaia-ops/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
  244. package/dist/gaia-ops/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
  245. package/dist/gaia-ops/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
  246. package/dist/gaia-ops/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
  247. package/dist/gaia-ops/tools/fast-queries/run_triage.sh +59 -0
  248. package/dist/gaia-ops/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
  249. package/dist/gaia-ops/tools/gaia_simulator/__init__.py +33 -0
  250. package/dist/gaia-ops/tools/gaia_simulator/cli.py +354 -0
  251. package/dist/gaia-ops/tools/gaia_simulator/extractor.py +457 -0
  252. package/dist/gaia-ops/tools/gaia_simulator/reporter.py +258 -0
  253. package/dist/gaia-ops/tools/gaia_simulator/routing_simulator.py +334 -0
  254. package/dist/gaia-ops/tools/gaia_simulator/runner.py +539 -0
  255. package/dist/gaia-ops/tools/gaia_simulator/skills_mapper.py +264 -0
  256. package/dist/gaia-ops/tools/memory/README.md +0 -0
  257. package/dist/gaia-ops/tools/memory/__init__.py +20 -0
  258. package/dist/gaia-ops/tools/memory/backfill_fts5.py +107 -0
  259. package/dist/gaia-ops/tools/memory/conflict_detector.py +295 -0
  260. package/dist/gaia-ops/tools/memory/episodic.py +1210 -0
  261. package/dist/gaia-ops/tools/memory/git_invalidator.py +262 -0
  262. package/dist/gaia-ops/tools/memory/paths.py +102 -0
  263. package/dist/gaia-ops/tools/memory/scoring.py +193 -0
  264. package/dist/gaia-ops/tools/memory/search_store.py +375 -0
  265. package/dist/gaia-ops/tools/persist_transcript_analysis.py +85 -0
  266. package/dist/gaia-ops/tools/review/__init__.py +1 -0
  267. package/dist/gaia-ops/tools/review/review_engine.py +157 -0
  268. package/dist/gaia-ops/tools/scan/__init__.py +35 -0
  269. package/dist/gaia-ops/tools/scan/config.py +247 -0
  270. package/dist/gaia-ops/tools/scan/merge.py +212 -0
  271. package/dist/gaia-ops/tools/scan/orchestrator.py +549 -0
  272. package/dist/gaia-ops/tools/scan/registry.py +127 -0
  273. package/dist/gaia-ops/tools/scan/scanners/__init__.py +18 -0
  274. package/dist/gaia-ops/tools/scan/scanners/base.py +137 -0
  275. package/dist/gaia-ops/tools/scan/scanners/environment.py +349 -0
  276. package/dist/gaia-ops/tools/scan/scanners/git.py +570 -0
  277. package/dist/gaia-ops/tools/scan/scanners/infrastructure.py +875 -0
  278. package/dist/gaia-ops/tools/scan/scanners/orchestration.py +600 -0
  279. package/dist/gaia-ops/tools/scan/scanners/stack.py +1085 -0
  280. package/dist/gaia-ops/tools/scan/scanners/tools.py +260 -0
  281. package/dist/gaia-ops/tools/scan/setup.py +686 -0
  282. package/dist/gaia-ops/tools/scan/tests/__init__.py +1 -0
  283. package/dist/gaia-ops/tools/scan/tests/conftest.py +796 -0
  284. package/dist/gaia-ops/tools/scan/tests/test_environment.py +323 -0
  285. package/dist/gaia-ops/tools/scan/tests/test_git.py +419 -0
  286. package/dist/gaia-ops/tools/scan/tests/test_infrastructure.py +382 -0
  287. package/dist/gaia-ops/tools/scan/tests/test_integration.py +920 -0
  288. package/dist/gaia-ops/tools/scan/tests/test_merge.py +269 -0
  289. package/dist/gaia-ops/tools/scan/tests/test_orchestration.py +304 -0
  290. package/dist/gaia-ops/tools/scan/tests/test_stack.py +604 -0
  291. package/dist/gaia-ops/tools/scan/tests/test_tools.py +349 -0
  292. package/dist/gaia-ops/tools/scan/ui.py +624 -0
  293. package/dist/gaia-ops/tools/scan/verify.py +270 -0
  294. package/dist/gaia-ops/tools/scan/walk.py +118 -0
  295. package/dist/gaia-ops/tools/scan/workspace.py +85 -0
  296. package/dist/gaia-ops/tools/validation/README.md +244 -0
  297. package/dist/gaia-ops/tools/validation/__init__.py +17 -0
  298. package/dist/gaia-ops/tools/validation/approval_gate.py +321 -0
  299. package/dist/gaia-ops/tools/validation/validate_skills.py +189 -0
  300. package/dist/gaia-security/.claude-plugin/plugin.json +24 -0
  301. package/dist/gaia-security/README.md +90 -0
  302. package/dist/gaia-security/config/universal-rules.json +102 -0
  303. package/dist/gaia-security/hooks/adapters/__init__.py +52 -0
  304. package/dist/gaia-security/hooks/adapters/base.py +219 -0
  305. package/dist/gaia-security/hooks/adapters/channel.py +17 -0
  306. package/dist/gaia-security/hooks/adapters/claude_code.py +1890 -0
  307. package/dist/gaia-security/hooks/adapters/types.py +194 -0
  308. package/dist/gaia-security/hooks/adapters/utils.py +25 -0
  309. package/dist/gaia-security/hooks/hooks.json +113 -0
  310. package/dist/gaia-security/hooks/modules/__init__.py +15 -0
  311. package/dist/gaia-security/hooks/modules/agents/__init__.py +29 -0
  312. package/dist/gaia-security/hooks/modules/agents/contract_validator.py +647 -0
  313. package/dist/gaia-security/hooks/modules/agents/response_contract.py +496 -0
  314. package/dist/gaia-security/hooks/modules/agents/skill_injection_verifier.py +120 -0
  315. package/dist/gaia-security/hooks/modules/agents/state_tracker.py +267 -0
  316. package/dist/gaia-security/hooks/modules/agents/task_info_builder.py +74 -0
  317. package/dist/gaia-security/hooks/modules/agents/transcript_analyzer.py +458 -0
  318. package/dist/gaia-security/hooks/modules/agents/transcript_reader.py +152 -0
  319. package/dist/gaia-security/hooks/modules/audit/__init__.py +28 -0
  320. package/dist/gaia-security/hooks/modules/audit/event_detector.py +168 -0
  321. package/dist/gaia-security/hooks/modules/audit/logger.py +131 -0
  322. package/dist/gaia-security/hooks/modules/audit/metrics.py +134 -0
  323. package/dist/gaia-security/hooks/modules/audit/workflow_auditor.py +611 -0
  324. package/dist/gaia-security/hooks/modules/audit/workflow_recorder.py +296 -0
  325. package/dist/gaia-security/hooks/modules/context/__init__.py +11 -0
  326. package/dist/gaia-security/hooks/modules/context/agentic_loop_detector.py +165 -0
  327. package/dist/gaia-security/hooks/modules/context/anchor_tracker.py +317 -0
  328. package/dist/gaia-security/hooks/modules/context/compact_context_builder.py +218 -0
  329. package/dist/gaia-security/hooks/modules/context/context_freshness.py +145 -0
  330. package/dist/gaia-security/hooks/modules/context/context_injector.py +558 -0
  331. package/dist/gaia-security/hooks/modules/context/context_writer.py +530 -0
  332. package/dist/gaia-security/hooks/modules/context/contracts_loader.py +161 -0
  333. package/dist/gaia-security/hooks/modules/core/__init__.py +40 -0
  334. package/dist/gaia-security/hooks/modules/core/hook_entry.py +78 -0
  335. package/dist/gaia-security/hooks/modules/core/paths.py +160 -0
  336. package/dist/gaia-security/hooks/modules/core/plugin_mode.py +149 -0
  337. package/dist/gaia-security/hooks/modules/core/plugin_setup.py +577 -0
  338. package/dist/gaia-security/hooks/modules/core/state.py +179 -0
  339. package/dist/gaia-security/hooks/modules/core/stdin.py +24 -0
  340. package/dist/gaia-security/hooks/modules/events/__init__.py +1 -0
  341. package/dist/gaia-security/hooks/modules/events/event_writer.py +210 -0
  342. package/dist/gaia-security/hooks/modules/memory/__init__.py +8 -0
  343. package/dist/gaia-security/hooks/modules/memory/episode_writer.py +216 -0
  344. package/dist/gaia-security/hooks/modules/orchestrator/__init__.py +1 -0
  345. package/dist/gaia-security/hooks/modules/orchestrator/delegate_mode.py +122 -0
  346. package/dist/gaia-security/hooks/modules/scanning/__init__.py +8 -0
  347. package/dist/gaia-security/hooks/modules/scanning/scan_trigger.py +84 -0
  348. package/dist/gaia-security/hooks/modules/security/__init__.py +120 -0
  349. package/dist/gaia-security/hooks/modules/security/approval_cleanup.py +87 -0
  350. package/dist/gaia-security/hooks/modules/security/approval_constants.py +23 -0
  351. package/dist/gaia-security/hooks/modules/security/approval_grants.py +1638 -0
  352. package/dist/gaia-security/hooks/modules/security/approval_messages.py +71 -0
  353. package/dist/gaia-security/hooks/modules/security/approval_scopes.py +222 -0
  354. package/dist/gaia-security/hooks/modules/security/blocked_commands.py +595 -0
  355. package/dist/gaia-security/hooks/modules/security/blocked_message_formatter.py +87 -0
  356. package/dist/gaia-security/hooks/modules/security/command_semantics.py +181 -0
  357. package/dist/gaia-security/hooks/modules/security/composition_rules.py +547 -0
  358. package/dist/gaia-security/hooks/modules/security/flag_classifiers.py +873 -0
  359. package/dist/gaia-security/hooks/modules/security/gitops_validator.py +179 -0
  360. package/dist/gaia-security/hooks/modules/security/mutative_verbs.py +1131 -0
  361. package/dist/gaia-security/hooks/modules/security/network_hosts.py +481 -0
  362. package/dist/gaia-security/hooks/modules/security/prompt_validator.py +40 -0
  363. package/dist/gaia-security/hooks/modules/security/shell_unwrapper.py +165 -0
  364. package/dist/gaia-security/hooks/modules/security/tiers.py +196 -0
  365. package/dist/gaia-security/hooks/modules/session/__init__.py +10 -0
  366. package/dist/gaia-security/hooks/modules/session/pending_scanner.py +174 -0
  367. package/dist/gaia-security/hooks/modules/session/session_context_writer.py +100 -0
  368. package/dist/gaia-security/hooks/modules/session/session_event_injector.py +160 -0
  369. package/dist/gaia-security/hooks/modules/session/session_manager.py +31 -0
  370. package/dist/gaia-security/hooks/modules/session/session_registry.py +333 -0
  371. package/dist/gaia-security/hooks/modules/tools/__init__.py +29 -0
  372. package/dist/gaia-security/hooks/modules/tools/bash_validator.py +1008 -0
  373. package/dist/gaia-security/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  374. package/dist/gaia-security/hooks/modules/tools/hook_response.py +55 -0
  375. package/dist/gaia-security/hooks/modules/tools/shell_parser.py +227 -0
  376. package/dist/gaia-security/hooks/modules/tools/stage_decomposer.py +315 -0
  377. package/dist/gaia-security/hooks/modules/tools/task_validator.py +294 -0
  378. package/dist/gaia-security/hooks/modules/validation/__init__.py +23 -0
  379. package/dist/gaia-security/hooks/modules/validation/commit_validator.py +380 -0
  380. package/dist/gaia-security/hooks/post_tool_use.py +54 -0
  381. package/dist/gaia-security/hooks/pre_tool_use.py +413 -0
  382. package/dist/gaia-security/hooks/session_end_hook.py +77 -0
  383. package/dist/gaia-security/hooks/session_start.py +81 -0
  384. package/dist/gaia-security/hooks/stop_hook.py +70 -0
  385. package/dist/gaia-security/hooks/user_prompt_submit.py +246 -0
  386. package/dist/gaia-security/settings.json +58 -0
  387. package/git-hooks/commit-msg +41 -0
  388. package/hooks/README.md +100 -0
  389. package/hooks/adapters/__init__.py +52 -0
  390. package/hooks/adapters/base.py +219 -0
  391. package/hooks/adapters/channel.py +17 -0
  392. package/hooks/adapters/claude_code.py +1890 -0
  393. package/hooks/adapters/types.py +194 -0
  394. package/hooks/adapters/utils.py +25 -0
  395. package/hooks/elicitation_result.py +179 -0
  396. package/hooks/hooks.json +84 -0
  397. package/hooks/modules/README.md +189 -0
  398. package/hooks/modules/__init__.py +15 -0
  399. package/hooks/modules/agents/__init__.py +29 -0
  400. package/hooks/modules/agents/contract_validator.py +647 -0
  401. package/hooks/modules/agents/response_contract.py +496 -0
  402. package/hooks/modules/agents/skill_injection_verifier.py +120 -0
  403. package/hooks/modules/agents/state_tracker.py +267 -0
  404. package/hooks/modules/agents/task_info_builder.py +74 -0
  405. package/hooks/modules/agents/transcript_analyzer.py +458 -0
  406. package/hooks/modules/agents/transcript_reader.py +152 -0
  407. package/hooks/modules/audit/__init__.py +28 -0
  408. package/hooks/modules/audit/event_detector.py +168 -0
  409. package/hooks/modules/audit/logger.py +131 -0
  410. package/hooks/modules/audit/metrics.py +134 -0
  411. package/hooks/modules/audit/workflow_auditor.py +611 -0
  412. package/hooks/modules/audit/workflow_recorder.py +296 -0
  413. package/hooks/modules/context/__init__.py +11 -0
  414. package/hooks/modules/context/agentic_loop_detector.py +165 -0
  415. package/hooks/modules/context/anchor_tracker.py +317 -0
  416. package/hooks/modules/context/compact_context_builder.py +218 -0
  417. package/hooks/modules/context/context_freshness.py +145 -0
  418. package/hooks/modules/context/context_injector.py +558 -0
  419. package/hooks/modules/context/context_writer.py +530 -0
  420. package/hooks/modules/context/contracts_loader.py +161 -0
  421. package/hooks/modules/core/__init__.py +40 -0
  422. package/hooks/modules/core/hook_entry.py +78 -0
  423. package/hooks/modules/core/paths.py +160 -0
  424. package/hooks/modules/core/plugin_mode.py +149 -0
  425. package/hooks/modules/core/plugin_setup.py +577 -0
  426. package/hooks/modules/core/state.py +179 -0
  427. package/hooks/modules/core/stdin.py +24 -0
  428. package/hooks/modules/events/__init__.py +1 -0
  429. package/hooks/modules/events/event_writer.py +210 -0
  430. package/hooks/modules/evidence/__init__.py +34 -0
  431. package/hooks/modules/evidence/assertions.py +137 -0
  432. package/hooks/modules/evidence/index_writer.py +57 -0
  433. package/hooks/modules/evidence/loader.py +126 -0
  434. package/hooks/modules/evidence/runner.py +241 -0
  435. package/hooks/modules/memory/__init__.py +8 -0
  436. package/hooks/modules/memory/episode_writer.py +216 -0
  437. package/hooks/modules/orchestrator/__init__.py +1 -0
  438. package/hooks/modules/orchestrator/delegate_mode.py +122 -0
  439. package/hooks/modules/scanning/__init__.py +8 -0
  440. package/hooks/modules/scanning/scan_trigger.py +84 -0
  441. package/hooks/modules/security/__init__.py +120 -0
  442. package/hooks/modules/security/approval_cleanup.py +87 -0
  443. package/hooks/modules/security/approval_constants.py +23 -0
  444. package/hooks/modules/security/approval_grants.py +1638 -0
  445. package/hooks/modules/security/approval_messages.py +71 -0
  446. package/hooks/modules/security/approval_scopes.py +222 -0
  447. package/hooks/modules/security/blocked_commands.py +595 -0
  448. package/hooks/modules/security/blocked_message_formatter.py +87 -0
  449. package/hooks/modules/security/command_semantics.py +181 -0
  450. package/hooks/modules/security/composition_rules.py +547 -0
  451. package/hooks/modules/security/flag_classifiers.py +873 -0
  452. package/hooks/modules/security/gitops_validator.py +179 -0
  453. package/hooks/modules/security/mutative_verbs.py +1131 -0
  454. package/hooks/modules/security/network_hosts.py +481 -0
  455. package/hooks/modules/security/prompt_validator.py +40 -0
  456. package/hooks/modules/security/shell_unwrapper.py +165 -0
  457. package/hooks/modules/security/tiers.py +196 -0
  458. package/hooks/modules/session/__init__.py +10 -0
  459. package/hooks/modules/session/pending_scanner.py +174 -0
  460. package/hooks/modules/session/session_context_writer.py +100 -0
  461. package/hooks/modules/session/session_event_injector.py +160 -0
  462. package/hooks/modules/session/session_manager.py +31 -0
  463. package/hooks/modules/session/session_registry.py +333 -0
  464. package/hooks/modules/tools/__init__.py +29 -0
  465. package/hooks/modules/tools/bash_validator.py +1008 -0
  466. package/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  467. package/hooks/modules/tools/hook_response.py +55 -0
  468. package/hooks/modules/tools/shell_parser.py +227 -0
  469. package/hooks/modules/tools/stage_decomposer.py +315 -0
  470. package/hooks/modules/tools/task_validator.py +294 -0
  471. package/hooks/modules/validation/__init__.py +23 -0
  472. package/hooks/modules/validation/commit_validator.py +380 -0
  473. package/hooks/post_compact.py +43 -0
  474. package/hooks/post_tool_use.py +54 -0
  475. package/hooks/pre_compact.py +60 -0
  476. package/hooks/pre_tool_use.py +413 -0
  477. package/hooks/session_end_hook.py +77 -0
  478. package/hooks/session_start.py +81 -0
  479. package/hooks/stop_hook.py +70 -0
  480. package/hooks/subagent_start.py +71 -0
  481. package/hooks/subagent_stop.py +295 -0
  482. package/hooks/task_completed.py +70 -0
  483. package/hooks/user_prompt_submit.py +246 -0
  484. package/index.js +83 -0
  485. package/package.json +103 -0
  486. package/pyproject.toml +32 -0
  487. package/skills/README.md +158 -0
  488. package/skills/agent-creation/SKILL.md +87 -0
  489. package/skills/agent-creation/examples.md +170 -0
  490. package/skills/agent-creation/reference.md +191 -0
  491. package/skills/agent-protocol/SKILL.md +93 -0
  492. package/skills/agent-protocol/examples.md +223 -0
  493. package/skills/agent-response/SKILL.md +69 -0
  494. package/skills/agentic-loop/SKILL.md +80 -0
  495. package/skills/agentic-loop/reference.md +378 -0
  496. package/skills/blog-writing/SKILL.md +98 -0
  497. package/skills/blog-writing/reference.md +130 -0
  498. package/skills/brief-spec/SKILL.md +185 -0
  499. package/skills/command-execution/SKILL.md +64 -0
  500. package/skills/command-execution/reference.md +83 -0
  501. package/skills/context-updater/SKILL.md +87 -0
  502. package/skills/context-updater/examples.md +71 -0
  503. package/skills/developer-patterns/SKILL.md +50 -0
  504. package/skills/developer-patterns/reference.md +112 -0
  505. package/skills/execution/SKILL.md +99 -0
  506. package/skills/fast-queries/SKILL.md +43 -0
  507. package/skills/gaia-compact/SKILL.md +74 -0
  508. package/skills/gaia-patterns/SKILL.md +108 -0
  509. package/skills/gaia-patterns/reference.md +395 -0
  510. package/skills/gaia-planner/SKILL.md +37 -0
  511. package/skills/gaia-planner/reference.md +107 -0
  512. package/skills/gaia-release/SKILL.md +85 -0
  513. package/skills/gaia-release/reference.md +92 -0
  514. package/skills/gaia-self-check/SKILL.md +114 -0
  515. package/skills/gaia-self-check/reference.md +453 -0
  516. package/skills/gaia-verify/SKILL.md +77 -0
  517. package/skills/gaia-verify/reference.md +80 -0
  518. package/skills/git-conventions/SKILL.md +47 -0
  519. package/skills/gitops-patterns/SKILL.md +60 -0
  520. package/skills/gitops-patterns/reference.md +183 -0
  521. package/skills/gmail-policy/SKILL.md +200 -0
  522. package/skills/gmail-policy/reference.md +150 -0
  523. package/skills/gmail-triage/SKILL.md +100 -0
  524. package/skills/gws-setup/SKILL.md +99 -0
  525. package/skills/gws-setup/reference.md +73 -0
  526. package/skills/investigation/SKILL.md +100 -0
  527. package/skills/memory-curation/SKILL.md +83 -0
  528. package/skills/memory-search/SKILL.md +88 -0
  529. package/skills/orchestrator-approval/SKILL.md +160 -0
  530. package/skills/orchestrator-approval/reference.md +174 -0
  531. package/skills/pending-approvals/SKILL.md +72 -0
  532. package/skills/pending-approvals/reference.md +214 -0
  533. package/skills/readme-writing/SKILL.md +71 -0
  534. package/skills/readme-writing/reference.md +188 -0
  535. package/skills/reference.md +135 -0
  536. package/skills/request-approval/SKILL.md +140 -0
  537. package/skills/request-approval/examples.md +140 -0
  538. package/skills/request-approval/reference.md +57 -0
  539. package/skills/schedule-task/SKILL.md +64 -0
  540. package/skills/schedule-task/reference.md +233 -0
  541. package/skills/security-tiers/SKILL.md +141 -0
  542. package/skills/security-tiers/destructive-commands-reference.md +623 -0
  543. package/skills/security-tiers/reference.md +39 -0
  544. package/skills/session-reflection/SKILL.md +69 -0
  545. package/skills/skill-creation/SKILL.md +92 -0
  546. package/skills/skill-creation/reference.md +29 -0
  547. package/skills/terraform-patterns/SKILL.md +89 -0
  548. package/skills/terraform-patterns/reference.md +93 -0
  549. package/templates/README.md +69 -0
  550. package/templates/managed-settings.template.json +43 -0
  551. package/tools/__init__.py +9 -0
  552. package/tools/agentic-loop/decide-status.py +210 -0
  553. package/tools/agentic-loop/parse-metric.py +106 -0
  554. package/tools/agentic-loop/record-iteration.py +221 -0
  555. package/tools/context/README.md +132 -0
  556. package/tools/context/__init__.py +42 -0
  557. package/tools/context/_paths.py +20 -0
  558. package/tools/context/context_provider.py +721 -0
  559. package/tools/context/context_section_reader.py +342 -0
  560. package/tools/context/deep_merge.py +159 -0
  561. package/tools/context/pending_updates.py +760 -0
  562. package/tools/context/surface_router.py +278 -0
  563. package/tools/fast-queries/README.md +65 -0
  564. package/tools/fast-queries/__init__.py +30 -0
  565. package/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
  566. package/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
  567. package/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
  568. package/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
  569. package/tools/fast-queries/run_triage.sh +59 -0
  570. package/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
  571. package/tools/gaia_simulator/__init__.py +33 -0
  572. package/tools/gaia_simulator/cli.py +354 -0
  573. package/tools/gaia_simulator/extractor.py +457 -0
  574. package/tools/gaia_simulator/reporter.py +258 -0
  575. package/tools/gaia_simulator/routing_simulator.py +334 -0
  576. package/tools/gaia_simulator/runner.py +539 -0
  577. package/tools/gaia_simulator/skills_mapper.py +264 -0
  578. package/tools/memory/README.md +0 -0
  579. package/tools/memory/__init__.py +20 -0
  580. package/tools/memory/backfill_fts5.py +107 -0
  581. package/tools/memory/conflict_detector.py +295 -0
  582. package/tools/memory/episodic.py +1210 -0
  583. package/tools/memory/git_invalidator.py +262 -0
  584. package/tools/memory/paths.py +102 -0
  585. package/tools/memory/scoring.py +193 -0
  586. package/tools/memory/search_store.py +375 -0
  587. package/tools/persist_transcript_analysis.py +85 -0
  588. package/tools/review/__init__.py +1 -0
  589. package/tools/review/review_engine.py +157 -0
  590. package/tools/scan/__init__.py +35 -0
  591. package/tools/scan/config.py +247 -0
  592. package/tools/scan/merge.py +212 -0
  593. package/tools/scan/orchestrator.py +549 -0
  594. package/tools/scan/registry.py +127 -0
  595. package/tools/scan/scanners/__init__.py +18 -0
  596. package/tools/scan/scanners/base.py +137 -0
  597. package/tools/scan/scanners/environment.py +349 -0
  598. package/tools/scan/scanners/git.py +570 -0
  599. package/tools/scan/scanners/infrastructure.py +875 -0
  600. package/tools/scan/scanners/orchestration.py +600 -0
  601. package/tools/scan/scanners/stack.py +1085 -0
  602. package/tools/scan/scanners/tools.py +260 -0
  603. package/tools/scan/setup.py +686 -0
  604. package/tools/scan/tests/__init__.py +1 -0
  605. package/tools/scan/tests/conftest.py +796 -0
  606. package/tools/scan/tests/test_environment.py +323 -0
  607. package/tools/scan/tests/test_git.py +419 -0
  608. package/tools/scan/tests/test_infrastructure.py +382 -0
  609. package/tools/scan/tests/test_integration.py +920 -0
  610. package/tools/scan/tests/test_merge.py +269 -0
  611. package/tools/scan/tests/test_orchestration.py +304 -0
  612. package/tools/scan/tests/test_stack.py +604 -0
  613. package/tools/scan/tests/test_tools.py +349 -0
  614. package/tools/scan/ui.py +624 -0
  615. package/tools/scan/verify.py +270 -0
  616. package/tools/scan/walk.py +118 -0
  617. package/tools/scan/workspace.py +85 -0
  618. package/tools/validation/README.md +244 -0
  619. package/tools/validation/__init__.py +17 -0
  620. package/tools/validation/approval_gate.py +321 -0
  621. 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