aios-core 4.0.2 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aios-core/cli/commands/migrate/analyze.js +6 -6
- package/.aios-core/cli/commands/migrate/backup.js +2 -2
- package/.aios-core/cli/commands/migrate/execute.js +4 -4
- package/.aios-core/cli/commands/migrate/index.js +5 -5
- package/.aios-core/cli/commands/migrate/rollback.js +6 -6
- package/.aios-core/cli/commands/migrate/update-imports.js +2 -2
- package/.aios-core/cli/commands/migrate/validate.js +2 -2
- package/.aios-core/cli/commands/pro/index.js +52 -0
- package/.aios-core/cli/index.js +1 -1
- package/.aios-core/core/ids/registry-updater.js +29 -3
- package/.aios-core/core/migration/migration-config.yaml +2 -2
- package/.aios-core/core/migration/module-mapping.yaml +2 -2
- package/.aios-core/core/registry/README.md +2 -2
- package/.aios-core/core/synapse/context/context-builder.js +34 -0
- package/.aios-core/core/synapse/diagnostics/collectors/consistency-collector.js +168 -0
- package/.aios-core/core/synapse/diagnostics/collectors/hook-collector.js +129 -0
- package/.aios-core/core/synapse/diagnostics/collectors/manifest-collector.js +82 -0
- package/.aios-core/core/synapse/diagnostics/collectors/output-analyzer.js +134 -0
- package/.aios-core/core/synapse/diagnostics/collectors/pipeline-collector.js +75 -0
- package/.aios-core/core/synapse/diagnostics/collectors/quality-collector.js +252 -0
- package/.aios-core/core/synapse/diagnostics/collectors/relevance-matrix.js +174 -0
- package/.aios-core/core/synapse/diagnostics/collectors/safe-read-json.js +31 -0
- package/.aios-core/core/synapse/diagnostics/collectors/session-collector.js +102 -0
- package/.aios-core/core/synapse/diagnostics/collectors/timing-collector.js +126 -0
- package/.aios-core/core/synapse/diagnostics/collectors/uap-collector.js +83 -0
- package/.aios-core/core/synapse/diagnostics/report-formatter.js +484 -0
- package/.aios-core/core/synapse/diagnostics/synapse-diagnostics.js +95 -0
- package/.aios-core/core/synapse/engine.js +73 -20
- package/.aios-core/core/synapse/runtime/hook-runtime.js +60 -0
- package/.aios-core/core-config.yaml +6 -0
- package/.aios-core/data/agent-config-requirements.yaml +2 -2
- package/.aios-core/data/aios-kb.md +4 -4
- package/.aios-core/data/entity-registry.yaml +5 -5
- package/.aios-core/development/agents/architect.md +10 -10
- package/.aios-core/development/agents/devops.md +93 -50
- package/.aios-core/development/agents/qa.md +94 -40
- package/.aios-core/development/agents/ux-design-expert.md +25 -25
- package/.aios-core/development/scripts/activation-runtime.js +63 -0
- package/.aios-core/development/scripts/generate-greeting.js +9 -8
- package/.aios-core/development/scripts/unified-activation-pipeline.js +102 -2
- package/.aios-core/development/tasks/{db-expansion-pack-integration.md → db-squad-integration.md} +5 -5
- package/.aios-core/development/tasks/{integrate-expansion-pack.md → integrate-squad.md} +2 -2
- package/.aios-core/development/tasks/next.md +3 -3
- package/.aios-core/development/tasks/pr-automation.md +2 -2
- package/.aios-core/development/tasks/publish-npm.md +257 -0
- package/.aios-core/development/tasks/release-management.md +4 -4
- package/.aios-core/development/tasks/setup-github.md +1 -1
- package/.aios-core/development/tasks/squad-creator-migrate.md +1 -1
- package/.aios-core/development/tasks/squad-creator-sync-ide-command.md +14 -14
- package/.aios-core/development/tasks/update-aios.md +1 -1
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +1 -1
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +5 -5
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +21 -21
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +25 -25
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +4 -4
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +3 -3
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +13 -13
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +1 -1
- package/.aios-core/framework-config.yaml +4 -0
- package/.aios-core/infrastructure/scripts/codex-skills-sync/index.js +182 -0
- package/.aios-core/infrastructure/scripts/codex-skills-sync/validate.js +172 -0
- package/.aios-core/infrastructure/scripts/ide-sync/README.md +14 -0
- package/.aios-core/infrastructure/scripts/ide-sync/index.js +6 -0
- package/.aios-core/infrastructure/scripts/tool-resolver.js +4 -4
- package/.aios-core/infrastructure/scripts/validate-paths.js +142 -0
- package/.aios-core/infrastructure/templates/aios-sync.yaml.template +11 -11
- package/.aios-core/infrastructure/templates/github-workflows/README.md +1 -1
- package/.aios-core/install-manifest.yaml +190 -106
- package/.aios-core/local-config.yaml.template +2 -0
- package/.aios-core/product/README.md +2 -2
- package/.aios-core/product/data/integration-patterns.md +1 -1
- package/.aios-core/product/templates/ide-rules/cline-rules.md +1 -1
- package/.aios-core/product/templates/ide-rules/codex-rules.md +65 -0
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +1 -1
- package/.aios-core/product/templates/ide-rules/roo-rules.md +1 -1
- package/.aios-core/user-guide.md +15 -14
- package/.aios-core/workflow-intelligence/engine/output-formatter.js +1 -1
- package/.claude/hooks/enforce-architecture-first.py +196 -0
- package/.claude/hooks/install-hooks.sh +41 -0
- package/.claude/hooks/mind-clone-governance.py +192 -0
- package/.claude/hooks/pre-commit-mmos-guard.sh +99 -0
- package/.claude/hooks/pre-commit-version-check.sh +156 -0
- package/.claude/hooks/read-protection.py +151 -0
- package/.claude/hooks/slug-validation.py +176 -0
- package/.claude/hooks/sql-governance.py +182 -0
- package/.claude/hooks/synapse-engine.js +9 -20
- package/.claude/hooks/write-path-validation.py +194 -0
- package/README.md +44 -14
- package/bin/aios-init.js +255 -184
- package/bin/aios-minimal.js +2 -2
- package/bin/aios.js +19 -19
- package/package.json +7 -4
- package/packages/aios-pro-cli/bin/aios-pro.js +75 -2
- package/packages/aios-pro-cli/package.json +5 -1
- package/packages/aios-pro-cli/src/recover.js +100 -0
- package/packages/installer/src/__tests__/performance-benchmark.js +382 -0
- package/packages/installer/src/config/ide-configs.js +12 -1
- package/packages/installer/src/config/templates/core-config-template.js +2 -2
- package/packages/installer/src/installer/aios-core-installer.js +2 -2
- package/packages/installer/src/installer/file-hasher.js +97 -0
- package/packages/installer/src/installer/post-install-validator.js +41 -1
- package/packages/installer/src/pro/pro-scaffolder.js +335 -0
- package/packages/installer/src/utils/aios-colors.js +2 -2
- package/packages/installer/src/wizard/feedback.js +1 -1
- package/packages/installer/src/wizard/ide-config-generator.js +2 -2
- package/packages/installer/src/wizard/index.js +58 -19
- package/packages/installer/src/wizard/pro-setup.js +547 -0
- package/packages/installer/src/wizard/questions.js +20 -14
- package/packages/installer/src/wizard/validators.js +1 -1
- package/scripts/package-synapse.js +323 -0
- package/scripts/validate-package-completeness.js +317 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Hook: SQL Governance
|
|
4
|
+
|
|
5
|
+
REGRA: Comandos SQL que criam/alteram/deletam objetos de banco DEVEM ser aprovados.
|
|
6
|
+
|
|
7
|
+
Este hook intercepta comandos Bash que contêm SQL perigoso e bloqueia
|
|
8
|
+
operações não autorizadas em banco de dados.
|
|
9
|
+
|
|
10
|
+
Exit Codes:
|
|
11
|
+
- 0: Permitido
|
|
12
|
+
- 2: Bloqueado (SQL perigoso detectado)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
import os
|
|
18
|
+
import re
|
|
19
|
+
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# CONFIGURAÇÃO: Patterns SQL que requerem aprovação
|
|
22
|
+
# =============================================================================
|
|
23
|
+
|
|
24
|
+
DANGEROUS_PATTERNS = [
|
|
25
|
+
# DDL - Criação
|
|
26
|
+
(r"\bCREATE\s+TABLE\b", "CREATE TABLE"),
|
|
27
|
+
(r"\bCREATE\s+VIEW\b", "CREATE VIEW"),
|
|
28
|
+
(r"\bCREATE\s+MATERIALIZED\s+VIEW\b", "CREATE MATERIALIZED VIEW"),
|
|
29
|
+
(r"\bCREATE\s+FUNCTION\b", "CREATE FUNCTION"),
|
|
30
|
+
(r"\bCREATE\s+TRIGGER\b", "CREATE TRIGGER"),
|
|
31
|
+
(r"\bCREATE\s+INDEX\b", "CREATE INDEX"),
|
|
32
|
+
(r"\bCREATE\s+TYPE\b", "CREATE TYPE"),
|
|
33
|
+
(r"\bCREATE\s+SCHEMA\b", "CREATE SCHEMA"),
|
|
34
|
+
(r"\bCREATE\s+EXTENSION\b", "CREATE EXTENSION"),
|
|
35
|
+
(r"\bCREATE\s+POLICY\b", "CREATE POLICY"),
|
|
36
|
+
|
|
37
|
+
# DDL - Alteração
|
|
38
|
+
(r"\bALTER\s+TABLE\b", "ALTER TABLE"),
|
|
39
|
+
(r"\bALTER\s+VIEW\b", "ALTER VIEW"),
|
|
40
|
+
(r"\bALTER\s+FUNCTION\b", "ALTER FUNCTION"),
|
|
41
|
+
|
|
42
|
+
# DDL - Deleção
|
|
43
|
+
(r"\bDROP\s+TABLE\b", "DROP TABLE"),
|
|
44
|
+
(r"\bDROP\s+VIEW\b", "DROP VIEW"),
|
|
45
|
+
(r"\bDROP\s+FUNCTION\b", "DROP FUNCTION"),
|
|
46
|
+
(r"\bDROP\s+TRIGGER\b", "DROP TRIGGER"),
|
|
47
|
+
(r"\bDROP\s+INDEX\b", "DROP INDEX"),
|
|
48
|
+
(r"\bDROP\s+SCHEMA\b", "DROP SCHEMA"),
|
|
49
|
+
(r"\bDROP\s+POLICY\b", "DROP POLICY"),
|
|
50
|
+
|
|
51
|
+
# DML Perigoso
|
|
52
|
+
(r"\bTRUNCATE\b", "TRUNCATE"),
|
|
53
|
+
(r"\bDELETE\s+FROM\b(?!.*\bWHERE\b)", "DELETE without WHERE"),
|
|
54
|
+
|
|
55
|
+
# Backup proibido (criar tabela como cópia)
|
|
56
|
+
(r"\bCREATE\s+TABLE\b.*\bAS\s+SELECT\b", "CREATE TABLE AS SELECT (backup proibido)"),
|
|
57
|
+
|
|
58
|
+
# Storage
|
|
59
|
+
(r"\bINSERT\s+INTO\s+storage\.buckets\b", "INSERT INTO storage.buckets"),
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
# Patterns que indicam contexto seguro (não bloquear)
|
|
63
|
+
SAFE_CONTEXTS = [
|
|
64
|
+
r"--.*$", # Comentário SQL
|
|
65
|
+
r"SELECT\s+.*\bFROM\b", # Query de leitura
|
|
66
|
+
r"information_schema", # Query de metadata
|
|
67
|
+
r"pg_catalog", # Query de sistema
|
|
68
|
+
r"\bEXPLAIN\b", # Explain plan
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
# Comandos que são sempre permitidos
|
|
72
|
+
ALLOWED_COMMANDS = [
|
|
73
|
+
"supabase migration", # CLI de migration
|
|
74
|
+
"supabase db push", # Push de migrations
|
|
75
|
+
"supabase db pull", # Pull de schema
|
|
76
|
+
"pg_dump", # Backup (exportar)
|
|
77
|
+
"psql.*-f.*migrations", # Aplicar migration file
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
# =============================================================================
|
|
81
|
+
# LÓGICA DO HOOK
|
|
82
|
+
# =============================================================================
|
|
83
|
+
|
|
84
|
+
def extract_sql_from_command(command: str) -> str:
|
|
85
|
+
"""Extrai possível SQL de um comando bash."""
|
|
86
|
+
# Remover aspas externas se houver
|
|
87
|
+
sql = command
|
|
88
|
+
|
|
89
|
+
# Detectar SQL inline em psql -c
|
|
90
|
+
psql_match = re.search(r'psql.*-c\s+["\'](.+?)["\']', command, re.DOTALL)
|
|
91
|
+
if psql_match:
|
|
92
|
+
sql = psql_match.group(1)
|
|
93
|
+
|
|
94
|
+
# Detectar heredoc
|
|
95
|
+
heredoc_match = re.search(r'<<["\']?(\w+)["\']?\s*\n(.+?)\n\1', command, re.DOTALL)
|
|
96
|
+
if heredoc_match:
|
|
97
|
+
sql = heredoc_match.group(2)
|
|
98
|
+
|
|
99
|
+
return sql.upper()
|
|
100
|
+
|
|
101
|
+
def is_safe_context(command: str) -> bool:
|
|
102
|
+
"""Verifica se o comando está em contexto seguro."""
|
|
103
|
+
command_lower = command.lower()
|
|
104
|
+
|
|
105
|
+
for allowed in ALLOWED_COMMANDS:
|
|
106
|
+
if re.search(allowed, command_lower):
|
|
107
|
+
return True
|
|
108
|
+
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
def detect_dangerous_sql(command: str) -> list[tuple[str, str]]:
|
|
112
|
+
"""Detecta patterns SQL perigosos no comando."""
|
|
113
|
+
sql = extract_sql_from_command(command)
|
|
114
|
+
detected = []
|
|
115
|
+
|
|
116
|
+
for pattern, description in DANGEROUS_PATTERNS:
|
|
117
|
+
if re.search(pattern, sql, re.IGNORECASE):
|
|
118
|
+
detected.append((pattern, description))
|
|
119
|
+
|
|
120
|
+
return detected
|
|
121
|
+
|
|
122
|
+
def main():
|
|
123
|
+
# Ler input do stdin
|
|
124
|
+
try:
|
|
125
|
+
input_data = json.load(sys.stdin)
|
|
126
|
+
except json.JSONDecodeError:
|
|
127
|
+
# Se não conseguir parsear, permitir (fail-open)
|
|
128
|
+
sys.exit(0)
|
|
129
|
+
|
|
130
|
+
tool_name = input_data.get("tool_name", "")
|
|
131
|
+
tool_input = input_data.get("tool_input", {})
|
|
132
|
+
|
|
133
|
+
# Só processar Bash
|
|
134
|
+
if tool_name != "Bash":
|
|
135
|
+
sys.exit(0)
|
|
136
|
+
|
|
137
|
+
command = tool_input.get("command", "")
|
|
138
|
+
if not command:
|
|
139
|
+
sys.exit(0)
|
|
140
|
+
|
|
141
|
+
# Verificar se é contexto seguro
|
|
142
|
+
if is_safe_context(command):
|
|
143
|
+
sys.exit(0)
|
|
144
|
+
|
|
145
|
+
# Detectar SQL perigoso
|
|
146
|
+
dangerous = detect_dangerous_sql(command)
|
|
147
|
+
|
|
148
|
+
if not dangerous:
|
|
149
|
+
sys.exit(0)
|
|
150
|
+
|
|
151
|
+
# BLOQUEAR: SQL perigoso detectado
|
|
152
|
+
detected_list = "\n".join([f"║ • {desc:<64} ║" for _, desc in dangerous[:5]])
|
|
153
|
+
|
|
154
|
+
error_message = f"""
|
|
155
|
+
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
156
|
+
║ 🛑 SQL GOVERNANCE: Operação de banco requer aprovação ║
|
|
157
|
+
╠══════════════════════════════════════════════════════════════════════════════╣
|
|
158
|
+
║ ║
|
|
159
|
+
║ Operações detectadas: ║
|
|
160
|
+
{detected_list}
|
|
161
|
+
║ ║
|
|
162
|
+
║ REGRA: Comandos que criam/alteram/deletam objetos de banco DEVEM: ║
|
|
163
|
+
║ ║
|
|
164
|
+
║ 1. Ser propostos ao usuário ANTES de executar ║
|
|
165
|
+
║ 2. Incluir justificativa e análise de impacto ║
|
|
166
|
+
║ 3. Aguardar aprovação explícita ║
|
|
167
|
+
║ ║
|
|
168
|
+
║ EXCEÇÕES PERMITIDAS: ║
|
|
169
|
+
║ • supabase migration (CLI oficial) ║
|
|
170
|
+
║ • pg_dump (backup/export) ║
|
|
171
|
+
║ • Aplicar migrations existentes em supabase/migrations/ ║
|
|
172
|
+
║ ║
|
|
173
|
+
║ AÇÃO: Proponha as mudanças ao usuário e aguarde aprovação. ║
|
|
174
|
+
║ Use o formato: Schema/SQL + Justificativa + Impacto ║
|
|
175
|
+
║ ║
|
|
176
|
+
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
177
|
+
"""
|
|
178
|
+
print(error_message, file=sys.stderr)
|
|
179
|
+
sys.exit(2)
|
|
180
|
+
|
|
181
|
+
if __name__ == "__main__":
|
|
182
|
+
main()
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
// SYN-14: Boot time captured before ANY require — measures hook cold start
|
|
3
|
+
const _BOOT_TIME = process.hrtime.bigint();
|
|
2
4
|
'use strict';
|
|
3
5
|
|
|
4
6
|
/**
|
|
@@ -16,7 +18,9 @@
|
|
|
16
18
|
*/
|
|
17
19
|
|
|
18
20
|
const path = require('path');
|
|
19
|
-
const
|
|
21
|
+
const { resolveHookRuntime, buildHookOutput } = require(
|
|
22
|
+
path.join(__dirname, '..', '..', '.aios-core', 'core', 'synapse', 'runtime', 'hook-runtime.js'),
|
|
23
|
+
);
|
|
20
24
|
|
|
21
25
|
/** Safety timeout (ms) — defense-in-depth; Claude Code also manages hook timeout. */
|
|
22
26
|
const HOOK_TIMEOUT_MS = 5000;
|
|
@@ -41,26 +45,11 @@ function readStdin() {
|
|
|
41
45
|
/** Main hook execution pipeline. */
|
|
42
46
|
async function main() {
|
|
43
47
|
const input = await readStdin();
|
|
44
|
-
const
|
|
45
|
-
if (!
|
|
46
|
-
const synapsePath = path.join(cwd, '.synapse');
|
|
47
|
-
if (!fs.existsSync(synapsePath)) return;
|
|
48
|
+
const runtime = resolveHookRuntime(input);
|
|
49
|
+
if (!runtime) return;
|
|
48
50
|
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
);
|
|
52
|
-
const { SynapseEngine } = require(
|
|
53
|
-
path.join(cwd, '.aios-core', 'core', 'synapse', 'engine.js')
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const sessionsDir = path.join(synapsePath, 'sessions');
|
|
57
|
-
const session = loadSession(sessionId, sessionsDir) || { prompt_count: 0 };
|
|
58
|
-
const engine = new SynapseEngine(synapsePath);
|
|
59
|
-
const result = await engine.process(prompt, session);
|
|
60
|
-
|
|
61
|
-
process.stdout.write(JSON.stringify({
|
|
62
|
-
hookSpecificOutput: { additionalContext: result.xml || '' },
|
|
63
|
-
}));
|
|
51
|
+
const result = await runtime.engine.process(input.prompt, runtime.session);
|
|
52
|
+
process.stdout.write(JSON.stringify(buildHookOutput(result.xml)));
|
|
64
53
|
}
|
|
65
54
|
|
|
66
55
|
/**
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Hook: Write Path Validation
|
|
4
|
+
|
|
5
|
+
REGRA: Documentos devem ir para os paths corretos conforme convenções.
|
|
6
|
+
|
|
7
|
+
Este hook intercepta Write/Edit e AVISA (não bloqueia) quando o path
|
|
8
|
+
parece violar as convenções de organização de documentos.
|
|
9
|
+
|
|
10
|
+
Exit Codes:
|
|
11
|
+
- 0: Sempre (apenas avisa, nunca bloqueia)
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import sys
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# CONFIGURAÇÃO: Regras de organização de documentos
|
|
22
|
+
# =============================================================================
|
|
23
|
+
|
|
24
|
+
PATH_RULES = [
|
|
25
|
+
# (pattern no nome/conteúdo, path esperado, descrição)
|
|
26
|
+
{
|
|
27
|
+
"name_patterns": [r"session", r"handoff", r"^2\d{3}-\d{2}-\d{2}"],
|
|
28
|
+
"expected_path": "docs/sessions/",
|
|
29
|
+
"description": "Session logs e handoffs → docs/sessions/YYYY-MM/",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name_patterns": [r"architecture", r"system-design", r"infra"],
|
|
33
|
+
"expected_path": "docs/architecture/",
|
|
34
|
+
"description": "Docs de arquitetura → docs/architecture/",
|
|
35
|
+
"exclude_patterns": [r"ARCHITECTURE_RULES"], # Exceção para MMOS
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name_patterns": [r"guide", r"tutorial", r"how-to"],
|
|
39
|
+
"expected_path": "docs/guides/",
|
|
40
|
+
"description": "Guias e tutoriais → docs/guides/",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name_patterns": [r"prd\.md$", r"epic.*\.md$", r"story.*\.md$"],
|
|
44
|
+
"expected_path": "docs/projects/",
|
|
45
|
+
"description": "PRDs, Epics, Stories → docs/projects/{project}/",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name_patterns": [r"mind.*specific", r"mind.*validation"],
|
|
49
|
+
"expected_path": "outputs/minds/",
|
|
50
|
+
"description": "Docs específicos de mind → outputs/minds/{slug}/docs/",
|
|
51
|
+
},
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
# Paths que são sempre válidos (não avisar)
|
|
55
|
+
ALWAYS_VALID_PATHS = [
|
|
56
|
+
".claude/",
|
|
57
|
+
".aios-core/",
|
|
58
|
+
".aios-upstream/",
|
|
59
|
+
"squads/",
|
|
60
|
+
"node_modules/",
|
|
61
|
+
".git/",
|
|
62
|
+
"app/",
|
|
63
|
+
"supabase/",
|
|
64
|
+
"outputs/",
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
# =============================================================================
|
|
68
|
+
# LÓGICA DO HOOK
|
|
69
|
+
# =============================================================================
|
|
70
|
+
|
|
71
|
+
def get_project_root():
|
|
72
|
+
"""Obtém o root do projeto."""
|
|
73
|
+
return os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
|
|
74
|
+
|
|
75
|
+
def normalize_path(file_path: str, project_root: str) -> str:
|
|
76
|
+
"""Normaliza path para relativo."""
|
|
77
|
+
if file_path.startswith(project_root):
|
|
78
|
+
return file_path[len(project_root):].lstrip("/")
|
|
79
|
+
return file_path
|
|
80
|
+
|
|
81
|
+
def is_always_valid(relative_path: str) -> bool:
|
|
82
|
+
"""Verifica se o path está em área sempre válida."""
|
|
83
|
+
for valid in ALWAYS_VALID_PATHS:
|
|
84
|
+
if relative_path.startswith(valid):
|
|
85
|
+
return True
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
def is_documentation_file(relative_path: str) -> bool:
|
|
89
|
+
"""Verifica se é um arquivo de documentação."""
|
|
90
|
+
doc_extensions = [".md", ".mdx", ".txt", ".rst"]
|
|
91
|
+
return any(relative_path.endswith(ext) for ext in doc_extensions)
|
|
92
|
+
|
|
93
|
+
def check_path_rules(relative_path: str) -> list[dict]:
|
|
94
|
+
"""
|
|
95
|
+
Verifica se o path viola alguma regra.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Lista de violações com sugestões
|
|
99
|
+
"""
|
|
100
|
+
violations = []
|
|
101
|
+
filename = os.path.basename(relative_path)
|
|
102
|
+
|
|
103
|
+
for rule in PATH_RULES:
|
|
104
|
+
# Verificar se o nome do arquivo corresponde ao pattern
|
|
105
|
+
matches_name = False
|
|
106
|
+
for pattern in rule["name_patterns"]:
|
|
107
|
+
if re.search(pattern, filename, re.IGNORECASE):
|
|
108
|
+
matches_name = True
|
|
109
|
+
break
|
|
110
|
+
|
|
111
|
+
if not matches_name:
|
|
112
|
+
continue
|
|
113
|
+
|
|
114
|
+
# Verificar exceções
|
|
115
|
+
if "exclude_patterns" in rule:
|
|
116
|
+
is_excluded = False
|
|
117
|
+
for exc_pattern in rule["exclude_patterns"]:
|
|
118
|
+
if re.search(exc_pattern, filename, re.IGNORECASE):
|
|
119
|
+
is_excluded = True
|
|
120
|
+
break
|
|
121
|
+
if is_excluded:
|
|
122
|
+
continue
|
|
123
|
+
|
|
124
|
+
# Verificar se está no path esperado
|
|
125
|
+
expected = rule["expected_path"]
|
|
126
|
+
if not relative_path.startswith(expected):
|
|
127
|
+
violations.append({
|
|
128
|
+
"current_path": relative_path,
|
|
129
|
+
"expected_path": expected,
|
|
130
|
+
"description": rule["description"],
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
return violations
|
|
134
|
+
|
|
135
|
+
def main():
|
|
136
|
+
# Ler input do stdin
|
|
137
|
+
try:
|
|
138
|
+
input_data = json.load(sys.stdin)
|
|
139
|
+
except json.JSONDecodeError:
|
|
140
|
+
sys.exit(0)
|
|
141
|
+
|
|
142
|
+
tool_name = input_data.get("tool_name", "")
|
|
143
|
+
tool_input = input_data.get("tool_input", {})
|
|
144
|
+
|
|
145
|
+
# Só processar Write e Edit
|
|
146
|
+
if tool_name not in ["Write", "Edit"]:
|
|
147
|
+
sys.exit(0)
|
|
148
|
+
|
|
149
|
+
file_path = tool_input.get("file_path", "")
|
|
150
|
+
if not file_path:
|
|
151
|
+
sys.exit(0)
|
|
152
|
+
|
|
153
|
+
# Normalizar path
|
|
154
|
+
project_root = get_project_root()
|
|
155
|
+
relative_path = normalize_path(file_path, project_root)
|
|
156
|
+
|
|
157
|
+
# Verificar se é área sempre válida
|
|
158
|
+
if is_always_valid(relative_path):
|
|
159
|
+
sys.exit(0)
|
|
160
|
+
|
|
161
|
+
# Só verificar arquivos de documentação
|
|
162
|
+
if not is_documentation_file(relative_path):
|
|
163
|
+
sys.exit(0)
|
|
164
|
+
|
|
165
|
+
# Verificar regras
|
|
166
|
+
violations = check_path_rules(relative_path)
|
|
167
|
+
|
|
168
|
+
if not violations:
|
|
169
|
+
sys.exit(0)
|
|
170
|
+
|
|
171
|
+
# AVISAR (não bloquear)
|
|
172
|
+
violation = violations[0] # Mostrar primeira violação
|
|
173
|
+
|
|
174
|
+
warning_message = f"""
|
|
175
|
+
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
176
|
+
│ ⚠️ PATH WARNING: Documento pode estar no local errado │
|
|
177
|
+
├──────────────────────────────────────────────────────────────────────────────┤
|
|
178
|
+
│ │
|
|
179
|
+
│ Arquivo: {relative_path[:60]:<60} │
|
|
180
|
+
│ │
|
|
181
|
+
│ Convenção: {violation['description'][:56]:<56} │
|
|
182
|
+
│ Esperado: {violation['expected_path']:<57} │
|
|
183
|
+
│ │
|
|
184
|
+
│ NOTA: Este é apenas um AVISO, a operação será executada. │
|
|
185
|
+
│ Verifique se o path está correto antes de continuar. │
|
|
186
|
+
│ │
|
|
187
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
188
|
+
"""
|
|
189
|
+
# Imprimir warning mas NÃO bloquear (exit 0)
|
|
190
|
+
print(warning_message, file=sys.stderr)
|
|
191
|
+
sys.exit(0)
|
|
192
|
+
|
|
193
|
+
if __name__ == "__main__":
|
|
194
|
+
main()
|
package/README.md
CHANGED
|
@@ -80,7 +80,7 @@ Esta abordagem de duas fases elimina tanto a **inconsistência de planejamento**
|
|
|
80
80
|
- **[Aprender como usar o AIOS](docs/guides/user-guide.md)** → Guia completo do usuário e passo a passo
|
|
81
81
|
- **[Ver agentes IA disponíveis](#agentes-disponíveis)** → Papéis especializados para sua equipe
|
|
82
82
|
- **[Explorar usos não técnicos](#-além-do-desenvolvimento-de-software---squads)** → Escrita criativa, negócios, bem-estar, educação
|
|
83
|
-
- **[Criar meus próprios agentes IA](#criando-seu-próprio-
|
|
83
|
+
- **[Criar meus próprios agentes IA](#criando-seu-próprio-squad)** → Construir agentes para seu domínio
|
|
84
84
|
- **[Navegar Squads prontos](docs/guides/squads-overview.md)** → Veja como criar e usar equipes de agentes IA
|
|
85
85
|
- **[Entender a arquitetura](docs/architecture/ARCHITECTURE-INDEX.md)** → Mergulho técnico profundo
|
|
86
86
|
- **[Juntar-se à comunidade](https://discord.gg/gk8jAdXWmj)** → Obter ajuda e compartilhar ideias
|
|
@@ -90,7 +90,7 @@ Esta abordagem de duas fases elimina tanto a **inconsistência de planejamento**
|
|
|
90
90
|
**Mantenha-se atualizado sem esforço!** Para atualizar sua instalação AIOS existente:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
npx
|
|
93
|
+
npx aios-core@latest install
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
Isto vai:
|
|
@@ -139,7 +139,7 @@ O Synkra AIOS agora inclui uma experiência de instalação interativa de últim
|
|
|
139
139
|
|
|
140
140
|
- ✅ Download da versão mais recente do NPM
|
|
141
141
|
- ✅ Assistente de instalação interativo moderno
|
|
142
|
-
- ✅ Configuração automática do IDE (Windsurf, Cursor ou Claude Code)
|
|
142
|
+
- ✅ Configuração automática do IDE (Codex CLI, Windsurf, Cursor ou Claude Code)
|
|
143
143
|
- ✅ Configuração de todos os agentes e fluxos de trabalho AIOS
|
|
144
144
|
- ✅ Criação dos arquivos de configuração necessários
|
|
145
145
|
- ✅ Inicialização do sistema de meta-agentes
|
|
@@ -155,7 +155,7 @@ O Synkra AIOS agora inclui uma experiência de instalação interativa de últim
|
|
|
155
155
|
Se você já tem o AIOS instalado:
|
|
156
156
|
|
|
157
157
|
```bash
|
|
158
|
-
npx
|
|
158
|
+
npx aios-core@latest install
|
|
159
159
|
# O instalador detectará sua instalação existente e a atualizará
|
|
160
160
|
```
|
|
161
161
|
|
|
@@ -174,6 +174,13 @@ O Synkra AIOS inclui regras pré-configuradas para IDE para melhorar sua experi
|
|
|
174
174
|
|
|
175
175
|
- ✅ Já configurado! O arquivo `.claude/CLAUDE.md` é carregado automaticamente
|
|
176
176
|
|
|
177
|
+
#### Para Codex CLI:
|
|
178
|
+
|
|
179
|
+
- ✅ Já configurado! O arquivo `AGENTS.md` na raiz é carregado automaticamente
|
|
180
|
+
- Opcional: sincronize agentes auxiliares com `npm run sync:ide:codex`
|
|
181
|
+
- Recomendado neste repositório: gerar e versionar skills locais com `npm run sync:skills:codex`
|
|
182
|
+
- Use `npm run sync:skills:codex:global` apenas fora deste projeto (para evitar duplicidade no `/skills`)
|
|
183
|
+
|
|
177
184
|
Estas regras fornecem:
|
|
178
185
|
|
|
179
186
|
- 🤖 Reconhecimento e integração de comandos de agentes
|
|
@@ -185,7 +192,7 @@ Estas regras fornecem:
|
|
|
185
192
|
### Início Mais Rápido com Interface Web (2 minutos)
|
|
186
193
|
|
|
187
194
|
1. **Instale o AIOS**: Execute `npx aios-core init meu-projeto`
|
|
188
|
-
2. **Configure seu IDE**: Siga as instruções de configuração para Windsurf, Cursor ou Claude Code
|
|
195
|
+
2. **Configure seu IDE**: Siga as instruções de configuração para Codex CLI, Windsurf, Cursor ou Claude Code
|
|
189
196
|
3. **Comece a Planejar**: Ative um agente como `@analyst` para começar a criar seu briefing
|
|
190
197
|
4. **Use comandos AIOS**: Digite `*help` para ver comandos disponíveis
|
|
191
198
|
5. **Siga o fluxo**: Veja o [Guia do usuário](docs/guides/user-guide.md) para mais detalhes
|
|
@@ -368,13 +375,13 @@ npm run install:aios
|
|
|
368
375
|
Para membros da equipe ingressando no projeto:
|
|
369
376
|
|
|
370
377
|
```bash
|
|
371
|
-
# Instalar AIOS
|
|
372
|
-
npx
|
|
378
|
+
# Instalar AIOS no projeto
|
|
379
|
+
npx aios-core@latest install
|
|
373
380
|
|
|
374
381
|
# Isto vai:
|
|
375
|
-
# 1.
|
|
376
|
-
# 2.
|
|
377
|
-
# 3.
|
|
382
|
+
# 1. Detectar instalação existente (se houver)
|
|
383
|
+
# 2. Instalar/atualizar framework AIOS
|
|
384
|
+
# 3. Configurar agentes e workflows
|
|
378
385
|
```
|
|
379
386
|
|
|
380
387
|
## 🌟 Além do Desenvolvimento de Software - Squads
|
|
@@ -512,17 +519,17 @@ User Request → Spec Pipeline → Execution Engine → QA Review → Working Co
|
|
|
512
519
|
|
|
513
520
|
## Criando Seu Próprio Squad
|
|
514
521
|
|
|
515
|
-
|
|
522
|
+
Squads permitem estender o AIOS para qualquer domínio. Estrutura básica:
|
|
516
523
|
|
|
517
524
|
```
|
|
518
|
-
squads/seu-
|
|
519
|
-
├── config.yaml # Configuração do
|
|
525
|
+
squads/seu-squad/
|
|
526
|
+
├── config.yaml # Configuração do squad
|
|
520
527
|
├── agents/ # Agentes especializados
|
|
521
528
|
├── tasks/ # Fluxos de trabalho de tarefas
|
|
522
529
|
├── templates/ # Templates de documentos
|
|
523
530
|
├── checklists/ # Checklists de validação
|
|
524
531
|
├── data/ # Base de conhecimento
|
|
525
|
-
├── README.md # Documentação do
|
|
532
|
+
├── README.md # Documentação do squad
|
|
526
533
|
└── user-guide.md # Guia do usuário
|
|
527
534
|
```
|
|
528
535
|
|
|
@@ -536,6 +543,29 @@ Squads são equipes modulares de agentes IA. Veja a [Visão Geral de Squads](doc
|
|
|
536
543
|
|
|
537
544
|
- **[hybrid-ops](https://github.com/SynkraAI/aios-hybrid-ops-pedro-valerio)** - Operações híbridas humano-agente (repositório separado)
|
|
538
545
|
|
|
546
|
+
## AIOS Pro
|
|
547
|
+
|
|
548
|
+
O **AIOS Pro** (`@aios-fullstack/pro`) é o módulo premium do Synkra AIOS, oferecendo funcionalidades avançadas para equipes e projetos de maior escala.
|
|
549
|
+
|
|
550
|
+
> **Disponibilidade restrita:** O AIOS Pro está disponível exclusivamente para membros do **AIOS Cohort Advanced**. [Saiba mais sobre o programa](https://synkra.ai).
|
|
551
|
+
|
|
552
|
+
### Instalação
|
|
553
|
+
|
|
554
|
+
```bash
|
|
555
|
+
npm install @aios-fullstack/pro
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Features Premium
|
|
559
|
+
|
|
560
|
+
- **Squads Avançados** - Squads especializados com capacidades expandidas
|
|
561
|
+
- **Memory Layer** - Memória persistente de padrões e insights entre sessões
|
|
562
|
+
- **Métricas & Analytics** - Dashboard de produtividade e métricas de desenvolvimento
|
|
563
|
+
- **Integrações Enterprise** - Conectores para Jira, Linear, Notion e mais
|
|
564
|
+
- **Configuração em Camadas** - Sistema de configuração L1-L4 com herança
|
|
565
|
+
- **Licenciamento** - Gerenciamento de licença via `aios pro activate --key <KEY>`
|
|
566
|
+
|
|
567
|
+
Para mais informações, execute `npx aios-core pro --help` após a instalação.
|
|
568
|
+
|
|
539
569
|
## Suporte & Comunidade
|
|
540
570
|
|
|
541
571
|
- 📖 [Guia da Comunidade](docs/community.md) - Como participar e contribuir
|