@orkastery/cli 0.2.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 (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/adapters/README.md +22 -0
  4. package/adapters/claude-code/.claude-plugin/marketplace.json +15 -0
  5. package/adapters/claude-code/.claude-plugin/plugin.json +31 -0
  6. package/adapters/claude-code/README.md +102 -0
  7. package/adapters/claude-code/agents/ork-check.md +32 -0
  8. package/adapters/claude-code/agents/ork-go.md +32 -0
  9. package/adapters/claude-code/agents/ork-goal.md +33 -0
  10. package/adapters/claude-code/agents/ork-master.md +32 -0
  11. package/adapters/claude-code/agents/ork-plan.md +32 -0
  12. package/adapters/claude-code/agents/ork-ship.md +32 -0
  13. package/adapters/claude-code/commands/check.md +45 -0
  14. package/adapters/claude-code/commands/go.md +46 -0
  15. package/adapters/claude-code/commands/goal.md +54 -0
  16. package/adapters/claude-code/commands/master.md +42 -0
  17. package/adapters/claude-code/commands/ork.md +37 -0
  18. package/adapters/claude-code/commands/plan.md +47 -0
  19. package/adapters/claude-code/commands/ship.md +45 -0
  20. package/adapters/claude-code/hooks/hooks.json +17 -0
  21. package/adapters/claude-code/hooks/ork-guard.js +130 -0
  22. package/adapters/hermes/README.md +45 -0
  23. package/adapters/hermes/bin/ork-abrir-thread.sh +25 -0
  24. package/adapters/hermes/hermes.plugin.json +21 -0
  25. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +116 -0
  26. package/adapters/openclaw/README.md +63 -0
  27. package/adapters/openclaw/bin/ork-abrir-thread.sh +24 -0
  28. package/adapters/openclaw/openclaw.plugin.json +138 -0
  29. package/dist/adapters/claude-bg.js +308 -0
  30. package/dist/auditoria.js +848 -0
  31. package/dist/auditrun.js +976 -0
  32. package/dist/board.js +314 -0
  33. package/dist/canarios.js +271 -0
  34. package/dist/catalogo.js +124 -0
  35. package/dist/ciclos.js +156 -0
  36. package/dist/claims.js +226 -0
  37. package/dist/divida.js +374 -0
  38. package/dist/doctor.js +246 -0
  39. package/dist/evalrunner.js +458 -0
  40. package/dist/fix.js +450 -0
  41. package/dist/gates.js +92 -0
  42. package/dist/handoff.js +521 -0
  43. package/dist/hosts.js +331 -0
  44. package/dist/index.js +1910 -0
  45. package/dist/init.js +231 -0
  46. package/dist/leases.js +508 -0
  47. package/dist/ledger.js +138 -0
  48. package/dist/manifest.js +255 -0
  49. package/dist/master.js +453 -0
  50. package/dist/memoria.js +773 -0
  51. package/dist/modos.js +220 -0
  52. package/dist/orkmind.js +487 -0
  53. package/dist/orquestracao.js +559 -0
  54. package/dist/phase.js +572 -0
  55. package/dist/policies.js +176 -0
  56. package/dist/prompts.js +406 -0
  57. package/dist/ratelimit.js +179 -0
  58. package/dist/recall.js +252 -0
  59. package/dist/retry.js +917 -0
  60. package/dist/sandbox.js +94 -0
  61. package/dist/sessoes.js +104 -0
  62. package/dist/ship.js +551 -0
  63. package/dist/slug.js +100 -0
  64. package/dist/superficie.js +1347 -0
  65. package/dist/thread.js +333 -0
  66. package/dist/tokens.js +228 -0
  67. package/dist/types.js +20 -0
  68. package/dist/util.js +156 -0
  69. package/dist/verify.js +262 -0
  70. package/dist/worktree.js +576 -0
  71. package/dist/yaml.js +112 -0
  72. package/eval/README.md +85 -0
  73. package/eval/casos/check-quality.json +103 -0
  74. package/eval/casos/code-reviewer.json +102 -0
  75. package/eval/casos/decision-triage.json +103 -0
  76. package/eval/casos/go-implementation.json +103 -0
  77. package/eval/casos/goal-definition.json +103 -0
  78. package/eval/casos/master-metrics.json +103 -0
  79. package/eval/casos/narrative-guardian.json +163 -0
  80. package/eval/casos/orkastery-bootstrap.json +102 -0
  81. package/eval/casos/plan-specification.json +102 -0
  82. package/eval/casos/roadmap-keeper.json +103 -0
  83. package/eval/casos/scope-check-capability-map.json +83 -0
  84. package/eval/casos/security-auditor.json +102 -0
  85. package/eval/casos/ship-release.json +122 -0
  86. package/eval/casos/test-engineer.json +122 -0
  87. package/eval/casos/thread-state.json +82 -0
  88. package/eval/casos/thread-tracing.json +83 -0
  89. package/eval/casos/web-performance-auditor.json +102 -0
  90. package/eval/fixtures/b0-slug-e-modos/caso.json +56 -0
  91. package/eval/fixtures/b2-master-log/caso.json +91 -0
  92. package/eval/fixtures/fx-concurrency/caso.json +15 -0
  93. package/eval/fixtures/fx-hallucination/caso.json +12 -0
  94. package/eval/fixtures/fx-happy/caso.json +16 -0
  95. package/eval/fixtures/fx-schema-drift/caso.json +15 -0
  96. package/eval/fixtures/fx-stale-base/caso.json +12 -0
  97. package/eval/fixtures/fx-wiki-destroy/caso.json +16 -0
  98. package/eval/fixtures/superficie-de-rede/README.md +22 -0
  99. package/eval/fixtures/superficie-de-rede/api-express.js +30 -0
  100. package/eval/fixtures/superficie-de-rede/api_fastapi.py +17 -0
  101. package/eval/fixtures/superficie-de-rede/api_gin.go +18 -0
  102. package/package.json +56 -0
  103. package/references/README.md +25 -0
  104. package/references/code-review-axes.md +82 -0
  105. package/references/definition-of-done.md +74 -0
  106. package/references/performance-checklist.md +53 -0
  107. package/references/security-checklist.md +101 -0
  108. package/references/testing-patterns.md +51 -0
  109. package/skills/README.md +43 -0
  110. package/skills/core/orkastery-bootstrap/SKILL.md +89 -0
  111. package/skills/core/thread-state/SKILL.md +86 -0
  112. package/skills/governance/decision-triage/SKILL.md +65 -0
  113. package/skills/governance/narrative-guardian/SKILL.md +66 -0
  114. package/skills/governance/roadmap-keeper/SKILL.md +60 -0
  115. package/skills/governance/scope-check-capability-map/SKILL.md +61 -0
  116. package/skills/observability/thread-tracing/SKILL.md +63 -0
  117. package/skills/phases/check-quality/SKILL.md +87 -0
  118. package/skills/phases/go-implementation/SKILL.md +70 -0
  119. package/skills/phases/goal-definition/SKILL.md +69 -0
  120. package/skills/phases/master-metrics/SKILL.md +65 -0
  121. package/skills/phases/plan-specification/SKILL.md +67 -0
  122. package/skills/phases/ship-release/SKILL.md +68 -0
  123. package/skills/reviewers/code-reviewer/SKILL.md +61 -0
  124. package/skills/reviewers/security-auditor/SKILL.md +68 -0
  125. package/skills/reviewers/test-engineer/SKILL.md +66 -0
  126. package/skills/reviewers/web-performance-auditor/SKILL.md +63 -0
package/dist/modos.js ADDED
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /**
3
+ * Modos de conducao por #TAG (visao unificada, secao 3.5).
4
+ *
5
+ * Regra central, nao negociavel: o modo afrouxa a PAUSA, nunca a VERIFICACAO.
6
+ * Claims, verify, policies e gates tipados rodam identicos em todos os modos;
7
+ * o que muda e se o veredito espera o humano ou segue sozinho com registro no ledger.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TAG_DE_MODO_DESCONHECIDO = exports.ORDEM_DOS_MODOS = exports.MODOS = exports.INVARIANTES = void 0;
11
+ exports.slugDasFases = slugDasFases;
12
+ exports.parseModo = parseModo;
13
+ exports.extrairTagDoPedido = extrairTagDoPedido;
14
+ exports.tagDoModo = tagDoModo;
15
+ exports.definicaoDoModo = definicaoDoModo;
16
+ exports.pausasDoModo = pausasDoModo;
17
+ exports.blocoDaFase = blocoDaFase;
18
+ exports.fasePausa = fasePausa;
19
+ exports.tabelaDeModos = tabelaDeModos;
20
+ const types_1 = require("./types");
21
+ /** Invariantes que valem em TODOS os modos, inclusive `#Auto`. */
22
+ exports.INVARIANTES = [
23
+ 'Claims, verify e policies rodam identicos em todos os modos.',
24
+ 'Policy `block` pausa qualquer modo, inclusive #Auto.',
25
+ 'Escalacao tipada para humano pausa qualquer modo, inclusive #Auto.',
26
+ 'Um score humano por entrega sempre; nos modos sem pausa de MASTER ele vai para a fila de batch.',
27
+ 'Toda decisao autonoma vai ao ledger com quem decidiu, evidencia e razao.',
28
+ ];
29
+ /** Monta a parte 3 do slug para um conjunto de fases (visao, secao 3.4). */
30
+ function slugDasFases(fases) {
31
+ if (fases.length === 0)
32
+ throw new Error('bloco de loop sem fases');
33
+ if (fases.length === types_1.FASES.length)
34
+ return 'full';
35
+ if (fases.length === 1)
36
+ return fases[0].toLowerCase();
37
+ return 'f' + fases.map((f) => types_1.DIGITO_DA_FASE[f]).join('');
38
+ }
39
+ function bloco(fases, pausaSobre) {
40
+ return {
41
+ fases,
42
+ pausa: pausaSobre.length > 0,
43
+ pausaSobre,
44
+ slugFases: slugDasFases(fases),
45
+ };
46
+ }
47
+ const SEM_PAUSA = '';
48
+ /** A matriz dos 5 modos, do mais HITL ao mais autonomo. */
49
+ exports.MODOS = {
50
+ look: {
51
+ modo: 'look',
52
+ tag: '#Look',
53
+ blocos: [
54
+ bloco(['GOAL'], 'objetivo'),
55
+ bloco(['PLAN'], 'plano'),
56
+ bloco(['GO'], 'implementacao'),
57
+ bloco(['CHECK'], 'evidencias'),
58
+ bloco(['SHIP'], 'push'),
59
+ bloco(['MASTER'], 'score'),
60
+ ],
61
+ pausas: 6,
62
+ recomendadoPara: 'Risco alto, passos irreversiveis, dominio novo, produto com usuarios reais',
63
+ },
64
+ ork: {
65
+ modo: 'ork',
66
+ tag: '#Ork',
67
+ blocos: [
68
+ bloco(['GOAL', 'PLAN'], 'premissas'),
69
+ bloco(['GO'], 'implementacao'),
70
+ bloco(['CHECK'], 'evidencias'),
71
+ bloco(['SHIP'], 'push'),
72
+ bloco(['MASTER'], 'score'),
73
+ ],
74
+ pausas: 5,
75
+ recomendadoPara: 'Demandas de produto que pedem veredito separado da execucao e da evidencia',
76
+ },
77
+ classic: {
78
+ modo: 'classic',
79
+ tag: '#Classic',
80
+ blocos: [
81
+ bloco(['GOAL'], 'objetivo'),
82
+ bloco(['PLAN'], 'plano'),
83
+ bloco(['GO', 'CHECK'], 'evidencias, com autorizacao antecipada de push'),
84
+ bloco(['SHIP', 'MASTER'], SEM_PAUSA),
85
+ ],
86
+ pausas: 3,
87
+ recomendadoPara: 'O padrao: premissas delicadas com entrega confiavel; score em batch',
88
+ },
89
+ maestro: {
90
+ modo: 'maestro',
91
+ tag: '#Maestro',
92
+ blocos: [
93
+ bloco(['GOAL', 'PLAN'], 'premissas'),
94
+ bloco(['GO', 'CHECK', 'SHIP'], SEM_PAUSA),
95
+ bloco(['MASTER'], SEM_PAUSA),
96
+ ],
97
+ pausas: 1,
98
+ recomendadoPara: 'Solucoes claras e ageis, sem muitos riscos ou tradeoffs; score em batch',
99
+ },
100
+ auto: {
101
+ modo: 'auto',
102
+ tag: '#Auto',
103
+ blocos: [bloco([...types_1.FASES], SEM_PAUSA)],
104
+ pausas: 0,
105
+ recomendadoPara: 'Solucoes menores, docs, estudos, pesquisas, configuracoes, auditorias, migracoes',
106
+ },
107
+ };
108
+ /** Todos os modos na ordem do espectro, do mais HITL ao mais autonomo. */
109
+ exports.ORDEM_DOS_MODOS = ['look', 'ork', 'classic', 'maestro', 'auto'];
110
+ /**
111
+ * Parseia a #TAG de modo de conducao.
112
+ * Aceita `#Auto`, `auto`, `--modo auto`, com ou sem caixa. Retorna null se nao reconhecer.
113
+ */
114
+ function parseModo(entrada) {
115
+ if (!entrada)
116
+ return null;
117
+ const limpo = entrada.trim().replace(/^--?modo[= ]/i, '').replace(/^#/, '').toLowerCase();
118
+ return exports.ORDEM_DOS_MODOS.includes(limpo) ? limpo : null;
119
+ }
120
+ /**
121
+ * Extrai a primeira #TAG de modo presente no texto livre de um pedido do builder.
122
+ * E o caminho usado pelos adaptadores de host antes de chamar `ork thread new --modo`.
123
+ */
124
+ function extrairTagDoPedido(texto) {
125
+ const achadas = texto.match(/#(look|ork|classic|maestro|auto)\b/gi);
126
+ if (!achadas || achadas.length === 0)
127
+ return null;
128
+ return parseModo(achadas[0]);
129
+ }
130
+ /** Tag mostrada quando a thread em disco nao traz um modo reconhecido. */
131
+ exports.TAG_DE_MODO_DESCONHECIDO = '#?';
132
+ /**
133
+ * Tag do modo para EXIBICAO, tolerante ao que esta de fato gravado em disco.
134
+ *
135
+ * `thread.json` e arquivo, nao tipo: uma thread criada por versao antiga, por outro
136
+ * perfil de board ou editada a mao pode trazer um `modo` que nao existe na matriz
137
+ * (ou nao trazer nenhum). Todo `MODOS[thread.modo].tag` nesses casos estourava com
138
+ * "Cannot read properties of undefined (reading 'tag')" e derrubava o comando INTEIRO,
139
+ * inclusive `ork board`, `ork thread list` e `ork orquestracao status`.
140
+ *
141
+ * A regra aqui e nunca lancar: um comando que so LE o board tem de conseguir mostrar
142
+ * a thread torta, que e justamente a que o humano precisa ver para consertar. A tag
143
+ * de fallback carrega o valor cru (`#?default`) para dizer o que arrumar.
144
+ *
145
+ * Isto NAO afrouxa a conducao: quem VALIDA modo (criar thread, checar manifesto)
146
+ * continua usando `definicaoDoModo`, que lanca. Aqui so se decide o que imprimir.
147
+ */
148
+ function tagDoModo(modo) {
149
+ if (typeof modo === 'string') {
150
+ const def = exports.MODOS[modo];
151
+ if (def)
152
+ return def.tag;
153
+ const cru = modo.trim();
154
+ if (cru.length > 0)
155
+ return `${exports.TAG_DE_MODO_DESCONHECIDO}${cru.slice(0, 16)}`;
156
+ }
157
+ return exports.TAG_DE_MODO_DESCONHECIDO;
158
+ }
159
+ /** Definicao de um modo, com erro tipado quando o modo nao existe. */
160
+ function definicaoDoModo(modo) {
161
+ const def = exports.MODOS[modo];
162
+ if (!def)
163
+ throw new Error(`modo de conducao desconhecido: ${modo}`);
164
+ return def;
165
+ }
166
+ /** Numero de pausas humanas do modo, derivado dos blocos (nunca hardcoded no consumo). */
167
+ function pausasDoModo(modo) {
168
+ return definicaoDoModo(modo).blocos.filter((b) => b.pausa).length;
169
+ }
170
+ /** O bloco de loop que conduz a fase informada dentro do modo. */
171
+ function blocoDaFase(modo, fase) {
172
+ const def = definicaoDoModo(modo);
173
+ const achado = def.blocos.find((b) => b.fases.includes(fase));
174
+ if (!achado)
175
+ throw new Error(`fase ${fase} nao pertence a nenhum bloco do modo ${modo}`);
176
+ return achado;
177
+ }
178
+ /** A fase pausa para o humano ao fechar seu bloco? */
179
+ function fasePausa(modo, fase) {
180
+ const b = blocoDaFase(modo, fase);
181
+ return b.pausa && b.fases[b.fases.length - 1] === fase;
182
+ }
183
+ /** Tabela dos 5 modos em texto, usada por `ork modos`. */
184
+ function tabelaDeModos() {
185
+ const linhas = [];
186
+ linhas.push('Modos de conducao (a #TAG vai no proprio pedido ao orquestrador)');
187
+ linhas.push('');
188
+ const cab = ['#TAG'.padEnd(10), 'BLOCOS'.padEnd(6), 'PAUSAS'.padEnd(7), 'CICLO'];
189
+ linhas.push(' ' + cab.join(' '));
190
+ linhas.push(' ' + '-'.repeat(78));
191
+ for (const modo of exports.ORDEM_DOS_MODOS) {
192
+ const def = exports.MODOS[modo];
193
+ const ciclo = def.blocos
194
+ .map((b) => b.fases.join('-') + (b.pausa ? ' *' : ''))
195
+ .join(' / ');
196
+ linhas.push(' ' +
197
+ [
198
+ def.tag.padEnd(10),
199
+ String(def.blocos.length).padEnd(6),
200
+ String(pausasDoModo(modo)).padEnd(7),
201
+ ciclo,
202
+ ].join(' '));
203
+ }
204
+ linhas.push(' ' + '-'.repeat(78));
205
+ linhas.push(' * = bloco que pausa e espera veredito humano');
206
+ linhas.push('');
207
+ linhas.push('Detalhe por modo:');
208
+ for (const modo of exports.ORDEM_DOS_MODOS) {
209
+ const def = exports.MODOS[modo];
210
+ const pausas = def.blocos.filter((b) => b.pausa).map((b) => b.pausaSobre);
211
+ linhas.push(` ${def.tag.padEnd(10)} slug das sessoes: ${def.blocos.map((b) => b.slugFases).join(', ')}`);
212
+ linhas.push(` pausas: ${pausas.length > 0 ? pausas.join(', ') : 'nenhuma'}`);
213
+ linhas.push(` uso: ${def.recomendadoPara}`);
214
+ }
215
+ linhas.push('');
216
+ linhas.push('REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.');
217
+ for (const inv of exports.INVARIANTES)
218
+ linhas.push(' - ' + inv);
219
+ return linhas.join('\n');
220
+ }