aiox-core 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aiox-core/data/entity-registry.yaml +5297 -1814
- package/.aiox-core/data/registry-update-log.jsonl +2 -0
- package/.aiox-core/development/templates/service-template/README.md.hbs +158 -158
- package/.aiox-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
- package/.aiox-core/development/templates/service-template/client.ts.hbs +403 -403
- package/.aiox-core/development/templates/service-template/errors.ts.hbs +182 -182
- package/.aiox-core/development/templates/service-template/index.ts.hbs +120 -120
- package/.aiox-core/development/templates/service-template/package.json.hbs +87 -87
- package/.aiox-core/development/templates/service-template/types.ts.hbs +145 -145
- package/.aiox-core/development/templates/squad-template/LICENSE +21 -21
- package/.aiox-core/infrastructure/scripts/tool-resolver.js +4 -4
- package/.aiox-core/infrastructure/templates/aiox-sync.yaml.template +182 -182
- package/.aiox-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aiox-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aiox-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aiox-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-aiox-base.tmpl +63 -63
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aiox-core/install-manifest.yaml +58 -58
- package/.aiox-core/local-config.yaml.template +71 -71
- package/.aiox-core/monitor/hooks/lib/__init__.py +1 -1
- package/.aiox-core/monitor/hooks/lib/enrich.py +58 -58
- package/.aiox-core/monitor/hooks/lib/send_event.py +47 -47
- package/.aiox-core/monitor/hooks/notification.py +29 -29
- package/.aiox-core/monitor/hooks/post_tool_use.py +45 -45
- package/.aiox-core/monitor/hooks/pre_compact.py +29 -29
- package/.aiox-core/monitor/hooks/pre_tool_use.py +40 -40
- package/.aiox-core/monitor/hooks/stop.py +29 -29
- package/.aiox-core/monitor/hooks/subagent_stop.py +29 -29
- package/.aiox-core/monitor/hooks/user_prompt_submit.py +38 -38
- package/.aiox-core/product/templates/adr.hbs +125 -125
- package/.aiox-core/product/templates/dbdr.hbs +241 -241
- package/.aiox-core/product/templates/engine/elicitation.js +2 -3
- package/.aiox-core/product/templates/epic.hbs +212 -212
- package/.aiox-core/product/templates/pmdr.hbs +186 -186
- package/.aiox-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aiox-core/product/templates/prd.hbs +201 -201
- package/.aiox-core/product/templates/story.hbs +263 -263
- package/.aiox-core/product/templates/task.hbs +170 -170
- package/.aiox-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aiox-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aiox-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aiox-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aiox-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aiox-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aiox-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aiox-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aiox-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aiox-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aiox-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aiox-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aiox-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aiox-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aiox-core/product/templates/tmpl-view.sql +177 -177
- package/.aiox-core/scripts/pm.sh +0 -0
- package/.claude/hooks/code-intel-pretool.cjs +107 -0
- package/.claude/hooks/enforce-architecture-first.py +196 -196
- package/.claude/hooks/mind-clone-governance.py +192 -192
- package/.claude/hooks/read-protection.py +151 -151
- package/.claude/hooks/slug-validation.py +176 -176
- package/.claude/hooks/sql-governance.py +182 -182
- package/.claude/hooks/write-path-validation.py +194 -194
- package/LICENSE +33 -33
- package/bin/aiox-graph.js +0 -0
- package/bin/aiox-minimal.js +0 -0
- package/bin/aiox.js +0 -0
- package/docs/guides/aios-workflows/README.md +247 -0
- package/docs/guides/aios-workflows/bob-orchestrator-workflow.md +1536 -0
- package/package.json +1 -1
- package/packages/aiox-install/bin/aiox-install.js +0 -0
- package/packages/aiox-install/bin/edmcp.js +0 -0
- package/packages/aiox-pro-cli/bin/aiox-pro.js +0 -0
- package/packages/installer/src/wizard/pro-setup.js +210 -123
- package/pro/README.md +66 -0
- package/pro/license/degradation.js +220 -0
- package/pro/license/errors.js +450 -0
- package/pro/license/feature-gate.js +354 -0
- package/pro/license/index.js +181 -0
- package/pro/license/license-api.js +679 -0
- package/pro/license/license-cache.js +523 -0
- package/pro/license/license-crypto.js +303 -0
- package/scripts/check-markdown-links.py +352 -352
- package/scripts/dashboard-parallel-dev.sh +0 -0
- package/scripts/dashboard-parallel-phase3.sh +0 -0
- package/scripts/dashboard-parallel-phase4.sh +0 -0
- package/scripts/glue/README.md +355 -0
- package/scripts/glue/compose-agent-prompt.cjs +362 -0
- package/scripts/install-monitor-hooks.sh +0 -0
- package/.aiox-core/lib/build.json +0 -1
|
@@ -1,194 +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
|
-
".aiox-core/",
|
|
58
|
-
".aiox-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()
|
|
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
|
+
".aiox-core/",
|
|
58
|
+
".aiox-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/LICENSE
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 BMad Code, LLC (BMad Method - original work)
|
|
4
|
-
Copyright (c) 2025 SynkraAI Inc. (AIOX Framework - derivative work)
|
|
5
|
-
|
|
6
|
-
This project was originally derived from the BMad Method
|
|
7
|
-
(https://github.com/bmad-code-org/BMAD-METHOD), created by Brian Madison.
|
|
8
|
-
Synkra AIOX is NOT affiliated with, endorsed by, or sanctioned by the
|
|
9
|
-
BMad Method or BMad Code, LLC.
|
|
10
|
-
|
|
11
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
13
|
-
in the Software without restriction, including without limitation the rights
|
|
14
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
15
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
16
|
-
furnished to do so, subject to the following conditions:
|
|
17
|
-
|
|
18
|
-
The above copyright notice and this permission notice shall be included in all
|
|
19
|
-
copies or substantial portions of the Software.
|
|
20
|
-
|
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
-
SOFTWARE.
|
|
28
|
-
|
|
29
|
-
TRADEMARK NOTICE:
|
|
30
|
-
BMad, BMad Method, and BMad Core are trademarks of BMad Code, LLC.
|
|
31
|
-
These trademarks are NOT licensed under the MIT License. See the BMad Method
|
|
32
|
-
TRADEMARK.md (https://github.com/bmad-code-org/BMAD-METHOD/blob/main/TRADEMARK.md)
|
|
33
|
-
for detailed guidelines on trademark usage.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 BMad Code, LLC (BMad Method - original work)
|
|
4
|
+
Copyright (c) 2025 SynkraAI Inc. (AIOX Framework - derivative work)
|
|
5
|
+
|
|
6
|
+
This project was originally derived from the BMad Method
|
|
7
|
+
(https://github.com/bmad-code-org/BMAD-METHOD), created by Brian Madison.
|
|
8
|
+
Synkra AIOX is NOT affiliated with, endorsed by, or sanctioned by the
|
|
9
|
+
BMad Method or BMad Code, LLC.
|
|
10
|
+
|
|
11
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
13
|
+
in the Software without restriction, including without limitation the rights
|
|
14
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
15
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
16
|
+
furnished to do so, subject to the following conditions:
|
|
17
|
+
|
|
18
|
+
The above copyright notice and this permission notice shall be included in all
|
|
19
|
+
copies or substantial portions of the Software.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
+
SOFTWARE.
|
|
28
|
+
|
|
29
|
+
TRADEMARK NOTICE:
|
|
30
|
+
BMad, BMad Method, and BMad Core are trademarks of BMad Code, LLC.
|
|
31
|
+
These trademarks are NOT licensed under the MIT License. See the BMad Method
|
|
32
|
+
TRADEMARK.md (https://github.com/bmad-code-org/BMAD-METHOD/blob/main/TRADEMARK.md)
|
|
33
|
+
for detailed guidelines on trademark usage.
|
package/bin/aiox-graph.js
CHANGED
|
File without changes
|
package/bin/aiox-minimal.js
CHANGED
|
File without changes
|
package/bin/aiox.js
CHANGED
|
File without changes
|