up-cc 0.16.0 → 2.0.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.
Files changed (134) hide show
  1. package/README.md +87 -577
  2. package/package.json +5 -3
  3. package/up/CHANGELOG.md +110 -0
  4. package/up/agents/up-arquiteto.md +95 -39
  5. package/up/agents/up-auditor.md +218 -0
  6. package/up/agents/up-executor.md +94 -31
  7. package/up/agents/up-mapeador-codigo.md +63 -10
  8. package/up/agents/up-pesquisador.md +278 -0
  9. package/up/agents/up-revisor.md +249 -0
  10. package/up/agents/up-sintetizador.md +156 -179
  11. package/up/agents/up-tester.md +280 -0
  12. package/up/agents/up-verificador.md +95 -11
  13. package/up/bin/install.js +190 -21
  14. package/up/bin/lib/core.cjs +17 -43
  15. package/up/bin/lib/github.cjs +495 -0
  16. package/up/bin/lib/multica.cjs +424 -0
  17. package/up/bin/up-tools.cjs +167 -46
  18. package/up/commands/auditar.md +66 -0
  19. package/up/commands/build.md +54 -43
  20. package/up/commands/depurar.md +1 -1
  21. package/up/commands/plan.md +52 -38
  22. package/up/commands/rapido.md +15 -9
  23. package/up/commands/testar.md +81 -122
  24. package/up/commands/up.md +106 -0
  25. package/up/hooks/up-session-start.js +107 -0
  26. package/up/references/engineering-principles.md +1 -1
  27. package/up/references/governance-rules.md +5 -5
  28. package/up/references/production-requirements.md +1 -1
  29. package/up/references/severity-levels.md +2 -2
  30. package/up/references/tdd-evidence-types.md +81 -0
  31. package/up/skills/up-brainstorm/SKILL.md +39 -0
  32. package/up/skills/up-tdd/SKILL.md +39 -0
  33. package/up/skills/up-verificar-antes-de-concluir/SKILL.md +49 -0
  34. package/up/skills/usando-up/SKILL.md +26 -0
  35. package/up/templates/audit-plan.md +3 -3
  36. package/up/templates/audit-report.md +2 -2
  37. package/up/templates/design-tokens.md +2 -2
  38. package/up/workflows/auditar.md +255 -0
  39. package/up/workflows/build.md +600 -386
  40. package/up/workflows/dcrv.md +183 -99
  41. package/up/workflows/governance.md +112 -220
  42. package/up/workflows/plan.md +169 -399
  43. package/up/workflows/rapido.md +7 -1
  44. package/up/workflows/up.md +447 -0
  45. package/up/agents/up-analista-codigo.md +0 -446
  46. package/up/agents/up-api-tester.md +0 -405
  47. package/up/agents/up-architecture-supervisor.md +0 -126
  48. package/up/agents/up-audit-supervisor.md +0 -83
  49. package/up/agents/up-auditor-modernidade.md +0 -378
  50. package/up/agents/up-auditor-performance.md +0 -426
  51. package/up/agents/up-auditor-ux.md +0 -396
  52. package/up/agents/up-backend-specialist.md +0 -175
  53. package/up/agents/up-blind-validator.md +0 -259
  54. package/up/agents/up-chief-architect.md +0 -184
  55. package/up/agents/up-chief-engineer.md +0 -202
  56. package/up/agents/up-chief-operations.md +0 -123
  57. package/up/agents/up-chief-product.md +0 -103
  58. package/up/agents/up-chief-quality.md +0 -211
  59. package/up/agents/up-clone-crawler.md +0 -234
  60. package/up/agents/up-clone-design-extractor.md +0 -227
  61. package/up/agents/up-clone-feature-mapper.md +0 -225
  62. package/up/agents/up-clone-prd-writer.md +0 -169
  63. package/up/agents/up-clone-verifier.md +0 -227
  64. package/up/agents/up-code-reviewer.md +0 -229
  65. package/up/agents/up-consolidador-ideias.md +0 -493
  66. package/up/agents/up-database-specialist.md +0 -169
  67. package/up/agents/up-delivery-auditor.md +0 -247
  68. package/up/agents/up-devops-agent.md +0 -203
  69. package/up/agents/up-execution-supervisor.md +0 -315
  70. package/up/agents/up-exhaustive-tester.md +0 -348
  71. package/up/agents/up-frontend-specialist.md +0 -152
  72. package/up/agents/up-operations-supervisor.md +0 -94
  73. package/up/agents/up-pesquisador-mercado.md +0 -350
  74. package/up/agents/up-pesquisador-projeto.md +0 -358
  75. package/up/agents/up-planning-auditor.md +0 -284
  76. package/up/agents/up-planning-supervisor.md +0 -260
  77. package/up/agents/up-product-analyst.md +0 -192
  78. package/up/agents/up-product-supervisor.md +0 -83
  79. package/up/agents/up-project-ceo.md +0 -352
  80. package/up/agents/up-qa-agent.md +0 -171
  81. package/up/agents/up-quality-supervisor.md +0 -178
  82. package/up/agents/up-requirements-validator.md +0 -230
  83. package/up/agents/up-security-reviewer.md +0 -137
  84. package/up/agents/up-sintetizador-melhorias.md +0 -407
  85. package/up/agents/up-system-designer.md +0 -332
  86. package/up/agents/up-technical-writer.md +0 -188
  87. package/up/agents/up-verification-supervisor.md +0 -111
  88. package/up/agents/up-visual-critic.md +0 -358
  89. package/up/commands/adicionar-fase.md +0 -47
  90. package/up/commands/adicionar-testes.md +0 -145
  91. package/up/commands/ajuda.md +0 -176
  92. package/up/commands/atualizar.md +0 -103
  93. package/up/commands/clone-builder.md +0 -67
  94. package/up/commands/configurar.md +0 -219
  95. package/up/commands/custos.md +0 -67
  96. package/up/commands/dashboard.md +0 -48
  97. package/up/commands/discutir-fase.md +0 -35
  98. package/up/commands/executar-fase.md +0 -40
  99. package/up/commands/ideias.md +0 -49
  100. package/up/commands/iniciar.md +0 -31
  101. package/up/commands/mapear-codigo.md +0 -63
  102. package/up/commands/melhorias.md +0 -45
  103. package/up/commands/mobile-first.md +0 -71
  104. package/up/commands/modo-builder.md +0 -186
  105. package/up/commands/novo-projeto.md +0 -40
  106. package/up/commands/onboard.md +0 -69
  107. package/up/commands/pausar.md +0 -33
  108. package/up/commands/planejar-fase.md +0 -45
  109. package/up/commands/progresso.md +0 -33
  110. package/up/commands/remover-fase.md +0 -34
  111. package/up/commands/resetar.md +0 -27
  112. package/up/commands/retomar.md +0 -35
  113. package/up/commands/saude.md +0 -103
  114. package/up/commands/ux-tester.md +0 -63
  115. package/up/commands/verificar-trabalho.md +0 -35
  116. package/up/workflows/adicionar-fase.md +0 -112
  117. package/up/workflows/builder-e2e.md +0 -501
  118. package/up/workflows/builder.md +0 -3419
  119. package/up/workflows/ceo-intake.md +0 -305
  120. package/up/workflows/ceo-updates.md +0 -183
  121. package/up/workflows/clone-builder.md +0 -320
  122. package/up/workflows/discutir-fase.md +0 -336
  123. package/up/workflows/executar-fase.md +0 -358
  124. package/up/workflows/executar-plano.md +0 -659
  125. package/up/workflows/ideias.md +0 -381
  126. package/up/workflows/iniciar.md +0 -235
  127. package/up/workflows/melhorias.md +0 -409
  128. package/up/workflows/mobile-first.md +0 -692
  129. package/up/workflows/novo-projeto.md +0 -778
  130. package/up/workflows/planejar-fase.md +0 -293
  131. package/up/workflows/progresso.md +0 -226
  132. package/up/workflows/retomar.md +0 -231
  133. package/up/workflows/ux-tester.md +0 -526
  134. package/up/workflows/verificar-trabalho.md +0 -308
