stealthos-cli 0.1.0-alpha.3 → 0.1.0-alpha.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.
- package/ai/CONTRACT.md +110 -0
- package/ai/INDEX.md +203 -0
- package/ai/README.md +434 -0
- package/ai/ROUTER.md +288 -0
- package/ai/agents/README.md +103 -0
- package/ai/agents/architect.md +59 -0
- package/ai/agents/backend-engineer.md +62 -0
- package/ai/agents/founder.md +45 -0
- package/ai/agents/frontend-engineer.md +61 -0
- package/ai/agents/product-manager.md +56 -0
- package/ai/agents/qa-engineer.md +53 -0
- package/ai/agents/researcher.md +74 -0
- package/ai/agents/reviewer.md +73 -0
- package/ai/agents/security-engineer.md +59 -0
- package/ai/agents/sre-engineer.md +70 -0
- package/ai/agents/tech-lead.md +70 -0
- package/ai/architecture/README.md +35 -0
- package/ai/architecture/components.md +24 -0
- package/ai/architecture/containers.md +30 -0
- package/ai/architecture/event-flows.md +36 -0
- package/ai/architecture/sequence-diagrams.md +38 -0
- package/ai/architecture/system-context.md +46 -0
- package/ai/architecture/threat-modeling.md +40 -0
- package/ai/blueprints/README.md +67 -0
- package/ai/blueprints/_schema.json +40 -0
- package/ai/blueprints/ai-platform.json +28 -0
- package/ai/blueprints/crm.json +22 -0
- package/ai/blueprints/game.json +25 -0
- package/ai/blueprints/mobile.json +24 -0
- package/ai/blueprints/realtime.json +22 -0
- package/ai/blueprints/saas.json +25 -0
- package/ai/blueprints/telemetry.json +30 -0
- package/ai/blueprints/web.json +23 -0
- package/ai/bootstrap/discovery-questions.md +117 -0
- package/ai/bootstrap/dispatcher.md +85 -0
- package/ai/bootstrap/existing-project.md +191 -0
- package/ai/bootstrap/new-project.md +127 -0
- package/ai/bootstrap/tech-mapping.md +164 -0
- package/ai/clients/README.md +114 -0
- package/ai/clients/antigravity.md +125 -0
- package/ai/clients/claude-code.md +65 -0
- package/ai/clients/cline.md +69 -0
- package/ai/clients/codex-aider-cli.md +82 -0
- package/ai/clients/continue.md +67 -0
- package/ai/clients/copilot.md +49 -0
- package/ai/clients/cursor.md +81 -0
- package/ai/clients/snippets/mcp-absolute-paths.json +9 -0
- package/ai/clients/snippets/mcp-http.json +7 -0
- package/ai/clients/snippets/mcp-stdio.json +9 -0
- package/ai/clients/trae.md +69 -0
- package/ai/clients/windsurf.md +71 -0
- package/ai/core/pipeline/execution-engine.md +157 -0
- package/ai/engineering/README.md +32 -0
- package/ai/engineering/observability/incident-response.md +82 -0
- package/ai/evals/protocol-tests.md +150 -0
- package/ai/evolution/agent-evolution.md +161 -0
- package/ai/evolution/improvements.md +91 -0
- package/ai/evolution/learnings.md +49 -0
- package/ai/evolution/patterns-discovered.md +48 -0
- package/ai/execution/README.md +33 -0
- package/ai/execution/backlog.md +27 -0
- package/ai/execution/milestones.md +26 -0
- package/ai/execution/roadmap.md +30 -0
- package/ai/execution/sprint.md +42 -0
- package/ai/governance/README.md +34 -0
- package/ai/governance/architecture-principles.md +99 -0
- package/ai/governance/definition-of-done.md +88 -0
- package/ai/governance/definition-of-ready.md +69 -0
- package/ai/governance/engineering-principles.md +70 -0
- package/ai/governance/quality-gates.md +85 -0
- package/ai/governance/security-policies.md +84 -0
- package/ai/hooks/enforce-audit.ps1 +41 -0
- package/ai/hooks/enforce-audit.sh +39 -0
- package/ai/hooks/guard-edit.ps1 +182 -0
- package/ai/hooks/guard-edit.sh +161 -0
- package/ai/hooks/inject-os-reminder.ps1 +40 -0
- package/ai/hooks/inject-os-reminder.sh +16 -0
- package/ai/manifest.json +238 -0
- package/ai/memory/_detected-stack.json +33 -0
- package/ai/memory/_summary.md +49 -0
- package/ai/memory/archive/.gitkeep +3 -0
- package/ai/memory/completed-tasks.md +156 -0
- package/ai/memory/decisions.md +257 -0
- package/ai/memory/errors-and-solutions.md +41 -0
- package/ai/memory/known-issues.md +40 -0
- package/ai/memory/pending-tasks.md +37 -0
- package/ai/memory/project-context.md +67 -0
- package/ai/operating-system/architecture.md +54 -0
- package/ai/operating-system/coding-standards.md +84 -0
- package/ai/operating-system/folder-structure.md +126 -0
- package/ai/operating-system/performance-rules.md +86 -0
- package/ai/operating-system/quality-control.md +81 -0
- package/ai/operating-system/security-rules.md +91 -0
- package/ai/operating-system/workflow.md +86 -0
- package/ai/product/README.md +24 -0
- package/ai/product/business-rules.md +26 -0
- package/ai/product/personas.md +29 -0
- package/ai/product/user-journeys.md +30 -0
- package/ai/product/vision.md +35 -0
- package/ai/rules/behavior.md +45 -0
- package/ai/rules/do.md +47 -0
- package/ai/rules/dont.md +46 -0
- package/ai/rules/execution-flow.md +125 -0
- package/ai/rules/structural-constraints.md +59 -0
- package/ai/rules/structure-canon.md +116 -0
- package/ai/runtime.md +179 -0
- package/ai/scripts/detect-stack.ps1 +166 -0
- package/ai/scripts/detect-stack.sh +172 -0
- package/ai/scripts/init-ai-os.ps1 +215 -0
- package/ai/scripts/init-ai-os.sh +99 -0
- package/ai/scripts/lint-os.ps1 +99 -0
- package/ai/scripts/lint-os.sh +85 -0
- package/ai/scripts/start-os.ps1 +151 -0
- package/ai/scripts/start-os.sh +141 -0
- package/ai/server/README.md +105 -0
- package/ai/server/aios-server.mjs +2134 -0
- package/ai/server/package-lock.json +802 -0
- package/ai/server/package.json +31 -0
- package/ai/server/src/analyzer/graph-builder.ts +92 -0
- package/ai/server/src/analyzer/index.ts +191 -0
- package/ai/server/src/analyzer/module-mapper.ts +171 -0
- package/ai/server/src/analyzer/smell-detector.ts +54 -0
- package/ai/server/src/analyzer/stack-detector.ts +70 -0
- package/ai/server/src/index.ts +16 -0
- package/ai/server/src/packager/context-builder.ts +217 -0
- package/ai/server/src/packager/index.ts +3 -0
- package/ai/server/src/packager/memory-injector.ts +128 -0
- package/ai/server/src/packager/module-summarizer.ts +60 -0
- package/ai/server/src/packager/token-estimator.ts +26 -0
- package/ai/server/src/snapshot/index.ts +3 -0
- package/ai/server/src/snapshot/snapshot-creator.ts +206 -0
- package/ai/server/src/snapshot/snapshot-diff.ts +86 -0
- package/ai/server/src/snapshot/snapshot-restore.ts +14 -0
- package/ai/server/src/types.ts +94 -0
- package/ai/server/tsconfig.json +26 -0
- package/ai/skills/architecture-design.md +82 -0
- package/ai/skills/backend-engineering.md +57 -0
- package/ai/skills/database-design.md +76 -0
- package/ai/skills/frontend-engineering.md +63 -0
- package/ai/skills/performance.md +73 -0
- package/ai/skills/scalability.md +84 -0
- package/ai/skills/security.md +71 -0
- package/ai/skills/testing.md +77 -0
- package/ai/specs/ADR/ADR-0002-typescript-runtime.md +103 -0
- package/ai/specs/ADR/ADR-0004-runtime-orchestrator.md +94 -0
- package/ai/specs/ADR/ADR-0005-workflow-engine.md +105 -0
- package/ai/specs/ADR/ADR-0006-runtime-state.md +104 -0
- package/ai/specs/ADR/ADR-0007-state-compiler-drift-context-layers-artifact-index.md +82 -0
- package/ai/specs/ADR/ADR-0008-intent-runtime-discovery-branching.md +93 -0
- package/ai/specs/ADR/ADR-0009-confidence-system-maturity-tracking.md +113 -0
- package/ai/specs/ADR/ADR-0010-structural-architecture-standards.md +121 -0
- package/ai/specs/ADR/ADR-0011-mcp-prompts.md +86 -0
- package/ai/specs/ADR/ADR-0012-stealthos-hybrid-architecture.md +174 -0
- package/ai/specs/ADR/_TEMPLATE.md +60 -0
- package/ai/specs/BRD/_TEMPLATE.md +50 -0
- package/ai/specs/PRD/_TEMPLATE.md +72 -0
- package/ai/specs/README.md +43 -0
- package/ai/specs/RFC/RFC-0001-runtime-orchestrator.md +149 -0
- package/ai/specs/RFC/RFC-0002-runtime-orchestrator-extended.md +134 -0
- package/ai/specs/RFC/_TEMPLATE.md +61 -0
- package/ai/specs/RUNBOOKS/_TEMPLATE.md +68 -0
- package/ai/specs/SDD/_TEMPLATE.md +104 -0
- package/ai/specs/TASKS/_TEMPLATE.md +52 -0
- package/ai/tools/debugging.md +64 -0
- package/ai/tools/dependency-analysis.md +46 -0
- package/ai/tools/internet-research.md +42 -0
- package/ai/tools/mcp-discovery.md +44 -0
- package/ai/workflows/_schema.json +81 -0
- package/ai/workflows/init.json +148 -0
- package/ai/workflows/sync.json +71 -0
- package/ai/workflows/work.json +91 -0
- package/package.json +42 -36
- package/scripts/bundle-ai.mjs +58 -0
- package/src/cli.mjs +83 -79
- package/src/commands/install.mjs +35 -11
- package/src/commands/run.mjs +117 -0
- package/src/lib/resolve-source.mjs +27 -10
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0008
|
|
3
|
+
slug: intent-runtime-discovery-branching
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- RFC-0002 (extensão consolidada)
|
|
9
|
+
- ADR-0007 (Fase 3 — State Compiler)
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-0008 — Intent Runtime para /work + Discovery Runtime ramificado em /init (Fase 4)
|
|
13
|
+
|
|
14
|
+
## Contexto
|
|
15
|
+
|
|
16
|
+
Sob ADR-0005 (Fase 1), `/work` é pipeline linear de tools. Sob ADR-0007 (Fase 3), consome `runtime-context.json`. Mas ainda falta o **pipeline operacional completo** descrito na análise externa: Intent → Gap Analysis → Clarification (pause) → Plan → Approval (pause) → Execute → Validate → Memory Update → Snapshot. E `/init` precisa **ramificar** entre projeto novo (Discovery Runtime) vs existente (Reverse Engineering Runtime).
|
|
17
|
+
|
|
18
|
+
Esta ADR cobre **Fase 4** do RFC-0002.
|
|
19
|
+
|
|
20
|
+
## Decisão
|
|
21
|
+
|
|
22
|
+
**Decidimos estender o Workflow Engine com 2 capacidades:**
|
|
23
|
+
|
|
24
|
+
1. **Pause-for-input** — step pode declarar `pause_for: { reason, prompt, expected_input? }`. Quando alcançado:
|
|
25
|
+
- Engine salva snapshot da execução em `.ai/runtime/paused-executions/<execution_id>.json`.
|
|
26
|
+
- Retorna `{ status: "paused", execution_id, pause_info, steps_completed }`.
|
|
27
|
+
- Cliente externo (Claude AskUserQuestion, Gemini Function Calling pause, etc.) mostra `prompt` ao usuário e chama `aios_resume_workflow({execution_id, user_input})`.
|
|
28
|
+
- Engine recarrega state, deserializa, continua do step seguinte com `ctx.resumed_input` populado.
|
|
29
|
+
|
|
30
|
+
2. **Branches condicionais** — step pode ter `branches: [{ when: "<expr>", steps: [...] }, { default: true, steps: [...] }]`. Avaliação simples: `when` é dotted-path com operador (`==`, `!=`, `in`) comparado a literal. Ex.: `state.identity.maturity == "empty"`.
|
|
31
|
+
|
|
32
|
+
**Workflow `work` v3.0.0 (Intent Runtime completo)**:
|
|
33
|
+
1. `load_runtime_context` — base operacional consolidada.
|
|
34
|
+
2. `classify_intent` — refina classify_task.
|
|
35
|
+
3. `gap_analysis` — heurística: arquivos/specs ausentes para o intent.
|
|
36
|
+
4. `clarification` (pause_for, opcional se complex) — questiona ambiguidades.
|
|
37
|
+
5. `generate_plan` — pseudo-step que retorna template; LLM externa preenche.
|
|
38
|
+
6. `approval` (pause_for) — pede OK do usuário.
|
|
39
|
+
7. `execute` — placeholder; execução real é da LLM externa via tool calls subsequentes.
|
|
40
|
+
8. `validate` — `aios_lint` + `aios_validate_audit` no resultado.
|
|
41
|
+
9. `memory_update` — state.rotating.active_focus + sugestão append em completed-tasks.
|
|
42
|
+
10. `post_snapshot` — snapshot final.
|
|
43
|
+
|
|
44
|
+
**Workflow `init` v3.0.0 (ramificado)** — usa `branches`:
|
|
45
|
+
- Branch A `when: state.identity.maturity == "empty"` → Discovery Runtime (perguntas extensas).
|
|
46
|
+
- Branch default → Reverse Engineering Runtime (steps atuais do init v2).
|
|
47
|
+
|
|
48
|
+
**3 tools novas**: `aios_resume_workflow`, `aios_list_paused_executions`, `aios_cancel_paused_execution`.
|
|
49
|
+
|
|
50
|
+
## Consequências
|
|
51
|
+
|
|
52
|
+
### Positivas
|
|
53
|
+
- `/work` vira **runtime operacional completo** (não pipeline linear).
|
|
54
|
+
- Discovery em projeto novo deixa de exigir intervenção manual.
|
|
55
|
+
- Pausa-resume permite workflows multi-turno preservando estado.
|
|
56
|
+
- Cliente externo decide UI da pausa (AskUserQuestion, prompt customizado, etc.) — engine só declara intenção.
|
|
57
|
+
|
|
58
|
+
### Negativas / Trade-offs aceitos
|
|
59
|
+
- Estado de execução pausada vive em disco; precisa expiração (TTL 30 min default). Tool `aios_list_paused_executions` ajuda gestão.
|
|
60
|
+
- `branches` é mini-expression language; risco de virar DSL. Limito a `==`, `!=`, `in` e literal vs dotted-path.
|
|
61
|
+
- Workflow `work` v3 tem steps que são "placeholders" (`generate_plan`, `execute`) — LLM externa precisa entender que esses são marcadores. Documentado no workflow JSON.
|
|
62
|
+
|
|
63
|
+
### Neutras
|
|
64
|
+
- Workflows v2 (init/sync/work atuais) continuam válidos; v3 é opt-in via nome `work-v3` se preferir parallel. Decisão: substituir direto (mantém UX dos 3 commands).
|
|
65
|
+
|
|
66
|
+
## Alternativas consideradas
|
|
67
|
+
|
|
68
|
+
### A — Pause-for-input via MCP notifications nativas
|
|
69
|
+
- Pros: idiomático MCP.
|
|
70
|
+
- Cons: nem todo cliente MCP suporta server-initiated notifications interativas.
|
|
71
|
+
- **Descartada**: status:paused + execution_id é portável.
|
|
72
|
+
|
|
73
|
+
### B — Branches via expressões JavaScript completas
|
|
74
|
+
- Pros: máxima expressividade.
|
|
75
|
+
- Cons: eval security; vira motor de scripts.
|
|
76
|
+
- **Descartada**: 3 operadores são suficientes.
|
|
77
|
+
|
|
78
|
+
### C — Pular Fase 4 / manter work como pipeline linear
|
|
79
|
+
- Pros: zero custo.
|
|
80
|
+
- Cons: usuário aprovou expansão; análise externa pediu explicitamente.
|
|
81
|
+
- **Descartada**.
|
|
82
|
+
|
|
83
|
+
## Impacto futuro
|
|
84
|
+
|
|
85
|
+
- Fase 5 (Confidence) pode usar `pause_for` para perguntar sobre low-confidence categories.
|
|
86
|
+
- Se branches virarem onerosos, podemos converter para "sub-workflows" (workflow chama outro workflow).
|
|
87
|
+
- `paused-executions/` precisa cleanup periódico → adicionar step `prune_expired` em `sync` futuro.
|
|
88
|
+
|
|
89
|
+
## Referências
|
|
90
|
+
|
|
91
|
+
- RFC-0002 (Fase 4)
|
|
92
|
+
- ADR-0005 (engine base)
|
|
93
|
+
- ADR-0007 (runtime-context consumido por work v3)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0009
|
|
3
|
+
slug: confidence-system-maturity-tracking
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- RFC-0002 (extensão consolidada)
|
|
9
|
+
- ADR-0006 (state.json — onde confidence vive)
|
|
10
|
+
- ADR-0007 (runtime-context — onde flags aparecem)
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ADR-0009 — Confidence System + Maturity Tracking (Fase 5)
|
|
14
|
+
|
|
15
|
+
## Contexto
|
|
16
|
+
|
|
17
|
+
Sob ADR-0008, o runtime tem ciclo operacional completo. Mas a LLM ainda **assume com mesma confiança** fatos sólidos (architecture, decisions registradas) e inferências fracas (telemetria de módulos novos, padrões emergentes). Custo: erros de "alta convicção" em áreas mal compreendidas.
|
|
18
|
+
|
|
19
|
+
Análise externa propõe **Confidence System** registrando confiança por categoria. LLM consulta → faz mais perguntas onde confidence é baixa.
|
|
20
|
+
|
|
21
|
+
Esta ADR cobre **Fase 5** do RFC-0002 (última).
|
|
22
|
+
|
|
23
|
+
## Decisão
|
|
24
|
+
|
|
25
|
+
**Estendemos `state.json` com bloco `confidence`** e adicionamos **3 tools MCP**:
|
|
26
|
+
|
|
27
|
+
### Schema extension
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"confidence": {
|
|
31
|
+
"categories": {
|
|
32
|
+
"architecture": { "level": "high", "reason": "...", "updated_at": "..." },
|
|
33
|
+
"modules": { "level": "medium", "reason": "...", "updated_at": "..." },
|
|
34
|
+
"telemetry": { "level": "low", "reason": "...", "updated_at": "..." },
|
|
35
|
+
"decisions": { "level": "high", "reason": "...", "updated_at": "..." },
|
|
36
|
+
"domain": { "level": "medium", "reason": "...", "updated_at": "..." }
|
|
37
|
+
},
|
|
38
|
+
"default_level": "medium"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Levels: `low | medium | high`. Nova categoria pode ser criada por `aios_confidence_set`.
|
|
44
|
+
|
|
45
|
+
### Tools
|
|
46
|
+
- `aios_confidence_get({ category? })` — retorna toda confidence ou uma categoria.
|
|
47
|
+
- `aios_confidence_set({ category, level, reason })` — registra/atualiza.
|
|
48
|
+
- `aios_confidence_assess()` — heurística que olha state + project-state + drift e propõe níveis. Retorna sugestões; usuário/LLM aplica via set.
|
|
49
|
+
|
|
50
|
+
### Integração com runtime-context (ADR-0007)
|
|
51
|
+
`aios_compile_runtime_context` ganha bloco `low_confidence_flags`: top-3 categorias com `level=low`, expostas para LLM ler sem precisar puxar state. Ex.:
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"low_confidence_flags": [
|
|
55
|
+
{ "category": "telemetry", "reason": "módulo telemetry-injector adicionado mas sem SDD" },
|
|
56
|
+
{ "category": "modules", "reason": "16 orphan modules detectados em drift" }
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
LLM externa orientada a **perguntar antes de assumir** quando categoria do escopo está com low confidence.
|
|
62
|
+
|
|
63
|
+
### Maturity Tracking (lightweight)
|
|
64
|
+
`identity.maturity` (já existe sob ADR-0006: empty|minimal|partial|mature) ganha regra heurística em `aios_confidence_assess`:
|
|
65
|
+
- `empty`: sem state.identity.project_name + sem ADRs.
|
|
66
|
+
- `minimal`: project_name preenchido + ≤2 ADRs.
|
|
67
|
+
- `partial`: 3-9 ADRs + project-state.json existe.
|
|
68
|
+
- `mature`: ≥10 ADRs + project-state com >10 módulos + ≥3 syncs em workflow_history.
|
|
69
|
+
|
|
70
|
+
Tool sugere upgrade; não força.
|
|
71
|
+
|
|
72
|
+
## Consequências
|
|
73
|
+
|
|
74
|
+
### Positivas
|
|
75
|
+
- LLM tem sinal explícito para fazer mais perguntas em zonas frágeis.
|
|
76
|
+
- Drift detection (ADR-0007) agora pode rebaixar confidence automaticamente (ex.: detectar orphan modules → confidence.modules ← medium).
|
|
77
|
+
- Maturity tracking permite UX adaptativa (init em projeto `empty` é mais didático que `mature`).
|
|
78
|
+
|
|
79
|
+
### Negativas / Trade-offs aceitos
|
|
80
|
+
- Mais um bloco no state.json para manter. Aceitável: tools fazem set automático.
|
|
81
|
+
- Heurística de `assess` é opinion: pode discordar do usuário. Mitigação: `assess` apenas sugere, não escreve.
|
|
82
|
+
- `low_confidence_flags` adiciona ~200 tokens ao runtime-context. Ainda muito abaixo do budget 4000.
|
|
83
|
+
|
|
84
|
+
### Neutras
|
|
85
|
+
- Categorias são strings livres — extensível sem mudança de schema.
|
|
86
|
+
|
|
87
|
+
## Alternativas consideradas
|
|
88
|
+
|
|
89
|
+
### A — Confidence numérico (0-1)
|
|
90
|
+
- Pros: granularidade.
|
|
91
|
+
- Cons: usuário precisa traduzir 0.6 → "low? medium?"; mais ruído.
|
|
92
|
+
- **Descartada**: 3 níveis bastam.
|
|
93
|
+
|
|
94
|
+
### B — Confidence por arquivo individual
|
|
95
|
+
- Pros: precisão.
|
|
96
|
+
- Cons: explode em projetos grandes.
|
|
97
|
+
- **Descartada**: agregação por categoria é suficiente.
|
|
98
|
+
|
|
99
|
+
### C — Esperar caso de uso para implementar
|
|
100
|
+
- Pros: evita over-engineering.
|
|
101
|
+
- Cons: usuário aprovou explicitamente "Adotar TUDO incluindo Confidence System (Fase 5)".
|
|
102
|
+
- **Descartada por aprovação**.
|
|
103
|
+
|
|
104
|
+
## Impacto futuro
|
|
105
|
+
|
|
106
|
+
- Workflows futuros podem ter `pause_for` condicional baseado em confidence (ex.: pausa se categoria envolvida está low).
|
|
107
|
+
- Confidence pode ser exportado como métrica de qualidade do conhecimento do projeto.
|
|
108
|
+
|
|
109
|
+
## Referências
|
|
110
|
+
|
|
111
|
+
- RFC-0002 (Fase 5)
|
|
112
|
+
- ADR-0006 (state.json — host do bloco confidence)
|
|
113
|
+
- ADR-0007 (runtime-context — local dos flags)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0010
|
|
3
|
+
slug: structural-architecture-standards
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- ADR-0004 (Runtime Orchestrator base)
|
|
9
|
+
- ADR-0006 (state.json — identity ganha campo structural_profile)
|
|
10
|
+
- ADR-0007 (artifact_list — blueprints aparecem como artifacts)
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ADR-0010 — Structural Architecture Standards: Canon, Constraints, Blueprints, Composition Engine
|
|
14
|
+
|
|
15
|
+
## Contexto
|
|
16
|
+
|
|
17
|
+
Sob ADR-0004..0009 entregamos o Runtime Operacional. A próxima carência identificada é estrutural: projetos modernos são **híbridos** (saas + telemetry + crm + mobile + …) e estruturas tradicionais (`controllers/services/models`) viram caos rápido. A análise externa de 2026-05-16 propõe **AI-Native Project Architecture Standards** com 3 camadas:
|
|
18
|
+
|
|
19
|
+
1. **Structural Canon** — regras universais (domain-first, vertical slice, isolated runtime contexts, contracts required, etc.).
|
|
20
|
+
2. **Structural Blueprints** — fragmentos por tipo de projeto (web, saas, crm, mobile, game, ai-platform, telemetry, realtime).
|
|
21
|
+
3. **Composition Engine** — compõe blueprints híbridos via union semântica.
|
|
22
|
+
|
|
23
|
+
Convergência com pesquisa (2026): Modular Monolith + Vertical Slice Architecture é state-of-the-art; AI-native monorepos exigem instruções por-path e boundaries explícitos.
|
|
24
|
+
|
|
25
|
+
## Decisão
|
|
26
|
+
|
|
27
|
+
**Adotamos uma camada de Standards estruturais** com 3 artefatos + 3 tools MCP:
|
|
28
|
+
|
|
29
|
+
### Artefatos
|
|
30
|
+
- `.ai/rules/structure-canon.md` — princípios universais (domain-first, modular by responsibility, vertical slice, isolated boundaries, contracts required, AI-navigable).
|
|
31
|
+
- `.ai/rules/structural-constraints.md` — limites operacionais (max module deps, max file lines, depth, naming).
|
|
32
|
+
- `.ai/blueprints/_schema.json` — schema dos blueprints (JSON).
|
|
33
|
+
- `.ai/blueprints/README.md` — guia de composição.
|
|
34
|
+
- `.ai/blueprints/{web,saas,crm,mobile,game,ai-platform,telemetry,realtime}.json` — 8 blueprints declarativos.
|
|
35
|
+
|
|
36
|
+
### Schema blueprint
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"id": "saas",
|
|
40
|
+
"description": "...",
|
|
41
|
+
"extends": ["web"],
|
|
42
|
+
"folders": ["billing/", "tenancy/", "subscriptions/", "permissions/", "audit/"],
|
|
43
|
+
"modules": ["billing", "tenancy", "permissions", "audit"],
|
|
44
|
+
"packages_recommended": ["auth-sdk", "stripe-adapter"],
|
|
45
|
+
"integrations_recommended": ["stripe", "sendgrid"],
|
|
46
|
+
"notes": "..."
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Tools MCP (3)
|
|
51
|
+
- `aios_list_blueprints()` — lista os 8 blueprints disponíveis.
|
|
52
|
+
- `aios_get_blueprint({name})` — devolve o blueprint completo.
|
|
53
|
+
- `aios_compose_structure({types: ["saas","telemetry","realtime"]})` — faz union semântica (dedup, resolve `extends` transitivo) e retorna estrutura final consolidada: folders, modules, packages, integrations, applicable_constraints.
|
|
54
|
+
|
|
55
|
+
### Princípios do Canon (resumo)
|
|
56
|
+
1. **Domain-first**: organizar por bounded context (telemetry/, tracking/, billing/), não por tipo de arquivo.
|
|
57
|
+
2. **Modular Monolith + Vertical Slice**: cada módulo é self-contained (application/domain/infrastructure/contracts/events/tests/docs).
|
|
58
|
+
3. **Boundaries explícitos**: módulo só conversa com outro via API pública (contracts).
|
|
59
|
+
4. **No global utils**: utils ficam em packages tipados (`packages/utils/`) ou no próprio módulo.
|
|
60
|
+
5. **AI-navigable**: cada módulo tem `index.ts` + `README.md` curto descrevendo responsabilidade.
|
|
61
|
+
6. **Contracts required**: APIs entre módulos têm tipos compartilhados em `packages/contracts/`.
|
|
62
|
+
7. **Evolutionary**: estrutura cresce com o projeto; não força tudo no início.
|
|
63
|
+
|
|
64
|
+
### Constraints (defaults razoáveis)
|
|
65
|
+
- `max_module_dependencies`: 5
|
|
66
|
+
- `max_file_lines`: 500
|
|
67
|
+
- `max_folder_depth`: 4
|
|
68
|
+
- `require_module_readme`: true
|
|
69
|
+
- `require_module_index`: true
|
|
70
|
+
- `forbid_global_singletons`: true
|
|
71
|
+
- `forbid_circular_module_deps`: true
|
|
72
|
+
|
|
73
|
+
`state.identity.structural_profile` (novo campo, opcional) registra os tipos compostos (`["saas", "telemetry"]`).
|
|
74
|
+
|
|
75
|
+
## Consequências
|
|
76
|
+
|
|
77
|
+
### Positivas
|
|
78
|
+
- Projeto novo recebe estrutura inicial **composta** (não copy-paste de template gigante).
|
|
79
|
+
- IA tem **vocabulário comum** para navegar projetos (módulos por domínio, não por camada).
|
|
80
|
+
- Hibridização: SaaS + Telemetry + Realtime pode ser composto sem inventar pasta nova.
|
|
81
|
+
- Constraints auditáveis (drift detection futura pode reportar violação).
|
|
82
|
+
- Pesquisa 2026 confirma: AI agents performam melhor com path-aware boundaries.
|
|
83
|
+
|
|
84
|
+
### Negativas / Trade-offs aceitos
|
|
85
|
+
- Adicionar `.ai/blueprints/` e `.ai/rules/structure-canon.md` aumenta superfície de leitura. Mitigação: tier `on-demand` no manifest.
|
|
86
|
+
- Blueprints são templates; podem virar dogma. Mitigação: composition engine encoraja mistura, não substituição.
|
|
87
|
+
- Constraints como números (5 deps, 500 linhas) são heurísticas. Aceitável: customizáveis por projeto.
|
|
88
|
+
|
|
89
|
+
### Neutras
|
|
90
|
+
- Blueprints em JSON (zero-deps); README.md em markdown.
|
|
91
|
+
- `structural_profile` em state.json é optional — projetos legados não quebram.
|
|
92
|
+
|
|
93
|
+
## Alternativas consideradas
|
|
94
|
+
|
|
95
|
+
### A — Templates fixos (1 estrutura por tipo)
|
|
96
|
+
- Pros: simples.
|
|
97
|
+
- Cons: não escala para híbridos (saas+telemetry+crm).
|
|
98
|
+
- **Descartada**: análise externa explicitamente rejeita.
|
|
99
|
+
|
|
100
|
+
### B — Schema OpenAPI-like para estrutura
|
|
101
|
+
- Pros: muito formal.
|
|
102
|
+
- Cons: over-engineering; nossa necessidade é declaração simples.
|
|
103
|
+
- **Descartada**.
|
|
104
|
+
|
|
105
|
+
### C — Não criar (deixar projeto definir)
|
|
106
|
+
- Pros: zero overhead.
|
|
107
|
+
- Cons: cada projeto reinventa; IA não tem vocabulário comum.
|
|
108
|
+
- **Descartada**: usuário aprovou implementação explícita.
|
|
109
|
+
|
|
110
|
+
## Impacto futuro
|
|
111
|
+
|
|
112
|
+
- Workflow `init` v4 (futuro) pode chamar `aios_compose_structure` se usuário declarar tipos.
|
|
113
|
+
- Drift detection (ADR-0007) pode ser estendida com **structural drift**: módulo cresceu além do `max_file_lines`, viola circular_dep, etc.
|
|
114
|
+
- Blueprints novos podem ser adicionados sem mudança de código (engine lê `.ai/blueprints/*.json`).
|
|
115
|
+
|
|
116
|
+
## Referências
|
|
117
|
+
|
|
118
|
+
- RFC-0001/0002 (Runtime Orchestrator — base)
|
|
119
|
+
- Pesquisa 2026: Milan Jovanović "Vertical Slices Inside Modular Monolith", Spectro Cloud "AI Turning 2026 into Year of Monorepo", d4b "AI agents in monorepos"
|
|
120
|
+
- ADR-0006 (state.identity ganha structural_profile)
|
|
121
|
+
- ADR-0007 (artifact_list inclui blueprints)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0011
|
|
3
|
+
slug: mcp-prompts
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- ADR-0004 (Runtime Orchestrator)
|
|
9
|
+
- ADR-0005 (Workflow Engine)
|
|
10
|
+
- ADR-0008 (Intent Runtime + Discovery Branching)
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ADR-0011 — MCP Prompts como discovery mechanism cross-IDE
|
|
14
|
+
|
|
15
|
+
## Contexto
|
|
16
|
+
|
|
17
|
+
Os 3 comandos canônicos (`/init`, `/sync`, `/work`) eram expostos apenas via `.claude/commands/*.md` — um mecanismo **proprietário do Claude Code CLI**. Em qualquer outra IDE (Antigravity, Cursor, Windsurf, Cline, Continue, Copilot, TRAE, Gemini CLI) digitar `/init` no chat era tratado como texto literal, e o usuário precisava recorrer a linguagem natural ("inicialize o conhecimento do projeto") para que a LLM acertasse a tool MCP. Isso quebra a promessa "conecte o MCP e use" — o produto parecia incompleto fora do Claude Code.
|
|
18
|
+
|
|
19
|
+
O servidor MCP `ai-os` (`.ai/server/aios-server.mjs`) já expunha 36 tools via `tools/list` + `tools/call`, mas declarava capabilities apenas `{ tools: {} }`. O protocolo MCP (spec 2024-11-05) define um segundo primitivo, **Prompts**, que IDEs MCP-compatíveis renderizam **nativamente** no autocomplete de `/` (no Claude Code aparecem como `/mcp__<server>__<prompt>`; outras IDEs adotaram convenções similares).
|
|
20
|
+
|
|
21
|
+
## Decisão
|
|
22
|
+
|
|
23
|
+
**Expor os 3 workflows canônicos também como MCP Prompts**, mantendo as tools intactas. Adotamos o modelo **híbrido** (decidido com o usuário em 2026-05-16):
|
|
24
|
+
|
|
25
|
+
1. `capabilities` do servidor passa a declarar `{ tools: {}, prompts: {} }`.
|
|
26
|
+
2. Novos métodos JSON-RPC:
|
|
27
|
+
- `prompts/list` → enumera prompts derivados de `.ai/workflows/*.json` (whitelist: `init`, `sync`, `work`).
|
|
28
|
+
- `prompts/get` → retorna `{ description, messages: [{ role: "user", content: { type, text } }] }`.
|
|
29
|
+
3. **Conteúdo híbrido** do prompt retornado:
|
|
30
|
+
- Cabeçalho com nome + versão + descrição do workflow.
|
|
31
|
+
- **Ação**: bloco JSON com a chamada exata a `aios_run_workflow` (a LLM cliente executa).
|
|
32
|
+
- **Garantias**: lista dos `guarantees` do workflow.
|
|
33
|
+
- **Contexto enriquecido**: snapshot compacto de `state.identity` / `state.lifecycle` / `maturity`.
|
|
34
|
+
- **ROUTER hint** (quando `intent` for fornecido): rotas casadas + arquivos condicionais.
|
|
35
|
+
- **Lembrete de protocolo**: `OS:loaded(...)` + classificação + `[OS Audit]`.
|
|
36
|
+
4. **Argumentos** dos prompts:
|
|
37
|
+
- `init`, `sync`: `intent` (opcional).
|
|
38
|
+
- `work`: `intent` (required = true na descriptor; tool aceita ausente como fallback).
|
|
39
|
+
|
|
40
|
+
## Por que híbrido (vs. inline-execute)
|
|
41
|
+
|
|
42
|
+
Considerados:
|
|
43
|
+
- **Apenas instrução** (LLM faz tool call) — simples, mas perde a chance de injetar contexto que economiza reads.
|
|
44
|
+
- **Inline-execute no servidor** — 1 round-trip, mas perde os pause/resume interativos do `work` v3 (clarification + approval) e quebra o contrato do Workflow Engine de ADR-0005.
|
|
45
|
+
- **Híbrido (escolhido)** — instrução pra LLM chamar a tool + estado/ROUTER pré-carregados como contexto. Robusto, preserva pause/resume, e dá ao prompt valor além de "atalho pra digitar a tool call".
|
|
46
|
+
|
|
47
|
+
## Consequências
|
|
48
|
+
|
|
49
|
+
**Positivas:**
|
|
50
|
+
- IDEs MCP-aware (Claude Code, Cursor recente, e quem implementar o primitivo Prompts no futuro) expõem `/init`, `/sync`, `/work` **só conectando o MCP** — sem stub específico.
|
|
51
|
+
- Contexto enriquecido reduz round-trips: a LLM já recebe `state.identity` + ROUTER hint no `prompts/get`, evita ler 3 arquivos manualmente.
|
|
52
|
+
- `tools/list` permanece com 36 tools — zero regressão para clientes existentes.
|
|
53
|
+
- Versão do server bumps `1.0.0` → `1.1.0` (minor: feature add).
|
|
54
|
+
|
|
55
|
+
**Negativas / limitações:**
|
|
56
|
+
- IDEs sem suporte a MCP Prompts (Windsurf, Cline, Continue, Copilot, TRAE em versões antigas) continuam dependentes de linguagem natural ou snippet de instrução nos stubs (resolvido por Fase 2 — fora do escopo desta ADR).
|
|
57
|
+
- A whitelist `PROMPT_WORKFLOWS` é estática; adicionar um 4º prompt requer editar o servidor (intencional: prompts são produto, tools são API).
|
|
58
|
+
- O conteúdo do prompt é gerado em runtime — depende de `state.json` legível. Falhas são tratadas como `null` (graceful).
|
|
59
|
+
|
|
60
|
+
## Implementação
|
|
61
|
+
|
|
62
|
+
- `.ai/server/aios-server.mjs`:
|
|
63
|
+
- Bloco `MCP Prompts (ADR-0011)` adicionado antes de `handleRpc`.
|
|
64
|
+
- Helpers: `listMcpPrompts()`, `buildRouterHint(intent)`, `getMcpPrompt(name, args)`.
|
|
65
|
+
- Constante `PROMPT_WORKFLOWS = ["init", "sync", "work"]`.
|
|
66
|
+
- `initialize` declara `capabilities.prompts = {}`.
|
|
67
|
+
- `handleRpc` aceita `prompts/list` e `prompts/get`.
|
|
68
|
+
|
|
69
|
+
## Validação
|
|
70
|
+
|
|
71
|
+
Testado via HTTP em port 47791 (2026-05-16):
|
|
72
|
+
|
|
73
|
+
| Chamada | Resultado |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `initialize` | `capabilities.prompts: {}`, `serverInfo.version: 1.1.0` ✅ |
|
|
76
|
+
| `prompts/list` | retorna 3 prompts (init, sync, work) com `arguments` ✅ |
|
|
77
|
+
| `prompts/get init` | retorna messages com instrução + state.identity ✅ |
|
|
78
|
+
| `prompts/get work {intent}` | retorna messages com ROUTER hint matched ✅ |
|
|
79
|
+
| `prompts/get unknown` | erro `-32000: Unknown prompt` ✅ |
|
|
80
|
+
| `tools/list` (retrocompat) | 36 tools, sem alteração ✅ |
|
|
81
|
+
|
|
82
|
+
## Próximas fases (fora desta ADR)
|
|
83
|
+
|
|
84
|
+
- **Fase 2** — snippet de instrução universal para stubs (`CLAUDE.md`, `GEMINI.md`, `GPT.md`, `AGENTS.md`, `.cursorrules`, `.clinerules`, `.windsurfrules`, `.continue/rules/ai-os.md`, `.trae/rules/project_rules.md`, `.github/copilot-instructions.md`) — cópia controlada via script.
|
|
85
|
+
- **Fase 3** — padronizar nome MCP `ai-os` em todos os 8 configs.
|
|
86
|
+
- **Fase 4** — reescrever `.ai/clients/README.md` linhas 54-85 (tabela "slash não porta" → "slash porta via MCP Prompts onde suportado").
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0012
|
|
3
|
+
slug: stealthos-hybrid-architecture
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- ADR-0011 (MCP Prompts cross-IDE)
|
|
9
|
+
- ADR-0008 (Intent Runtime)
|
|
10
|
+
- ADR-0010 (Structural Architecture Standards)
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ADR-0012 — StealthOS Hybrid Architecture (daemon global + projeto leve)
|
|
14
|
+
|
|
15
|
+
## Contexto
|
|
16
|
+
|
|
17
|
+
O harness hoje despeja **toda a árvore `.ai/`** (~50 arquivos: server, manual, workflows, memory, snapshots, context) dentro do projeto do usuário. Isso polui o repo-alvo, viaja no git, conflita com convenções alheias e dificulta atualização do OS (cada projeto carrega sua própria cópia, divergindo do canônico).
|
|
18
|
+
|
|
19
|
+
O usuário definiu a visão do produto **StealthOS**: "assistente de desenvolvimento que **não interfere no projeto**". A descrição literal: *"fora dele será o ambiente onde o usuário vai construir os projetos, e o StealthOS não pode interferir no funcionamento do projeto"*.
|
|
20
|
+
|
|
21
|
+
Considerados 3 modelos:
|
|
22
|
+
- **A — In-project** (estado atual): tudo dentro do projeto. Auto-contido mas invasivo.
|
|
23
|
+
- **B — Daemon global puro**: nada no projeto exceto 1 arquivo. Refator gigante; IDEs perdem capacidade de auto-detectar stubs.
|
|
24
|
+
- **C — Híbrido** (escolhido): daemon global + state fora do projeto + stubs IDE leves dentro (necessários porque IDEs como Claude Code, Cursor, Antigravity só auto-detectam configs na raiz do projeto).
|
|
25
|
+
|
|
26
|
+
## Decisão
|
|
27
|
+
|
|
28
|
+
**Adotar o Modelo C — StealthOS Hybrid Architecture**:
|
|
29
|
+
|
|
30
|
+
### Layout `~/.stealthos/` (instalado uma vez por máquina)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
~/.stealthos/
|
|
34
|
+
├── server/ # aios-server.mjs + dist + node_modules
|
|
35
|
+
├── manual/ # hub master (capítulos do .manual\ atual)
|
|
36
|
+
├── templates/ # stubs por IDE (claude-code/, cursor/, ...)
|
|
37
|
+
├── workflows/ # init.json, sync.json, work.json (canônicos)
|
|
38
|
+
├── projects/
|
|
39
|
+
│ └── <project_hash>/ # state por projeto, fora do dir do projeto
|
|
40
|
+
│ ├── state.json
|
|
41
|
+
│ ├── runtime/
|
|
42
|
+
│ ├── snapshots/
|
|
43
|
+
│ ├── memory/
|
|
44
|
+
│ └── context/
|
|
45
|
+
└── VERSION
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Layout do projeto do usuário (mínimo necessário)
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
meu-projeto/
|
|
52
|
+
├── .stealthos.yml # registro do projeto (hash, IDEs ativas, modo)
|
|
53
|
+
├── CLAUDE.md # stub IDE (só se Claude Code marcado)
|
|
54
|
+
├── .claude/ # idem
|
|
55
|
+
├── GEMINI.md # só se Antigravity marcado
|
|
56
|
+
├── .gemini/ # idem
|
|
57
|
+
└── src/ # código do usuário, intocado
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Quem marcou só Claude Code: **3 itens** (`.stealthos.yml`, `CLAUDE.md`, `.claude/`). Quem marcou Cursor: **3 itens**. Quem marcou 5 IDEs: **~9 itens**. Versus os **14 atuais**.
|
|
61
|
+
|
|
62
|
+
### Project hash
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
project_hash = sha256(normalize(absolute_project_path)).slice(0, 12)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Determinístico, estável entre sessões, único por path absoluto. Mover o projeto = novo hash (intencional — força revalidação).
|
|
69
|
+
|
|
70
|
+
### Server resolution
|
|
71
|
+
|
|
72
|
+
Servidor passa a aceitar 2 modos via `STEALTHOS_MODE` env var ou `.stealthos.yml`:
|
|
73
|
+
|
|
74
|
+
- **`embedded`** (retrocompat, padrão até v2.0): state em `<project>/.ai/runtime/` — modo atual.
|
|
75
|
+
- **`hybrid`** (novo, padrão a partir de v2.0): state em `${STEALTHOS_HOME}/projects/<hash>/`, onde `STEALTHOS_HOME` default = `~/.stealthos`.
|
|
76
|
+
|
|
77
|
+
O servidor lê `cwd` no startup, calcula `project_hash`, resolve `STATE_PATH` dinamicamente.
|
|
78
|
+
|
|
79
|
+
## Mecanismo `.stealthos.yml`
|
|
80
|
+
|
|
81
|
+
```yaml
|
|
82
|
+
# StealthOS project registry — leve, versionável, ~15 linhas
|
|
83
|
+
version: 1
|
|
84
|
+
project_hash: a3f7c9e2d1b8
|
|
85
|
+
project_name: TripPlanner
|
|
86
|
+
mode: hybrid # ou 'embedded'
|
|
87
|
+
ides:
|
|
88
|
+
- claude-code
|
|
89
|
+
- antigravity
|
|
90
|
+
stack: node
|
|
91
|
+
created_at: 2026-05-16T18:00:00Z
|
|
92
|
+
stealthos_version: ">=2.0.0"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Migration path (versões do servidor)
|
|
96
|
+
|
|
97
|
+
| Versão | Capabilities | State |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| v1.0 | tools/* | embedded |
|
|
100
|
+
| v1.1 | tools/* + prompts/* (ADR-0011) | embedded |
|
|
101
|
+
| **v1.2 (atual)** | tools/* + prompts/* + `STEALTHOS_MODE` | embedded OU hybrid |
|
|
102
|
+
| **v2.0** (futura) | idem | hybrid default; embedded como flag |
|
|
103
|
+
|
|
104
|
+
## Consequências
|
|
105
|
+
|
|
106
|
+
**Positivas:**
|
|
107
|
+
- Projeto-alvo limpo (~3-9 itens vs 14). Alinhado com visão "não interfere".
|
|
108
|
+
- Update do StealthOS = atualizar `~/.stealthos/server/` — atinge todos os projetos.
|
|
109
|
+
- State pesado (snapshots, memory) **não viaja no git** do projeto-alvo.
|
|
110
|
+
- Múltiplos projetos isolados por hash sem cross-contamination.
|
|
111
|
+
- Caminho natural pra modo SaaS futuro: `~/.stealthos/` vira API hospedada.
|
|
112
|
+
|
|
113
|
+
**Negativas / mitigadas:**
|
|
114
|
+
- **cwd-dependent**: IDE em monorepo pode confundir cwd → hash errado. **Mitigação**: `.stealthos.yml` no projeto serve como ground-truth do hash (server lê primeiro).
|
|
115
|
+
- **Migration**: projetos existentes em modo embedded continuam funcionando (retrocompat). `stealthos migrate <project>` (futuro) move state pra hybrid.
|
|
116
|
+
- **Discoverability do server**: stubs IDE precisam apontar pro `~/.stealthos/server/aios-server.mjs` (path absoluto resolvido por scaffolder).
|
|
117
|
+
|
|
118
|
+
## Implementação por fases
|
|
119
|
+
|
|
120
|
+
1. **Esta ADR** — decisão registrada.
|
|
121
|
+
2. **Etapa 2 (scaffolder)** — `packages/create-stealthos/` que:
|
|
122
|
+
- Pergunta IDEs + stack + novo/existente.
|
|
123
|
+
- Escreve `.stealthos.yml` (modo `embedded` enquanto v1.2 não saiu).
|
|
124
|
+
- Copia stubs IDE selecionados (placeholders substituídos por cwd).
|
|
125
|
+
- Configura MCP em cada IDE (usa caminho do `~/.stealthos/server/` se já instalado, senão usa `.ai/server/` do projeto fallback).
|
|
126
|
+
3. **Etapa 3 (server v1.2)** — sessão separada. Refator:
|
|
127
|
+
- Introduzir `STEALTHOS_HOME` (default `~/.stealthos`).
|
|
128
|
+
- `STEALTHOS_MODE=hybrid` resolve state path por hash.
|
|
129
|
+
- `STATE_PATH`, `WORKFLOWS_DIR`, `RUNTIME_DIR` viram funções resolvidas em runtime.
|
|
130
|
+
4. **Etapa 4 (validação cross-OS)** — Windows + Linux VM + projeto novo + projeto existente.
|
|
131
|
+
5. **Etapa 5 (publish npm)** — `create-stealthos@1.0.0` no npm.
|
|
132
|
+
|
|
133
|
+
## Validação desta ADR
|
|
134
|
+
|
|
135
|
+
### Etapa 3 — server v1.2 (concluída 2026-05-16)
|
|
136
|
+
|
|
137
|
+
Refator do `.ai/server/aios-server.mjs` para multi-tenant. Mudanças:
|
|
138
|
+
|
|
139
|
+
- Novos imports: `createHash` (crypto), `homedir` (os).
|
|
140
|
+
- Novos constants:
|
|
141
|
+
- `STEALTHOS_MODE = process.env.STEALTHOS_MODE || "embedded"`
|
|
142
|
+
- `STEALTHOS_HOME = process.env.STEALTHOS_HOME || ~/.stealthos`
|
|
143
|
+
- `PROJECT_ROOT` resolve por modo (embedded: `__dirname/../..`; hybrid: `STEALTHOS_PROJECT_DIR || process.cwd()`)
|
|
144
|
+
- `PROJECT_HASH = sha256(absolute(PROJECT_ROOT)).slice(0, 12)`
|
|
145
|
+
- `KB_DIR` (knowledge base canônico): `STEALTHOS_HOME` em hybrid, `<project>/.ai` em embedded
|
|
146
|
+
- `PROJECT_STATE_DIR` (state por projeto): `${STEALTHOS_HOME}/projects/${PROJECT_HASH}` em hybrid, `<project>/.ai` em embedded
|
|
147
|
+
- `AI_DIR` mantido como alias para `KB_DIR` (retrocompat).
|
|
148
|
+
- Refatorados: `WORKFLOWS_DIR` → KB, `RUNTIME_DIR/STATE_PATH/PAUSED_DIR/ARTIFACTS_INDEX_PATH/RUNTIME_CONTEXT_PATH` → PROJECT_STATE, `BLUEPRINTS_DIR` → KB.
|
|
149
|
+
- Refatoradas referências inline a `AI_DIR`: `memory/`, `snapshots/`, `context/`, `specs/`, `architecture/`, `product/`, `artifacts/`, `.runtime/` → todas para `PROJECT_STATE_DIR`.
|
|
150
|
+
- `safeResolve` refatorado com lista de prefixos `PROJECT_STATE_PREFIXES` (`memory|runtime|snapshots|context|artifacts|specs|architecture|product`) — paths com esses prefixos resolvem em PROJECT_STATE; o resto em KB.
|
|
151
|
+
- `aios_health` agora reporta `mode`, `stealthos_home`, `project_hash`, `kb_dir`, `kb_exists`, `project_state_dir`, `project_state_exists`.
|
|
152
|
+
- Startup banner indica modo.
|
|
153
|
+
- `serverInfo.version: "1.1.0" → "1.2.0"`.
|
|
154
|
+
|
|
155
|
+
### Testes realizados (HTTP em portas isoladas)
|
|
156
|
+
|
|
157
|
+
| Cenário | Comando | Resultado |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| **Embedded** (regressão zero) | `node aios-server.mjs --http --port 47792` no Harness | health.mode=embedded, KB+state ambos em `<Harness>/.ai`, 36 tools, 3 prompts ✓ |
|
|
160
|
+
| Embedded — `aios_read CONTRACT.md` | read KB path | retornado, conteúdo OK ✓ |
|
|
161
|
+
| Embedded — `aios_read memory/project-context.md` | read PROJECT_STATE path | retornado, conteúdo OK ✓ |
|
|
162
|
+
| Embedded — `aios_state_get identity` | leu state.json local | retornou identity real do projeto ✓ |
|
|
163
|
+
| **Hybrid** (projeto fake 1) | `STEALTHOS_MODE=hybrid STEALTHOS_HOME=sthome STEALTHOS_PROJECT_DIR=fake-project` | hash `55442f48c00f`, projects/<hash>/ auto-criado ✓ |
|
|
164
|
+
| Hybrid — `aios_list_workflows` | leu de sthome/workflows/ | retornou `init.json` (versão "hybrid-test") ✓ |
|
|
165
|
+
| Hybrid — `aios_state_set identity.project_name="hybrid-test"` | grava em projects/55442f48c00f/runtime/state.json | gravado ✓ |
|
|
166
|
+
| **Isolamento entre projetos** | Subir 2º server com `STEALTHOS_PROJECT_DIR=fake-project-2` | hash distinto `2b73b6fa31c1`, state.identity.project_name=null (não vê state do 1º projeto) ✓ |
|
|
167
|
+
| Coabitação em sthome | `ls sthome/projects/` | lista `55442f48c00f` e `2b73b6fa31c1` lado a lado ✓ |
|
|
168
|
+
|
|
169
|
+
Conclusão: refator multi-tenant funcional. Modo embedded sem regressão (Harness continua operando normalmente). Modo hybrid isola state por hash de cwd. Workflows + manifest + ROUTER lidos de KB. State + memory + snapshots + context gravam em PROJECT_STATE.
|
|
170
|
+
|
|
171
|
+
## Notas
|
|
172
|
+
|
|
173
|
+
- Nome do produto: **StealthOS** (com L). Confirmado pelo usuário em 2026-05-16.
|
|
174
|
+
- Nome do pacote npm: `create-stealthos` (convenção `create-*` para scaffolders, alinhado com `create-react-app`, `create-vite`).
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-NNNN
|
|
3
|
+
slug: <slug-kebab>
|
|
4
|
+
status: proposed # proposed | accepted | superseded-by-NNNN | deprecated
|
|
5
|
+
date: AAAA-MM-DD
|
|
6
|
+
deciders: [founder, architect, ...]
|
|
7
|
+
related:
|
|
8
|
+
- PRD-NNNN
|
|
9
|
+
- SDD-NNNN
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-NNNN — <Decisão em frase curta>
|
|
13
|
+
|
|
14
|
+
## Contexto
|
|
15
|
+
O que motivou a decisão? Restrições, requisitos, problema. Cite dados, não opinião.
|
|
16
|
+
|
|
17
|
+
## Decisão
|
|
18
|
+
**Decidimos X.**
|
|
19
|
+
Frase clara, acionável.
|
|
20
|
+
|
|
21
|
+
## Consequências
|
|
22
|
+
|
|
23
|
+
### Positivas
|
|
24
|
+
- ...
|
|
25
|
+
|
|
26
|
+
### Negativas / Trade-offs aceitos
|
|
27
|
+
- ...
|
|
28
|
+
|
|
29
|
+
### Neutras
|
|
30
|
+
- ...
|
|
31
|
+
|
|
32
|
+
## Alternativas consideradas
|
|
33
|
+
|
|
34
|
+
### Alternativa A — <nome>
|
|
35
|
+
- Pros: ...
|
|
36
|
+
- Cons: ...
|
|
37
|
+
- **Descartada** porque: ...
|
|
38
|
+
|
|
39
|
+
### Alternativa B — <nome>
|
|
40
|
+
- Pros: ...
|
|
41
|
+
- Cons: ...
|
|
42
|
+
- **Descartada** porque: ...
|
|
43
|
+
|
|
44
|
+
## Critérios de decisão
|
|
45
|
+
| Critério | Peso | Alt-A | Alt-B | Escolhida |
|
|
46
|
+
|---|---|---|---|---|
|
|
47
|
+
| Performance | Alto | Médio | Alto | Alta |
|
|
48
|
+
| Custo | Médio | Baixo | Médio | Baixo |
|
|
49
|
+
| Manutenibilidade | Alto | Médio | Alto | Alto |
|
|
50
|
+
|
|
51
|
+
## Impacto futuro
|
|
52
|
+
O que precisaríamos mudar se essa decisão se mostrar errada? Quão caro reverter?
|
|
53
|
+
|
|
54
|
+
## Referências
|
|
55
|
+
- Links, PRs, issues, papers, benchmarks externos.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
> **Lembrete**: ADR aceito não se edita. Mudança = novo ADR com `supersedes: ADR-NNNN`.
|
|
60
|
+
> Espelho histórico desta decisão também aparece em `.ai/memory/decisions.md` (append-only).
|