@polymorphism-tech/morph-spec 9.2.0 → 9.3.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 (53) hide show
  1. package/CLAUDE.md +14 -78
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +7 -0
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +1 -1
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/CLAUDE.md +3 -3
  8. package/framework/MORPH.md +5 -8
  9. package/framework/agents.json +9 -6
  10. package/framework/commands/morph-status.md +2 -2
  11. package/framework/docs/CLI.md +8 -2
  12. package/framework/evals/review-checklist.md +3 -0
  13. package/framework/hooks/claude-code/__pycache__/statusline.cpython-313.pyc +0 -0
  14. package/framework/hooks/claude-code/core/worktree-context.js +23 -0
  15. package/framework/hooks/claude-code/statusline.py +3 -2
  16. package/framework/hooks/shared/gate-event.js +18 -0
  17. package/framework/hooks/shared/next-step.js +107 -0
  18. package/framework/hooks/shared/slice-progress.js +18 -5
  19. package/framework/hooks/shared/state-writer.js +6 -1
  20. package/framework/mcp/registry.json +31 -1
  21. package/framework/schemas/feature.schema.json +1 -0
  22. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  23. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  24. package/framework/skills/core/morph-apply/SKILL.md +4 -2
  25. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  26. package/framework/skills/core/morph-machine/SKILL.md +1 -1
  27. package/framework/skills/core/morph-media/SKILL.md +1 -1
  28. package/framework/skills/core/morph-plan/SKILL.md +1 -1
  29. package/framework/skills/core/morph-review/SKILL.md +1 -1
  30. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  31. package/framework/skills/core/morph-uiux/SKILL.md +2 -1
  32. package/framework/standards/STANDARDS.meta.json +1 -1
  33. package/framework/standards/ai-agents/setup.md +2 -0
  34. package/framework/standards/integration/mcp/mcp-tools.md +3 -1
  35. package/package.json +1 -1
  36. package/src/commands/observability/cost.js +12 -0
  37. package/src/commands/project/status.js +6 -68
  38. package/src/commands/state/advance.js +1 -1
  39. package/src/commands/state/gate-check.js +2 -2
  40. package/src/commands/state/gate-decision.js +4 -1
  41. package/src/commands/state/next.js +24 -0
  42. package/src/commands/state/report-check.js +3 -1
  43. package/src/commands/validation/verify.js +6 -1
  44. package/src/core/state/state-manager.js +4 -0
  45. package/src/dashboard/app/pages/FeatureDetail.jsx +6 -2
  46. package/src/dashboard/scanner/features-scanner.js +5 -2
  47. package/src/lib/generators/handoff-generator.js +11 -25
  48. package/src/lib/next-step.js +10 -0
  49. package/src/lib/risk-detector.js +18 -7
  50. package/src/lib/stack/stack-scan.js +13 -1
  51. package/src/lib/telemetry/metrics.js +46 -0
  52. package/src/lib/validators/verify-runner.js +1 -1
  53. package/src/utils/agents-installer.js +23 -0
@@ -2,6 +2,7 @@ import { readFileSync, existsSync, readdirSync } from 'node:fs';
2
2
  import { join } from 'path';
3
3
  import { shouldInstall } from '../lib/stack-filter.js';
4
4
  import { realEffects } from '../lib/installers/effects.js';
5
+ import { REVIEW_ROLES, VERDICT_TOKEN, REVIEWED_SHA_TOKEN, VERDICTS } from '../lib/review-reports.js';
5
6
 
6
7
  export const DEFAULT_AGENT_TOOLS = 'Read, Write, Edit, Bash, Glob, Grep';
7
8
 
@@ -300,6 +301,8 @@ export const DISPATCH_CONTRACT = [
300
301
  '`git checkout --`). A prova de que o teste morde é do verificador (Gate 3).',
301
302
  '9. ESCRITA: código e teste do projeto só por Write/Edit, nunca pelo Bash — heredoc, redirecionamento, `sed -i` ou script python/node que grava (`cat > X.cs <<EOF`, `sed -i … X.cs`): ' +
302
303
  'os guards de escrita só enxergam Write/Edit.',
304
+ '10. BLOQUEIO: decisão que não é sua (requisito contra o plano ou um ADR, escolha deixada ao humano) → `BLOQUEADO` na 1ª linha, ' +
305
+ 'com a pergunta e as opções. Dificuldade técnica não é bloqueio.',
303
306
  '',
304
307
  'Formato do relatório (o `report-check` lê estas marcas):',
305
308
  '',
@@ -317,6 +320,25 @@ export const DISPATCH_CONTRACT = [
317
320
  'Problemas e como foram resolvidos vão em prosa depois.',
318
321
  ];
319
322
 
323
+ export const REVIEW_REPORT_CONTRACT = [
324
+ '## Relatório do Gate 3',
325
+ '',
326
+ 'Grave o relatório que o dispatch nomeia ANTES de encerrar — o arquivo é o retorno, não a mensagem final. ' +
327
+ 'Se ele já existir quando você começar, é resíduo de outra rodada: não o leia antes de escrever o seu (ancoragem no veredito alheio), ' +
328
+ 'e não leia os relatórios dos outros papéis.',
329
+ '',
330
+ `Primeira linha \`${VERDICT_TOKEN} ${VERDICTS.join('|')}\`, depois \`${REVIEWED_SHA_TOKEN} {sha}\`, ` +
331
+ 'tabela `## Bloqueadores` (`| id | tipo | onde | evidência |`; vazia = `Nenhum.`) e `## Notas`. ' +
332
+ 'Bloqueador só com evidência e tipo; o resto é nota, e nota nunca pede rodada nova.',
333
+ '',
334
+ 'Numa confirmação (o orquestrador te retoma depois da correção, com o `sha` novo) acrescente ao fim uma seção nova com ' +
335
+ `\`${VERDICT_TOKEN}\` e \`${REVIEWED_SHA_TOKEN} {sha novo}\`: se você abriu bloqueadores, julgue só eles; ` +
336
+ 'se não abriu, julgue só o delta `{sha anterior}..{sha novo}` — o que a correção abriu. ' +
337
+ 'O relatório é append-only: vale o último veredito e, na `## Checks`, a última linha de cada Cn.',
338
+ '',
339
+ 'Um comando por chamada de Bash, sem encadear (`;`, `&&`, pipe): o composto é negado e custa a rodada.',
340
+ ];
341
+
320
342
  function buildBody(agent, maxTurns) {
321
343
  const lines = [
322
344
  `# ${agent.title ?? agent.id}`,
@@ -374,6 +396,7 @@ function buildBody(agent, maxTurns) {
374
396
  'O entregável é o arquivo de relatório que o dispatch nomeia; sem arquivo nomeado, é a sua mensagem final (no scout, o mapa).',
375
397
  '',
376
398
  );
399
+ if (Object.hasOwn(REVIEW_ROLES, agent.id)) lines.push(...REVIEW_REPORT_CONTRACT, '');
377
400
  }
378
401
 
379
402
  lines.push(