@jaguilar87/gaia 5.0.2 → 5.0.5

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 (154) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/ARCHITECTURE.md +0 -1
  4. package/CHANGELOG.md +110 -0
  5. package/INSTALL.md +0 -2
  6. package/README.md +1 -6
  7. package/bin/README.md +0 -1
  8. package/bin/cli/_install_helpers.py +1 -1
  9. package/bin/cli/approvals.py +23 -21
  10. package/bin/cli/cleanup.py +0 -1
  11. package/bin/cli/doctor.py +1 -1
  12. package/bin/cli/memory.py +2 -0
  13. package/bin/cli/update.py +1 -1
  14. package/bin/pre-publish-validate.js +48 -5
  15. package/config/README.md +22 -44
  16. package/config/surface-routing.json +0 -2
  17. package/dist/gaia-ops/.claude-plugin/plugin.json +1 -1
  18. package/dist/gaia-ops/config/README.md +22 -44
  19. package/dist/gaia-ops/config/surface-routing.json +0 -2
  20. package/dist/gaia-ops/hooks/modules/agents/contract_validator.py +18 -0
  21. package/dist/gaia-ops/hooks/modules/agents/handoff_persister.py +214 -2
  22. package/dist/gaia-ops/hooks/modules/agents/response_contract.py +26 -0
  23. package/dist/gaia-ops/hooks/modules/agents/transcript_reader.py +15 -0
  24. package/dist/gaia-ops/hooks/modules/security/__init__.py +0 -5
  25. package/dist/gaia-ops/hooks/modules/security/approval_grants.py +124 -19
  26. package/dist/gaia-ops/hooks/modules/security/mutative_verbs.py +99 -7
  27. package/dist/gaia-ops/hooks/modules/tools/bash_validator.py +127 -24
  28. package/dist/gaia-ops/hooks/modules/validation/commit_validator.py +90 -55
  29. package/dist/gaia-ops/skills/README.md +1 -1
  30. package/dist/gaia-ops/skills/agent-contract-handoff/SKILL.md +3 -0
  31. package/dist/gaia-ops/skills/agent-response/SKILL.md +4 -2
  32. package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +1 -1
  33. package/dist/gaia-ops/skills/gaia-patterns/reference.md +2 -3
  34. package/dist/gaia-ops/skills/gaia-release/SKILL.md +60 -24
  35. package/dist/gaia-ops/skills/gaia-release/reference.md +35 -11
  36. package/dist/gaia-ops/skills/git-conventions/SKILL.md +6 -2
  37. package/dist/gaia-ops/skills/orchestrator-present-approval/SKILL.md +30 -7
  38. package/dist/gaia-ops/skills/orchestrator-present-approval/reference.md +32 -15
  39. package/dist/gaia-ops/skills/readme-writing/SKILL.md +1 -1
  40. package/dist/gaia-ops/skills/readme-writing/reference.md +0 -1
  41. package/dist/gaia-ops/skills/security-tiers/SKILL.md +5 -1
  42. package/dist/gaia-ops/skills/security-tiers/reference.md +3 -1
  43. package/dist/gaia-ops/skills/subagent-request-approval/SKILL.md +43 -6
  44. package/dist/gaia-ops/skills/subagent-request-approval/reference.md +66 -16
  45. package/dist/gaia-ops/tools/context/README.md +1 -1
  46. package/dist/gaia-ops/tools/gaia_simulator/extractor.py +0 -1
  47. package/dist/gaia-ops/tools/scan/ui.py +20 -4
  48. package/dist/gaia-ops/tools/scan/verify.py +3 -3
  49. package/dist/gaia-ops/tools/validation/README.md +15 -24
  50. package/dist/gaia-security/.claude-plugin/plugin.json +1 -1
  51. package/dist/gaia-security/hooks/modules/agents/contract_validator.py +18 -0
  52. package/dist/gaia-security/hooks/modules/agents/handoff_persister.py +214 -2
  53. package/dist/gaia-security/hooks/modules/agents/response_contract.py +26 -0
  54. package/dist/gaia-security/hooks/modules/agents/transcript_reader.py +15 -0
  55. package/dist/gaia-security/hooks/modules/security/__init__.py +0 -5
  56. package/dist/gaia-security/hooks/modules/security/approval_grants.py +124 -19
  57. package/dist/gaia-security/hooks/modules/security/mutative_verbs.py +99 -7
  58. package/dist/gaia-security/hooks/modules/tools/bash_validator.py +127 -24
  59. package/dist/gaia-security/hooks/modules/validation/commit_validator.py +90 -55
  60. package/gaia/state/transitions.py +4 -4
  61. package/gaia/store/writer.py +56 -0
  62. package/hooks/modules/README.md +2 -4
  63. package/hooks/modules/agents/contract_validator.py +18 -0
  64. package/hooks/modules/agents/handoff_persister.py +214 -2
  65. package/hooks/modules/agents/response_contract.py +26 -0
  66. package/hooks/modules/agents/transcript_reader.py +15 -0
  67. package/hooks/modules/security/__init__.py +0 -5
  68. package/hooks/modules/security/approval_grants.py +124 -19
  69. package/hooks/modules/security/mutative_verbs.py +99 -7
  70. package/hooks/modules/tools/bash_validator.py +127 -24
  71. package/hooks/modules/validation/commit_validator.py +90 -55
  72. package/index.js +2 -12
  73. package/package.json +4 -6
  74. package/pyproject.toml +3 -3
  75. package/scripts/bootstrap_database.sh +88 -439
  76. package/scripts/check_schema_drift.py +208 -0
  77. package/scripts/migrations/README.md +78 -28
  78. package/scripts/migrations/schema.checksum +8 -0
  79. package/scripts/release-prepare.mjs +199 -0
  80. package/skills/README.md +1 -1
  81. package/skills/agent-contract-handoff/SKILL.md +3 -0
  82. package/skills/agent-response/SKILL.md +4 -2
  83. package/skills/gaia-patterns/SKILL.md +1 -1
  84. package/skills/gaia-patterns/reference.md +2 -3
  85. package/skills/gaia-release/SKILL.md +60 -24
  86. package/skills/gaia-release/reference.md +35 -11
  87. package/skills/git-conventions/SKILL.md +6 -2
  88. package/skills/orchestrator-present-approval/SKILL.md +30 -7
  89. package/skills/orchestrator-present-approval/reference.md +32 -15
  90. package/skills/readme-writing/SKILL.md +1 -1
  91. package/skills/readme-writing/reference.md +0 -1
  92. package/skills/security-tiers/SKILL.md +5 -1
  93. package/skills/security-tiers/reference.md +3 -1
  94. package/skills/subagent-request-approval/SKILL.md +43 -6
  95. package/skills/subagent-request-approval/reference.md +66 -16
  96. package/tools/context/README.md +1 -1
  97. package/tools/gaia_simulator/extractor.py +0 -1
  98. package/tools/scan/ui.py +20 -4
  99. package/tools/scan/verify.py +3 -3
  100. package/tools/validation/README.md +15 -24
  101. package/commands/README.md +0 -64
  102. package/commands/gaia.md +0 -37
  103. package/commands/scan-project.md +0 -74
  104. package/config/crons-schema.md +0 -81
  105. package/config/git_standards.json +0 -72
  106. package/dist/gaia-ops/commands/gaia.md +0 -37
  107. package/dist/gaia-ops/config/crons-schema.md +0 -81
  108. package/dist/gaia-ops/config/git_standards.json +0 -72
  109. package/dist/gaia-ops/hooks/modules/security/gitops_validator.py +0 -179
  110. package/dist/gaia-ops/tools/agentic-loop/decide-status.py +0 -210
  111. package/dist/gaia-ops/tools/agentic-loop/parse-metric.py +0 -106
  112. package/dist/gaia-ops/tools/agentic-loop/record-iteration.py +0 -223
  113. package/dist/gaia-security/hooks/modules/security/gitops_validator.py +0 -179
  114. package/git-hooks/commit-msg +0 -41
  115. package/hooks/modules/security/gitops_validator.py +0 -179
  116. package/scripts/migrations/v10_to_v11.sql +0 -170
  117. package/scripts/migrations/v10_to_v11_fresh.sql +0 -18
  118. package/scripts/migrations/v11_to_v12.sql +0 -195
  119. package/scripts/migrations/v11_to_v12_fresh.sql +0 -19
  120. package/scripts/migrations/v12_to_v13.sql +0 -48
  121. package/scripts/migrations/v12_to_v13_fresh.sql +0 -17
  122. package/scripts/migrations/v13_to_v14.sql +0 -44
  123. package/scripts/migrations/v13_to_v14_fresh.sql +0 -17
  124. package/scripts/migrations/v14_to_v15.sql +0 -71
  125. package/scripts/migrations/v14_to_v15_fresh.sql +0 -19
  126. package/scripts/migrations/v15_to_v16.sql +0 -57
  127. package/scripts/migrations/v15_to_v16_fresh.sql +0 -18
  128. package/scripts/migrations/v16_to_v17.sql +0 -51
  129. package/scripts/migrations/v16_to_v17_fresh.sql +0 -18
  130. package/scripts/migrations/v17_to_v18.sql +0 -66
  131. package/scripts/migrations/v17_to_v18_fresh.sql +0 -24
  132. package/scripts/migrations/v1_to_v2.sql +0 -97
  133. package/scripts/migrations/v2_to_v3.sql +0 -68
  134. package/scripts/migrations/v2_to_v3_merge.sql +0 -69
  135. package/scripts/migrations/v3_to_v4.sql +0 -67
  136. package/scripts/migrations/v3_to_v4_fresh.sql +0 -20
  137. package/scripts/migrations/v4_to_v5.sql +0 -55
  138. package/scripts/migrations/v4_to_v5_fresh.sql +0 -20
  139. package/scripts/migrations/v5_to_v6.sql +0 -48
  140. package/scripts/migrations/v5_to_v6_fresh.sql +0 -17
  141. package/scripts/migrations/v6_to_v7.sql +0 -26
  142. package/scripts/migrations/v6_to_v7_fresh.sql +0 -13
  143. package/scripts/migrations/v7_to_v8.sql +0 -44
  144. package/scripts/migrations/v7_to_v8_fresh.sql +0 -14
  145. package/scripts/migrations/v8_to_v9.sql +0 -87
  146. package/scripts/migrations/v8_to_v9_fresh.sql +0 -15
  147. package/scripts/migrations/v9_to_v10.sql +0 -109
  148. package/scripts/migrations/v9_to_v10_episodes_workspace.sql +0 -109
  149. package/scripts/migrations/v9_to_v10_fresh.sql +0 -18
  150. package/templates/README.md +0 -70
  151. package/templates/managed-settings.template.json +0 -43
  152. package/tools/agentic-loop/decide-status.py +0 -210
  153. package/tools/agentic-loop/parse-metric.py +0 -106
  154. package/tools/agentic-loop/record-iteration.py +0 -223
