atlas-workflow 0.9.2 → 0.9.3
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 +5 -2
- package/VERSION +1 -1
- package/build/bump-version.mjs +6 -21
- package/build/cli/atlas-init.mjs +92 -5
- package/hosts/opencode/.opencode/atlas/VERSION +1 -1
- package/hosts/opencode/.opencode/atlas/orchestrator/README.md +1 -1
- package/hosts/opencode/.opencode/atlas/orchestrator/references/host-adapters.md +13 -12
- package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/README.md +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/server.js +69 -7
- package/hosts/opencode/.opencode/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
- package/hosts/pi/atlas/VERSION +1 -1
- package/hosts/pi/atlas/orchestrator/README.md +1 -1
- package/hosts/pi/atlas/orchestrator/references/host-adapters.md +13 -12
- package/hosts/pi/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
- package/hosts/pi/atlas/packages/mcp-server/README.md +1 -1
- package/hosts/pi/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/pi/atlas/packages/mcp-server/server.js +69 -7
- package/hosts/pi/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
- package/hosts/zcode/.zcode-plugin/plugin.json +27 -0
- package/hosts/zcode/agents/atlas-direct-execute.md +31 -0
- package/hosts/zcode/agents/atlas-findings-repair.md +39 -0
- package/hosts/zcode/agents/atlas-plan-execute.md +33 -0
- package/hosts/zcode/agents/atlas-slice-review.md +27 -0
- package/hosts/zcode/agents/atlas-task-validator.md +138 -0
- package/hosts/zcode/packages/mcp-server/README.md +29 -0
- package/hosts/zcode/packages/mcp-server/VERSION +1 -0
- package/hosts/zcode/packages/mcp-server/package.json +15 -0
- package/hosts/zcode/packages/mcp-server/server.js +3897 -0
- package/hosts/zcode/packages/orchestrator/README.md +270 -0
- package/hosts/zcode/packages/orchestrator/commands/workflow.md +37 -0
- package/hosts/zcode/packages/orchestrator/defaults/paths.md +21 -0
- package/hosts/zcode/packages/orchestrator/references/host-adapters.md +106 -0
- package/hosts/zcode/packages/orchestrator/references/qa_s13_matrix.md +141 -0
- package/hosts/zcode/packages/orchestrator/references/subagent_dispatch.md +42 -0
- package/hosts/zcode/packages/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +391 -0
- package/hosts/zcode/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +855 -0
- package/hosts/zcode/packages/templates/BOUNDARY_PRD_PLAN.md +93 -0
- package/hosts/zcode/packages/templates/PERGUNTAS_EM_ABERTO_TEMPLATE.md +139 -0
- package/hosts/zcode/packages/templates/PLAN_TEMPLATE.md +146 -0
- package/hosts/zcode/packages/templates/PRD_TEMPLATE.md +150 -0
- package/hosts/zcode/packages/templates/STATE_FILE_SCHEMA.md +56 -0
- package/hosts/zcode/skills/_shared/references/stack-profiles.md +36 -0
- package/hosts/zcode/skills/_shared/scripts/document_quality.mjs +252 -0
- package/hosts/zcode/skills/atlas-backlog-generator/SKILL.md +93 -0
- package/hosts/zcode/skills/atlas-backlog-generator/agents/openai.yaml +4 -0
- package/hosts/zcode/skills/atlas-direct-execute/SKILL.md +221 -0
- package/hosts/zcode/skills/atlas-direct-execute/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-findings-repair/SKILL.md +158 -0
- package/hosts/zcode/skills/atlas-findings-repair/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-plan-execute/SKILL.md +175 -0
- package/hosts/zcode/skills/atlas-plan-execute/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-plan-execute/references/plan-contract.md +88 -0
- package/hosts/zcode/skills/atlas-plan-execute/references/quality-gates.md +60 -0
- package/hosts/zcode/skills/atlas-plan-execute/scripts/check_budget_state.py +96 -0
- package/hosts/zcode/skills/atlas-plan-execute/scripts/extract_plan_contract.py +191 -0
- package/hosts/zcode/skills/atlas-plan-execute/scripts/validate_gate_result.py +56 -0
- package/hosts/zcode/skills/atlas-plan-handoff/SKILL.md +183 -0
- package/hosts/zcode/skills/atlas-plan-handoff/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-prd-interview/SKILL.md +82 -0
- package/hosts/zcode/skills/atlas-prd-interview/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-slice-review/SKILL.md +156 -0
- package/hosts/zcode/skills/atlas-slice-review/agents/openai.yaml +4 -0
- package/hosts/zcode/skills/atlas-slice-review/references/review-contract.md +58 -0
- package/hosts/zcode/skills/atlas-slice-review/references/scenario-lenses.md +57 -0
- package/hosts/zcode/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
- package/hosts/zcode/skills/atlas-slice-review/scripts/classify_findings.py +24 -0
- package/hosts/zcode/skills/atlas-slice-review/scripts/extract_review_slice.py +158 -0
- package/hosts/zcode/skills/atlas-sprint-prd-generator/SKILL.md +77 -0
- package/hosts/zcode/skills/atlas-sprint-prd-generator/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-task-validator/SKILL.md +173 -0
- package/hosts/zcode/skills/atlas-task-validator/agents/openai.yaml +7 -0
- package/hosts/zcode/skills/atlas-workflow-orchestrator/SKILL.md +391 -0
- 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/orchestrator/README.md +1 -1
- package/plugins/atlas-workflow-orchestrator/orchestrator/references/host-adapters.md +13 -12
- package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/server.js +69 -7
- package/plugins/atlas-workflow-orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +2 -0
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Atlas Workflow
|
|
2
2
|
|
|
3
|
-
Plugin **Atlas Workflow Orchestrator** v0.9.
|
|
3
|
+
Plugin **Atlas Workflow Orchestrator** v0.9.3 — pipeline determinístico (PRD → plano → execução → validação) com skills `atlas-*`, templates e MCP. Um pacote, sete hosts: **Claude Code**, **Cursor**, **Codex App**, **Antigravity (Gemini)**, **ZCode**, **OpenCode** e **Pi CLI**.
|
|
4
4
|
|
|
5
|
-
**Versão:** [`VERSION`](VERSION) (`0.9.
|
|
5
|
+
**Versão:** [`VERSION`](VERSION) (`0.9.3`) · **Repo:** https://github.com/pauloborini/atlas-workflow
|
|
6
6
|
|
|
7
7
|
## Hosts
|
|
8
8
|
|
|
@@ -12,6 +12,7 @@ Plugin **Atlas Workflow Orchestrator** v0.9.1 — pipeline determinístico (PRD
|
|
|
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
14
|
| Antigravity (Gemini) | Instalador from-source (`init antigravity`) → `~/.gemini/config/` | — (cópia direta, sem artefato `.plugin`) | — |
|
|
15
|
+
| ZCode | Instalador cache-based (`init zcode`) → `~/.zcode/cli/plugins/cache/` | `atlas-workflow-zcode.plugin` | — |
|
|
15
16
|
| Opencode | Catálogo from-source `hosts/opencode/` | `atlas-workflow-opencode.plugin` | — |
|
|
16
17
|
| Pi CLI | Catálogo from-source `hosts/pi/` | `atlas-workflow-pi.plugin` | **`pi-mcp-adapter` + `pi-subagents`** |
|
|
17
18
|
|
|
@@ -31,6 +32,7 @@ Um instalador único cobre os hosts de forma **global** (recomendado para valer
|
|
|
31
32
|
npx github:pauloborini/atlas-workflow init claudecode # ou: cursor
|
|
32
33
|
npx github:pauloborini/atlas-workflow init codex
|
|
33
34
|
npx github:pauloborini/atlas-workflow init antigravity
|
|
35
|
+
npx github:pauloborini/atlas-workflow init zcode
|
|
34
36
|
npx github:pauloborini/atlas-workflow init opencode --global
|
|
35
37
|
npx github:pauloborini/atlas-workflow init pi --global --yes # --yes auto-instala as 2 deps
|
|
36
38
|
```
|
|
@@ -38,6 +40,7 @@ npx github:pauloborini/atlas-workflow init pi --global --yes # --yes auto-insta
|
|
|
38
40
|
- **claudecode/cursor**: o instalador roda o `marketplace add` + `install` nativos da CLI por você. Já são globais por natureza.
|
|
39
41
|
- **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
42
|
- **antigravity**: o instalador registra o Atlas como um plugin em `~/.gemini/config/plugins/` e adiciona o MCP correspondente em `mcp_config.json`.
|
|
43
|
+
- **zcode**: o instalador copia o catálogo from-source `hosts/zcode/` para `~/.zcode/cli/plugins/cache/pauloborini/atlas-workflow-orchestrator/<version>/` e registra o plugin no `marketplace.json` do ZCode. Ative no host via `/plugins enable atlas-workflow-orchestrator`. ZCode é Claude Agent SDK (clone estrutural do Claude Code): `Agent(subagent_type)` + `TodoWrite` + MCP stdio nativos — perfil `self_evident`, sem dependências externas.
|
|
41
44
|
- **opencode**: com `--global`, instala globalmente em `~/.config/opencode/` (o MCP é registrado com caminho absoluto, funcionando em todos os projetos).
|
|
42
45
|
- **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`.
|
|
43
46
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.3
|
package/build/bump-version.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// Bump
|
|
3
|
-
// regenera bundles/
|
|
4
|
-
// — quem publica é o workflow Release ao detectar VERSION novo na main.
|
|
2
|
+
// Bump deterministico de versao. Sincroniza os arquivos com versao concreta,
|
|
3
|
+
// regenera bundles/catalogos e roda check-consistency. NAO cria tag nem commita
|
|
4
|
+
// — quem publica e cria a tag é o workflow Release ao detectar VERSION novo na main.
|
|
5
5
|
//
|
|
6
6
|
// Uso: node build/bump-version.mjs <nova-versao> (ex.: 0.8.3)
|
|
7
7
|
//
|
|
@@ -88,26 +88,11 @@ execFileSync('bash', [path.join(ROOT, 'build', 'build-plugins.sh')], { cwd: ROOT
|
|
|
88
88
|
console.log(`Rodando check-consistency…`);
|
|
89
89
|
execFileSync('node', [path.join(ROOT, 'build', 'check-consistency.mjs')], { cwd: ROOT, stdio: 'inherit' });
|
|
90
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
91
|
console.log(`\nbump-version: ${current} -> ${next} OK.
|
|
107
92
|
|
|
108
93
|
Passos narrativos manuais (não automatizáveis):
|
|
109
94
|
1. CHANGELOG.md — adicionar entrada "## ${next} - YYYY-MM-DD".
|
|
110
95
|
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
|
|
112
|
-
git push origin main
|
|
113
|
-
=> CI Release
|
|
96
|
+
3. Revisar 'git status', commitar e dar push na main:
|
|
97
|
+
git push origin main
|
|
98
|
+
=> CI Release publica e cria a tag v${next}.`);
|
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
|
+
zcode: 'zcode', zai: 'zcode',
|
|
34
35
|
antigravity: 'antigravity', gemini: 'antigravity', antigravitycode: 'antigravity',
|
|
35
36
|
};
|
|
36
37
|
|
|
@@ -571,6 +572,91 @@ function uninstallAntigravity(opts) {
|
|
|
571
572
|
log('ok — artefatos globais do Atlas para Antigravity removidos.');
|
|
572
573
|
}
|
|
573
574
|
|
|
575
|
+
// --- ZCode (cache-based install) ----------------------------------------------
|
|
576
|
+
// ZCode só descobre plugins no escopo `zcode-plugins-official` (verificado
|
|
577
|
+
// empiricamente no bundle zcode.cjs: `G2="zcode-plugins-official"` é hardcoded e o
|
|
578
|
+
// scan de cache é restrito a `cache/zcode-plugins-official/<plugin>/<version>/`).
|
|
579
|
+
// Por isso o installer copia para esse path — não para um marketplace custom.
|
|
580
|
+
// O ZCode também regenera `marketplaces/zcode-plugins-official/marketplace.json` no
|
|
581
|
+
// boot a partir do scan; mantemos essa entry sincronizada para visualização imediata.
|
|
582
|
+
|
|
583
|
+
const ZCODE_MARKETPLACE = 'zcode-plugins-official';
|
|
584
|
+
const ZCODE_PLUGIN_NAME = 'atlas-workflow-orchestrator';
|
|
585
|
+
|
|
586
|
+
function zcodeCacheDir() {
|
|
587
|
+
return path.join(homedir(), '.zcode', 'cli', 'plugins', 'cache', ZCODE_MARKETPLACE, ZCODE_PLUGIN_NAME, VERSION);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
function zcodeMarketplaceCacheFile() {
|
|
591
|
+
return path.join(homedir(), '.zcode', 'cli', 'plugins', 'marketplaces', ZCODE_MARKETPLACE, 'marketplace.json');
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
function updateZcodeMarketplaceCacheEntry(cacheDir) {
|
|
595
|
+
const file = zcodeMarketplaceCacheFile();
|
|
596
|
+
let cfg = { name: ZCODE_MARKETPLACE, plugins: [], version: 1 };
|
|
597
|
+
if (fs.existsSync(file)) {
|
|
598
|
+
try { cfg = JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
599
|
+
catch { log(` aviso: ${path.basename(file)} é JSON inválido — reescrevendo do zero`); }
|
|
600
|
+
}
|
|
601
|
+
cfg.name = ZCODE_MARKETPLACE;
|
|
602
|
+
cfg.plugins = (cfg.plugins ?? []).filter((p) => p.name !== ZCODE_PLUGIN_NAME);
|
|
603
|
+
cfg.plugins.push({ cachePath: cacheDir, name: ZCODE_PLUGIN_NAME, source: 'filesystem', version: VERSION });
|
|
604
|
+
cfg.version = 1;
|
|
605
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
606
|
+
fs.writeFileSync(file, JSON.stringify(cfg, null, 2) + '\n');
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
function removeZcodeMarketplaceCacheEntry() {
|
|
610
|
+
const file = zcodeMarketplaceCacheFile();
|
|
611
|
+
if (!fs.existsSync(file)) return;
|
|
612
|
+
try {
|
|
613
|
+
const cfg = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
614
|
+
cfg.plugins = (cfg.plugins ?? []).filter((p) => p.name !== ZCODE_PLUGIN_NAME);
|
|
615
|
+
fs.writeFileSync(file, JSON.stringify(cfg, null, 2) + '\n');
|
|
616
|
+
} catch { log(` aviso: ${path.basename(file)} é JSON inválido — não mexi`); }
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
function installZcode(opts) {
|
|
620
|
+
const cacheDir = zcodeCacheDir();
|
|
621
|
+
const catalogSrc = path.join(ROOT, 'hosts/zcode');
|
|
622
|
+
log(`instalando Atlas (zcode v${VERSION}) GLOBAL em ${cacheDir}`);
|
|
623
|
+
if (!fs.existsSync(catalogSrc)) fail(`catálogo zcode ausente: hosts/zcode/ (rode build/build-plugins.sh)`);
|
|
624
|
+
if (opts.dryRun) {
|
|
625
|
+
log(` [dry-run] copiaria hosts/zcode/ → ${cacheDir}`);
|
|
626
|
+
log(` [dry-run] atualizaria ${zcodeMarketplaceCacheFile()}`);
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
// Limpa instalação anterior (pode haver versão stale)
|
|
630
|
+
const parentDir = path.dirname(cacheDir);
|
|
631
|
+
if (fs.existsSync(parentDir)) fs.rmSync(parentDir, { recursive: true, force: true });
|
|
632
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
633
|
+
fs.cpSync(catalogSrc, cacheDir, { recursive: true });
|
|
634
|
+
// Gera o seed file no formato que o ZCode espera
|
|
635
|
+
const seed = {
|
|
636
|
+
hash: '',
|
|
637
|
+
marketplace: ZCODE_MARKETPLACE,
|
|
638
|
+
plugin: ZCODE_PLUGIN_NAME,
|
|
639
|
+
pluginVersion: VERSION,
|
|
640
|
+
source: 'filesystem',
|
|
641
|
+
version: 1,
|
|
642
|
+
};
|
|
643
|
+
fs.writeFileSync(path.join(cacheDir, '.zcode-plugin-seed.json'), JSON.stringify(seed, null, 2) + '\n');
|
|
644
|
+
// Sincroniza a entry do marketplace cache (o ZCode regenera no boot, mas
|
|
645
|
+
// mantemos sincronizado para visualização imediata no `/plugins`).
|
|
646
|
+
updateZcodeMarketplaceCacheEntry(cacheDir);
|
|
647
|
+
log('ok — ZCode instalado no cache oficial.');
|
|
648
|
+
log('próximo: abra o ZCode e ative via /plugins enable atlas-workflow-orchestrator');
|
|
649
|
+
log(' confirme com a tool MCP atlas_ping (host=zcode, status=alive).');
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
function uninstallZcode(opts) {
|
|
653
|
+
const cacheParent = path.join(homedir(), '.zcode', 'cli', 'plugins', 'cache', ZCODE_MARKETPLACE, ZCODE_PLUGIN_NAME);
|
|
654
|
+
log(`removendo Atlas (zcode) GLOBAL de ${cacheParent}`);
|
|
655
|
+
rmIfExists(cacheParent, opts);
|
|
656
|
+
removeZcodeMarketplaceCacheEntry();
|
|
657
|
+
log('ok — ZCode: cache e registry removidos.');
|
|
658
|
+
}
|
|
659
|
+
|
|
574
660
|
function usage() {
|
|
575
661
|
log(`atlas-workflow v${VERSION} — instalador multi-host
|
|
576
662
|
|
|
@@ -582,6 +668,7 @@ hosts:
|
|
|
582
668
|
claudecode | cursor via \`claude plugin\` (marketplace from-source; já global)
|
|
583
669
|
codex via \`codex plugin\` + custom agents em CODEX_HOME/agents
|
|
584
670
|
antigravity via plugin nativo em ~/.gemini/config/ (já global)
|
|
671
|
+
zcode via cache ~/.zcode/cli/plugins/cache/ (já global; /plugins enable)
|
|
585
672
|
opencode por-projeto: .opencode/ + opencode.json no [dir]
|
|
586
673
|
--global: ~/.config/opencode/ (vale em todos os projetos)
|
|
587
674
|
pi por-projeto: .mcp.json + .pi/agents/ no [dir] + deps
|
|
@@ -636,23 +723,23 @@ function main() {
|
|
|
636
723
|
fail(`comando desconhecido: ${cmd} (use \`init <host>\` ou \`uninstall <host>\`)`, 2);
|
|
637
724
|
}
|
|
638
725
|
|
|
639
|
-
if (!rawHost) fail('informe o host: claudecode | cursor | codex | antigravity | opencode | pi', 2);
|
|
726
|
+
if (!rawHost) fail('informe o host: claudecode | cursor | codex | antigravity | zcode | opencode | pi', 2);
|
|
640
727
|
if (extra.length) fail(`argumentos extras não suportados: ${extra.join(' ')}`, 2);
|
|
641
728
|
const host = HOST_ALIASES[rawHost.toLowerCase()];
|
|
642
|
-
if (!host) fail(`host inválido: ${rawHost} (use claudecode|cursor|codex|antigravity|opencode|pi)`, 2);
|
|
729
|
+
if (!host) fail(`host inválido: ${rawHost} (use claudecode|cursor|codex|antigravity|zcode|opencode|pi)`, 2);
|
|
643
730
|
|
|
644
731
|
const opts = parsed.opts;
|
|
645
732
|
const targetDir = path.resolve(opts.dir || rawDir || process.cwd());
|
|
646
733
|
const actions = {
|
|
647
|
-
init: { claude: installClaude, codex: installCodex, antigravity: installAntigravity, opencode: installOpencode, pi: installPi },
|
|
648
|
-
uninstall: { claude: uninstallClaude, codex: uninstallCodex, antigravity: uninstallAntigravity, opencode: uninstallOpencode, pi: uninstallPi },
|
|
734
|
+
init: { claude: installClaude, codex: installCodex, antigravity: installAntigravity, zcode: installZcode, opencode: installOpencode, pi: installPi },
|
|
735
|
+
uninstall: { claude: uninstallClaude, codex: uninstallCodex, antigravity: uninstallAntigravity, zcode: uninstallZcode, opencode: uninstallOpencode, pi: uninstallPi },
|
|
649
736
|
};
|
|
650
737
|
const globalActions = {
|
|
651
738
|
init: { opencode: installOpencodeGlobal, pi: installPiGlobal },
|
|
652
739
|
uninstall: { opencode: uninstallOpencodeGlobal, pi: uninstallPiGlobal },
|
|
653
740
|
};
|
|
654
741
|
|
|
655
|
-
if (host === 'claude' || host === 'codex' || host === 'antigravity') {
|
|
742
|
+
if (host === 'claude' || host === 'codex' || host === 'antigravity' || host === 'zcode') {
|
|
656
743
|
if (opts.global && (host === 'claude' || host === 'codex')) log('nota: claude/codex já são globais por natureza (registro da CLI) — --global ignorado.');
|
|
657
744
|
actions[cmd][host](opts);
|
|
658
745
|
} else if (opts.global) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.3
|
|
@@ -11,7 +11,7 @@ Tools nativas do cliente (`Agent()`, `TodoWrite`, `tasks`, `$skill`) vivem no ho
|
|
|
11
11
|
1. **Runtime:** `atlas_capabilities` (MCP) — detecta host por env e retorna o descritor. Preferir sempre.
|
|
12
12
|
2. **Estático:** esta tabela — fallback de leitura/documentação quando o MCP não está disponível.
|
|
13
13
|
|
|
14
|
-
Os dois devem permanecer consistentes. O descritor em código vive em `packages/mcp-server/server.js` (`HOST_ADAPTERS`).
|
|
14
|
+
Os dois devem permanecer consistentes. O descritor em código vive em `packages/mcp-server/server.js` (`HOST_ADAPTERS`). ZCode usa o mesmo formato de agentes que Claude (`.md` com frontmatter) por ser Claude Agent SDK compat.
|
|
15
15
|
|
|
16
16
|
## Detecção de host
|
|
17
17
|
|
|
@@ -21,6 +21,7 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
|
|
|
21
21
|
| env `ATLAS_HOST` | o valor da env |
|
|
22
22
|
| env `CLAUDE_PLUGIN_ROOT` presente | `claude` |
|
|
23
23
|
| env `CODEX_HOME` / `CODEX_PLUGIN_ROOT` | `codex` |
|
|
24
|
+
| env `ZCODE_PLUGIN_ROOT` (injetado pelo `.zcode-plugin` do host) | `zcode` |
|
|
24
25
|
| env `ATLAS_HOST=opencode` (injetado por `opencode.json`) | `opencode` |
|
|
25
26
|
| env `ATLAS_HOST=pi` (injetado pela config do `pi-mcp-adapter`) | `pi` |
|
|
26
27
|
| env `ATLAS_HOST=antigravity` (injetado por `mcp_config.json`) | `antigravity` |
|
|
@@ -28,15 +29,15 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
|
|
|
28
29
|
|
|
29
30
|
## Matriz de adapters
|
|
30
31
|
|
|
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
|
|
39
|
-
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — |
|
|
32
|
+
| Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `antigravity` (Gemini) | `zcode` (ZCode) | `generic` |
|
|
33
|
+
|---------|------------------------|---------------------|------------|---------------|------------------------|-----------|-----------|
|
|
34
|
+
| 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>` | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | subagente nativo do host, passando só `<state_path>` |
|
|
35
|
+
| 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 | `agents/<name>.md` na raiz do plugin (.zcode-plugin) — mesmo formato claude (Claude Agent SDK) | mecanismo nativo equivalente |
|
|
36
|
+
| Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
|
|
37
|
+
| 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) | `self_evident` (`Agent()` bloqueante; Claude Agent SDK) | `must_report` (indeterminado; hard-fail sem report) |
|
|
38
|
+
| Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) | `TodoWrite` | nenhum (segue sem mirror) |
|
|
39
|
+
| 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`) | `.zcode-plugin/plugin.json` `mcpServers` (stdio; `ZCODE_PLUGIN_ROOT` injetado pelo host) | host MCP-capaz |
|
|
40
|
+
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — | — |
|
|
40
41
|
| 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
42
|
| Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
|
|
42
43
|
| Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem | idem |
|
|
@@ -92,7 +93,7 @@ Campos retornados (DEC-007):
|
|
|
92
93
|
1. Adicionar entrada em `HOST_ADAPTERS` (`packages/mcp-server/server.js`).
|
|
93
94
|
2. Adicionar regra de detecção em `detectHost` se houver env próprio.
|
|
94
95
|
3. Adicionar linha na matriz de adapters.
|
|
95
|
-
4. Registrar o subagente no formato nativo do host (ex.: `agents/<name>.md` ou equivalente).
|
|
96
|
+
4. Registrar o subagente no formato nativo do host (ex.: `agents/<name>.md` ou equivalente). ZCode reusa o formato Claude (`agents/<name>.md`) — mesmo formato, sem geração extra.
|
|
96
97
|
|
|
97
98
|
Sem tocar nas skills — elas já consomem o descritor.
|
|
98
99
|
|
|
@@ -102,4 +103,4 @@ Sem tocar nas skills — elas já consomem o descritor.
|
|
|
102
103
|
|
|
103
104
|
## Status multi-host
|
|
104
105
|
|
|
105
|
-
Todos os hosts-alvo do survey S01 estão implementados na matriz acima: `claude`, `codex`, `cursor` (carona no manifest claude), `opencode` (S06), `pi` (S07) e `generic`. Nenhum exige HTTP/SSE → stdio único (DEC-006/S05). Survey completo + fontes: `PRD_S01_host_survey.md`.
|
|
106
|
+
Todos os hosts-alvo do survey S01 estão implementados na matriz acima: `claude`, `codex`, `cursor` (carona no manifest claude), `opencode` (S06), `pi` (S07), `zcode` (Claude Agent SDK compat) e `generic`. Nenhum exige HTTP/SSE → stdio único (DEC-006/S05). Survey completo + fontes: `PRD_S01_host_survey.md`.
|
package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md
CHANGED
|
@@ -122,6 +122,7 @@ O pipeline é **fire-and-continue**: uma vez iniciado, o orquestrador avança fa
|
|
|
122
122
|
|
|
123
123
|
A única interação legítima com o usuário é **dentro de uma fase** — o mecanismo estruturado `question_prompt` devolvido por `atlas_capabilities`, usado pela entrevista para resolver ambiguidade de produto. Resolver ambiguidade ≠ pedir permissão pra avançar. Terminada a fase, respostas são persistidas no PRD, gates são reexecutados e o pipeline segue sozinho.
|
|
124
124
|
|
|
125
|
+
|
|
125
126
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
127
|
|
|
127
128
|
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**:
|
|
@@ -143,6 +144,7 @@ O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example
|
|
|
143
144
|
|
|
144
145
|
> 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.
|
|
145
146
|
|
|
147
|
+
|
|
146
148
|
## Protocolo de banner (única comunicação de progresso)
|
|
147
149
|
|
|
148
150
|
O orquestrador comunica progresso **apenas** por **banner de fase de linha única** no formato `▸ atlas: <fase> · <ação> [· <detalhe>]` (PRD D7/D8). Regras:
|
|
@@ -283,23 +283,81 @@ const HOST_ADAPTERS = {
|
|
|
283
283
|
},
|
|
284
284
|
antigravity: {
|
|
285
285
|
label: 'Antigravity',
|
|
286
|
+
// Antigravity não tem skill loader nativo em subagentes — o SKILL.md completo
|
|
287
|
+
// DEVE ser embutido no Prompt de cada invoke_subagent (via define_subagent como
|
|
288
|
+
// system_prompt ou diretamente no Prompt). Nunca despachar subagente sem SKILL.md
|
|
289
|
+
// injetado, pois o subagente não carregará o contrato e o pipeline vai impasse.
|
|
290
|
+
//
|
|
291
|
+
// Fluxo para fases de execução/validação (executor, validator, repair, review):
|
|
292
|
+
// 1. define_subagent(name: "<atlas-exec>", system_prompt: "<SKILL.MD completo>")
|
|
293
|
+
// 2. invoke_subagent(Subagents: [{TypeName: "<atlas-exec>", Role: "<papel>",
|
|
294
|
+
// Prompt: "<state_path ou plan_path>",
|
|
295
|
+
// Workspace: "branch"}])
|
|
296
|
+
// — invoke_subagent é BLOQUEANTE por design: não polling, não background.
|
|
297
|
+
// — Workspace: "branch" garante isolamento de contexto (fronteira G4/G9).
|
|
298
|
+
//
|
|
299
|
+
// Fases documentais (PRD, entrevista, plano) NÃO usam subagente — o orquestrador
|
|
300
|
+
// conduz no fio principal; define_subagent não é chamado para essas fases.
|
|
286
301
|
subagent_dispatch: {
|
|
287
|
-
mechanism: 'define_subagent(name, system_prompt) + invoke_subagent(Subagents)',
|
|
288
|
-
example: 'define_subagent(name: "atlas-task-validator", system_prompt: "<
|
|
289
|
-
registration: '
|
|
302
|
+
mechanism: 'define_subagent(name, system_prompt) + invoke_subagent(Subagents: [{TypeName, Role, Prompt, Workspace}])',
|
|
303
|
+
example: 'define_subagent(name: "atlas-task-validator", system_prompt: "<SKILL.MD completo do atlas-task-validator>") seguido de invoke_subagent(Subagents: [{TypeName: "atlas-task-validator", Role: "Validador frio", Prompt: "<state_path>", Workspace: "branch"}])',
|
|
304
|
+
registration: 'define_subagent dinâmico por sessão — o SKILL.md canônico é passado como system_prompt; sem pré-registro persistente',
|
|
305
|
+
// Sem loader nativo: o SKILL.md DEVE ser embutido no system_prompt do define_subagent.
|
|
306
|
+
// Não usar TypeName: "self" sem injetar o SKILL.md — o subagente herdaria o contexto
|
|
307
|
+
// do orquestrador e violaria o isolamento frio (G4/G9).
|
|
308
|
+
skill_loading: 'embed_in_system_prompt',
|
|
290
309
|
},
|
|
291
310
|
validator_dispatch: {
|
|
292
311
|
dispatcher: 'orchestrator',
|
|
293
312
|
join: {
|
|
294
313
|
sync: 'self_evident',
|
|
295
314
|
confidence: 'high',
|
|
296
|
-
mechanism: 'invoke_subagent bloqueante por design do host',
|
|
315
|
+
mechanism: 'invoke_subagent bloqueante por design do host — sem polling, sem callback',
|
|
297
316
|
},
|
|
298
317
|
},
|
|
299
|
-
question_prompt:
|
|
318
|
+
// question_prompt: usado pela atlas-prd-interview para fazer perguntas ao usuário.
|
|
319
|
+
// No Antigravity, usar ask_question (ferramenta nativa de perguntas interativas).
|
|
320
|
+
// IMPORTANTE — resume_after_interview: após receber respostas via ask_question,
|
|
321
|
+
// persistir no PRD e RETOMAR O PIPELINE IMEDIATAMENTE sem nova confirmação.
|
|
322
|
+
// Nunca aguardar input adicional do usuário entre fases — viola fire-and-continue.
|
|
323
|
+
question_prompt: {
|
|
324
|
+
mechanism: 'ask_question',
|
|
325
|
+
mode: 'structured',
|
|
326
|
+
max_questions: 4,
|
|
327
|
+
options_per_question: 3,
|
|
328
|
+
persistence: 'prd_after_each_round',
|
|
329
|
+
resume_after_interview: 'automatic',
|
|
330
|
+
},
|
|
300
331
|
todo_tool: null,
|
|
301
332
|
hooks: { supported: false, mechanism: null },
|
|
302
333
|
capabilities_flags: { subagent_available: true, mcp_available: true, todo_available: false },
|
|
334
|
+
// self_evident: MCP nativo + invoke_subagent bloqueante provados pelo boot do host.
|
|
335
|
+
// Não exige host_capabilities report (igual claude/codex/opencode).
|
|
336
|
+
prereq_policy: 'self_evident',
|
|
337
|
+
},
|
|
338
|
+
zcode: {
|
|
339
|
+
label: 'ZCode',
|
|
340
|
+
subagent_dispatch: {
|
|
341
|
+
// ZCode roda no Claude Agent SDK: Agent(subagent_type) nativo e bloqueante.
|
|
342
|
+
// Skills/agents do plugin vivem no bundle (.zcode-plugin) carregado pelo host.
|
|
343
|
+
mechanism: 'Agent(subagent_type)',
|
|
344
|
+
example: 'Agent(subagent_type: "atlas-task-validator", prompt: "<state_path>")',
|
|
345
|
+
registration: 'agents/<name>.md na raiz do plugin (descoberto via .zcode-plugin/plugin.json)',
|
|
346
|
+
},
|
|
347
|
+
validator_dispatch: {
|
|
348
|
+
dispatcher: 'orchestrator',
|
|
349
|
+
join: {
|
|
350
|
+
sync: 'self_evident',
|
|
351
|
+
confidence: 'presumed',
|
|
352
|
+
mechanism: 'Agent(subagent_type) bloqueante por design do host (Claude Agent SDK)',
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
question_prompt: { mechanism: 'AskUserQuestion', mode: 'structured', max_questions: 4, options_per_question: 3, persistence: 'prd_after_each_round' },
|
|
356
|
+
todo_tool: 'TodoWrite',
|
|
357
|
+
hooks: { supported: true, mechanism: '.zcode-plugin/plugin.json (hooks)' },
|
|
358
|
+
// ZCode é clone estrutural do Claude Code (Claude Agent SDK): subagente +
|
|
359
|
+
// MCP-local + TodoWrite nativos. Perfil self_evident — passa PREREQ/JOIN sem report.
|
|
360
|
+
capabilities_flags: { subagent_available: true, mcp_available: true, todo_available: true },
|
|
303
361
|
},
|
|
304
362
|
generic: {
|
|
305
363
|
label: 'Host genérico',
|
|
@@ -367,6 +425,10 @@ const HOST_NAMES = Object.keys(HOST_ADAPTERS);
|
|
|
367
425
|
const HOST_DETECTORS = [
|
|
368
426
|
{ via: 'env:CLAUDE_PLUGIN_ROOT', detect: (env) => (env.CLAUDE_PLUGIN_ROOT ? 'claude' : null) },
|
|
369
427
|
{ via: 'env:CODEX', detect: (env) => (env.CODEX_HOME || env.CODEX_PLUGIN_ROOT ? 'codex' : null) },
|
|
428
|
+
// ZCode (app Electron no Claude Agent SDK) injeta ZCODE_PLUGIN_ROOT ao spawnar o
|
|
429
|
+
// subprocesso MCP do plugin (comprovado no bundle zcode.cjs: interpolação análoga a
|
|
430
|
+
// CLAUDE_PLUGIN_ROOT). Sinal próprio e determinístico — precedência sobre ATLAS_HOST.
|
|
431
|
+
{ via: 'env:ZCODE_PLUGIN_ROOT', detect: (env) => (env.ZCODE_PLUGIN_ROOT ? 'zcode' : null) },
|
|
370
432
|
// opencode/pi não expõem env distintivo garantido no subprocesso MCP (S01).
|
|
371
433
|
// Detecção determinística: o packaging injeta ATLAS_HOST no env do MCP —
|
|
372
434
|
// opencode: opencode.json → mcp.<name>.environment.ATLAS_HOST = "opencode"
|
|
@@ -419,7 +481,7 @@ function capabilities(args = {}) {
|
|
|
419
481
|
// do host com a disponibilidade real reportada pelo caller (`host_capabilities`).
|
|
420
482
|
//
|
|
421
483
|
// Política por host (`prereq_policy`):
|
|
422
|
-
// - 'self_evident' (claude/codex/opencode, default): runtime nativo. Flag essencial
|
|
484
|
+
// - 'self_evident' (claude/codex/opencode/zcode, default): runtime nativo. Flag essencial
|
|
423
485
|
// vem do report quando presente, senão do perfil (otimista justificado: MCP-vivo
|
|
424
486
|
// prova-se no boot; subagente é nativo do host/plugin instalado).
|
|
425
487
|
// - 'must_report' (pi/generic): essencial depende de dep externa (pi) ou de host
|
|
@@ -469,7 +531,7 @@ function checkPrerequisites(args = {}) {
|
|
|
469
531
|
|
|
470
532
|
// Gate JOIN (DEC-SIB-003, SPEC_JOIN_CAPABILITY_S03 §3/§5). Espelha checkPrerequisites:
|
|
471
533
|
// lê validator_dispatch.join do adapter e decide hard-fail por política.
|
|
472
|
-
// - join.sync === 'self_evident' (claude/codex/opencode): host nativo conhecido;
|
|
534
|
+
// - join.sync === 'self_evident' (claude/codex/opencode/zcode): host nativo conhecido;
|
|
473
535
|
// o runtime presume join disponível e NÃO exige report. confidence 'presumed'
|
|
474
536
|
// (claude/opencode) passa, mas é registrado para observabilidade (smoke S13).
|
|
475
537
|
// - join.sync === 'must_report' (pi/generic): fail-closed. Só passa se o caller
|
|
@@ -122,6 +122,7 @@ O pipeline é **fire-and-continue**: uma vez iniciado, o orquestrador avança fa
|
|
|
122
122
|
|
|
123
123
|
A única interação legítima com o usuário é **dentro de uma fase** — o mecanismo estruturado `question_prompt` devolvido por `atlas_capabilities`, usado pela entrevista para resolver ambiguidade de produto. Resolver ambiguidade ≠ pedir permissão pra avançar. Terminada a fase, respostas são persistidas no PRD, gates são reexecutados e o pipeline segue sozinho.
|
|
124
124
|
|
|
125
|
+
|
|
125
126
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
127
|
|
|
127
128
|
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**:
|
|
@@ -143,6 +144,7 @@ O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example
|
|
|
143
144
|
|
|
144
145
|
> 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.
|
|
145
146
|
|
|
147
|
+
|
|
146
148
|
## Protocolo de banner (única comunicação de progresso)
|
|
147
149
|
|
|
148
150
|
O orquestrador comunica progresso **apenas** por **banner de fase de linha única** no formato `▸ atlas: <fase> · <ação> [· <detalhe>]` (PRD D7/D8). Regras:
|
package/hosts/pi/atlas/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.3
|
|
@@ -11,7 +11,7 @@ Tools nativas do cliente (`Agent()`, `TodoWrite`, `tasks`, `$skill`) vivem no ho
|
|
|
11
11
|
1. **Runtime:** `atlas_capabilities` (MCP) — detecta host por env e retorna o descritor. Preferir sempre.
|
|
12
12
|
2. **Estático:** esta tabela — fallback de leitura/documentação quando o MCP não está disponível.
|
|
13
13
|
|
|
14
|
-
Os dois devem permanecer consistentes. O descritor em código vive em `packages/mcp-server/server.js` (`HOST_ADAPTERS`).
|
|
14
|
+
Os dois devem permanecer consistentes. O descritor em código vive em `packages/mcp-server/server.js` (`HOST_ADAPTERS`). ZCode usa o mesmo formato de agentes que Claude (`.md` com frontmatter) por ser Claude Agent SDK compat.
|
|
15
15
|
|
|
16
16
|
## Detecção de host
|
|
17
17
|
|
|
@@ -21,6 +21,7 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
|
|
|
21
21
|
| env `ATLAS_HOST` | o valor da env |
|
|
22
22
|
| env `CLAUDE_PLUGIN_ROOT` presente | `claude` |
|
|
23
23
|
| env `CODEX_HOME` / `CODEX_PLUGIN_ROOT` | `codex` |
|
|
24
|
+
| env `ZCODE_PLUGIN_ROOT` (injetado pelo `.zcode-plugin` do host) | `zcode` |
|
|
24
25
|
| env `ATLAS_HOST=opencode` (injetado por `opencode.json`) | `opencode` |
|
|
25
26
|
| env `ATLAS_HOST=pi` (injetado pela config do `pi-mcp-adapter`) | `pi` |
|
|
26
27
|
| env `ATLAS_HOST=antigravity` (injetado por `mcp_config.json`) | `antigravity` |
|
|
@@ -28,15 +29,15 @@ Os dois devem permanecer consistentes. O descritor em código vive em `packages/
|
|
|
28
29
|
|
|
29
30
|
## Matriz de adapters
|
|
30
31
|
|
|
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
|
|
39
|
-
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — |
|
|
32
|
+
| Concern | `claude` (Claude Code) | `codex` (Codex App) | `opencode` | `pi` (pi cli) | `antigravity` (Gemini) | `zcode` (ZCode) | `generic` |
|
|
33
|
+
|---------|------------------------|---------------------|------------|---------------|------------------------|-----------|-----------|
|
|
34
|
+
| 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>` | `Agent(subagent_type: "<name>", prompt: "<state_path>")` | subagente nativo do host, passando só `<state_path>` |
|
|
35
|
+
| 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 | `agents/<name>.md` na raiz do plugin (.zcode-plugin) — mesmo formato claude (Claude Agent SDK) | mecanismo nativo equivalente |
|
|
36
|
+
| Topologia do validador frio (G4) | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** | **`sibling`** |
|
|
37
|
+
| 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) | `self_evident` (`Agent()` bloqueante; Claude Agent SDK) | `must_report` (indeterminado; hard-fail sem report) |
|
|
38
|
+
| Todo nativo | `TodoWrite` | `tasks` | `todowrite` | nenhum (segue sem mirror) | nenhum (segue sem mirror) | `TodoWrite` | nenhum (segue sem mirror) |
|
|
39
|
+
| 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`) | `.zcode-plugin/plugin.json` `mcpServers` (stdio; `ZCODE_PLUGIN_ROOT` injetado pelo host) | host MCP-capaz |
|
|
40
|
+
| Deps externas obrigatórias | — | — | — | **`pi-mcp-adapter` + `pi-subagents`** (DEC-005) | — | — | — |
|
|
40
41
|
| 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
42
|
| Escrita de plano | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` | `.atlas/plans/` |
|
|
42
43
|
| Leitura de plano (ordem) | `.atlas/plans/` → `.cursor/plans/` → `.codex/plans/` | idem | idem | idem | idem | idem |
|
|
@@ -92,7 +93,7 @@ Campos retornados (DEC-007):
|
|
|
92
93
|
1. Adicionar entrada em `HOST_ADAPTERS` (`packages/mcp-server/server.js`).
|
|
93
94
|
2. Adicionar regra de detecção em `detectHost` se houver env próprio.
|
|
94
95
|
3. Adicionar linha na matriz de adapters.
|
|
95
|
-
4. Registrar o subagente no formato nativo do host (ex.: `agents/<name>.md` ou equivalente).
|
|
96
|
+
4. Registrar o subagente no formato nativo do host (ex.: `agents/<name>.md` ou equivalente). ZCode reusa o formato Claude (`agents/<name>.md`) — mesmo formato, sem geração extra.
|
|
96
97
|
|
|
97
98
|
Sem tocar nas skills — elas já consomem o descritor.
|
|
98
99
|
|
|
@@ -102,4 +103,4 @@ Sem tocar nas skills — elas já consomem o descritor.
|
|
|
102
103
|
|
|
103
104
|
## Status multi-host
|
|
104
105
|
|
|
105
|
-
Todos os hosts-alvo do survey S01 estão implementados na matriz acima: `claude`, `codex`, `cursor` (carona no manifest claude), `opencode` (S06), `pi` (S07) e `generic`. Nenhum exige HTTP/SSE → stdio único (DEC-006/S05). Survey completo + fontes: `PRD_S01_host_survey.md`.
|
|
106
|
+
Todos os hosts-alvo do survey S01 estão implementados na matriz acima: `claude`, `codex`, `cursor` (carona no manifest claude), `opencode` (S06), `pi` (S07), `zcode` (Claude Agent SDK compat) e `generic`. Nenhum exige HTTP/SSE → stdio único (DEC-006/S05). Survey completo + fontes: `PRD_S01_host_survey.md`.
|
|
@@ -122,6 +122,7 @@ O pipeline é **fire-and-continue**: uma vez iniciado, o orquestrador avança fa
|
|
|
122
122
|
|
|
123
123
|
A única interação legítima com o usuário é **dentro de uma fase** — o mecanismo estruturado `question_prompt` devolvido por `atlas_capabilities`, usado pela entrevista para resolver ambiguidade de produto. Resolver ambiguidade ≠ pedir permissão pra avançar. Terminada a fase, respostas são persistidas no PRD, gates são reexecutados e o pipeline segue sozinho.
|
|
124
124
|
|
|
125
|
+
|
|
125
126
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
127
|
|
|
127
128
|
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**:
|
|
@@ -143,6 +144,7 @@ O **mecanismo** varia por host — leia `subagent_dispatch.mechanism`, `.example
|
|
|
143
144
|
|
|
144
145
|
> 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.
|
|
145
146
|
|
|
147
|
+
|
|
146
148
|
## Protocolo de banner (única comunicação de progresso)
|
|
147
149
|
|
|
148
150
|
O orquestrador comunica progresso **apenas** por **banner de fase de linha única** no formato `▸ atlas: <fase> · <ação> [· <detalhe>]` (PRD D7/D8). Regras:
|