@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.
Files changed (609) 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 +1212 -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 +237 -0
  16. package/agents/gaia-planner.md +53 -0
  17. package/agents/gaia-system.md +70 -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 +628 -0
  26. package/bin/cli/history.py +305 -0
  27. package/bin/cli/memory.py +464 -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 +816 -0
  45. package/bin/pre-publish-validate.js +610 -0
  46. package/bin/python-detect.js +60 -0
  47. package/commands/README.md +64 -0
  48. package/commands/gaia.md +37 -0
  49. package/commands/scan-project.md +67 -0
  50. package/config/README.md +71 -0
  51. package/config/cloud/aws.json +134 -0
  52. package/config/cloud/gcp.json +139 -0
  53. package/config/context-contracts.json +158 -0
  54. package/config/crons-schema.md +81 -0
  55. package/config/git_standards.json +72 -0
  56. package/config/surface-routing.json +421 -0
  57. package/config/universal-rules.json +102 -0
  58. package/dist/gaia-ops/.claude-plugin/plugin.json +24 -0
  59. package/dist/gaia-ops/README.md +80 -0
  60. package/dist/gaia-ops/agents/cloud-troubleshooter.md +73 -0
  61. package/dist/gaia-ops/agents/developer.md +65 -0
  62. package/dist/gaia-ops/agents/gaia-operator.md +64 -0
  63. package/dist/gaia-ops/agents/gaia-orchestrator.md +237 -0
  64. package/dist/gaia-ops/agents/gaia-planner.md +53 -0
  65. package/dist/gaia-ops/agents/gaia-system.md +70 -0
  66. package/dist/gaia-ops/agents/gitops-operator.md +61 -0
  67. package/dist/gaia-ops/agents/terraform-architect.md +63 -0
  68. package/dist/gaia-ops/commands/gaia.md +37 -0
  69. package/dist/gaia-ops/config/README.md +71 -0
  70. package/dist/gaia-ops/config/cloud/aws.json +134 -0
  71. package/dist/gaia-ops/config/cloud/gcp.json +139 -0
  72. package/dist/gaia-ops/config/context-contracts.json +158 -0
  73. package/dist/gaia-ops/config/crons-schema.md +81 -0
  74. package/dist/gaia-ops/config/git_standards.json +72 -0
  75. package/dist/gaia-ops/config/surface-routing.json +421 -0
  76. package/dist/gaia-ops/config/universal-rules.json +102 -0
  77. package/dist/gaia-ops/hooks/adapters/__init__.py +52 -0
  78. package/dist/gaia-ops/hooks/adapters/base.py +219 -0
  79. package/dist/gaia-ops/hooks/adapters/channel.py +17 -0
  80. package/dist/gaia-ops/hooks/adapters/claude_code.py +1890 -0
  81. package/dist/gaia-ops/hooks/adapters/types.py +194 -0
  82. package/dist/gaia-ops/hooks/adapters/utils.py +25 -0
  83. package/dist/gaia-ops/hooks/hooks.json +163 -0
  84. package/dist/gaia-ops/hooks/modules/__init__.py +15 -0
  85. package/dist/gaia-ops/hooks/modules/agents/__init__.py +29 -0
  86. package/dist/gaia-ops/hooks/modules/agents/contract_validator.py +647 -0
  87. package/dist/gaia-ops/hooks/modules/agents/response_contract.py +496 -0
  88. package/dist/gaia-ops/hooks/modules/agents/skill_injection_verifier.py +120 -0
  89. package/dist/gaia-ops/hooks/modules/agents/state_tracker.py +267 -0
  90. package/dist/gaia-ops/hooks/modules/agents/task_info_builder.py +74 -0
  91. package/dist/gaia-ops/hooks/modules/agents/transcript_analyzer.py +458 -0
  92. package/dist/gaia-ops/hooks/modules/agents/transcript_reader.py +152 -0
  93. package/dist/gaia-ops/hooks/modules/audit/__init__.py +28 -0
  94. package/dist/gaia-ops/hooks/modules/audit/event_detector.py +168 -0
  95. package/dist/gaia-ops/hooks/modules/audit/logger.py +131 -0
  96. package/dist/gaia-ops/hooks/modules/audit/metrics.py +134 -0
  97. package/dist/gaia-ops/hooks/modules/audit/workflow_auditor.py +611 -0
  98. package/dist/gaia-ops/hooks/modules/audit/workflow_recorder.py +296 -0
  99. package/dist/gaia-ops/hooks/modules/context/__init__.py +11 -0
  100. package/dist/gaia-ops/hooks/modules/context/agentic_loop_detector.py +165 -0
  101. package/dist/gaia-ops/hooks/modules/context/anchor_tracker.py +317 -0
  102. package/dist/gaia-ops/hooks/modules/context/compact_context_builder.py +218 -0
  103. package/dist/gaia-ops/hooks/modules/context/context_freshness.py +145 -0
  104. package/dist/gaia-ops/hooks/modules/context/context_injector.py +558 -0
  105. package/dist/gaia-ops/hooks/modules/context/context_writer.py +530 -0
  106. package/dist/gaia-ops/hooks/modules/context/contracts_loader.py +161 -0
  107. package/dist/gaia-ops/hooks/modules/core/__init__.py +40 -0
  108. package/dist/gaia-ops/hooks/modules/core/hook_entry.py +78 -0
  109. package/dist/gaia-ops/hooks/modules/core/paths.py +160 -0
  110. package/dist/gaia-ops/hooks/modules/core/plugin_mode.py +149 -0
  111. package/dist/gaia-ops/hooks/modules/core/plugin_setup.py +577 -0
  112. package/dist/gaia-ops/hooks/modules/core/state.py +179 -0
  113. package/dist/gaia-ops/hooks/modules/core/stdin.py +24 -0
  114. package/dist/gaia-ops/hooks/modules/events/__init__.py +1 -0
  115. package/dist/gaia-ops/hooks/modules/events/event_writer.py +210 -0
  116. package/dist/gaia-ops/hooks/modules/memory/__init__.py +8 -0
  117. package/dist/gaia-ops/hooks/modules/memory/episode_writer.py +216 -0
  118. package/dist/gaia-ops/hooks/modules/orchestrator/__init__.py +1 -0
  119. package/dist/gaia-ops/hooks/modules/orchestrator/delegate_mode.py +122 -0
  120. package/dist/gaia-ops/hooks/modules/scanning/__init__.py +8 -0
  121. package/dist/gaia-ops/hooks/modules/scanning/scan_trigger.py +84 -0
  122. package/dist/gaia-ops/hooks/modules/security/__init__.py +120 -0
  123. package/dist/gaia-ops/hooks/modules/security/approval_cleanup.py +87 -0
  124. package/dist/gaia-ops/hooks/modules/security/approval_constants.py +23 -0
  125. package/dist/gaia-ops/hooks/modules/security/approval_grants.py +1638 -0
  126. package/dist/gaia-ops/hooks/modules/security/approval_messages.py +71 -0
  127. package/dist/gaia-ops/hooks/modules/security/approval_scopes.py +222 -0
  128. package/dist/gaia-ops/hooks/modules/security/blocked_commands.py +595 -0
  129. package/dist/gaia-ops/hooks/modules/security/blocked_message_formatter.py +87 -0
  130. package/dist/gaia-ops/hooks/modules/security/command_semantics.py +181 -0
  131. package/dist/gaia-ops/hooks/modules/security/composition_rules.py +547 -0
  132. package/dist/gaia-ops/hooks/modules/security/flag_classifiers.py +873 -0
  133. package/dist/gaia-ops/hooks/modules/security/gitops_validator.py +179 -0
  134. package/dist/gaia-ops/hooks/modules/security/mutative_verbs.py +1131 -0
  135. package/dist/gaia-ops/hooks/modules/security/network_hosts.py +481 -0
  136. package/dist/gaia-ops/hooks/modules/security/prompt_validator.py +40 -0
  137. package/dist/gaia-ops/hooks/modules/security/shell_unwrapper.py +165 -0
  138. package/dist/gaia-ops/hooks/modules/security/tiers.py +196 -0
  139. package/dist/gaia-ops/hooks/modules/session/__init__.py +10 -0
  140. package/dist/gaia-ops/hooks/modules/session/pending_scanner.py +174 -0
  141. package/dist/gaia-ops/hooks/modules/session/session_context_writer.py +100 -0
  142. package/dist/gaia-ops/hooks/modules/session/session_event_injector.py +160 -0
  143. package/dist/gaia-ops/hooks/modules/session/session_manager.py +31 -0
  144. package/dist/gaia-ops/hooks/modules/session/session_registry.py +232 -0
  145. package/dist/gaia-ops/hooks/modules/tools/__init__.py +29 -0
  146. package/dist/gaia-ops/hooks/modules/tools/bash_validator.py +1008 -0
  147. package/dist/gaia-ops/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  148. package/dist/gaia-ops/hooks/modules/tools/hook_response.py +55 -0
  149. package/dist/gaia-ops/hooks/modules/tools/shell_parser.py +227 -0
  150. package/dist/gaia-ops/hooks/modules/tools/stage_decomposer.py +315 -0
  151. package/dist/gaia-ops/hooks/modules/tools/task_validator.py +294 -0
  152. package/dist/gaia-ops/hooks/modules/validation/__init__.py +23 -0
  153. package/dist/gaia-ops/hooks/modules/validation/commit_validator.py +380 -0
  154. package/dist/gaia-ops/hooks/post_compact.py +43 -0
  155. package/dist/gaia-ops/hooks/post_tool_use.py +54 -0
  156. package/dist/gaia-ops/hooks/pre_compact.py +60 -0
  157. package/dist/gaia-ops/hooks/pre_tool_use.py +413 -0
  158. package/dist/gaia-ops/hooks/session_start.py +81 -0
  159. package/dist/gaia-ops/hooks/stop_hook.py +82 -0
  160. package/dist/gaia-ops/hooks/subagent_start.py +71 -0
  161. package/dist/gaia-ops/hooks/subagent_stop.py +295 -0
  162. package/dist/gaia-ops/hooks/task_completed.py +70 -0
  163. package/dist/gaia-ops/hooks/user_prompt_submit.py +246 -0
  164. package/dist/gaia-ops/settings.json +72 -0
  165. package/dist/gaia-ops/skills/README.md +154 -0
  166. package/dist/gaia-ops/skills/agent-protocol/SKILL.md +93 -0
  167. package/dist/gaia-ops/skills/agent-protocol/examples.md +223 -0
  168. package/dist/gaia-ops/skills/agent-response/SKILL.md +69 -0
  169. package/dist/gaia-ops/skills/agentic-loop/SKILL.md +80 -0
  170. package/dist/gaia-ops/skills/agentic-loop/reference.md +378 -0
  171. package/dist/gaia-ops/skills/blog-writing/SKILL.md +98 -0
  172. package/dist/gaia-ops/skills/blog-writing/reference.md +130 -0
  173. package/dist/gaia-ops/skills/brief-spec/SKILL.md +182 -0
  174. package/dist/gaia-ops/skills/command-execution/SKILL.md +64 -0
  175. package/dist/gaia-ops/skills/command-execution/reference.md +83 -0
  176. package/dist/gaia-ops/skills/context-updater/SKILL.md +87 -0
  177. package/dist/gaia-ops/skills/context-updater/examples.md +71 -0
  178. package/dist/gaia-ops/skills/developer-patterns/SKILL.md +50 -0
  179. package/dist/gaia-ops/skills/developer-patterns/reference.md +112 -0
  180. package/dist/gaia-ops/skills/execution/SKILL.md +99 -0
  181. package/dist/gaia-ops/skills/fast-queries/SKILL.md +43 -0
  182. package/dist/gaia-ops/skills/gaia-compact/SKILL.md +74 -0
  183. package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +108 -0
  184. package/dist/gaia-ops/skills/gaia-patterns/reference.md +395 -0
  185. package/dist/gaia-ops/skills/gaia-planner/SKILL.md +37 -0
  186. package/dist/gaia-ops/skills/gaia-planner/reference.md +107 -0
  187. package/dist/gaia-ops/skills/gaia-release/SKILL.md +82 -0
  188. package/dist/gaia-ops/skills/gaia-release/reference.md +102 -0
  189. package/dist/gaia-ops/skills/gaia-self-check/SKILL.md +114 -0
  190. package/dist/gaia-ops/skills/gaia-self-check/reference.md +453 -0
  191. package/dist/gaia-ops/skills/gaia-verify/SKILL.md +77 -0
  192. package/dist/gaia-ops/skills/gaia-verify/reference.md +80 -0
  193. package/dist/gaia-ops/skills/git-conventions/SKILL.md +47 -0
  194. package/dist/gaia-ops/skills/gitops-patterns/SKILL.md +60 -0
  195. package/dist/gaia-ops/skills/gitops-patterns/reference.md +183 -0
  196. package/dist/gaia-ops/skills/gmail-policy/SKILL.md +200 -0
  197. package/dist/gaia-ops/skills/gmail-policy/reference.md +150 -0
  198. package/dist/gaia-ops/skills/gmail-triage/SKILL.md +100 -0
  199. package/dist/gaia-ops/skills/gws-setup/SKILL.md +99 -0
  200. package/dist/gaia-ops/skills/gws-setup/reference.md +73 -0
  201. package/dist/gaia-ops/skills/investigation/SKILL.md +100 -0
  202. package/dist/gaia-ops/skills/memory-curation/SKILL.md +83 -0
  203. package/dist/gaia-ops/skills/memory-search/SKILL.md +88 -0
  204. package/dist/gaia-ops/skills/orchestrator-approval/SKILL.md +160 -0
  205. package/dist/gaia-ops/skills/orchestrator-approval/reference.md +174 -0
  206. package/dist/gaia-ops/skills/pending-approvals/SKILL.md +72 -0
  207. package/dist/gaia-ops/skills/pending-approvals/reference.md +214 -0
  208. package/dist/gaia-ops/skills/readme-writing/SKILL.md +71 -0
  209. package/dist/gaia-ops/skills/readme-writing/reference.md +188 -0
  210. package/dist/gaia-ops/skills/reference.md +135 -0
  211. package/dist/gaia-ops/skills/request-approval/SKILL.md +140 -0
  212. package/dist/gaia-ops/skills/request-approval/examples.md +140 -0
  213. package/dist/gaia-ops/skills/request-approval/reference.md +57 -0
  214. package/dist/gaia-ops/skills/schedule-task/SKILL.md +64 -0
  215. package/dist/gaia-ops/skills/schedule-task/reference.md +233 -0
  216. package/dist/gaia-ops/skills/security-tiers/SKILL.md +141 -0
  217. package/dist/gaia-ops/skills/security-tiers/destructive-commands-reference.md +623 -0
  218. package/dist/gaia-ops/skills/security-tiers/reference.md +39 -0
  219. package/dist/gaia-ops/skills/skill-creation/SKILL.md +92 -0
  220. package/dist/gaia-ops/skills/skill-creation/reference.md +29 -0
  221. package/dist/gaia-ops/skills/terraform-patterns/SKILL.md +89 -0
  222. package/dist/gaia-ops/skills/terraform-patterns/reference.md +93 -0
  223. package/dist/gaia-ops/tools/__init__.py +9 -0
  224. package/dist/gaia-ops/tools/agentic-loop/decide-status.py +210 -0
  225. package/dist/gaia-ops/tools/agentic-loop/parse-metric.py +106 -0
  226. package/dist/gaia-ops/tools/agentic-loop/record-iteration.py +221 -0
  227. package/dist/gaia-ops/tools/context/README.md +132 -0
  228. package/dist/gaia-ops/tools/context/__init__.py +42 -0
  229. package/dist/gaia-ops/tools/context/_paths.py +20 -0
  230. package/dist/gaia-ops/tools/context/context_provider.py +721 -0
  231. package/dist/gaia-ops/tools/context/context_section_reader.py +342 -0
  232. package/dist/gaia-ops/tools/context/deep_merge.py +159 -0
  233. package/dist/gaia-ops/tools/context/pending_updates.py +760 -0
  234. package/dist/gaia-ops/tools/context/surface_router.py +278 -0
  235. package/dist/gaia-ops/tools/fast-queries/README.md +65 -0
  236. package/dist/gaia-ops/tools/fast-queries/__init__.py +30 -0
  237. package/dist/gaia-ops/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
  238. package/dist/gaia-ops/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
  239. package/dist/gaia-ops/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
  240. package/dist/gaia-ops/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
  241. package/dist/gaia-ops/tools/fast-queries/run_triage.sh +59 -0
  242. package/dist/gaia-ops/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
  243. package/dist/gaia-ops/tools/gaia_simulator/__init__.py +33 -0
  244. package/dist/gaia-ops/tools/gaia_simulator/cli.py +354 -0
  245. package/dist/gaia-ops/tools/gaia_simulator/extractor.py +457 -0
  246. package/dist/gaia-ops/tools/gaia_simulator/reporter.py +258 -0
  247. package/dist/gaia-ops/tools/gaia_simulator/routing_simulator.py +334 -0
  248. package/dist/gaia-ops/tools/gaia_simulator/runner.py +539 -0
  249. package/dist/gaia-ops/tools/gaia_simulator/skills_mapper.py +264 -0
  250. package/dist/gaia-ops/tools/memory/README.md +0 -0
  251. package/dist/gaia-ops/tools/memory/__init__.py +20 -0
  252. package/dist/gaia-ops/tools/memory/backfill_fts5.py +107 -0
  253. package/dist/gaia-ops/tools/memory/conflict_detector.py +295 -0
  254. package/dist/gaia-ops/tools/memory/episodic.py +1210 -0
  255. package/dist/gaia-ops/tools/memory/git_invalidator.py +262 -0
  256. package/dist/gaia-ops/tools/memory/paths.py +102 -0
  257. package/dist/gaia-ops/tools/memory/scoring.py +193 -0
  258. package/dist/gaia-ops/tools/memory/search_store.py +360 -0
  259. package/dist/gaia-ops/tools/persist_transcript_analysis.py +85 -0
  260. package/dist/gaia-ops/tools/review/__init__.py +1 -0
  261. package/dist/gaia-ops/tools/review/review_engine.py +157 -0
  262. package/dist/gaia-ops/tools/scan/__init__.py +35 -0
  263. package/dist/gaia-ops/tools/scan/config.py +247 -0
  264. package/dist/gaia-ops/tools/scan/merge.py +212 -0
  265. package/dist/gaia-ops/tools/scan/orchestrator.py +549 -0
  266. package/dist/gaia-ops/tools/scan/registry.py +127 -0
  267. package/dist/gaia-ops/tools/scan/scanners/__init__.py +18 -0
  268. package/dist/gaia-ops/tools/scan/scanners/base.py +137 -0
  269. package/dist/gaia-ops/tools/scan/scanners/environment.py +349 -0
  270. package/dist/gaia-ops/tools/scan/scanners/git.py +570 -0
  271. package/dist/gaia-ops/tools/scan/scanners/infrastructure.py +875 -0
  272. package/dist/gaia-ops/tools/scan/scanners/orchestration.py +600 -0
  273. package/dist/gaia-ops/tools/scan/scanners/stack.py +1085 -0
  274. package/dist/gaia-ops/tools/scan/scanners/tools.py +260 -0
  275. package/dist/gaia-ops/tools/scan/setup.py +686 -0
  276. package/dist/gaia-ops/tools/scan/tests/__init__.py +1 -0
  277. package/dist/gaia-ops/tools/scan/tests/conftest.py +796 -0
  278. package/dist/gaia-ops/tools/scan/tests/test_environment.py +323 -0
  279. package/dist/gaia-ops/tools/scan/tests/test_git.py +419 -0
  280. package/dist/gaia-ops/tools/scan/tests/test_infrastructure.py +382 -0
  281. package/dist/gaia-ops/tools/scan/tests/test_integration.py +920 -0
  282. package/dist/gaia-ops/tools/scan/tests/test_merge.py +269 -0
  283. package/dist/gaia-ops/tools/scan/tests/test_orchestration.py +304 -0
  284. package/dist/gaia-ops/tools/scan/tests/test_stack.py +604 -0
  285. package/dist/gaia-ops/tools/scan/tests/test_tools.py +349 -0
  286. package/dist/gaia-ops/tools/scan/ui.py +624 -0
  287. package/dist/gaia-ops/tools/scan/verify.py +270 -0
  288. package/dist/gaia-ops/tools/scan/walk.py +118 -0
  289. package/dist/gaia-ops/tools/scan/workspace.py +85 -0
  290. package/dist/gaia-ops/tools/validation/README.md +244 -0
  291. package/dist/gaia-ops/tools/validation/__init__.py +17 -0
  292. package/dist/gaia-ops/tools/validation/approval_gate.py +321 -0
  293. package/dist/gaia-ops/tools/validation/validate_skills.py +189 -0
  294. package/dist/gaia-security/.claude-plugin/plugin.json +24 -0
  295. package/dist/gaia-security/README.md +90 -0
  296. package/dist/gaia-security/config/universal-rules.json +102 -0
  297. package/dist/gaia-security/hooks/adapters/__init__.py +52 -0
  298. package/dist/gaia-security/hooks/adapters/base.py +219 -0
  299. package/dist/gaia-security/hooks/adapters/channel.py +17 -0
  300. package/dist/gaia-security/hooks/adapters/claude_code.py +1890 -0
  301. package/dist/gaia-security/hooks/adapters/types.py +194 -0
  302. package/dist/gaia-security/hooks/adapters/utils.py +25 -0
  303. package/dist/gaia-security/hooks/hooks.json +84 -0
  304. package/dist/gaia-security/hooks/modules/__init__.py +15 -0
  305. package/dist/gaia-security/hooks/modules/agents/__init__.py +29 -0
  306. package/dist/gaia-security/hooks/modules/agents/contract_validator.py +647 -0
  307. package/dist/gaia-security/hooks/modules/agents/response_contract.py +496 -0
  308. package/dist/gaia-security/hooks/modules/agents/skill_injection_verifier.py +120 -0
  309. package/dist/gaia-security/hooks/modules/agents/state_tracker.py +267 -0
  310. package/dist/gaia-security/hooks/modules/agents/task_info_builder.py +74 -0
  311. package/dist/gaia-security/hooks/modules/agents/transcript_analyzer.py +458 -0
  312. package/dist/gaia-security/hooks/modules/agents/transcript_reader.py +152 -0
  313. package/dist/gaia-security/hooks/modules/audit/__init__.py +28 -0
  314. package/dist/gaia-security/hooks/modules/audit/event_detector.py +168 -0
  315. package/dist/gaia-security/hooks/modules/audit/logger.py +131 -0
  316. package/dist/gaia-security/hooks/modules/audit/metrics.py +134 -0
  317. package/dist/gaia-security/hooks/modules/audit/workflow_auditor.py +611 -0
  318. package/dist/gaia-security/hooks/modules/audit/workflow_recorder.py +296 -0
  319. package/dist/gaia-security/hooks/modules/context/__init__.py +11 -0
  320. package/dist/gaia-security/hooks/modules/context/agentic_loop_detector.py +165 -0
  321. package/dist/gaia-security/hooks/modules/context/anchor_tracker.py +317 -0
  322. package/dist/gaia-security/hooks/modules/context/compact_context_builder.py +218 -0
  323. package/dist/gaia-security/hooks/modules/context/context_freshness.py +145 -0
  324. package/dist/gaia-security/hooks/modules/context/context_injector.py +558 -0
  325. package/dist/gaia-security/hooks/modules/context/context_writer.py +530 -0
  326. package/dist/gaia-security/hooks/modules/context/contracts_loader.py +161 -0
  327. package/dist/gaia-security/hooks/modules/core/__init__.py +40 -0
  328. package/dist/gaia-security/hooks/modules/core/hook_entry.py +78 -0
  329. package/dist/gaia-security/hooks/modules/core/paths.py +160 -0
  330. package/dist/gaia-security/hooks/modules/core/plugin_mode.py +149 -0
  331. package/dist/gaia-security/hooks/modules/core/plugin_setup.py +577 -0
  332. package/dist/gaia-security/hooks/modules/core/state.py +179 -0
  333. package/dist/gaia-security/hooks/modules/core/stdin.py +24 -0
  334. package/dist/gaia-security/hooks/modules/events/__init__.py +1 -0
  335. package/dist/gaia-security/hooks/modules/events/event_writer.py +210 -0
  336. package/dist/gaia-security/hooks/modules/memory/__init__.py +8 -0
  337. package/dist/gaia-security/hooks/modules/memory/episode_writer.py +216 -0
  338. package/dist/gaia-security/hooks/modules/orchestrator/__init__.py +1 -0
  339. package/dist/gaia-security/hooks/modules/orchestrator/delegate_mode.py +122 -0
  340. package/dist/gaia-security/hooks/modules/scanning/__init__.py +8 -0
  341. package/dist/gaia-security/hooks/modules/scanning/scan_trigger.py +84 -0
  342. package/dist/gaia-security/hooks/modules/security/__init__.py +120 -0
  343. package/dist/gaia-security/hooks/modules/security/approval_cleanup.py +87 -0
  344. package/dist/gaia-security/hooks/modules/security/approval_constants.py +23 -0
  345. package/dist/gaia-security/hooks/modules/security/approval_grants.py +1638 -0
  346. package/dist/gaia-security/hooks/modules/security/approval_messages.py +71 -0
  347. package/dist/gaia-security/hooks/modules/security/approval_scopes.py +222 -0
  348. package/dist/gaia-security/hooks/modules/security/blocked_commands.py +595 -0
  349. package/dist/gaia-security/hooks/modules/security/blocked_message_formatter.py +87 -0
  350. package/dist/gaia-security/hooks/modules/security/command_semantics.py +181 -0
  351. package/dist/gaia-security/hooks/modules/security/composition_rules.py +547 -0
  352. package/dist/gaia-security/hooks/modules/security/flag_classifiers.py +873 -0
  353. package/dist/gaia-security/hooks/modules/security/gitops_validator.py +179 -0
  354. package/dist/gaia-security/hooks/modules/security/mutative_verbs.py +1131 -0
  355. package/dist/gaia-security/hooks/modules/security/network_hosts.py +481 -0
  356. package/dist/gaia-security/hooks/modules/security/prompt_validator.py +40 -0
  357. package/dist/gaia-security/hooks/modules/security/shell_unwrapper.py +165 -0
  358. package/dist/gaia-security/hooks/modules/security/tiers.py +196 -0
  359. package/dist/gaia-security/hooks/modules/session/__init__.py +10 -0
  360. package/dist/gaia-security/hooks/modules/session/pending_scanner.py +174 -0
  361. package/dist/gaia-security/hooks/modules/session/session_context_writer.py +100 -0
  362. package/dist/gaia-security/hooks/modules/session/session_event_injector.py +160 -0
  363. package/dist/gaia-security/hooks/modules/session/session_manager.py +31 -0
  364. package/dist/gaia-security/hooks/modules/session/session_registry.py +232 -0
  365. package/dist/gaia-security/hooks/modules/tools/__init__.py +29 -0
  366. package/dist/gaia-security/hooks/modules/tools/bash_validator.py +1008 -0
  367. package/dist/gaia-security/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  368. package/dist/gaia-security/hooks/modules/tools/hook_response.py +55 -0
  369. package/dist/gaia-security/hooks/modules/tools/shell_parser.py +227 -0
  370. package/dist/gaia-security/hooks/modules/tools/stage_decomposer.py +315 -0
  371. package/dist/gaia-security/hooks/modules/tools/task_validator.py +294 -0
  372. package/dist/gaia-security/hooks/modules/validation/__init__.py +23 -0
  373. package/dist/gaia-security/hooks/modules/validation/commit_validator.py +380 -0
  374. package/dist/gaia-security/hooks/post_tool_use.py +54 -0
  375. package/dist/gaia-security/hooks/pre_tool_use.py +413 -0
  376. package/dist/gaia-security/hooks/session_start.py +81 -0
  377. package/dist/gaia-security/hooks/stop_hook.py +82 -0
  378. package/dist/gaia-security/hooks/user_prompt_submit.py +246 -0
  379. package/dist/gaia-security/settings.json +58 -0
  380. package/git-hooks/commit-msg +41 -0
  381. package/hooks/README.md +100 -0
  382. package/hooks/adapters/__init__.py +52 -0
  383. package/hooks/adapters/base.py +219 -0
  384. package/hooks/adapters/channel.py +17 -0
  385. package/hooks/adapters/claude_code.py +1890 -0
  386. package/hooks/adapters/types.py +194 -0
  387. package/hooks/adapters/utils.py +25 -0
  388. package/hooks/elicitation_result.py +179 -0
  389. package/hooks/hooks.json +84 -0
  390. package/hooks/modules/README.md +189 -0
  391. package/hooks/modules/__init__.py +15 -0
  392. package/hooks/modules/agents/__init__.py +29 -0
  393. package/hooks/modules/agents/contract_validator.py +647 -0
  394. package/hooks/modules/agents/response_contract.py +496 -0
  395. package/hooks/modules/agents/skill_injection_verifier.py +120 -0
  396. package/hooks/modules/agents/state_tracker.py +267 -0
  397. package/hooks/modules/agents/task_info_builder.py +74 -0
  398. package/hooks/modules/agents/transcript_analyzer.py +458 -0
  399. package/hooks/modules/agents/transcript_reader.py +152 -0
  400. package/hooks/modules/audit/__init__.py +28 -0
  401. package/hooks/modules/audit/event_detector.py +168 -0
  402. package/hooks/modules/audit/logger.py +131 -0
  403. package/hooks/modules/audit/metrics.py +134 -0
  404. package/hooks/modules/audit/workflow_auditor.py +611 -0
  405. package/hooks/modules/audit/workflow_recorder.py +296 -0
  406. package/hooks/modules/context/__init__.py +11 -0
  407. package/hooks/modules/context/agentic_loop_detector.py +165 -0
  408. package/hooks/modules/context/anchor_tracker.py +317 -0
  409. package/hooks/modules/context/compact_context_builder.py +218 -0
  410. package/hooks/modules/context/context_freshness.py +145 -0
  411. package/hooks/modules/context/context_injector.py +558 -0
  412. package/hooks/modules/context/context_writer.py +530 -0
  413. package/hooks/modules/context/contracts_loader.py +161 -0
  414. package/hooks/modules/core/__init__.py +40 -0
  415. package/hooks/modules/core/hook_entry.py +78 -0
  416. package/hooks/modules/core/paths.py +160 -0
  417. package/hooks/modules/core/plugin_mode.py +149 -0
  418. package/hooks/modules/core/plugin_setup.py +577 -0
  419. package/hooks/modules/core/state.py +179 -0
  420. package/hooks/modules/core/stdin.py +24 -0
  421. package/hooks/modules/events/__init__.py +1 -0
  422. package/hooks/modules/events/event_writer.py +210 -0
  423. package/hooks/modules/evidence/__init__.py +34 -0
  424. package/hooks/modules/evidence/assertions.py +137 -0
  425. package/hooks/modules/evidence/index_writer.py +57 -0
  426. package/hooks/modules/evidence/loader.py +126 -0
  427. package/hooks/modules/evidence/runner.py +241 -0
  428. package/hooks/modules/memory/__init__.py +8 -0
  429. package/hooks/modules/memory/episode_writer.py +216 -0
  430. package/hooks/modules/orchestrator/__init__.py +1 -0
  431. package/hooks/modules/orchestrator/delegate_mode.py +122 -0
  432. package/hooks/modules/scanning/__init__.py +8 -0
  433. package/hooks/modules/scanning/scan_trigger.py +84 -0
  434. package/hooks/modules/security/__init__.py +120 -0
  435. package/hooks/modules/security/approval_cleanup.py +87 -0
  436. package/hooks/modules/security/approval_constants.py +23 -0
  437. package/hooks/modules/security/approval_grants.py +1638 -0
  438. package/hooks/modules/security/approval_messages.py +71 -0
  439. package/hooks/modules/security/approval_scopes.py +222 -0
  440. package/hooks/modules/security/blocked_commands.py +595 -0
  441. package/hooks/modules/security/blocked_message_formatter.py +87 -0
  442. package/hooks/modules/security/command_semantics.py +181 -0
  443. package/hooks/modules/security/composition_rules.py +547 -0
  444. package/hooks/modules/security/flag_classifiers.py +873 -0
  445. package/hooks/modules/security/gitops_validator.py +179 -0
  446. package/hooks/modules/security/mutative_verbs.py +1131 -0
  447. package/hooks/modules/security/network_hosts.py +481 -0
  448. package/hooks/modules/security/prompt_validator.py +40 -0
  449. package/hooks/modules/security/shell_unwrapper.py +165 -0
  450. package/hooks/modules/security/tiers.py +196 -0
  451. package/hooks/modules/session/__init__.py +10 -0
  452. package/hooks/modules/session/pending_scanner.py +174 -0
  453. package/hooks/modules/session/session_context_writer.py +100 -0
  454. package/hooks/modules/session/session_event_injector.py +160 -0
  455. package/hooks/modules/session/session_manager.py +31 -0
  456. package/hooks/modules/session/session_registry.py +232 -0
  457. package/hooks/modules/tools/__init__.py +29 -0
  458. package/hooks/modules/tools/bash_validator.py +1008 -0
  459. package/hooks/modules/tools/cloud_pipe_validator.py +231 -0
  460. package/hooks/modules/tools/hook_response.py +55 -0
  461. package/hooks/modules/tools/shell_parser.py +227 -0
  462. package/hooks/modules/tools/stage_decomposer.py +315 -0
  463. package/hooks/modules/tools/task_validator.py +294 -0
  464. package/hooks/modules/validation/__init__.py +23 -0
  465. package/hooks/modules/validation/commit_validator.py +380 -0
  466. package/hooks/post_compact.py +43 -0
  467. package/hooks/post_tool_use.py +54 -0
  468. package/hooks/pre_compact.py +60 -0
  469. package/hooks/pre_tool_use.py +413 -0
  470. package/hooks/session_start.py +81 -0
  471. package/hooks/stop_hook.py +82 -0
  472. package/hooks/subagent_start.py +71 -0
  473. package/hooks/subagent_stop.py +295 -0
  474. package/hooks/task_completed.py +70 -0
  475. package/hooks/user_prompt_submit.py +246 -0
  476. package/index.js +83 -0
  477. package/package.json +99 -0
  478. package/pyproject.toml +32 -0
  479. package/skills/README.md +154 -0
  480. package/skills/agent-protocol/SKILL.md +93 -0
  481. package/skills/agent-protocol/examples.md +223 -0
  482. package/skills/agent-response/SKILL.md +69 -0
  483. package/skills/agentic-loop/SKILL.md +80 -0
  484. package/skills/agentic-loop/reference.md +378 -0
  485. package/skills/blog-writing/SKILL.md +98 -0
  486. package/skills/blog-writing/reference.md +130 -0
  487. package/skills/brief-spec/SKILL.md +182 -0
  488. package/skills/command-execution/SKILL.md +64 -0
  489. package/skills/command-execution/reference.md +83 -0
  490. package/skills/context-updater/SKILL.md +87 -0
  491. package/skills/context-updater/examples.md +71 -0
  492. package/skills/developer-patterns/SKILL.md +50 -0
  493. package/skills/developer-patterns/reference.md +112 -0
  494. package/skills/execution/SKILL.md +99 -0
  495. package/skills/fast-queries/SKILL.md +43 -0
  496. package/skills/gaia-compact/SKILL.md +74 -0
  497. package/skills/gaia-patterns/SKILL.md +108 -0
  498. package/skills/gaia-patterns/reference.md +395 -0
  499. package/skills/gaia-planner/SKILL.md +37 -0
  500. package/skills/gaia-planner/reference.md +107 -0
  501. package/skills/gaia-release/SKILL.md +82 -0
  502. package/skills/gaia-release/reference.md +102 -0
  503. package/skills/gaia-self-check/SKILL.md +114 -0
  504. package/skills/gaia-self-check/reference.md +453 -0
  505. package/skills/gaia-verify/SKILL.md +77 -0
  506. package/skills/gaia-verify/reference.md +80 -0
  507. package/skills/git-conventions/SKILL.md +47 -0
  508. package/skills/gitops-patterns/SKILL.md +60 -0
  509. package/skills/gitops-patterns/reference.md +183 -0
  510. package/skills/gmail-policy/SKILL.md +200 -0
  511. package/skills/gmail-policy/reference.md +150 -0
  512. package/skills/gmail-triage/SKILL.md +100 -0
  513. package/skills/gws-setup/SKILL.md +99 -0
  514. package/skills/gws-setup/reference.md +73 -0
  515. package/skills/investigation/SKILL.md +100 -0
  516. package/skills/memory-curation/SKILL.md +83 -0
  517. package/skills/memory-search/SKILL.md +88 -0
  518. package/skills/orchestrator-approval/SKILL.md +160 -0
  519. package/skills/orchestrator-approval/reference.md +174 -0
  520. package/skills/pending-approvals/SKILL.md +72 -0
  521. package/skills/pending-approvals/reference.md +214 -0
  522. package/skills/readme-writing/SKILL.md +71 -0
  523. package/skills/readme-writing/reference.md +188 -0
  524. package/skills/reference.md +135 -0
  525. package/skills/request-approval/SKILL.md +140 -0
  526. package/skills/request-approval/examples.md +140 -0
  527. package/skills/request-approval/reference.md +57 -0
  528. package/skills/schedule-task/SKILL.md +64 -0
  529. package/skills/schedule-task/reference.md +233 -0
  530. package/skills/security-tiers/SKILL.md +141 -0
  531. package/skills/security-tiers/destructive-commands-reference.md +623 -0
  532. package/skills/security-tiers/reference.md +39 -0
  533. package/skills/skill-creation/SKILL.md +92 -0
  534. package/skills/skill-creation/reference.md +29 -0
  535. package/skills/terraform-patterns/SKILL.md +89 -0
  536. package/skills/terraform-patterns/reference.md +93 -0
  537. package/templates/README.md +69 -0
  538. package/templates/managed-settings.template.json +43 -0
  539. package/tools/__init__.py +9 -0
  540. package/tools/agentic-loop/decide-status.py +210 -0
  541. package/tools/agentic-loop/parse-metric.py +106 -0
  542. package/tools/agentic-loop/record-iteration.py +221 -0
  543. package/tools/context/README.md +132 -0
  544. package/tools/context/__init__.py +42 -0
  545. package/tools/context/_paths.py +20 -0
  546. package/tools/context/context_provider.py +721 -0
  547. package/tools/context/context_section_reader.py +342 -0
  548. package/tools/context/deep_merge.py +159 -0
  549. package/tools/context/pending_updates.py +760 -0
  550. package/tools/context/surface_router.py +278 -0
  551. package/tools/fast-queries/README.md +65 -0
  552. package/tools/fast-queries/__init__.py +30 -0
  553. package/tools/fast-queries/appservices/quicktriage_devops_developer.sh +75 -0
  554. package/tools/fast-queries/cloud/aws/quicktriage_aws_troubleshooter.sh +32 -0
  555. package/tools/fast-queries/cloud/gcp/quicktriage_gcp_troubleshooter.sh +88 -0
  556. package/tools/fast-queries/gitops/quicktriage_gitops_operator.sh +48 -0
  557. package/tools/fast-queries/run_triage.sh +59 -0
  558. package/tools/fast-queries/terraform/quicktriage_terraform_architect.sh +80 -0
  559. package/tools/gaia_simulator/__init__.py +33 -0
  560. package/tools/gaia_simulator/cli.py +354 -0
  561. package/tools/gaia_simulator/extractor.py +457 -0
  562. package/tools/gaia_simulator/reporter.py +258 -0
  563. package/tools/gaia_simulator/routing_simulator.py +334 -0
  564. package/tools/gaia_simulator/runner.py +539 -0
  565. package/tools/gaia_simulator/skills_mapper.py +264 -0
  566. package/tools/memory/README.md +0 -0
  567. package/tools/memory/__init__.py +20 -0
  568. package/tools/memory/backfill_fts5.py +107 -0
  569. package/tools/memory/conflict_detector.py +295 -0
  570. package/tools/memory/episodic.py +1210 -0
  571. package/tools/memory/git_invalidator.py +262 -0
  572. package/tools/memory/paths.py +102 -0
  573. package/tools/memory/scoring.py +193 -0
  574. package/tools/memory/search_store.py +360 -0
  575. package/tools/persist_transcript_analysis.py +85 -0
  576. package/tools/review/__init__.py +1 -0
  577. package/tools/review/review_engine.py +157 -0
  578. package/tools/scan/__init__.py +35 -0
  579. package/tools/scan/config.py +247 -0
  580. package/tools/scan/merge.py +212 -0
  581. package/tools/scan/orchestrator.py +549 -0
  582. package/tools/scan/registry.py +127 -0
  583. package/tools/scan/scanners/__init__.py +18 -0
  584. package/tools/scan/scanners/base.py +137 -0
  585. package/tools/scan/scanners/environment.py +349 -0
  586. package/tools/scan/scanners/git.py +570 -0
  587. package/tools/scan/scanners/infrastructure.py +875 -0
  588. package/tools/scan/scanners/orchestration.py +600 -0
  589. package/tools/scan/scanners/stack.py +1085 -0
  590. package/tools/scan/scanners/tools.py +260 -0
  591. package/tools/scan/setup.py +686 -0
  592. package/tools/scan/tests/__init__.py +1 -0
  593. package/tools/scan/tests/conftest.py +796 -0
  594. package/tools/scan/tests/test_environment.py +323 -0
  595. package/tools/scan/tests/test_git.py +419 -0
  596. package/tools/scan/tests/test_infrastructure.py +382 -0
  597. package/tools/scan/tests/test_integration.py +920 -0
  598. package/tools/scan/tests/test_merge.py +269 -0
  599. package/tools/scan/tests/test_orchestration.py +304 -0
  600. package/tools/scan/tests/test_stack.py +604 -0
  601. package/tools/scan/tests/test_tools.py +349 -0
  602. package/tools/scan/ui.py +624 -0
  603. package/tools/scan/verify.py +270 -0
  604. package/tools/scan/walk.py +118 -0
  605. package/tools/scan/workspace.py +85 -0
  606. package/tools/validation/README.md +244 -0
  607. package/tools/validation/__init__.py +17 -0
  608. package/tools/validation/approval_gate.py +321 -0
  609. package/tools/validation/validate_skills.py +189 -0
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: skill-creation
3
+ description: Use when creating a new skill, improving an existing skill, or deciding what a skill should contain and how it should be structured
4
+ metadata:
5
+ user-invocable: false
6
+ type: technique
7
+ ---
8
+
9
+ # Skill Creation
10
+
11
+ ## What is a skill?
12
+
13
+ Injected procedural knowledge -- the "how" for agents. The agent brings identity and domain knowledge. The skill brings process and protocol. They never duplicate each other.
14
+
15
+ ## Step 1: Choose the type
16
+
17
+ Type determines structure. Choose before writing anything.
18
+
19
+ | Type | Purpose | When it applies |
20
+ |------|---------|-----------------|
21
+ | **Discipline** | Enforces rules the agent will rationalize around under pressure | command-execution, execution |
22
+ | **Technique** | How to think about or approach a class of problem | investigation, approval |
23
+ | **Reference** | Lookup tables, classifications, format specifications | security-tiers, fast-queries, git-conventions |
24
+ | **Domain** | Project-specific patterns for a technical area | terraform-patterns, gitops-patterns |
25
+ | **Protocol** | System operating contract -- state machines, mandatory formats | agent-protocol |
26
+
27
+ ## Step 2: Apply the type structure
28
+
29
+ **Discipline:** Iron Law -> Mental Model -> Rules -> Traps -> Anti-patterns. Every trap you leave unnamed is a loophole.
30
+
31
+ **Technique:** Overview (core principle + when to use) -> Process (numbered steps) -> Anti-patterns.
32
+
33
+ **Reference:** Quick-scan table at top -> Examples -> Edge cases / special rules.
34
+
35
+ **Domain:** Conventions (naming, structure) -> Examples/snippets -> Key rules -> links to reference files.
36
+
37
+ **Protocol:** State machine / flow -> Mandatory format -> State transitions -> Error handling.
38
+
39
+ ## Step 3: Write for judgment, not compliance
40
+
41
+ A rule without context ("ALWAYS do X") carries almost no weight in the LLM's reasoning -- the model has no reason to prioritize it over competing signals. An explanation with consequences carries enough weight to influence decisions even under pressure. Every line competes for attention; earn each one with reasoning the model can use.
42
+
43
+ The test: for each rule, ask -- if the agent saw enough examples of this going wrong, would it reach the same conclusion? If yes, you are capturing genuine wisdom. If no, it needs more context.
44
+
45
+ For detailed guidance on tone by type (discipline, technique, domain, reference, protocol) and connection to the gaia-patterns design philosophy, see `reference.md`.
46
+
47
+ ## Step 4: Write the description field
48
+
49
+ The description determines when the agent reads the skill. It contains **triggering conditions only** -- describing the process causes the agent to follow the description and skip reading the content.
50
+
51
+ ```yaml
52
+ # Bad -- summarizes process, agent skips content
53
+ description: Defensive command execution - timeout protection, pipe avoidance, safe shell patterns
54
+
55
+ # Good -- triggering conditions only
56
+ description: Use when executing any bash command, cloud CLI, or shell operation
57
+ ```
58
+
59
+ ## Step 5: Respect the line budget
60
+
61
+ | Injection method | Budget | Reason |
62
+ |-----------------|--------|--------|
63
+ | Frontmatter (always loaded) | < 100 lines | Loaded on every agent call |
64
+ | On-demand (read from disk) | < 500 lines | Loaded only when explicitly needed |
65
+
66
+ Heavy reference material -> `reference.md` (on-demand). Concrete examples -> `examples.md`. Executable tools -> `scripts/`.
67
+
68
+ ```
69
+ skill-name/
70
+ ├── SKILL.md <- main content (always loaded)
71
+ ├── reference.md <- heavy docs (on-demand)
72
+ ├── examples.md <- concrete examples (on-demand)
73
+ └── scripts/ <- executable tools
74
+ ```
75
+
76
+ ## When to create vs update
77
+
78
+ **Create new skill:** Distinct behavioral concern not covered by existing skills. Domain knowledge inline in an agent that applies to multiple agents.
79
+
80
+ **Update existing skill:** Agent ignores a rule the skill already defines -> strengthen with traps. Skill is missing a type-appropriate section.
81
+
82
+ **Put elsewhere:** Project-specific config -> CLAUDE.md or agent inline. Single-agent-only behavior -> keep inline. Knowledge the LLM covers well from training -> not needed.
83
+
84
+ **When creating a new skill:** Also update `skills/README.md` to add the new skill to the index. Load Skill('readme-writing') to do this correctly.
85
+
86
+ ## Anti-Patterns
87
+
88
+ - **Description summarizes process** -- agent follows the description and skips reading the skill body.
89
+ - **Discipline without traps** -- agents rationalize around rules; every unnamed loophole gets used.
90
+ - **Too generic** -- "be careful with commands" teaches nothing; skills need specific, concrete rules.
91
+ - **Duplicates agent content** -- two sources of truth both become stale; pick one place.
92
+ - **Single responsibility violated** -- if a skill covers two distinct behaviors, split it.
@@ -0,0 +1,29 @@
1
+ # Skill Creation -- Reference
2
+
3
+ Detailed guidance on writing style, tone by type, and design philosophy. Read on-demand when crafting or reviewing skill content.
4
+
5
+ ## Write for Judgment, Not Compliance
6
+
7
+ A skill that says "ALWAYS do X" is a rule. Rules get skipped the moment the agent encounters a situation where X seems unnecessary. A skill that explains *what goes wrong when you skip X* forms judgment. Judgment holds even in situations the skill never anticipated.
8
+
9
+ The test: for each rule or step you write, ask -- if the agent saw enough real examples of this going wrong, would it reach the same conclusion on its own? If yes, you're capturing genuine wisdom. If no, it's probably an arbitrary preference that needs more context before it can guide decisions.
10
+
11
+ This is why the investigation skill doesn't say "INVESTIGATE FIRST. ALWAYS. NO EXCEPTIONS." It says: *"Every codebase is a record of accumulated decisions... The first 2-3 files you read define whether your solution fits or fights the project."* The agent understands the stakes. The behavior follows.
12
+
13
+ Every line in a skill competes for weight in the LLM's reasoning. A rule without context carries almost no weight -- the model has no reason to prioritize it over competing signals. An explanation with consequences carries enough weight to influence decisions even under pressure. This is why conciseness matters: a verbose skill dilutes its own weight. Every line should earn its place by adding reasoning the model can use.
14
+
15
+ ## Tone by Type
16
+
17
+ **Discipline** works best when the Iron Law is blunt and a reasoned paragraph follows explaining what breaks when you violate it. Command-execution's mental model ("When you reach for a pipe, you have not looked for the flag yet") does more work than a dozen capitalized warnings because it reframes the decision point itself.
18
+
19
+ **Technique** should read like a mentor sharing experience. Not "do step 1, step 2, step 3" but "when you encounter X, the thing that matters most is Y, because Z." The agent needs to internalize the priority, not memorize the sequence.
20
+
21
+ **Domain** skills guide discovery of the project's conventions, not dictate a generic structure. The codebase is the source of truth; the skill is a reference that helps the agent find and interpret what's already there.
22
+
23
+ **Reference** is where tone matters least and accuracy matters most. Tables, classifications, format specs. Get the content right.
24
+
25
+ **Protocol** needs precision in its state machines and formats, but transitions should explain why they exist. An agent that understands why REVIEW precedes IN_PROGRESS for T3 operations will handle edge cases the protocol didn't enumerate.
26
+
27
+ ## Connection to Design Philosophy
28
+
29
+ The gaia-patterns Workflow Design Philosophy captures this directly: *"Be positive -- describe what to do, not what to avoid"* and *"Allow discovery -- agent reaches conclusions empirically."* These principles apply directly to skill writing. A skill full of prohibitions ("never do X", "do NOT do Y") trains avoidance, not understanding. A skill that describes the better path and explains why it's better trains judgment that generalizes.
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: terraform-patterns
3
+ description: Use when creating, modifying, or reviewing Terraform or Terragrunt configuration files
4
+ metadata:
5
+ user-invocable: false
6
+ type: domain
7
+ ---
8
+
9
+ # Terraform Patterns
10
+
11
+ Project-specific conventions. Use values from your injected project-context — never hardcode project IDs, regions, or account identifiers.
12
+
13
+ For HCL examples (remote state, component structure, labels, outputs), read `reference.md` in this directory.
14
+
15
+ ## Discover the Project's Organization
16
+
17
+ Every project organizes Terraform differently. Before creating any
18
+ file, discover how THIS project does it.
19
+
20
+ 1. **Find the modules directory.** Look for `tf_modules/`, `modules/`,
21
+ `terraform/`, or similar. The name varies — what matters is whether
22
+ reusable modules exist and where they live.
23
+ 2. **Read 2-3 existing terragrunt.hcl files.** Look at the `source =`
24
+ lines. Do they reference local modules? Registry modules? A mix?
25
+ 3. **Follow the majority pattern.** If 8 out of 10 components use
26
+ local module references, yours should too. Consistency with the
27
+ project matters more than what you'd choose on a greenfield.
28
+
29
+ ### Module vs Inline
30
+
31
+ If the project has reusable modules for similar resource compositions
32
+ (e.g., a cloud-sql module that composes instance + database + user +
33
+ secrets), and your new resource follows a similar composition pattern,
34
+ create a reusable module. If it's truly one-off glue with no reuse
35
+ potential, inline is acceptable — but check first, because most
36
+ projects lean one way.
37
+
38
+ ## Directory Structure (Reference)
39
+
40
+ The structure below is a common starting point, not a prescription.
41
+ If the codebase uses a different layout, follow the codebase.
42
+
43
+ ```
44
+ terraform/
45
+ └── [module-name]/
46
+ ├── main.tf # Resource definitions
47
+ ├── variables.tf # Input variables
48
+ ├── outputs.tf # Output values (snake_case, with descriptions)
49
+ └── provider.tf # Provider config (if module-level)
50
+
51
+ features/infra/[env]/
52
+ ├── terragrunt.hcl # Root: remote state config
53
+ └── [component]/
54
+ └── terragrunt.hcl # Component: inputs + dependency references
55
+ ```
56
+
57
+ ## Naming Convention
58
+
59
+ | Resource | Pattern | Notes |
60
+ |----------|---------|-------|
61
+ | Network/VPC | `{app}-{env}-vpc` | From context: project + env |
62
+ | Cluster | `{app}-{env}-cluster-{n}` | Match context cluster_name |
63
+ | Database | `{app}-{env}-{engine}-instance` | Engine: postgres, mysql |
64
+ | Secret | `{service}-secret` | Matches app service name |
65
+ | Service Account | `{resource}-sa` | Scope: resource it serves |
66
+
67
+ ## Module Sourcing
68
+
69
+ - **Local modules** (preferred for GCP): `../../../../../terraform//{module-name}`
70
+ - **Registry modules** (preferred for AWS): `tfr:///terraform-aws-modules/{module}/aws?version=x.y.z`
71
+ - **Always pin exact versions** — never `latest`, never unpinned
72
+
73
+ ## Key Rules
74
+
75
+ 1. **Prefer Terragrunt** — prefer `terragrunt` commands for all environment operations; raw `terraform` is acceptable for module development and testing only
76
+ 2. **Dependencies via blocks** — never hardcode IDs, always `dependency.x.outputs.y`
77
+ 3. **Version pinning** — exact versions for modules, `~>` for providers
78
+ 4. **Tags on everything** — all resources get the standard label block
79
+ 5. **snake_case outputs** — descriptive names with `description` field
80
+ 6. **mock_outputs on dependencies** — required for `validate` and `plan` to work offline
81
+
82
+ ## Reference Docs
83
+
84
+ Use `WebFetch` when a resource or attribute is unknown or ambiguous. Do not use WebFetch to discover patterns — the codebase always wins over external docs.
85
+
86
+ | Need | URL |
87
+ |------|-----|
88
+ | Google provider resources | `https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/{resource}` |
89
+ | Terragrunt config blocks | `https://terragrunt.gruntwork.io/docs/reference/config-blocks-and-attributes` |
@@ -0,0 +1,93 @@
1
+ # Terraform Patterns — HCL Reference
2
+
3
+ Structural patterns for Terraform and Terragrunt. Cloud-agnostic — use values from project-context, never hardcode.
4
+
5
+ For cloud-specific resource examples (VPCs, clusters, databases), discover patterns from the existing codebase using the `investigation` skill.
6
+
7
+ ---
8
+
9
+ ## Remote State (root terragrunt.hcl)
10
+
11
+ ```hcl
12
+ remote_state {
13
+ backend = "gcs" # gcs | s3 | azurerm — from cloud_provider in context
14
+ config = {
15
+ bucket = "{project_id}-terraform-state"
16
+ prefix = "${path_relative_to_include()}/terraform.tfstate"
17
+ project = "{project_id}" # from project-context
18
+ location = "{primary_region}" # from project-context
19
+ }
20
+ }
21
+ ```
22
+
23
+ ## Component (terragrunt.hcl)
24
+
25
+ ```hcl
26
+ include "root" { path = find_in_parent_folders() }
27
+ terraform { source = "../../../../../terraform//{module-name}" }
28
+
29
+ dependency "vpc" {
30
+ config_path = "../vpc"
31
+ mock_outputs = { network_id = "mock-network" }
32
+ mock_outputs_allowed_terraform_commands = ["validate", "plan"]
33
+ }
34
+
35
+ inputs = {
36
+ project_id = "{project_id}" # from project-context
37
+ region = "{primary_region}" # from project-context
38
+ network_id = dependency.vpc.outputs.network_id
39
+ }
40
+ ```
41
+
42
+ ## Required Labels
43
+
44
+ Every resource must include:
45
+
46
+ ```hcl
47
+ labels = {
48
+ environment = "{env}" # from project-context
49
+ managed_by = "terraform"
50
+ project = "{project_id}" # from project-context
51
+ }
52
+ ```
53
+
54
+ ## Outputs Pattern
55
+
56
+ ```hcl
57
+ output "resource_id" {
58
+ description = "Description of what this output represents"
59
+ value = resource_type.name.id
60
+ }
61
+ ```
62
+
63
+ Always: snake_case name, non-empty description, no sensitive values unless `sensitive = true`.
64
+
65
+ ## Module Sourcing
66
+
67
+ ```hcl
68
+ # Local module (GCP preferred)
69
+ terraform { source = "../../../../../terraform//{module-name}" }
70
+
71
+ # Registry module (AWS preferred)
72
+ terraform { source = "tfr:///terraform-aws-modules/{module}/aws?version=x.y.z" }
73
+ ```
74
+
75
+ Always pin exact versions — never `latest`, never unpinned.
76
+
77
+ ## State Operations
78
+
79
+ ```bash
80
+ terragrunt state list
81
+ terragrunt state show {resource_type}.{name}
82
+ terragrunt import {resource_type}.{name} {live_id}
83
+ ```
84
+
85
+ ## Troubleshooting
86
+
87
+ | Issue | Solution |
88
+ |-------|----------|
89
+ | State lock | Check state backend lock table, wait or force-unlock with caution |
90
+ | Module not found | Run `terragrunt init` |
91
+ | Dependency cycle | Review dependency `config_path` declarations |
92
+ | Mock outputs mismatch | Update `mock_outputs` to match actual output types |
93
+ | Plan shows unexpected destroy | Check for naming drift between code and live state |
@@ -0,0 +1,9 @@
1
+ """gaia-ops tools namespace package.
2
+
3
+ Marking ``tools`` as a regular package ensures pytest's rootdir discovery
4
+ resolves to the repo root for both ``tests/`` and ``tools/scan/tests/``
5
+ during full-suite collection. Without this file, pytest walks up from
6
+ ``tools/scan/tests/__init__.py`` to ``tools/`` (no ``__init__.py``) and
7
+ uses that as the package root, which makes ``from tools.scan...`` imports
8
+ fail at collection time.
9
+ """
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ decide-status.py
4
+
5
+ Mechanically decide what to do based on numbers alone. No LLM judgment.
6
+
7
+ Usage:
8
+ python3 decide-status.py \
9
+ --current 94.5 \
10
+ --best 92.0 \
11
+ --threshold 98 \
12
+ --direction higher \
13
+ --consecutive-discards 2 \
14
+ --pivot-count 1
15
+
16
+ Output JSON:
17
+ {
18
+ "decision": "keep",
19
+ "reason": "Metric improved from 92.0 to 94.5",
20
+ "improved": true,
21
+ "gap_remaining": 3.5
22
+ }
23
+
24
+ Decision precedence (evaluated top-to-bottom, first match wins):
25
+ 1. pivot_count >= 3 → stop
26
+ 2. consecutive_discards >= 5 → pivot (also a discard)
27
+ 3. consecutive_discards >= 3 → refine (also a discard)
28
+ 4. current meets or passes threshold → threshold_reached
29
+ 5. current improved vs best (per direction) → keep
30
+ 6. current same or worse → discard
31
+
32
+ Exit codes:
33
+ 0 success (decision emitted as JSON)
34
+ 1 invalid input
35
+ """
36
+
37
+ import argparse
38
+ import json
39
+ import sys
40
+
41
+
42
+ Decision = str # type alias for readability
43
+
44
+
45
+ def _is_improved(current: float, best: float, direction: str) -> bool:
46
+ """Return True if *current* is strictly better than *best* per direction."""
47
+ if direction == "higher":
48
+ return current > best
49
+ return current < best # lower is better
50
+
51
+
52
+ def _threshold_reached(current: float, threshold: float, direction: str) -> bool:
53
+ """Return True if *current* has met or surpassed *threshold*."""
54
+ if direction == "higher":
55
+ return current >= threshold
56
+ return current <= threshold
57
+
58
+
59
+ def _gap_remaining(current: float, threshold: float, direction: str) -> float:
60
+ """Absolute gap between current value and threshold."""
61
+ if direction == "higher":
62
+ return max(0.0, threshold - current)
63
+ return max(0.0, current - threshold)
64
+
65
+
66
+ def decide(
67
+ current: float,
68
+ best: float,
69
+ threshold: float,
70
+ direction: str,
71
+ consecutive_discards: int,
72
+ pivot_count: int,
73
+ ) -> dict:
74
+ """Pure function: return decision dict from numeric inputs."""
75
+
76
+ gap = _gap_remaining(current, threshold, direction)
77
+ improved = _is_improved(current, best, direction)
78
+
79
+ # --- Precedence 1: hard stop on too many pivots ---
80
+ if pivot_count >= 3:
81
+ return {
82
+ "decision": "stop",
83
+ "reason": f"pivot_count={pivot_count} has reached the maximum of 3; halting loop",
84
+ "improved": improved,
85
+ "gap_remaining": gap,
86
+ }
87
+
88
+ # --- Precedence 2 & 3: discard streak escalations ---
89
+ # Evaluated before threshold/keep so an ongoing failing streak is flagged
90
+ # even if the current run happens to reach the threshold.
91
+ if consecutive_discards >= 5:
92
+ return {
93
+ "decision": "pivot",
94
+ "reason": (
95
+ f"consecutive_discards={consecutive_discards} >= 5; "
96
+ "strategy is not working, force a pivot"
97
+ ),
98
+ "improved": improved,
99
+ "gap_remaining": gap,
100
+ }
101
+
102
+ if consecutive_discards >= 3:
103
+ return {
104
+ "decision": "refine",
105
+ "reason": (
106
+ f"consecutive_discards={consecutive_discards} >= 3; "
107
+ "current approach needs refinement before continuing"
108
+ ),
109
+ "improved": improved,
110
+ "gap_remaining": gap,
111
+ }
112
+
113
+ # --- Precedence 4: threshold reached ---
114
+ if _threshold_reached(current, threshold, direction):
115
+ return {
116
+ "decision": "threshold_reached",
117
+ "reason": (
118
+ f"current={current} {'≥' if direction == 'higher' else '≤'} "
119
+ f"threshold={threshold}; goal achieved"
120
+ ),
121
+ "improved": improved,
122
+ "gap_remaining": 0.0,
123
+ }
124
+
125
+ # --- Precedence 5 & 6: standard keep/discard ---
126
+ if improved:
127
+ return {
128
+ "decision": "keep",
129
+ "reason": f"Metric improved from {best} to {current}",
130
+ "improved": True,
131
+ "gap_remaining": gap,
132
+ }
133
+
134
+ return {
135
+ "decision": "discard",
136
+ "reason": f"Metric did not improve (current={current}, best={best})",
137
+ "improved": False,
138
+ "gap_remaining": gap,
139
+ }
140
+
141
+
142
+ def main() -> None:
143
+ parser = argparse.ArgumentParser(
144
+ description="Compute the next agentic-loop decision from metric numbers only.",
145
+ formatter_class=argparse.RawDescriptionHelpFormatter,
146
+ epilog="""
147
+ Decisions:
148
+ keep current improved vs best
149
+ discard current same or worse
150
+ refine 3+ consecutive discards (improvement needed in approach)
151
+ pivot 5+ consecutive discards (strategy change required)
152
+ stop 3+ pivots already attempted
153
+ threshold_reached current meets or surpasses the goal threshold
154
+
155
+ Direction values:
156
+ higher larger numbers are better (e.g. accuracy, passing tests)
157
+ lower smaller numbers are better (e.g. error rate, latency ms)
158
+ """,
159
+ )
160
+ parser.add_argument("--current", required=True, type=float, help="Metric value for the current run")
161
+ parser.add_argument("--best", required=True, type=float, help="Best metric seen so far (from state.json)")
162
+ parser.add_argument("--threshold", required=True, type=float, help="Target threshold to reach")
163
+ parser.add_argument(
164
+ "--direction",
165
+ required=True,
166
+ choices=["higher", "lower"],
167
+ help="Whether higher or lower values are better",
168
+ )
169
+ parser.add_argument(
170
+ "--consecutive-discards",
171
+ required=True,
172
+ type=int,
173
+ metavar="N",
174
+ help="Number of consecutive discard outcomes so far (from state.json)",
175
+ )
176
+ parser.add_argument(
177
+ "--pivot-count",
178
+ required=True,
179
+ type=int,
180
+ metavar="N",
181
+ help="Number of pivots executed so far (from state.json)",
182
+ )
183
+ args = parser.parse_args()
184
+
185
+ # --- Input validation ---
186
+ errors = []
187
+ if args.consecutive_discards < 0:
188
+ errors.append("--consecutive-discards must be >= 0")
189
+ if args.pivot_count < 0:
190
+ errors.append("--pivot-count must be >= 0")
191
+
192
+ if errors:
193
+ for err in errors:
194
+ print(f"error: {err}", file=sys.stderr)
195
+ sys.exit(1)
196
+
197
+ result = decide(
198
+ current=args.current,
199
+ best=args.best,
200
+ threshold=args.threshold,
201
+ direction=args.direction,
202
+ consecutive_discards=args.consecutive_discards,
203
+ pivot_count=args.pivot_count,
204
+ )
205
+
206
+ print(json.dumps(result, indent=2))
207
+
208
+
209
+ if __name__ == "__main__":
210
+ main()
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ parse-metric.py
4
+
5
+ Read stdout from eval_command and extract METRIC lines.
6
+
7
+ Usage:
8
+ echo "output" | python3 parse-metric.py --metric accuracy
9
+ python3 parse-metric.py --metric accuracy --file /tmp/eval-output.txt
10
+
11
+ Input lines must match: METRIC {name}={number}
12
+ Output: JSON to stdout with metric name, numeric value, and raw line.
13
+ """
14
+
15
+ import argparse
16
+ import json
17
+ import re
18
+ import sys
19
+ from typing import Optional
20
+
21
+
22
+ METRIC_PATTERN = re.compile(r"^METRIC\s+(\w+)=([\d.]+)\s*$")
23
+
24
+
25
+ def parse_lines(lines: list[str]) -> list[dict]:
26
+ """Extract all METRIC entries from a sequence of lines."""
27
+ results = []
28
+ for line in lines:
29
+ stripped = line.rstrip("\n")
30
+ match = METRIC_PATTERN.match(stripped)
31
+ if match:
32
+ name = match.group(1)
33
+ raw_value = match.group(2)
34
+ # Preserve int vs float from the source text.
35
+ value: int | float
36
+ if "." in raw_value:
37
+ value = float(raw_value)
38
+ else:
39
+ value = int(raw_value)
40
+ results.append(
41
+ {
42
+ "metric": name,
43
+ "value": value,
44
+ "raw_line": stripped,
45
+ }
46
+ )
47
+ return results
48
+
49
+
50
+ def main() -> None:
51
+ parser = argparse.ArgumentParser(
52
+ description="Extract METRIC lines from eval_command output.",
53
+ formatter_class=argparse.RawDescriptionHelpFormatter,
54
+ epilog="""
55
+ Examples:
56
+ echo "METRIC accuracy=94.5" | python3 parse-metric.py --metric accuracy
57
+ python3 parse-metric.py --metric passing_tests --file /tmp/out.txt
58
+ python3 parse-metric.py --file /tmp/out.txt # returns all metrics
59
+ """,
60
+ )
61
+ parser.add_argument(
62
+ "--metric",
63
+ metavar="NAME",
64
+ help="Return only this named metric (case-sensitive). Exits 1 if not found.",
65
+ )
66
+ parser.add_argument(
67
+ "--file",
68
+ metavar="PATH",
69
+ help="Read from file instead of stdin.",
70
+ )
71
+ args = parser.parse_args()
72
+
73
+ # --- Read input ---
74
+ try:
75
+ if args.file:
76
+ with open(args.file, "r") as fh:
77
+ lines = fh.readlines()
78
+ else:
79
+ lines = sys.stdin.readlines()
80
+ except OSError as exc:
81
+ print(f"error: cannot read input: {exc}", file=sys.stderr)
82
+ sys.exit(1)
83
+
84
+ # --- Parse ---
85
+ all_metrics = parse_lines(lines)
86
+
87
+ if args.metric:
88
+ # Filter to the requested metric name.
89
+ matches = [m for m in all_metrics if m["metric"] == args.metric]
90
+ if not matches:
91
+ print(
92
+ f"error: metric '{args.metric}' not found in input",
93
+ file=sys.stderr,
94
+ )
95
+ sys.exit(1)
96
+ # Return the last occurrence if there are duplicates.
97
+ result = matches[-1]
98
+ else:
99
+ # Return all metrics as a list when no --metric filter is given.
100
+ result = all_metrics # type: ignore[assignment]
101
+
102
+ print(json.dumps(result, indent=2))
103
+
104
+
105
+ if __name__ == "__main__":
106
+ main()