@@ -23,11 +23,75 @@ Usage:
23
23
  import json
24
24
  import os
25
25
  import re
26
- from typing import Dict, List, Any, Optional
26
+ from typing import Dict, List, Optional
27
27
  from datetime import datetime
28
28
  from dataclasses import dataclass
29
29
 
30
30
 
31
+ # ---------------------------------------------------------------------------
32
+ # Git commit standards -- inlined constants.
33
+ #
34
+ # These were previously loaded from config/git_standards.json. They are now
35
+ # module-level constants: commit_validator.py is the single runtime consumer
36
+ # of these format/subject/body rules, so the JSON indirection added drift risk
37
+ # without any benefit. Footer detection/stripping is NOT here -- it lives,
38
+ # hardcoded, in bash_validator (footers are bash_validator's responsibility).
39
+ # ---------------------------------------------------------------------------
40
+
41
+ FORMAT = "conventional_commits"
42
+
43
+ TYPE_ALLOWED = (
44
+ "feat",
45
+ "fix",
46
+ "refactor",
47
+ "docs",
48
+ "test",
49
+ "chore",
50
+ "ci",
51
+ "perf",
52
+ "style",
53
+ "build",
54
+ )
55
+
56
+ SCOPE_REQUIRED = False
57
+ SCOPE_EXAMPLES = ("helmrelease", "terraform", "pg-non-prod", "infrastructure")
58
+
59
+ SUBJECT_MAX_LENGTH = 72
60
+ SUBJECT_RULES = {
61
+ "capitalize_first_letter": False,
62
+ "no_period_at_end": True,
63
+ "imperative_mood": True,
64
+ "no_emoji": True,
65
+ }
66
+
67
+ BODY_MAX_LINE_LENGTH = 72
68
+ BODY_REQUIRED = False
69
+
70
+ EXAMPLES_VALID = (
71
+ "feat(helmrelease): add Phase 3.3 services",
72
+ "fix(pg-non-prod): correct API key environment variable mappings",
73
+ "refactor: simplify context provider logic",
74
+ "docs: update README with new workflow",
75
+ "chore(deps): update terraform to v1.6.0",
76
+ )
77
+
78
+ EXAMPLES_INVALID = (
79
+ "Added new feature",
80
+ "Fixed bugs",
81
+ "Updates",
82
+ "feat: add feature\n\n🤖 Generated with Claude Code",
83
+ "feat: add new feature 🚀",
84
+ "fix: 🐛 correct bug",
85
+ )
86
+
87
+ ENFORCEMENT = {
88
+ "enabled": True,
89
+ "block_on_failure": True,
90
+ "log_violations": True,
91
+ "log_path": ".claude/logs/commit-violations.jsonl",
92
+ }
93
+
94
+
31
95
  @dataclass
