atlas-workflow 0.8.2 → 0.9.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/README.md +6 -3
- package/VERSION +1 -1
- package/build/bump-version.mjs +113 -0
- package/build/cli/atlas-init.mjs +84 -7
- package/hosts/opencode/.opencode/atlas/VERSION +1 -1
- package/hosts/opencode/.opencode/atlas/orchestrator/README.md +9 -2
- package/hosts/opencode/.opencode/atlas/orchestrator/references/host-adapters.md +13 -12
- package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +25 -53
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/README.md +3 -2
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/server.js +337 -10
- package/hosts/opencode/.opencode/skills/atlas-direct-execute/SKILL.md +31 -0
- package/hosts/opencode/.opencode/skills/atlas-plan-execute/SKILL.md +32 -0
- package/hosts/opencode/.opencode/skills/atlas-workflow-orchestrator/SKILL.md +25 -53
- package/hosts/pi/.pi/agents/atlas-direct-execute.md +31 -0
- package/hosts/pi/.pi/agents/atlas-plan-execute.md +32 -0
- package/hosts/pi/atlas/VERSION +1 -1
- package/hosts/pi/atlas/orchestrator/README.md +9 -2
- package/hosts/pi/atlas/orchestrator/references/host-adapters.md +13 -12
- package/hosts/pi/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +25 -53
- package/hosts/pi/atlas/packages/mcp-server/README.md +3 -2
- package/hosts/pi/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/pi/atlas/packages/mcp-server/server.js +337 -10
- package/hosts/pi/skills/atlas-direct-execute/SKILL.md +31 -0
- package/hosts/pi/skills/atlas-plan-execute/SKILL.md +32 -0
- package/hosts/pi/skills/atlas-workflow-orchestrator/SKILL.md +25 -53
- package/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/.codex-plugin/plugin.json +1 -1
- package/plugins/atlas-workflow-orchestrator/VERSION +1 -1
- package/plugins/atlas-workflow-orchestrator/agents/atlas-direct-execute.md +1 -1
- package/plugins/atlas-workflow-orchestrator/agents/atlas-plan-execute.md +1 -1
- package/plugins/atlas-workflow-orchestrator/orchestrator/README.md +9 -2
- package/plugins/atlas-workflow-orchestrator/orchestrator/references/host-adapters.md +13 -12
- package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +25 -53
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md +3 -2
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/server.js +337 -10
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-direct-execute/SKILL.md +31 -0
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-plan-execute/SKILL.md +32 -0
- package/plugins/atlas-workflow-orchestrator/skills/atlas-direct-execute/SKILL.md +31 -0
- package/plugins/atlas-workflow-orchestrator/skills/atlas-plan-execute/SKILL.md +32 -0
- package/plugins/atlas-workflow-orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +25 -53
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Atlas Workflow
|
|
2
2
|
|
|
3
|
-
Plugin **Atlas Workflow Orchestrator** v0.
|
|
3
|
+
Plugin **Atlas Workflow Orchestrator** v0.9.0 — pipeline determinístico (PRD → plano → execução → validação) com skills `atlas-*`, templates e MCP. Um pacote, seis hosts: **Claude Code**, **Cursor**, **Codex App**, **Antigravity (Gemini)**, **OpenCode** e **Pi CLI**.
|
|
4
4
|
|
|
5
|
-
**Versão:** [`VERSION`](VERSION) (`0.
|
|
5
|
+
**Versão:** [`VERSION`](VERSION) (`0.9.0`) · **Repo:** https://github.com/pauloborini/atlas-workflow
|
|
6
6
|
|
|
7
7
|
## Hosts
|
|
8
8
|
|
|
@@ -11,6 +11,7 @@ Plugin **Atlas Workflow Orchestrator** v0.8.2 — pipeline determinístico (PRD
|
|
|
11
11
|
| Claude Code | Marketplace GitHub | `atlas-workflow-claude.plugin` | — |
|
|
12
12
|
| Cursor | **Igual ao Claude Code** (ver nota abaixo) | `atlas-workflow-claude.plugin` | — |
|
|
13
13
|
| Codex App | Marketplace GitHub | `atlas-workflow-codex.plugin` | — |
|
|
14
|
+
| Antigravity (Gemini) | Instalador from-source (`init antigravity`) → `~/.gemini/config/` | — (cópia direta, sem artefato `.plugin`) | — |
|
|
14
15
|
| Opencode | Catálogo from-source `hosts/opencode/` | `atlas-workflow-opencode.plugin` | — |
|
|
15
16
|
| Pi CLI | Catálogo from-source `hosts/pi/` | `atlas-workflow-pi.plugin` | **`pi-mcp-adapter` + `pi-subagents`** |
|
|
16
17
|
|
|
@@ -24,17 +25,19 @@ Plugin **Atlas Workflow Orchestrator** v0.8.2 — pipeline determinístico (PRD
|
|
|
24
25
|
|
|
25
26
|
> Referência rápida de todos os comandos (instalar/atualizar/remover por host): **[COMMANDS.md](COMMANDS.md)**.
|
|
26
27
|
|
|
27
|
-
Um instalador único cobre os
|
|
28
|
+
Um instalador único cobre os hosts de forma **global** (recomendado para valer em todos os projetos) — não precisa clonar o repo:
|
|
28
29
|
|
|
29
30
|
```bash
|
|
30
31
|
npx github:pauloborini/atlas-workflow init claudecode # ou: cursor
|
|
31
32
|
npx github:pauloborini/atlas-workflow init codex
|
|
33
|
+
npx github:pauloborini/atlas-workflow init antigravity
|
|
32
34
|
npx github:pauloborini/atlas-workflow init opencode --global
|
|
33
35
|
npx github:pauloborini/atlas-workflow init pi --global --yes # --yes auto-instala as 2 deps
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
- **claudecode/cursor**: o instalador roda o `marketplace add` + `install` nativos da CLI por você. Já são globais por natureza.
|
|
37
39
|
- **codex**: o instalador roda `marketplace add` + `plugin add` e também copia os custom agents Atlas para `CODEX_HOME/agents` (`~/.codex/agents` se `CODEX_HOME` não estiver definido). Este é o caminho garantido para `spawn_agent(agent_type: "atlas-*")`.
|
|
40
|
+
- **antigravity**: o instalador registra o Atlas como um plugin em `~/.gemini/config/plugins/` e adiciona o MCP correspondente em `mcp_config.json`.
|
|
38
41
|
- **opencode**: com `--global`, instala globalmente em `~/.config/opencode/` (o MCP é registrado com caminho absoluto, funcionando em todos os projetos).
|
|
39
42
|
- **pi**: com `--global`, instala globalmente em `~/.pi/agent/` (honra `PI_CODING_AGENT_DIR`), registra o MCP em `mcp.json` global e checa/instala as deps `pi-mcp-adapter` + `pi-subagents`.
|
|
40
43
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.9.0
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Bump determinístico de versão. Sincroniza os arquivos com versão concreta,
|
|
3
|
+
// regenera bundles/catálogos e roda check-consistency. NÃO cria tag nem commita
|
|
4
|
+
// — quem publica é o workflow Release ao detectar VERSION novo na main.
|
|
5
|
+
//
|
|
6
|
+
// Uso: node build/bump-version.mjs <nova-versao> (ex.: 0.8.3)
|
|
7
|
+
//
|
|
8
|
+
// Não toca CHANGELOG.md nem PATCH_PROCEDURE.md (prosa/exemplos históricos), nem
|
|
9
|
+
// a seção "Novidades vX" do orchestrator README (changelog embutido). Esses são
|
|
10
|
+
// passos narrativos manuais, listados no final.
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
17
|
+
const next = (process.argv[2] || '').trim();
|
|
18
|
+
|
|
19
|
+
function die(msg) { console.error(`bump-version: ${msg}`); process.exit(1); }
|
|
20
|
+
|
|
21
|
+
if (!/^\d+\.\d+\.\d+$/.test(next)) {
|
|
22
|
+
die(`versão inválida "${process.argv[2] || ''}" — use SemVer X.Y.Z (ex.: 0.8.3)`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const versionPath = path.join(ROOT, 'VERSION');
|
|
26
|
+
const current = fs.readFileSync(versionPath, 'utf8').trim();
|
|
27
|
+
if (current === next) die(`VERSION já é ${next} — nada a bumpar`);
|
|
28
|
+
|
|
29
|
+
const esc = current.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
30
|
+
|
|
31
|
+
// [arquivo, transform]. transform recebe o conteúdo e devolve o novo.
|
|
32
|
+
const edits = [
|
|
33
|
+
['VERSION', () => `${next}\n`],
|
|
34
|
+
['plugins/atlas-workflow-orchestrator/VERSION', () => `${next}\n`],
|
|
35
|
+
['hosts/pi/atlas/VERSION', () => `${next}\n`],
|
|
36
|
+
['hosts/opencode/.opencode/atlas/VERSION', () => `${next}\n`],
|
|
37
|
+
['package.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, 'package.json')],
|
|
38
|
+
['packages/mcp-server/package.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, 'mcp-server/package.json')],
|
|
39
|
+
['.claude-plugin/plugin.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, '.claude-plugin/plugin.json')],
|
|
40
|
+
// Prosa de versão atual — replace-all é seguro (sem changelog embutido).
|
|
41
|
+
['README.md', (t) => replaceAll(t, esc, next, 'README.md')],
|
|
42
|
+
['COMMANDS.md', (t) => replaceAll(t, esc, next, 'COMMANDS.md')],
|
|
43
|
+
['packages/mcp-server/README.md', (t) => replaceAll(t, esc, next, 'mcp-server/README.md')],
|
|
44
|
+
// Orchestrator README tem "Novidades vX" (histórico) — só a linha Plugin version.
|
|
45
|
+
['packages/orchestrator/README.md', (t) => replaceOnce(t, `**Plugin version:** ${current}`, `**Plugin version:** ${next}`, 'orchestrator/README.md (Plugin version)')],
|
|
46
|
+
|
|
47
|
+
// --- Codex plugin bundle ---
|
|
48
|
+
['plugins/atlas-workflow-orchestrator/.codex-plugin/plugin.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, 'codex-plugin/plugin.json')],
|
|
49
|
+
['plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, 'plugins mcp-server/package.json')],
|
|
50
|
+
['plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md', (t) => replaceAll(t, esc, next, 'plugins mcp-server/README.md')],
|
|
51
|
+
['plugins/atlas-workflow-orchestrator/orchestrator/README.md', (t) => replaceOnce(t, `**Plugin version:** ${current}`, `**Plugin version:** ${next}`, 'plugins orchestrator/README.md (Plugin version)')],
|
|
52
|
+
|
|
53
|
+
// --- Host: Pi ---
|
|
54
|
+
['hosts/pi/atlas/packages/mcp-server/package.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, 'hosts/pi mcp-server/package.json')],
|
|
55
|
+
['hosts/pi/atlas/packages/mcp-server/README.md', (t) => replaceAll(t, esc, next, 'hosts/pi mcp-server/README.md')],
|
|
56
|
+
['hosts/pi/atlas/orchestrator/README.md', (t) => replaceOnce(t, `**Plugin version:** ${current}`, `**Plugin version:** ${next}`, 'hosts/pi orchestrator/README.md (Plugin version)')],
|
|
57
|
+
|
|
58
|
+
// --- Host: OpenCode ---
|
|
59
|
+
['hosts/opencode/.opencode/atlas/packages/mcp-server/package.json', (t) => replaceOnce(t, `"version": "${current}"`, `"version": "${next}"`, 'hosts/opencode mcp-server/package.json')],
|
|
60
|
+
['hosts/opencode/.opencode/atlas/packages/mcp-server/README.md', (t) => replaceAll(t, esc, next, 'hosts/opencode mcp-server/README.md')],
|
|
61
|
+
['hosts/opencode/.opencode/atlas/orchestrator/README.md', (t) => replaceOnce(t, `**Plugin version:** ${current}`, `**Plugin version:** ${next}`, 'hosts/opencode orchestrator/README.md (Plugin version)')],
|
|
62
|
+
|
|
63
|
+
// --- Docs com versão inline ---
|
|
64
|
+
['CLAUDE.md', (t) => replaceOnce(t, `Versão: \`${current}\``, `Versão: \`${next}\``, 'CLAUDE.md')],
|
|
65
|
+
['AGENTS.md', (t) => replaceOnce(t, `Versão: \`${current}\``, `Versão: \`${next}\``, 'AGENTS.md')],
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
function replaceOnce(text, from, to, label) {
|
|
69
|
+
if (!text.includes(from)) die(`âncora não encontrada em ${label}: "${from}"`);
|
|
70
|
+
return text.replace(from, to);
|
|
71
|
+
}
|
|
72
|
+
function replaceAll(text, escFrom, to, label) {
|
|
73
|
+
const re = new RegExp(escFrom, 'g');
|
|
74
|
+
if (!re.test(text)) die(`versão ${current} não encontrada em ${label}`);
|
|
75
|
+
return text.replace(new RegExp(escFrom, 'g'), to);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
for (const [rel, fn] of edits) {
|
|
79
|
+
const p = path.join(ROOT, rel);
|
|
80
|
+
const before = fs.readFileSync(p, 'utf8');
|
|
81
|
+
fs.writeFileSync(p, fn(before));
|
|
82
|
+
console.log(` bump ${rel} ${current} -> ${next}`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
console.log(`\nRegenerando bundles/catálogos (build-plugins.sh)…`);
|
|
86
|
+
execFileSync('bash', [path.join(ROOT, 'build', 'build-plugins.sh')], { cwd: ROOT, stdio: 'inherit' });
|
|
87
|
+
|
|
88
|
+
console.log(`Rodando check-consistency…`);
|
|
89
|
+
execFileSync('node', [path.join(ROOT, 'build', 'check-consistency.mjs')], { cwd: ROOT, stdio: 'inherit' });
|
|
90
|
+
|
|
91
|
+
// Criar tag git local (marketplace resolve por tag, não por HEAD).
|
|
92
|
+
// Tag só é criada — push fica pro passo manual junto com o commit.
|
|
93
|
+
// CI Release é idempotente: se tag já existe, pula criação.
|
|
94
|
+
const tag = `v${next}`;
|
|
95
|
+
try {
|
|
96
|
+
execFileSync('git', ['tag', tag], { cwd: ROOT, stdio: 'pipe' });
|
|
97
|
+
console.log(`\n tag ${tag} (local — push com: git push origin ${tag})`);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
if (e.stderr?.toString().includes('already exists')) {
|
|
100
|
+
console.log(`\n tag ${tag} já existe (ok)`);
|
|
101
|
+
} else {
|
|
102
|
+
throw e;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
console.log(`\nbump-version: ${current} -> ${next} OK.
|
|
107
|
+
|
|
108
|
+
Passos narrativos manuais (não automatizáveis):
|
|
109
|
+
1. CHANGELOG.md — adicionar entrada "## ${next} - YYYY-MM-DD".
|
|
110
|
+
2. packages/orchestrator/README.md — adicionar seção "### Novidades v${next}" e "Last updated".
|
|
111
|
+
3. Revisar 'git status', commitar e dar push na main (incluir tag):
|
|
112
|
+
git push origin main v${next}
|
|
113
|
+
=> CI Release detecta tag existente e publica sem re-criar.`);
|
package/build/cli/atlas-init.mjs
CHANGED
|
@@ -31,6 +31,7 @@ const HOST_ALIASES = {
|
|
|
31
31
|
codex: 'codex',
|
|
32
32
|
opencode: 'opencode',
|
|
33
33
|
pi: 'pi',
|
|
34
|
+
antigravity: 'antigravity', gemini: 'antigravity', antigravitycode: 'antigravity',
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
function log(msg) { process.stdout.write(`${msg}\n`); }
|
|
@@ -239,6 +240,8 @@ function installClaude(opts) {
|
|
|
239
240
|
if (!which('claude')) fail('CLI `claude` não encontrada no PATH. Instale o Claude Code primeiro.');
|
|
240
241
|
log(`instalando Atlas (claude/cursor) via marketplace from-source @ ${REPO_SLUG}`);
|
|
241
242
|
if (run('claude', ['plugin', 'marketplace', 'add', REPO_SLUG], opts)) fail('falha no `claude plugin marketplace add`');
|
|
243
|
+
// Atualiza snapshot do marketplace (add é idempotente mas não faz pull de commits novos).
|
|
244
|
+
run('claude', ['plugin', 'marketplace', 'update'], opts);
|
|
242
245
|
if (run('claude', ['plugin', 'install', PLUGIN_ID], opts)) fail('falha no `claude plugin install`');
|
|
243
246
|
log('ok — Claude Code/Cursor instalados (skills + subagente + MCP + hooks).');
|
|
244
247
|
}
|
|
@@ -247,6 +250,8 @@ function installCodex(opts) {
|
|
|
247
250
|
if (!which('codex')) fail('CLI `codex` não encontrada no PATH. Instale o Codex primeiro.');
|
|
248
251
|
log(`instalando Atlas (codex) via marketplace from-source @ ${REPO_SLUG}`);
|
|
249
252
|
if (run('codex', ['plugin', 'marketplace', 'add', REPO_SLUG], opts)) fail('falha no `codex plugin marketplace add`');
|
|
253
|
+
// Atualiza snapshot do marketplace (add é idempotente mas não faz pull de commits novos).
|
|
254
|
+
run('codex', ['plugin', 'marketplace', 'upgrade'], opts);
|
|
250
255
|
if (run('codex', ['plugin', 'add', PLUGIN_ID], opts)) fail('falha no `codex plugin add`');
|
|
251
256
|
const codexHome = process.env.CODEX_HOME?.trim() || path.join(homedir(), '.codex');
|
|
252
257
|
const agentsDir = path.join(codexHome, 'agents');
|
|
@@ -406,6 +411,65 @@ function installPiGlobal(opts) {
|
|
|
406
411
|
log('próximo: abra `pi` em qualquer pasta → atlas_ping (host=pi) + atlas_capabilities.');
|
|
407
412
|
}
|
|
408
413
|
|
|
414
|
+
function installAntigravity(opts) {
|
|
415
|
+
const geminiConfig = path.join(homedir(), '.gemini', 'config');
|
|
416
|
+
const pluginDir = path.join(geminiConfig, 'plugins', 'atlas-workflow-orchestrator');
|
|
417
|
+
const mcpFile = path.join(geminiConfig, 'mcp_config.json');
|
|
418
|
+
const absServer = path.join(pluginDir, 'packages', 'mcp-server', 'server.js');
|
|
419
|
+
|
|
420
|
+
log(`instalando Atlas (antigravity v${VERSION}) GLOBAL em ${pluginDir}`);
|
|
421
|
+
assertConfigParseable(mcpFile);
|
|
422
|
+
|
|
423
|
+
const entry = {
|
|
424
|
+
command: process.execPath,
|
|
425
|
+
args: [absServer],
|
|
426
|
+
env: {
|
|
427
|
+
ATLAS_HOST: 'antigravity'
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
if (opts.dryRun) {
|
|
432
|
+
log(` [dry-run] criaria pasta do plugin → ${pluginDir}`);
|
|
433
|
+
log(` [dry-run] copiaria skills e mcp-server para a pasta do plugin`);
|
|
434
|
+
log(` [dry-run] criaria plugin.json na raiz do plugin`);
|
|
435
|
+
log(` [dry-run] mesclaria mcpServers.atlas-workflow em ${mcpFile} (args absoluto)`);
|
|
436
|
+
} else {
|
|
437
|
+
fs.mkdirSync(pluginDir, { recursive: true });
|
|
438
|
+
|
|
439
|
+
// Limpeza de instalações anteriores controladas por nós
|
|
440
|
+
const skillsDir = path.join(pluginDir, 'skills');
|
|
441
|
+
const packagesDir = path.join(pluginDir, 'packages');
|
|
442
|
+
rmPath(skillsDir, opts);
|
|
443
|
+
rmPath(packagesDir, opts);
|
|
444
|
+
|
|
445
|
+
// Copia as skills
|
|
446
|
+
fs.mkdirSync(skillsDir, { recursive: true });
|
|
447
|
+
fs.cpSync(path.join(ROOT, 'packages/skills'), skillsDir, { recursive: true });
|
|
448
|
+
|
|
449
|
+
// Copia a orquestradora
|
|
450
|
+
fs.cpSync(
|
|
451
|
+
path.join(ROOT, 'packages/orchestrator/skills/atlas-workflow-orchestrator'),
|
|
452
|
+
path.join(skillsDir, 'atlas-workflow-orchestrator'),
|
|
453
|
+
{ recursive: true }
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
// Copia o mcp-server
|
|
457
|
+
fs.mkdirSync(path.join(packagesDir, 'mcp-server'), { recursive: true });
|
|
458
|
+
fs.cpSync(path.join(ROOT, 'packages/mcp-server'), path.join(packagesDir, 'mcp-server'), { recursive: true });
|
|
459
|
+
|
|
460
|
+
// Remove testes do mcp-server no bundle
|
|
461
|
+
fs.rmSync(path.join(packagesDir, 'mcp-server', 'server.test.js'), { force: true });
|
|
462
|
+
|
|
463
|
+
// Cria o plugin.json
|
|
464
|
+
const pluginJson = { name: 'atlas-workflow-orchestrator' };
|
|
465
|
+
fs.writeFileSync(path.join(pluginDir, 'plugin.json'), JSON.stringify(pluginJson, null, 2) + '\n');
|
|
466
|
+
|
|
467
|
+
// Mescla o MCP
|
|
468
|
+
mergeServerInto(mcpFile, 'mcpServers', 'atlas-workflow', entry);
|
|
469
|
+
log('ok — Antigravity GLOBAL instalado (skills + MCP server).');
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
409
473
|
// --- uninstall ---------------------------------------------------------------
|
|
410
474
|
|
|
411
475
|
function rmIfExists(p, { dryRun }) {
|
|
@@ -498,6 +562,17 @@ function uninstallPiGlobal(opts) {
|
|
|
498
562
|
log('ok — artefatos globais do Atlas removidos. As deps pi-mcp-adapter/pi-subagents ficam (uso geral).');
|
|
499
563
|
}
|
|
500
564
|
|
|
565
|
+
function uninstallAntigravity(opts) {
|
|
566
|
+
const geminiConfig = path.join(homedir(), '.gemini', 'config');
|
|
567
|
+
const pluginDir = path.join(geminiConfig, 'plugins', 'atlas-workflow-orchestrator');
|
|
568
|
+
const mcpFile = path.join(geminiConfig, 'mcp_config.json');
|
|
569
|
+
|
|
570
|
+
log(`removendo Atlas (antigravity) GLOBAL de ${pluginDir}`);
|
|
571
|
+
rmIfExists(pluginDir, opts);
|
|
572
|
+
dropMcpKey(mcpFile, 'mcpServers', 'atlas-workflow', opts);
|
|
573
|
+
log('ok — artefatos globais do Atlas para Antigravity removidos.');
|
|
574
|
+
}
|
|
575
|
+
|
|
501
576
|
function usage() {
|
|
502
577
|
log(`atlas-workflow v${VERSION} — instalador multi-host
|
|
503
578
|
|
|
@@ -508,6 +583,7 @@ uso:
|
|
|
508
583
|
hosts:
|
|
509
584
|
claudecode | cursor via \`claude plugin\` (marketplace from-source; já global)
|
|
510
585
|
codex via \`codex plugin\` + custom agents em CODEX_HOME/agents
|
|
586
|
+
antigravity via plugin nativo em ~/.gemini/config/ (já global)
|
|
511
587
|
opencode por-projeto: .opencode/ + opencode.json no [dir]
|
|
512
588
|
--global: ~/.config/opencode/ (vale em todos os projetos)
|
|
513
589
|
pi por-projeto: .mcp.json + .pi/agents/ no [dir] + deps
|
|
@@ -515,13 +591,14 @@ hosts:
|
|
|
515
591
|
|
|
516
592
|
flags:
|
|
517
593
|
--dir <d> diretório alvo (opencode/pi por-projeto); default: diretório atual
|
|
518
|
-
--global,-g instalação global (opencode/pi); claude/codex já são globais
|
|
594
|
+
--global,-g instalação global (opencode/pi); claude/codex/antigravity já são globais
|
|
519
595
|
--yes,-y auto-instala deps faltantes (pi, no init)
|
|
520
596
|
--dry-run mostra o que faria, sem alterar nada
|
|
521
597
|
-h,--help esta ajuda
|
|
522
598
|
|
|
523
599
|
exemplos:
|
|
524
600
|
npx github:${REPO_SLUG} init claudecode
|
|
601
|
+
npx github:${REPO_SLUG} init antigravity
|
|
525
602
|
npx github:${REPO_SLUG} init opencode # projeto atual
|
|
526
603
|
npx github:${REPO_SLUG} init opencode --global # todos os projetos
|
|
527
604
|
npx github:${REPO_SLUG} init pi --global --yes
|
|
@@ -561,24 +638,24 @@ function main() {
|
|
|
561
638
|
fail(`comando desconhecido: ${cmd} (use \`init <host>\` ou \`uninstall <host>\`)`, 2);
|
|
562
639
|
}
|
|
563
640
|
|
|
564
|
-
if (!rawHost) fail('informe o host: claudecode | cursor | codex | opencode | pi', 2);
|
|
641
|
+
if (!rawHost) fail('informe o host: claudecode | cursor | codex | antigravity | opencode | pi', 2);
|
|
565
642
|
if (extra.length) fail(`argumentos extras não suportados: ${extra.join(' ')}`, 2);
|
|
566
643
|
const host = HOST_ALIASES[rawHost.toLowerCase()];
|
|
567
|
-
if (!host) fail(`host inválido: ${rawHost} (use claudecode|cursor|codex|opencode|pi)`, 2);
|
|
644
|
+
if (!host) fail(`host inválido: ${rawHost} (use claudecode|cursor|codex|antigravity|opencode|pi)`, 2);
|
|
568
645
|
|
|
569
646
|
const opts = parsed.opts;
|
|
570
647
|
const targetDir = path.resolve(opts.dir || rawDir || process.cwd());
|
|
571
648
|
const actions = {
|
|
572
|
-
init: { claude: installClaude, codex: installCodex, opencode: installOpencode, pi: installPi },
|
|
573
|
-
uninstall: { claude: uninstallClaude, codex: uninstallCodex, opencode: uninstallOpencode, pi: uninstallPi },
|
|
649
|
+
init: { claude: installClaude, codex: installCodex, antigravity: installAntigravity, opencode: installOpencode, pi: installPi },
|
|
650
|
+
uninstall: { claude: uninstallClaude, codex: uninstallCodex, antigravity: uninstallAntigravity, opencode: uninstallOpencode, pi: uninstallPi },
|
|
574
651
|
};
|
|
575
652
|
const globalActions = {
|
|
576
653
|
init: { opencode: installOpencodeGlobal, pi: installPiGlobal },
|
|
577
654
|
uninstall: { opencode: uninstallOpencodeGlobal, pi: uninstallPiGlobal },
|
|
578
655
|
};
|
|
579
656
|
|
|
580
|
-
if (host === 'claude' || host === 'codex') {
|
|
581
|
-
if (opts.global) log('nota: claude/codex já são globais por natureza (registro da CLI) — --global ignorado.');
|
|
657
|
+
if (host === 'claude' || host === 'codex' || host === 'antigravity') {
|
|
658
|
+
if (opts.global && (host === 'claude' || host === 'codex')) log('nota: claude/codex já são globais por natureza (registro da CLI) — --global ignorado.');
|
|
582
659
|
actions[cmd][host](opts);
|
|
583
660
|
} else if (opts.global) {
|
|
584
661
|
globalActions[cmd][host](opts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.9.0
|
|
@@ -220,9 +220,16 @@ Veja este README, `packages/mcp-server/README.md` e os SKILL.md `atlas-*` para o
|
|
|
220
220
|
|
|
221
221
|
---
|
|
222
222
|
|
|
223
|
-
**Plugin version:** 0.
|
|
223
|
+
**Plugin version:** 0.9.0
|
|
224
224
|
**Author:** Paulo Borini
|
|
225
|
-
**Last updated:** 2026-06-
|
|
225
|
+
**Last updated:** 2026-06-16
|
|
226
|
+
|
|
227
|
+
### Novidades v0.8.4 — liveness do executor (Gate G12)
|
|
228
|
+
|
|
229
|
+
- `plan_execute` agora tem liveness explícito: `atlas_lock_dispatch(start)` cria deadline de bootstrap e o executor precisa emitir checkpoints materiais.
|
|
230
|
+
- `atlas-plan-execute` deve reportar `executor_started`, `skill_loaded`, `plan_loaded`, `handoff_accepted`, `task_started`, `first_write` e `state_path_created` conforme avança.
|
|
231
|
+
- Se o sub-agent não retornar/progredir, o orquestrador consulta `atlas_lock_dispatch(status)`; bootstrap vencido vira `executor_bootstrap_timeout`, checkpoint antigo sem avanço vira `executor_progress_timeout`; ambos persistem `stalled`, liberam retry e não podem ser tratados como execução em andamento.
|
|
232
|
+
- `atlas_lock_validator(start)` só abre o validator depois de `state_path_created` para o mesmo `state_path`; checkpoint final sem arquivo legível é bloqueado.
|
|
226
233
|
|
|
227
234
|
### Novidades v0.8.2 — release/npm e procedimento de bump
|
|
228
235
|
|
|
@@ -23,22 +23,23 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
|
|
|
23
23
|
| env `CODEX_HOME` / `CODEX_PLUGIN_ROOT` | `codex` |
|
|
24
24
|
| env `ATLAS_HOST=opencode` (injetado por `opencode.json`) | `opencode` |
|
|
25
25
|
| env `ATLAS_HOST=pi` (injetado pela config do `pi-mcp-adapter`) | `pi` |
|
|
26
|
+
| env `ATLAS_HOST=antigravity` (injetado por `mcp_config.json`) | `antigravity` |
|
|
26
27
|
| nenhum | `generic` |
|
|
27
28
|
|
|
28
29
|
## Matriz de adapters
|
|
29
30
|
|
|
30
|
-
| Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `generic` |
|
|
31
|
-
|
|
32
|
-
| Disparo de subagente | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | `spawn_agent(agent_type: "<name>", items: [{ type: "text", text: "<state_path>" }])` | `@<name>` (ou auto) com `<state_path>` | tool `subagent({ agent: "<name>", task: "<state_path>", context: "fresh" })` (pi-subagents) | subagente nativo do host, passando só `<state_path>` |
|
|
33
|
-
| Registro do subagente | `agents/<name>.md` na raiz do plugin | `CODEX_HOME/agents/<name>.toml` via `init codex` (`.codex/agents/` no bundle é fonte gerada; custom agent nativo; `developer_instructions` carrega o `SKILL.md`; `atlas-task-validator` pinado em `model="gpt-5.4"` + `model_reasoning_effort="high"`) | `.opencode/agents/<name>.md` (`mode: subagent`) | `.pi/agents/<name>.md` (pi-subagents; frontmatter `name`+`description`+`tools`; **`SKILL.md` canônico embutido no corpo** porque o pi não tem skill loader no sub-agente — fonte única segue `packages/skills/<name>/SKILL.md`, agente é cópia gerada por `build/gen-host-agent.mjs`) | mecanismo nativo equivalente |
|
|
34
|
-
| Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
|
|
35
|
-
| Join síncrono (gate JOIN) | `self_evident` (`Agent()` bloqueante) | `self_evident` (confirmado em produção) | `self_evident` (`@<name>` bloqueante) | `must_report` (depende de `pi-subagents`; hard-fail sem report) | `must_report` (indeterminado; hard-fail sem report) |
|
|
36
|
-
| Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) |
|
|
37
|
-
| Config MCP | `plugin.json` `mcpServers` | `.mcp.json` | `opencode.json` `mcp.<name>` (`type:"local"`, `environment.ATLAS_HOST=opencode`) | `.mcp.json` no root (`pi-mcp-adapter`; `env.ATLAS_HOST=pi`); tools chegam proxiadas/prefixadas `atlas_workflow_<tool>` | host MCP-capaz |
|
|
38
|
-
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — |
|
|
39
|
-
| Estado de run | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) |
|
|
40
|
-
| Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
|
|
41
|
-
| Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem |
|
|
31
|
+
| Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `antigravity` (Gemini) | `generic` |
|
|
32
|
+
|---------|------------------------|---------------------|------------|---------------|------------------------|-----------|
|
|
33
|
+
| Disparo de subagente | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | `spawn_agent(agent_type: "<name>", items: [{ type: "text", text: "<state_path>" }])` | `@<name>` (ou auto) com `<state_path>` | tool `subagent({ agent: "<name>", task: "<state_path>", context: "fresh" })` (pi-subagents) | `define_subagent` + `invoke_subagent` com `<state_path>` | subagente nativo do host, passando só `<state_path>` |
|
|
34
|
+
| Registro do subagente | `agents/<name>.md` na raiz do plugin | `CODEX_HOME/agents/<name>.toml` via `init codex` (`.codex/agents/` no bundle é fonte gerada; custom agent nativo; `developer_instructions` carrega o `SKILL.md`; `atlas-task-validator` pinado em `model="gpt-5.4"` + `model_reasoning_effort="high"`) | `.opencode/agents/<name>.md` (`mode: subagent`) | `.pi/agents/<name>.md` (pi-subagents; frontmatter `name`+`description`+`tools`; **`SKILL.md` canônico embutido no corpo** porque o pi não tem skill loader no sub-agente — fonte única segue `packages/skills/<name>/SKILL.md`, agente é cópia gerada por `build/gen-host-agent.mjs`) | dinâmico via `define_subagent` da skill do orquestrador | mecanismo nativo equivalente |
|
|
35
|
+
| Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
|
|
36
|
+
| Join síncrono (gate JOIN) | `self_evident` (`Agent()` bloqueante) | `self_evident` (confirmado em produção) | `self_evident` (`@<name>` bloqueante) | `must_report` (depende de `pi-subagents`; hard-fail sem report) | `self_evident` (`invoke_subagent` bloqueante) | `must_report` (indeterminado; hard-fail sem report) |
|
|
37
|
+
| Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) | nenhum (segue sem mirror) |
|
|
38
|
+
| Config MCP | `plugin.json` `mcpServers` | `.mcp.json` | `opencode.json` `mcp.<name>` (`type:"local"`, `environment.ATLAS_HOST=opencode`) | `.mcp.json` no root (`pi-mcp-adapter`; `env.ATLAS_HOST=pi`); tools chegam proxiadas/prefixadas `atlas_workflow_<tool>` | `mcp_config.json` (`env.ATLAS_HOST=antigravity`) | host MCP-capaz |
|
|
39
|
+
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — |
|
|
40
|
+
| Estado de run | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) | `atlas_run_state` (MCP) |
|
|
41
|
+
| Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
|
|
42
|
+
| Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem | idem |
|
|
42
43
|
|
|
43
44
|
`.cursor/plans/` e `.codex/plans/` são lidos com deprecation warning por 1 release; escrita só em `.atlas/plans/`. **opencode** instala via `.opencode/` + `opencode.json` (`hosts/opencode/`). **pi** instala via `mcp.json` + `agents/` + `skills/` (`hosts/pi/`) e exige as 2 deps obrigatórias; sem qualquer uma o preflight aborta (gate PREREQ).
|
|
44
45
|
|
package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md
CHANGED
|
@@ -8,7 +8,7 @@ category: Development Automation
|
|
|
8
8
|
|
|
9
9
|
Orquestra pipelines de desenvolvimento de features no projeto Atlas, automatizando a sequência de skills sob demanda com um único comando.
|
|
10
10
|
|
|
11
|
-
> **
|
|
11
|
+
> **MCP é fonte obrigatória de status.** Cada gate é consultado via MCP antes de avançar (tools por fase na Fase 0 e nos fluxos). Sem resposta MCP, sem resultado exigido ou status bloqueante → workflow abortado, sem fallback narrativo. Edge cases de ambiente (conflito plugin/nativo, MCP indisponível, estado corrompido, lock conflict, drift de versão) bloqueiam com causa, impacto e próxima ação segura.
|
|
12
12
|
|
|
13
13
|
## Sintaxe
|
|
14
14
|
|
|
@@ -124,33 +124,24 @@ A única interação legítima com o usuário é **dentro de uma fase** — o `A
|
|
|
124
124
|
|
|
125
125
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
126
|
|
|
127
|
-
O orquestrador **coordena a execução**, não implementa código
|
|
127
|
+
O orquestrador **coordena a execução**, não implementa código — maestro que aponta cada sub-agent na ordem e espera terminar, **nunca pega o instrumento de código**. A fronteira de determinismo é a **mutação de código** (PRD D10), com **duas fases**:
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
- **ANTES do plano validado — autoria documental livre no fio principal.** Pode autorar PRD, entrevistar e escrever `PLAN_*.md` direto; fases documentais não exigem sub-agent (documento não muta o produto). **Ao finalizar um PRD inline, estampar `| Status | Aprovado para implementação |`** — é o `required_status` do gate TC; sem isso o PRD sai `Draft` e trava o TC em rodadas de correção.
|
|
130
|
+
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** Não edita mais PRD/plano/código nem roda comando mutante; só coordena (despachar sub-agent, ler artefato pra verificar gate, ecoar banner, montar output).
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** A partir daí o orquestrador **NÃO** edita PRD/plano, **NÃO** edita código, **NÃO** roda comando mutante. Só **coordena a execução**: despachar sub-agent, ler artefato para verificar gate, ecoar banner, montar o output final.
|
|
133
|
-
- **Execução de código é SEMPRE gateada — nunca afrouxa.** Toda mutação de código vive obrigatoriamente em sub-agent `plan_execute` (blocking, um por vez) + validador frio `task_validator` (PRD D10). O orquestrador **nunca escreve código**, em nenhuma fase, em nenhum modo. Isto não muda com a autoria documental livre acima.
|
|
134
|
-
|
|
135
|
-
- **Permitido:** parse de args; classificar input; autorar PRD/entrevista/`PLAN_*.md` **enquanto o plano não foi validado**; despachar sub-agent (blocking, um por vez); ler artefato em disco para verificar gate; ecoar banner; montar o output final.
|
|
136
|
-
- **Proibido (Gate G9):** escrever/editar **código**; rodar comando mutante (`flutter`, `test`, `git add/commit`); editar PRD/plano **depois** do plano validado; implementar "em paralelo"; usar `run_in_background` para fases do pipeline.
|
|
137
|
-
- **Dispatch blocking:** despacha → **espera o retorno** → verifica gate → próxima fase. Nunca dois sub-agents simultâneos. Nunca trabalhar enquanto um sub-agent roda.
|
|
132
|
+
Execução de código é **sempre** sub-agent `plan_execute` (blocking, um por vez) + validador frio `task_validator` (Gate G9/G7 — detalhe na tabela de gates). Dispatch blocking: despacha → espera retorno → verifica gate → próxima fase. Nunca dois sub-agents simultâneos.
|
|
138
133
|
|
|
139
134
|
### Verbo de dispatch é host-agnóstico (não assuma "Agent tool")
|
|
140
135
|
|
|
141
|
-
O **mecanismo**
|
|
136
|
+
O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example` e `validator_dispatch` de `atlas_capabilities` (fonte de verdade em runtime) e use o **verbo nativo**. Não hardcode o verbo do Claude. Mapeamento ilustrativo, onde `<exec>` é o id da fase (`plan-execute`/`direct-execute`/`slice-review`/`task-validator`):
|
|
142
137
|
|
|
143
138
|
- **claude:** `Agent(subagent_type: "atlas-<exec>", prompt: ...)`
|
|
144
|
-
- **codex:** `spawn_agent(agent_type: "atlas-<exec>", items: [{ type: "text", text: "<state_path ou task>" }])`
|
|
139
|
+
- **codex:** `spawn_agent(agent_type: "atlas-<exec>", items: [{ type: "text", text: "<state_path ou task>" }])` (custom agent nativo em `CODEX_HOME/agents/atlas-<exec>.toml`; `.codex/agents/` do bundle é gerado). `$atlas-*` sozinho **não** isola contexto — use `spawn_agent`.
|
|
145
140
|
- **opencode:** `@atlas-<exec>` (ou auto por description)
|
|
146
141
|
- **pi:** `subagent({ agent: "atlas-<exec>", task, context: "fresh" })`
|
|
147
142
|
- **generic:** subagente nativo do host
|
|
148
143
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
> **Rodar a mutação de código no fio principal é violação do Gate G9 — em QUALQUER host.** Ausência da "Agent tool" (porque o host não é Claude) **não** é licença para executar inline: é sinal de que você deve usar o **verbo de dispatch daquele host**. No Codex, `$atlas-*` sozinho não isola contexto; use `spawn_agent`. Se o host não expõe nenhum mecanismo de sub-agent (preflight `subagent_available:false`), o gate PREREQ já abortou em `ready` — você nunca chega aqui sem isolamento.
|
|
152
|
-
|
|
153
|
-
Se você (orquestrador) está prestes a editar **código**, **pare**: esse trabalho é do sub-agent de execução. Despache-o (verbo nativo do host) e espere. (Autoria de PRD/plano antes da validação é a única autoria permitida no fio principal.)
|
|
144
|
+
> Ausência de "Agent tool" (host ≠ Claude) **não** é licença pra executar inline — é sinal pra usar o verbo daquele host (Gate G9, qualquer host). Host sem mecanismo de sub-agent já abortou em PREREQ; você nunca chega aqui sem isolamento.
|
|
154
145
|
|
|
155
146
|
## Protocolo de banner (única comunicação de progresso)
|
|
156
147
|
|
|
@@ -177,6 +168,7 @@ Regras inegociáveis. Violação = parar, não contornar.
|
|
|
177
168
|
| TC | **Conformidade de template via MCP.** PRD e PLAN só avançam como artefatos documentais se `atlas_verify_template_conformance` retornar `passed` e `pending_count: 0`. Pendência bloqueia com `next_action`. | PRD + plano |
|
|
178
169
|
| G6 | **Status verificado, não auto-reportado.** O ✅ de cada item no output só pode ser marcado após confirmar o artefato em disco. Faltou artefato exigido pelo modo → status final `incomplete`, nunca `completed`. | output |
|
|
179
170
|
| G7 | **Execução de código roda SEMPRE como sub-agent despachado (verbo nativo do host, lido de `atlas_capabilities`), nunca no contexto do orquestrador.** A **autoria** do `PLAN_*.md` pode ser feita pelo orquestrador no fio principal **enquanto o plano não foi validado** (autoria documental, PRD D10) — mas o plano só vira confiável após `atlas_verify_artifact` + TC `passed`. A **execução do plano** (`plan_execute`) e qualquer mutação de código vão obrigatoriamente a sub-agent. Antes de iniciar/concluir fase de execução, usar `atlas_lock_dispatch`; fase fora de ordem ou paralela bloqueia. Depois do plano validado, o orquestrador não edita mais o plano (mãos atadas fortes). | plano + execução |
|
|
171
|
+
| G12 | **Executor vivo precisa provar progresso.** Ao iniciar `plan_execute`, `atlas_lock_dispatch(start)` cria liveness de bootstrap/progresso. O executor precisa emitir `atlas_lock_dispatch(checkpoint, phase=plan_execute, event=...)` cedo, começando por `executor_started`/`skill_loaded`, depois `plan_loaded`, `handoff_accepted`, `task_started`, `first_write` e `state_path_created` conforme avança. `state_path_created` exige `state_path` legível/parseável, e `atlas_lock_validator(start)` só abre validator se o último checkpoint for `state_path_created` para exatamente o mesmo `state_path`. Se o sub-agent não retornar, travar, ficar sem primeiro checkpoint, ou ficar com checkpoint antigo sem avanço, o orquestrador chama `atlas_lock_dispatch(action=status, phase=plan_execute)`: `executor_bootstrap_timeout`/`executor_progress_timeout` viram `stalled`, o lock é liberado para `retry_plan_execute`, e a execução não pode ser declarada completa. Sem checkpoint/progresso não há "em andamento" confiável. | execução |
|
|
180
172
|
| G8 | **Ordem fixa de validação: `task-validator` ANTES, `slice-review` POR ÚLTIMO. Nunca em paralelo.** Conclusão de `plan_execute` usa `atlas_lock_dispatch` com `validator_status: passed`; review só inicia após execução concluída. | validação + review |
|
|
181
173
|
| PREREQ | **Pré-requisitos de determinismo (hard-fail, DEC-004).** `atlas_preflight` verifica, **antes de tudo**, se o host tem subagente + MCP (essenciais). Ausente (ex.: pi sem `pi-mcp-adapter`/`pi-subagents`, host MCP-only sem subagente) → aborta em `ready` com `missing_prerequisites`/`next_action`. Sem degradação, sem validator inline, qualquer tamanho. `todo` não-essencial segue sem mirror. | roteamento |
|
|
182
174
|
| DEP | **Dependência de backlog não satisfeita = hard-fail determinístico.** Se o input é `backlog-item` e o item declara `Dependências` (ex.: S40 dep S39) cujo status, lido no mesmo backlog/registro de onde o item veio, **não** é `done`, abortar em `ready` com `unmet_dependencies`, causa e `next_action` (executar a dependência primeiro). Sem improviso e sem pergunta: ou a dep está `done` e segue, ou bloqueia com causa. Não confundir com decisão em aberto (que não bloqueia). | roteamento (backlog-item) |
|
|
@@ -188,6 +180,10 @@ Regras inegociáveis. Violação = parar, não contornar.
|
|
|
188
180
|
|
|
189
181
|
## Fluxo de execução
|
|
190
182
|
|
|
183
|
+
### [EXEC] — passo comum de execução + validação (idêntico em `full`/`direct`/`execute`)
|
|
184
|
+
|
|
185
|
+
`atlas_lock_dispatch(action=start, phase=plan_execute)`; despachar `plan_execute` como sub-agent blocking (lê `PLAN_*.md` em `full`/`execute`, PRD em `direct`). O executor emite checkpoints G12; sem retorno/progresso, chamar `atlas_lock_dispatch(action=status, phase=plan_execute)` e tratar `executor_bootstrap_timeout`/`executor_progress_timeout` como `stalled`/retry — nunca como execução em andamento. O executor retorna `validator_handoff_required` com `state_path`; o MCP só abre o slot após o checkpoint `state_path_created` para esse mesmo `state_path`. Validação sempre **sibling**: `atlas_lock_validator(action=start)`, despachar **um** `task_validator`, exigir no output o `dispatch_token` do slot e fechar com `validator_run_id` + `dispatch_token`. Em `fail`: `repair_start`, despachar `atlas-findings-repair` com `{state_path, findings, validator_attempt, repair_run_id, repair_budget: 1}`, exigir atualização do mesmo `state_path`, fechar com `repair_run_id` e rodar o **2º e último** validator. `passed`/`passed_with_observations` são terminais aprovados; status diferente bloqueia review e output completed.
|
|
186
|
+
|
|
191
187
|
### Full mode
|
|
192
188
|
|
|
193
189
|
Artefatos esperados (em ordem): `PRD_*.md` → (`PRD_*.md` atualizado) → `PLAN_*.md` → diff de código → relatório do validador.
|
|
@@ -199,7 +195,7 @@ Artefatos esperados (em ordem): `PRD_*.md` → (`PRD_*.md` atualizado) → `PLAN
|
|
|
199
195
|
5. **Plan** — `atlas_lock_dispatch(action=start, phase=plan_handoff)`, carregar/invocar `plan_handoff` no fio principal para redigir `PLAN_*.md`, depois chamar `atlas_verify_artifact` e `atlas_verify_template_conformance(artifact_type=plan)`. Concluir a fase com `atlas_lock_dispatch(action=complete, phase=plan_handoff)`. **Nenhuma linha de código pode ter sido escrita até aqui.**
|
|
200
196
|
- **G11:** se `PLAN_*.md` foi validado, chamar `atlas_assert_after_plan`. Se a próxima ação não for `dispatch_plan_execute_blocking`, abortar.
|
|
201
197
|
6. **Validate plan** — se há gaps → dispara entrevista, propaga e continua (ver "Decisão em aberto ≠ parada"). Não para pra pedir permissão.
|
|
202
|
-
7. **Execute** —
|
|
198
|
+
7. **Execute** — rodar o passo **[EXEC]** (lê `PLAN_*.md`).
|
|
203
199
|
8. **Review (condicional)** — somente após execução concluída e se `--review` → `atlas_lock_dispatch(action=start, phase=slice_review)`, despachar `slice_review`, depois `atlas_lock_dispatch(action=complete, phase=slice_review)`.
|
|
204
200
|
9. **Output** — ledger verificado com fonte MCP por gate/fase (ver "Output") + próximos passos.
|
|
205
201
|
|
|
@@ -209,7 +205,7 @@ Artefatos esperados: `PRD_*.md` → (atualizado) → diff de código → relató
|
|
|
209
205
|
|
|
210
206
|
1. Parse / Generate PRD (se necessário) + `atlas_verify_artifact`.
|
|
211
207
|
2. Validate PRD → `atlas_scan_prd` + `atlas_verify_template_conformance`; entrevista condicional reexecuta os gates.
|
|
212
|
-
3. **Execute** —
|
|
208
|
+
3. **Execute** — rodar o passo **[EXEC]** (executor lê o PRD; sem `PLAN_*.md`).
|
|
213
209
|
4. Review (condicional) — só após executor retornar 100% e dispatch MCP permitir.
|
|
214
210
|
5. Output (ledger verificado).
|
|
215
211
|
|
|
@@ -221,7 +217,7 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
221
217
|
|
|
222
218
|
1. **Parse / classify** — `atlas_ping` → `atlas_capabilities` → **`atlas_classify_input`** no input (PRD D3/D6: o tipo é fato e precisa ser conhecido antes de travar o modo) → **`atlas_preflight(<modo efetivo>)`** (PREREQ hard-fail intacto). A classificação determina o tipo: se for plano, o modo efetivo é `execute` e o preflight trava `execute`; se o input não for plano, auto-rotear (ver Fase 0, passo 2b) e o preflight trava o modo roteado. **`classify_input` sempre precede `preflight`** (o preflight trava o modo efetivo, não o pedido).
|
|
223
219
|
2. **Reverificar o plano na entrada** — `atlas_verify_artifact` no `PLAN_*.md` (G1) + `atlas_verify_template_conformance(artifact_type=plan)` (TC). Plano velho/manual/inválido **trava aqui** com `next_action` em linguagem de produto (PRD D11 — "autoria é livre, execução é gateada"). Sem reverificação válida não há dispatch.
|
|
224
|
-
3. **Executar** —
|
|
220
|
+
3. **Executar** — rodar o passo **[EXEC]** (lê `PLAN_*.md`). `plan_execute` é aceito como **primeira fase** em `execute` (sem fase nova; PRD D13).
|
|
225
221
|
4. **Review (condicional)** — só após execução concluída e se `--review` → `atlas_lock_dispatch(action=start, phase=slice_review)`, despachar `slice_review`, depois `complete`.
|
|
226
222
|
5. **Output** — ledger verificado; `guarantee_level` = `full_pipeline` (PRD D12).
|
|
227
223
|
|
|
@@ -238,15 +234,7 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
238
234
|
|
|
239
235
|
## Validação automática de PRD
|
|
240
236
|
|
|
241
|
-
O scan é **determinístico
|
|
242
|
-
|
|
243
|
-
- **§1 Contexto e objetivo:** `TBD`, `a confirmar`, `talvez`, `não definido`
|
|
244
|
-
- **§2 Escopo:** `pode ser`, `depende de`, `ainda não`, `incompleto`
|
|
245
|
-
- **§3 Decisões:** vazio/conteúdo mínimo, `vago`
|
|
246
|
-
- **§4 Fluxos e cenários UX:** `a definir`, `gap`, `depende de`
|
|
247
|
-
- **§5 Contrato funcional e invariantes:** `ainda não definido`, `mock apenas`, `a confirmar`
|
|
248
|
-
|
|
249
|
-
Antes de contar bloqueantes, aplicar exclusões estreitas do config (`exclude_if_line_contains`, hoje `depende de plano`) para frases de sucesso/resultado que descrevem dependência operacional já planejada. Não usar julgamento livre: a exclusão precisa estar no config e ser logada.
|
|
237
|
+
O scan é **determinístico** e roda **dentro do MCP** (`atlas_scan_prd`): a lista canônica de padrões §1-§5 e as exclusões de config (`exclude_if_line_contains`) são embutidas e mantidas no servidor — o orquestrador **não** reaplica padrões por conta própria, só consome o resultado. Não usar julgamento livre.
|
|
250
238
|
|
|
251
239
|
**Threshold = 1.** Se ≥ 1 padrão bloqueante → o orquestrador invoca `atlas-prd-interview` no fio principal. **Gate G5:** se 0 padrões bloqueantes, registrar `Ambiguity scan: 0 padrões bloqueantes — entrevista pulada` no output. Não há decisão subjetiva de "tenho certeza, pulo".
|
|
252
240
|
|
|
@@ -254,16 +242,16 @@ Antes de contar bloqueantes, aplicar exclusões estreitas do config (`exclude_if
|
|
|
254
242
|
|
|
255
243
|
## Decisão em aberto ≠ parada
|
|
256
244
|
|
|
257
|
-
|
|
245
|
+
Detalhe do caminho que a "Princípio de continuação automática" exige para decisão pendente de **qualquer fonte** (scan/entrevista/validação de plano/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — a fonte não muda o tratamento):
|
|
258
246
|
|
|
259
|
-
|
|
247
|
+
1. **Garantir o PRD primeiro.** Em `full`/`direct`, se o PRD não existe, **gerar o PRD draft** com as decisões marcadas. A entrevista é **PRD-scoped**: roda **sobre** o PRD, nunca antes. Detectar decisão não antecipa nem pula a geração do PRD.
|
|
248
|
+
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve via `AskUserQuestion` (interação dentro da fase, não pedido de permissão).
|
|
249
|
+
3. **Propagar** ao PRD/plano/DEC/registro de origem.
|
|
250
|
+
4. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** automaticamente.
|
|
260
251
|
|
|
261
|
-
|
|
262
|
-
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve a decisão via `AskUserQuestion` (interação **dentro da fase**, não pedido de permissão pra avançar).
|
|
263
|
-
3. **Propagar** a resolução ao PRD/plano/DEC/registro de origem.
|
|
264
|
-
4. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** (plano→execução) automaticamente.
|
|
252
|
+
Marcar TBD e adiar só se o usuário pedir **explicitamente** — nunca por iniciativa do orquestrador.
|
|
265
253
|
|
|
266
|
-
|
|
254
|
+
> `PERGUNTAS_EM_ABERTO.md` é verificado na validação de PRD; Q- aberta da sprint **não é blockage** — entra neste mesmo caminho.
|
|
267
255
|
|
|
268
256
|
---
|
|
269
257
|
|
|
@@ -324,12 +312,6 @@ Se `full` gerou `PLAN_*.md` mas não despachou `plan_execute`, o cabeçalho deve
|
|
|
324
312
|
|
|
325
313
|
---
|
|
326
314
|
|
|
327
|
-
## Integração com PERGUNTAS_EM_ABERTO.md
|
|
328
|
-
|
|
329
|
-
Plugin verifica `PERGUNTAS_EM_ABERTO.md` durante validação de PRD. Q-… abertas relacionadas à sprint **não param o pipeline** (Q- aberta não é blockage). O orquestrador trata como decisão em aberto: dispara `atlas-prd-interview` para resolver, propaga a decisão (PRD/plano/DEC/registro) e **continua** o pipeline. Ver "Decisão em aberto ≠ parada".
|
|
330
|
-
|
|
331
|
-
---
|
|
332
|
-
|
|
333
315
|
## Error handling
|
|
334
316
|
|
|
335
317
|
- **Pré-flight falha (skill ausente no host)** → para, reporta, não emula (ver Fase 0).
|
|
@@ -399,14 +381,4 @@ orquestrador
|
|
|
399
381
|
|
|
400
382
|
Regra de ouro: **um sub-agent por fase de execução, em série, blocking, sustentado por MCP**. O orquestrador espera cada sub-agent terminar antes do próximo e **nunca** trabalha em paralelo nem escreve código (Gate G9). Autoria documental (PRD/plano) é livre no fio principal **antes** do plano validado; depois, mãos atadas. Em `full`, `PLAN_*.md` validado obriga `plan_execute` no mesmo workflow (G11). `task-validator` ⟂ `slice-review` jamais coexistem. Progresso só por banner (string do MCP).
|
|
401
383
|
|
|
402
|
-
> Histórico
|
|
403
|
-
|
|
404
|
-
- **v0.8.1** — Patch de confiabilidade de contrato (só SKILL/command; sem código MCP, sem schema, schema v5 intacto). Fecha o vazamento de **parada discricionária**: nova seção "Princípio de continuação automática" (pipeline fire-and-continue — só para em gate duro `blocked` ou blockage de ambiente real) + "Decisão em aberto ≠ parada" (decisão pendente de **qualquer fonte** — scan/entrevista/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — dispara entrevista, propaga e **continua**, nunca vira menu de permissão nem "responda só: seguir ou D=..."; sequência travada: em `full`/`direct` gera PRD draft **primeiro**, entrevista roda **sobre** o PRD). Proíbe modo fora do contrato ("Modo Discussão"/"dry-run") e "quer que eu gere/continue?"; PRD ausente em `full`/`direct` gera automático. Novo **Gate DEP**: dependência de backlog não-`done` é hard-fail determinístico (não confundir com decisão em aberto). Origem: relato de pausa indevida no pipeline (orquestrador parava pra pedir confirmação que o contrato não exige).
|
|
405
|
-
- **v0.8.0** — Proof-of-work do validador frio (Gate G4, R20). `atlas_lock_validator(start)` emite um `challenge` (sha256 de um arquivo do boundary do `state_path`); o validador irmão lê via `validator_recovery.challenge`, computa o hash e devolve em `challenge_response`; o `complete` recomputa do disco e bloqueia (`challenge_failed`, slot preservado) em divergência/ausência. Atestação mecânica de que o veredito leu o boundary — fecha o atalho preguiçoso de afirmar `pass` sem ler código. **Não** é prova de isolamento não-forjável (MCP fala stdio com um único caller); best-effort (boundary sem arquivo legível → sem challenge, sem enforcement). Schema `atlas_capabilities` intacto (v5).
|
|
406
|
-
- **v0.7.2** — Patch de confiabilidade (sem breaking, schema v5 intacto). `ping().capabilities` passa a ser **derivado de `toolsList()`** (fonte única) — fim do drift que omitia `atlas_classify_input`, capaz de travar run válida na Fase 0; guard cruzado novo. CI ganha job `cross-os` (Windows/macOS, Node puro). Doc: proveniência do `dispatch_token` no `atlas-task-validator` e `.gitattributes` marcando artefatos gerados.
|
|
407
|
-
- **v0.7.1** — Patch de confiabilidade. MCP: `atlas_run_state(upsert)` faz merge top-level (não derruba `dispatch.active`); `findActiveRunConflict` só bloqueia conflito de lock real; `atlas_verify_artifact` aceita `artifact_kind`. Gate G4 endurecido: falha de dispatch em runtime = `blocked`, nunca inline (R17); `dispatch_token` do `complete` vem do output do próprio validador irmão (R19).
|
|
408
|
-
|
|
409
|
-
## Próximas fases
|
|
410
|
-
|
|
411
|
-
- **v0.4** hardening de empacotamento e smoke multi-host
|
|
412
|
-
- **v1.0** contrato estável de workflow
|
|
384
|
+
> Histórico de versões (detalhe de cada correção) e roadmap: [`CHANGELOG.md`](../../../../CHANGELOG.md) na raiz — fonte canônica.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Atlas Workflow MCP Server
|
|
2
2
|
|
|
3
|
-
Servidor MCP do plugin Atlas Workflow v0.
|
|
3
|
+
Servidor MCP do plugin Atlas Workflow v0.9.0.
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ Servidor MCP do plugin Atlas Workflow v0.8.2.
|
|
|
12
12
|
- `atlas_verify_template_conformance`: Gate TC; PRD/PLAN só avançam com template conforme e `pending_count: 0`.
|
|
13
13
|
- `atlas_scan_prd`: Gate G5; escaneia PRD por padrões determinísticos de ambiguidade bloqueante.
|
|
14
14
|
- `atlas_preflight`: Gate G10; valida modo, versão, lock ativo e mapa oficial de skills atlas-*.
|
|
15
|
-
- `atlas_lock_dispatch`: Gates G7/G8; controla fase ativa, ordem de dispatch e validator antes de review.
|
|
15
|
+
- `atlas_lock_dispatch`: Gates G7/G8/G12; controla fase ativa, checkpoints de liveness do executor, ordem de dispatch e validator antes de review (`state_path_created` exige `state_path` legível).
|
|
16
16
|
- `atlas_lock_validator`: Gate G4 sibling; um validator por vez, `dispatch_token` obrigatório, máximo de 2 attempts, repair obrigatório entre fail e retry, proof-of-work (challenge sha256 do boundary recomputado no complete; re-dispatch bounded → `challenge_exhausted`).
|
|
17
17
|
- `atlas_assert_after_plan`: Gate G11; bloqueia encerramento prematuro do modo full após plano validado.
|
|
18
18
|
|
|
@@ -25,4 +25,5 @@ Servidor MCP do plugin Atlas Workflow v0.8.2.
|
|
|
25
25
|
- Gates: resultados persistidos em `data.gates`.
|
|
26
26
|
- Roteamento: lock persistido em `data.routing`.
|
|
27
27
|
- Dispatch: fase ativa, próxima ação e histórico persistidos em `data.dispatch`.
|
|
28
|
+
- Liveness: `plan_execute` persiste `data.dispatch.active.liveness`; bootstrap vencido sem checkpoint ou checkpoint antigo sem progresso vira `executor_liveness.status = stalled` e `next_action: retry_plan_execute`; `atlas_lock_validator(start)` bloqueia até `state_path_created` corresponder ao mesmo `state_path`.
|
|
28
29
|
- Erro bloqueante: entradas inválidas, run inexistente ou falha de estado retornam erro JSON-RPC; gate bloqueado retorna `status: "blocked"` e `next_action`.
|