package/up/bin/install.js CHANGED
@@ -32,8 +32,14 @@ const dim = '\x1b[2m';
32
32
  const bold = '\x1b[1m';
33
33
  const reset = '\x1b[0m';
34
34
 
35
- // Version from package.json
36
- const pkg = require('../package.json');
35
+ // Version from package.json — try sibling (up/package.json in repo) first,
36
+ // then walk up to find the npm-shipped root package.json.
37
+ let pkg;
38
+ try {
39
+ pkg = require('../package.json');
40
+ } catch {
41
+ pkg = require('../../package.json');
42
+ }
37
43
  const VERSION = pkg.version;
38
44
 
39
45
  // Parse args
@@ -99,6 +105,15 @@ if (hasHelp) {
99
105
  const scriptDir = __dirname;
100
106
  const packageRoot = path.resolve(scriptDir, '..');
101
107
 
108
+ // Known UP skill directory names (namespaced). Only these are installed/removed,
109
+ // so third-party skills under <config>/skills/ are never touched.
110
+ const UP_SKILLS = [
111
+ 'usando-up',
112
+ 'up-brainstorm',
113
+ 'up-tdd',
114
+ 'up-verificar-antes-de-concluir',
115
+ ];
116
+
102
117
  // ── Runtime Helpers ──
103
118
 
104
119
  function getDirName(runtime) {
@@ -378,16 +393,14 @@ function convertCommandToGeminiToml(content) {
378
393
  * Supervisors/auditors/reviewers get read-only.
379
394
  */
380
395
  function getCodexSandboxMode(agentName) {
396
+ // 12 agentes (onda 2 do corte). up-executor roteia frontend/backend/database
397
+ // por contexto; up-tester funde visual + exhaustive + api num spawn multi-pass
398
+ // (precisa de workspace-write pra escrever reports).
381
399
  const writeAgents = [
382
- 'up-frontend-specialist', 'up-backend-specialist', 'up-database-specialist',
383
- 'up-executor', 'up-devops-agent', 'up-technical-writer', 'up-arquiteto',
384
- 'up-system-designer', 'up-roteirista', 'up-sintetizador', 'up-sintetizador-melhorias',
385
- 'up-consolidador-ideias', 'up-clone-crawler', 'up-clone-design-extractor',
386
- 'up-clone-feature-mapper', 'up-clone-prd-writer', 'up-clone-verifier',
387
- 'up-visual-critic', 'up-exhaustive-tester', 'up-api-tester', 'up-qa-agent',
388
- 'up-depurador', 'up-verificador', 'up-blind-validator', 'up-planejador',
389
- 'up-mapeador-codigo', 'up-analista-codigo', 'up-pesquisador-projeto',
390
- 'up-pesquisador-mercado', 'up-product-analyst', 'up-project-ceo',
400
+ 'up-executor', 'up-arquiteto', 'up-roteirista', 'up-sintetizador',
401
+ 'up-tester',
402
+ 'up-depurador', 'up-verificador', 'up-planejador', 'up-mapeador-codigo',
403
+ 'up-pesquisador', 'up-revisor', 'up-auditor',
391
404
  ];
392
405
  return writeAgents.includes(agentName) ? 'workspace-write' : 'read-only';
393
406
  }
@@ -653,6 +666,21 @@ function uninstall(targetDir, runtime) {
653
666
  if (removed > 0) console.log(` ${green}✓${reset} Removed UP agents`);
654
667
  }
655
668
 
669
+ // Remove o bootstrap brainstorm-first do arquivo de instrucoes (non-Claude)
670
+ const bootstrapFile = bootstrapTargetFile(runtime);
671
+ if (bootstrapFile) {
672
+ const bootstrapPath = path.join(targetDir, bootstrapFile);
673
+ if (fs.existsSync(bootstrapPath)) {
674
+ const before = fs.readFileSync(bootstrapPath, 'utf8');
675
+ const after = stripUpBootstrapBlock(before);
676
+ if (after !== before) {
677
+ if (after.trim()) fs.writeFileSync(bootstrapPath, after.trimEnd() + '\n');
678
+ else fs.unlinkSync(bootstrapPath); // o arquivo era so do UP -> remove
679
+ console.log(` ${green}✓${reset} Removed UP bootstrap de ${bootstrapFile}`);
680
+ }
681
+ }
682
+ }
683
+
656
684
  // Remove UP commands (runtime-specific structure)
657
685
  if (runtime === 'codex') {
658
686
  // Codex: skills/up-X folders
@@ -708,6 +736,27 @@ function uninstall(targetDir, runtime) {
708
736
  console.log(` ${green}✓${reset} Removed UP hooks`);
709
737
  }
710
738
 
739
+ // Remove UP skills layer (Claude Code only — only the known UP skill dirs,
740
+ // never third-party skills).
741
+ if (runtime === 'claude') {
742
+ const skillsDir = path.join(targetDir, 'skills');
743
+ if (fs.existsSync(skillsDir)) {
744
+ let skillCount = 0;
745
+ for (const skillName of UP_SKILLS) {
746
+ const skillPath = path.join(skillsDir, skillName);
747
+ if (fs.existsSync(skillPath)) {
748
+ const count = countFiles(skillPath);
749
+ rmDir(skillPath);
750
+ removed += count;
751
+ skillCount++;
752
+ }
753
+ }
754
+ if (skillCount > 0) {
755
+ console.log(` ${green}✓${reset} Removed ${skillCount} UP skills`);
756
+ }
757
+ }
758
+ }
759
+
711
760
  // Clean settings.json references
712
761
  if (runtime === 'claude') {
713
762
  const settingsPath = path.join(targetDir, 'settings.json');
@@ -727,7 +776,20 @@ function uninstall(targetDir, runtime) {
727
776
  return !hooks.some(h => h.command && h.command.includes('up-context-monitor'));
728
777
  });
729
778
  if (settings.hooks.PostToolUse.length === 0) delete settings.hooks.PostToolUse;
730
- if (Object.keys(settings.hooks).length === 0) delete settings.hooks;
779
+ changed = true;
780
+ }
781
+
782
+ if (settings.hooks && settings.hooks.SessionStart) {
783
+ settings.hooks.SessionStart = settings.hooks.SessionStart.filter(entry => {
784
+ const hooks = entry.hooks || [];
785
+ return !hooks.some(h => h.command && h.command.includes('up-session-start'));
786
+ });
787
+ if (settings.hooks.SessionStart.length === 0) delete settings.hooks.SessionStart;
788
+ changed = true;
789
+ }
790
+
791
+ if (settings.hooks && Object.keys(settings.hooks).length === 0) {
792
+ delete settings.hooks;
731
793
  changed = true;
732
794
  }
733
795
 
@@ -748,6 +810,67 @@ function uninstall(targetDir, runtime) {
748
810
 
749
811
  // ── INSTALL ──
750
812
 
813
+ // ── Brainstorm-first bootstrap for non-Claude runtimes ──
814
+ // Claude usa o hook SessionStart + skills. Gemini/OpenCode/Codex nao tem esse mecanismo,
815
+ // entao injetamos a doutrina UP no arquivo de instrucoes global do runtime (sempre carregado).
816
+ const UP_BOOTSTRAP_START = '<!-- UP-BOOTSTRAP:START (gerado por up-cc; nao edite a mao) -->';
817
+ const UP_BOOTSTRAP_END = '<!-- UP-BOOTSTRAP:END -->';
818
+
819
+ function bootstrapTargetFile(runtime) {
820
+ if (runtime === 'gemini') return 'GEMINI.md';
821
+ if (runtime === 'opencode' || runtime === 'codex') return 'AGENTS.md';
822
+ return null;
823
+ }
824
+
825
+ function buildUpBootstrapBlock(runtime, pathPrefix) {
826
+ const cmd = runtime === 'opencode' ? '/up-' : runtime === 'codex' ? '$up-' : '/up:';
827
+ const entry = runtime === 'opencode' ? '/up-up' : runtime === 'codex' ? '$up-up' : '/up:up';
828
+ const skills = toHomePrefix(pathPrefix) + 'up/skills';
829
+ return [
830
+ UP_BOOTSTRAP_START,
831
+ '# UP (up-cc): doutrina sempre-ativa',
832
+ '',
833
+ 'Voce tem o UP instalado. Antes de QUALQUER trabalho de codigo, design ou decisao, siga:',
834
+ '',
835
+ '1. BRAINSTORM-FIRST: explore intencao, requisitos e design ANTES de implementar. Escale por tamanho:',
836
+ ' trivial = 0 perguntas (anuncia e faz); pequena = 1 pergunta; media/grande = brainstorm completo com',
837
+ ' aprovacao por secao. Ref: ' + skills + '/up-brainstorm/SKILL.md',
838
+ '2. LEI DE FERRO (evidencia antes de afirmar): nunca diga "pronto", "funciona" ou "corrigido" sem rodar a',
839
+ ' prova NESTA resposta e confirmar a saida. Ref: ' + skills + '/up-verificar-antes-de-concluir/SKILL.md',
840
+ '3. TDD POR TIPO: logica/parser/bugfix = teste red-green; UI/CSS = prova visual (antes/depois);',
841
+ ' glue/integracao = smoke-test. Ref: ' + skills + '/up-tdd/SKILL.md',
842
+ '4. GitHub-nativo e o padrao no ' + cmd + 'build (worktree -> issue -> PR -> merge); ' + cmd + 'rapido pula a cerimonia.',
843
+ '5. O estado vive em .plano/ e sobrevive a reset de contexto. Persistencia e o coracao do UP.',
844
+ '',
845
+ 'Porta unica: ' + entry + ' "sua ideia". Comandos: ' + cmd + 'up, ' + cmd + 'plan, ' + cmd + 'build, ' + cmd + 'testar, ' + cmd + 'auditar, ' + cmd + 'depurar, ' + cmd + 'rapido.',
846
+ UP_BOOTSTRAP_END,
847
+ ].join('\n');
848
+ }
849
+
850
+ // Remove um bloco UP previo (idempotente). Retorna o conteudo sem o bloco.
851
+ function stripUpBootstrapBlock(content) {
852
+ const startIdx = content.indexOf(UP_BOOTSTRAP_START);
853
+ if (startIdx === -1) return content;
854
+ const endIdx = content.indexOf(UP_BOOTSTRAP_END, startIdx);
855
+ if (endIdx === -1) return content;
856
+ const before = content.slice(0, startIdx).replace(/\n*$/, '');
857
+ const after = content.slice(endIdx + UP_BOOTSTRAP_END.length).replace(/^\n*/, '');
858
+ return (before + (before && after ? '\n\n' : '') + after).trim();
859
+ }
860
+
861
+ function injectBootstrapInstructions(runtime, targetDir, pathPrefix) {
862
+ const fileName = bootstrapTargetFile(runtime);
863
+ if (!fileName) return;
864
+ const filePath = path.join(targetDir, fileName);
865
+ let existing = '';
866
+ if (fs.existsSync(filePath)) existing = fs.readFileSync(filePath, 'utf8');
867
+ existing = stripUpBootstrapBlock(existing); // idempotente: tira o bloco antigo
868
+ const block = buildUpBootstrapBlock(runtime, pathPrefix);
869
+ const next = existing ? existing.trimEnd() + '\n\n' + block + '\n' : block + '\n';
870
+ fs.writeFileSync(filePath, next);
871
+ console.log(` ${green}✓${reset} Brainstorm-first em ${fileName} (bootstrap UP)`);
872
+ }
873
+
751
874
  function install(isGlobal, runtime) {
752
875
  const targetDir = getTargetDir(runtime, isGlobal);
753
876
  const pathPrefix = buildPathPrefix(targetDir, isGlobal, runtime);
@@ -921,6 +1044,7 @@ function install(isGlobal, runtime) {
921
1044
 
922
1045
  const statuslineCmd = `node "${path.join(hooksDest, 'up-statusline.js')}"`;
923
1046
  const contextMonitorCmd = `node "${path.join(hooksDest, 'up-context-monitor.js')}"`;
1047
+ const sessionStartCmd = `node "${path.join(hooksDest, 'up-session-start.js')}"`;
924
1048
 
925
1049
  // Set statusLine
926
1050
  settings.statusLine = { type: 'command', command: statuslineCmd };
@@ -945,13 +1069,51 @@ function install(isGlobal, runtime) {
945
1069
  if (settings.hooks.SessionStart.length === 0) delete settings.hooks.SessionStart;
946
1070
  }
947
1071
 
1072
+ // Set SessionStart hook for the UP skill bootstrap (idempotent).
1073
+ // Fires on startup/clear/compact; the hook itself decides per source.
1074
+ const sessionStartHooks = settings.hooks.SessionStart || [];
1075
+ // Drop any prior UP session-start entries before re-adding (no duplicates)
1076
+ const sessionFiltered = sessionStartHooks.filter(entry => {
1077
+ const hooks = entry.hooks || [];
1078
+ return !hooks.some(h => h.command && h.command.includes('up-session-start'));
1079
+ });
1080
+ sessionFiltered.push({
1081
+ matcher: 'startup|clear|compact',
1082
+ hooks: [{ type: 'command', command: sessionStartCmd }],
1083
+ });
1084
+ settings.hooks.SessionStart = sessionFiltered;
1085
+
948
1086
  // Clean old GSD statusLine reference
949
1087
  if (settings.statusLine && settings.statusLine.command && settings.statusLine.command.includes('gsd-statusline')) {
950
1088
  settings.statusLine = { type: 'command', command: statuslineCmd };
951
1089
  }
952
1090
 
953
1091
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
954
- console.log(` ${green}✓${reset} Configured statusLine and context monitor`);
1092
+ console.log(` ${green}✓${reset} Configured statusLine, context monitor and session-start hook`);
1093
+ }
1094
+ }
1095
+
1096
+ // 4c. Install skills layer (Claude Code discovers skills at <config>/skills/*/SKILL.md)
1097
+ if (runtime === 'claude') {
1098
+ const skillsSrc = path.join(packageRoot, 'skills');
1099
+ if (fs.existsSync(skillsSrc)) {
1100
+ const skillsDest = path.join(targetDir, 'skills');
1101
+ fs.mkdirSync(skillsDest, { recursive: true });
1102
+
1103
+ let skillCount = 0;
1104
+ for (const skillName of UP_SKILLS) {
1105
+ const src = path.join(skillsSrc, skillName);
1106
+ if (fs.existsSync(src) && fs.statSync(src).isDirectory()) {
1107
+ // copyDirWithReplace clears the dest dir first, so existing third-party
1108
+ // skills (other names) are untouched — only this dir is replaced.
1109
+ copyDirWithReplace(src, path.join(skillsDest, skillName), pathPrefix, runtime);
1110
+ skillCount++;
1111
+ }
1112
+ }
1113
+
1114
+ if (skillCount > 0) {
1115
+ console.log(` ${green}✓${reset} Installed ${skillCount} skills`);
1116
+ }
955
1117
  }
956
1118
  }
957
1119
 
@@ -965,9 +1127,13 @@ function install(isGlobal, runtime) {
965
1127
 
966
1128
  // UP needs deeper agent nesting than Codex default (max_depth=1).
967
1129
  // Hierarchy: CEO → Chiefs → Supervisors → Operationals = 4 levels.
968
- // We do an idempotent merge: if [agents] section exists, only add missing keys.
969
1130
  const upMarker = '# UP — added by up-cc installer';
970
- if (!existing.includes(upMarker)) {
1131
+ const hasAgentsSection = /^\[agents\]/m.test(existing);
1132
+ if (existing.includes(upMarker)) {
1133
+ console.log(` ${dim}config.toml already has UP settings — skipped${reset}`);
1134
+ } else if (hasAgentsSection) {
1135
+ console.log(` ${dim}config.toml already has [agents] section — skipped (verify max_depth>=4, max_threads>=8)${reset}`);
1136
+ } else {
971
1137
  const upConfig =
972
1138
  `\n${upMarker}\n` +
973
1139
  `[agents]\n` +
@@ -976,11 +1142,14 @@ function install(isGlobal, runtime) {
976
1142
  `job_max_runtime_seconds = 3600\n`;
977
1143
  fs.writeFileSync(configPath, existing + upConfig);
978
1144
  console.log(` ${green}✓${reset} Configured config.toml ([agents] max_depth=4, max_threads=8)`);
979
- } else {
980
- console.log(` ${dim}config.toml already has UP settings — skipped${reset}`);
981
1145
  }
982
1146
  }
983
1147
 
1148
+ // 4d. Brainstorm-first bootstrap (non-Claude runtimes; Claude usa hook + skills no lugar)
1149
+ if (runtime !== 'claude') {
1150
+ injectBootstrapInstructions(runtime, targetDir, pathPrefix);
1151
+ }
1152
+
984
1153
  // 5. Write VERSION file
985
1154
  const versionDest = path.join(upDest, 'VERSION');
986
1155
  fs.writeFileSync(versionDest, VERSION);
@@ -1002,10 +1171,10 @@ function install(isGlobal, runtime) {
1002
1171
  }
1003
1172
 
1004
1173
  let command;
1005
- if (runtime === 'opencode') command = '/up-ajuda';
1006
- else if (runtime === 'codex') command = '$up-ajuda';
1007
- else command = '/up:ajuda';
1008
- console.log(`\n ${green}Done!${reset} Run ${cyan}${command}${reset} in ${label} to get started.\n`);
1174
+ if (runtime === 'opencode') command = '/up-up';
1175
+ else if (runtime === 'codex') command = '$up-up';
1176
+ else command = '/up:up';
1177
+ console.log(`\n ${green}Done!${reset} Run ${cyan}${command} "sua ideia"${reset} in ${label} to get started.\n`);
1009
1178
  }
1010
1179
 
1011
1180
  // ── INTERACTIVE MODE ──
@@ -86,59 +86,23 @@ const MODEL_PRESETS = {
86
86
  },
87
87
  };
88
88
 
89
- // Map agent names to their model role
89
+ // Map agent names to their model role (12 agentes — onda 2 do corte)
90
90
  const AGENT_ROLE_MAP = {
91
91
  // Planning
92
92
  'up-planejador': 'planning',
93
93
  'up-arquiteto': 'planning',
94
- 'up-product-analyst': 'planning',
95
- 'up-system-designer': 'planning',
96
94
  'up-roteirista': 'planning',
97
- 'up-pesquisador-projeto': 'planning',
98
95
  'up-sintetizador': 'planning',
99
96
  'up-mapeador-codigo': 'planning',
100
- 'up-requirements-validator': 'planning',
101
- // Execution
97
+ 'up-pesquisador': 'planning',
98
+ // Execution (up-executor roteia frontend/backend/database por contexto)
102
99
  'up-executor': 'execution',
103
- 'up-frontend-specialist': 'execution',
104
- 'up-backend-specialist': 'execution',
105
- 'up-database-specialist': 'execution',
106
- 'up-devops-agent': 'execution',
107
- 'up-technical-writer': 'execution',
108
100
  'up-depurador': 'execution',
109
- // Governance (supervisors + chiefs + CEO)
110
- 'up-execution-supervisor': 'governance',
111
- 'up-verification-supervisor': 'governance',
112
- 'up-planning-supervisor': 'governance',
113
- 'up-quality-supervisor': 'governance',
114
- 'up-audit-supervisor': 'governance',
115
- 'up-product-supervisor': 'governance',
116
- 'up-architecture-supervisor': 'governance',
117
- 'up-operations-supervisor': 'governance',
118
- 'up-chief-engineer': 'governance',
119
- 'up-chief-architect': 'governance',
120
- 'up-chief-quality': 'governance',
121
- 'up-chief-operations': 'governance',
122
- 'up-chief-product': 'governance',
123
- 'up-project-ceo': 'governance',
124
- 'up-delivery-auditor': 'governance',
125
- 'up-planning-auditor': 'governance',
126
- // Review & Testing
101
+ // Review & Testing (up-tester funde os 3 detectores DCRV)
127
102
  'up-verificador': 'review',
128
- 'up-blind-validator': 'review',
129
- 'up-code-reviewer': 'review',
130
- 'up-security-reviewer': 'review',
131
- 'up-visual-critic': 'review',
132
- 'up-exhaustive-tester': 'review',
133
- 'up-api-tester': 'review',
134
- 'up-qa-agent': 'review',
135
- 'up-auditor-ux': 'review',
136
- 'up-auditor-performance': 'review',
137
- 'up-auditor-modernidade': 'review',
138
- 'up-sintetizador-melhorias': 'review',
139
- 'up-analista-codigo': 'review',
140
- 'up-pesquisador-mercado': 'review',
141
- 'up-consolidador-ideias': 'review',
103
+ 'up-revisor': 'review',
104
+ 'up-auditor': 'review',
105
+ 'up-tester': 'review',
142
106
  };
143
107
 
144
108
  function loadConfig(cwd) {
@@ -150,6 +114,13 @@ function loadConfig(cwd) {
150
114
  auto_advance: false,
151
115
  instrumentation: { enabled: true },
152
116
  budget_ceiling: null,
117
+ // Fase 4: GitHub-native e o PADRAO. --solo no comando forca github_native=false
118
+ // so na execucao (o build.md le a flag e roteia para o modo solo, sem persistir).
119
+ github_native: true,
120
+ merge_strategy: 'squash',
121
+ // Fim de fase: se a fase tem UI, sobe dev server e exige aprovacao visual ANTES do merge.
122
+ // true por padrao (projeto em producao nao mergeia sem o dono ver na tela). --auto so pula se false.
123
+ require_visual_test: true,
153
124
  };
154
125
 
155
126
  try {
@@ -164,6 +135,9 @@ function loadConfig(cwd) {
164
135
  modelos: parsed.modelos ?? null,
165
136
  instrumentation: parsed.instrumentation ?? defaults.instrumentation,
166
137
  budget_ceiling: parsed.budget_ceiling ?? defaults.budget_ceiling,
138
+ github_native: parsed.github_native ?? defaults.github_native,
139
+ merge_strategy: parsed.merge_strategy ?? defaults.merge_strategy,
140
+ require_visual_test: parsed.require_visual_test ?? defaults.require_visual_test,
167
141
  };
168
142
  } catch {
169
143
  return defaults;