32
96
  class ValidationResult:
33
97
  """Result of commit message validation."""
@@ -44,43 +108,30 @@ class CommitMessageValidator:
44
108
  """
45
109
  Validates git commit messages against project standards.
46
110
 
47
- Standards are defined in .claude/config/git_standards.json
111
+ Standards are inlined as module-level constants (TYPE_ALLOWED,
112
+ SUBJECT_MAX_LENGTH, SUBJECT_RULES, etc.). Footer detection is not handled
113
+ here -- that is bash_validator's responsibility.
48
114
  """
49
115
 
50
116
  def __init__(self, config_path: Optional[str] = None):
51
117
  """
52
- Initialize validator with configuration.
118
+ Initialize validator.
53
119
 
54
120
  Args:
55
- config_path: Optional path to git_standards.json
56
- If None, uses default location
121
+ config_path: Accepted for backward compatibility only. When given,
122
+ it anchors base_path (used to resolve the relative
123
+ violation log path); the rules themselves come from
124
+ the module-level constants, not from any file.
57
125
  """
58
126
  if config_path is None:
59
- # Default path relative to this file
60
- # From hooks/modules/validation/ go up to gaia-ops root
127
+ # base_path -> gaia-ops root, used to resolve the violation log.
61
128
  # __file__ -> hooks/modules/validation/commit_validator.py
62
- # dirname(dirname(dirname(dirname(__file__)))) -> gaia-ops root
63
129
  base_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
64
- config_path = os.path.join(base_path, 'config', 'git_standards.json')
65
130
  else:
66
- # If config_path provided, derive base_path from it
67
131
  base_path = os.path.dirname(os.path.dirname(config_path))
68
132
 
69
133
  self.base_path = base_path
70
- self.config_path = config_path
71
- self.config = self._load_config()
72
- self.standards = self.config.get('commit_message', {})
73
- self.enforcement = self.config.get('enforcement', {})
74
-
75
- def _load_config(self) -> Dict[str, Any]:
76
- """Load git standards configuration from JSON file."""
77
- if not os.path.exists(self.config_path):
78
- raise FileNotFoundError(
79
- f"Git standards configuration not found at: {self.config_path}"
80
- )
81
-
82
- with open(self.config_path, 'r') as f:
83
- return json.load(f)
134
+ self.enforcement = ENFORCEMENT
84
135
 
85
136
  def validate(self, message: str) -> ValidationResult:
86
137
  """
@@ -95,19 +146,19 @@ class CommitMessageValidator:
95
146
  errors = []
96
147
  warnings = []
97
148
 
98
- # 1. Check for forbidden footers (CRITICAL)
99
- footer_errors = self._check_forbidden_footers(message)
100
- errors.extend(footer_errors)
149
+ # Note: forbidden-footer detection is intentionally NOT done here.
150
+ # Footers are bash_validator's responsibility (stripping/detection
151
+ # is hardcoded there).
101
152
 
102
- # 2. Check conventional commits format
153
+ # 1. Check conventional commits format
103
154
  format_errors = self._check_conventional_format(message)
104
155
  errors.extend(format_errors)
105
156
 
106
- # 3. Check subject line rules
157
+ # 2. Check subject line rules
107
158
  subject_errors = self._check_subject_rules(message)
108
159
  errors.extend(subject_errors)
109
160
 
110
- # 4. Check body rules (warnings only)
161
+ # 3. Check body rules (warnings only)
111
162
  body_warnings = self._check_body_rules(message)
112
163
  warnings.extend(body_warnings)
113
164
 
@@ -121,22 +172,6 @@ class CommitMessageValidator:
121
172
  warnings=warnings
122
173
  )
123
174
 
124
- def _check_forbidden_footers(self, message: str) -> List[Dict[str, str]]:
125
- """Check for forbidden footers in commit message."""
126
- errors = []
127
- forbidden = self.standards.get('footer_forbidden', [])
128
-
129
- for forbidden_text in forbidden:
130
- if forbidden_text.lower() in message.lower():
131
- errors.append({
132
- 'type': 'FORBIDDEN_FOOTER',
133
- 'message': f"Commit message contains forbidden footer: '{forbidden_text}'",
134
- 'fix': f"Remove all occurrences of '{forbidden_text}'",
135
- 'severity': 'error'
136
- })
137
-
138
- return errors
139
-
140
175
  def _check_conventional_format(self, message: str) -> List[Dict[str, str]]:
141
176
  """Check if message follows Conventional Commits format."""
142
177
  errors = []
@@ -147,16 +182,16 @@ class CommitMessageValidator:
147
182
 
148
183
  # Pattern: type(scope)?: description
149
184
  # Examples: feat: add feature, fix(api): correct bug
150
- allowed_types = '|'.join(self.standards.get('type_allowed', []))
185
+ allowed_types = '|'.join(TYPE_ALLOWED)
151
186
  pattern = rf'^({allowed_types})(\(.+?\))?: .+$'
152
187
 
153
188
  if not re.match(pattern, subject):
154
189
  errors.append({
155
190
  'type': 'INVALID_FORMAT',
156
191
  'message': 'Commit message does not follow Conventional Commits format',
157
- 'fix': f"Use format: type(scope): description\nAllowed types: {', '.join(self.standards.get('type_allowed', []))}",
192
+ 'fix': f"Use format: type(scope): description\nAllowed types: {', '.join(TYPE_ALLOWED)}",
158
193
  'severity': 'error',
159
- 'examples': self.standards.get('examples_valid', [])
194
+ 'examples': list(EXAMPLES_VALID)
160
195
  })
161
196
 
162
197
  return errors
@@ -175,7 +210,7 @@ class CommitMessageValidator:
175
210
  description = match.group(2)
176
211
 
177
212
  # Check max length
178
- max_length = self.standards.get('subject_max_length', 72)
213
+ max_length = SUBJECT_MAX_LENGTH
179
214
  if len(subject) > max_length:
180
215
  errors.append({
181
216
  'type': 'SUBJECT_TOO_LONG',
@@ -185,7 +220,7 @@ class CommitMessageValidator:
185
220
  })
186
221
 
187
222
  # Check for period at end
188
- rules = self.standards.get('subject_rules', {})
223
+ rules = SUBJECT_RULES
189
224
  if rules.get('no_period_at_end', True) and description.endswith('.'):
190
225
  errors.append({
191
226
  'type': 'SUBJECT_ENDS_WITH_PERIOD',
@@ -242,7 +277,7 @@ class CommitMessageValidator:
242
277
  })
243
278
 
244
279
  # Check body line length
245
- max_length = self.standards.get('body_max_line_length', 72)
280
+ max_length = BODY_MAX_LINE_LENGTH
246
281
  for i, line in enumerate(lines[2:], start=3): # Skip subject and blank line
247
282
  if len(line) > max_length and not line.startswith('http'):
248
283
  warnings.append({
@@ -285,13 +320,13 @@ class CommitMessageValidator:
285
320
  def get_examples(self) -> Dict[str, List[str]]:
286
321
  """Get example commit messages (valid and invalid)."""
287
322
  return {
288
- 'valid': self.standards.get('examples_valid', []),
289
- 'invalid': self.standards.get('examples_invalid', [])
323
+ 'valid': list(EXAMPLES_VALID),
324
+ 'invalid': list(EXAMPLES_INVALID)
290
325
  }
291
326
 
292
327
  def get_allowed_types(self) -> List[str]:
293
328
  """Get list of allowed commit types."""
294
- return self.standards.get('type_allowed', [])
329
+ return list(TYPE_ALLOWED)
295
330
 
296
331
  def format_error_message(self, validation: ValidationResult) -> str:
297
332
  """
package/index.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * import { getAgentPath, getToolPath, getConfigPath } from '@jaguilar87/gaia';
8
8
  * const agentPath = getAgentPath('gitops-operator');
9
9
  * const toolPath = getToolPath('context_provider.py');
10
- * const configPath = getConfigPath('git_standards.json');
10
+ * const configPath = getConfigPath('surface-routing.json');
11
11
  */
12
12
 
13
13
  import { fileURLToPath } from 'url';
@@ -54,18 +54,9 @@ export function getCommandPath(commandName) {
54
54
  return join(PACKAGE_ROOT, 'commands', commandName);
55
55
  }
56
56
 
57
- /**
58
- * Get absolute path to a template
59
- * @param {string} templateName - Name of the template (e.g., 'governance.template.md')
60
- * @returns {string} Absolute path to template file
61
- */
62
- export function getTemplatePath(templateName) {
63
- return join(PACKAGE_ROOT, 'templates', templateName);
64
- }
65
-
66
57
  /**
67
58
  * Get absolute path to config file
68
- * @param {string} configName - Name of the config (e.g., 'git_standards.json')
59
+ * @param {string} configName - Name of the config (e.g., 'surface-routing.json')
69
60
  * @returns {string} Absolute path to config file
70
61
  */
71
62
  export function getConfigPath(configName) {
@@ -78,6 +69,5 @@ export default {
78
69
  getToolPath,
79
70
  getHookPath,
80
71
  getCommandPath,
81
- getTemplatePath,
82
72
  getConfigPath
83
73
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaguilar87/gaia",
3
- "version": "5.0.2",
3
+ "version": "5.0.5",
4
4
  "description": "Multi-agent orchestration system for Claude Code - DevOps automation toolkit",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -37,13 +37,10 @@
37
37
  "tools/",
38
38
  "gaia/",
39
39
  "hooks/",
40
- "commands/",
41
- "templates/",
42
40
  "config/",
43
41
  "scripts/",
44
42
  "skills/",
45
43
  "dist/",
46
- "git-hooks/",
47
44
  "README.md",
48
45
  "INSTALL.md",
49
46
  "CHANGELOG.md",
@@ -62,6 +59,7 @@
62
59
  "test:all": "python3 -m pytest tests/ -v -m ''",
63
60
  "test:promptfoo": "npx promptfoo eval --config tests/promptfoo.yaml",
64
61
  "lint": "eslint .",
62
+ "release:prepare": "node scripts/release-prepare.mjs",
65
63
  "clean:dist": "rm -rf dist/",
66
64
  "build:plugins": "npm run clean:dist && python3 scripts/build-plugin.py gaia-security && python3 scripts/build-plugin.py gaia-ops",
67
65
  "clean": "find . -type d -name '__pycache__' -exec rm -rf {} + 2>/dev/null || true",
@@ -71,7 +69,7 @@
71
69
  "gaia:verify-install:local": "npm pack && bash bin/validate-sandbox.sh --tarball ./jaguilar87-gaia-*.tgz --target sandbox",
72
70
  "gaia:verify-install:rc": "bash bin/validate-sandbox.sh --version @rc --target sandbox",
73
71
  "gaia:verify-install:latest": "bash bin/validate-sandbox.sh --version @latest --target sandbox",
74
- "gaia:install-local": "npm pack && bash bin/validate-sandbox.sh --tarball ./jaguilar87-gaia-*.tgz --target local",
72
+ "gaia:install-local": "npm run build:plugins && npm pack && bash bin/validate-sandbox.sh --tarball ./jaguilar87-gaia-*.tgz --target local",
75
73
  "prepack": "npm run clean",
76
74
  "prepublishOnly": "npm run build:plugins && node bin/pre-publish-validate.js",
77
75
  "postinstall": "python3 bin/gaia install --postinstall",
@@ -85,6 +83,6 @@
85
83
  },
86
84
  "engines": {
87
85
  "node": ">=18.0.0",
88
- "python": ">=3.9"
86
+ "python": ">=3.11"
89
87
  }
90
88
  }
package/pyproject.toml CHANGED
@@ -1,8 +1,8 @@
1
1
  [project]
2
2
  name = "gaia"
3
- version = "5.0.2"
3
+ version = "5.0.5"
4
4
  description = "Multi-agent orchestration system for Claude Code - DevOps automation toolkit"
5
- requires-python = ">=3.9"
5
+ requires-python = ">=3.11"
6
6
  license = {text = "MIT"}
7
7
  authors = [
8
8
  {name = "Jorge Aguilar", email = "jorge.aguilar87@gmail.com"},
@@ -16,7 +16,7 @@ dev = [
16
16
  ]
17
17
 
18
18
  [tool.ruff]
19
- target-version = "py39"
19
+ target-version = "py311"
20
20
  line-length = 120
21
21
 
22
22
  [tool.ruff.lint]