@polymorphism-tech/morph-spec 4.9.0 → 4.10.1

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 (164) hide show
  1. package/README.md +2 -2
  2. package/bin/morph-spec.js +30 -0
  3. package/bin/task-manager.js +34 -22
  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 +35 -98
  8. package/framework/agents/backend/api-designer.md +3 -0
  9. package/framework/agents/backend/dotnet-senior.md +3 -0
  10. package/framework/agents/backend/ef-modeler.md +2 -0
  11. package/framework/agents/backend/hangfire-orchestrator.md +2 -0
  12. package/framework/agents/backend/ms-agent-expert.md +2 -0
  13. package/framework/agents/frontend/blazor-builder.md +2 -0
  14. package/framework/agents/frontend/nextjs-expert.md +2 -0
  15. package/framework/agents/infrastructure/azure-architect.md +2 -0
  16. package/framework/agents/infrastructure/azure-deploy-specialist.md +2 -0
  17. package/framework/agents/infrastructure/bicep-architect.md +2 -0
  18. package/framework/agents/infrastructure/container-specialist.md +2 -0
  19. package/framework/agents/infrastructure/devops-engineer.md +3 -0
  20. package/framework/agents/infrastructure/infra-architect.md +3 -0
  21. package/framework/agents/integrations/asaas-financial.md +2 -0
  22. package/framework/agents/integrations/azure-identity.md +2 -0
  23. package/framework/agents/integrations/clerk-auth.md +3 -0
  24. package/framework/agents/integrations/hangfire-integration.md +2 -0
  25. package/framework/agents/integrations/resend-email.md +2 -0
  26. package/framework/agents.json +37 -7
  27. package/framework/commands/commit.md +166 -0
  28. package/framework/commands/morph-apply.md +156 -155
  29. package/framework/commands/morph-archive.md +33 -27
  30. package/framework/commands/morph-infra.md +83 -77
  31. package/framework/commands/morph-preflight.md +97 -55
  32. package/framework/commands/morph-proposal.md +131 -58
  33. package/framework/commands/morph-status.md +36 -30
  34. package/framework/commands/morph-troubleshoot.md +68 -59
  35. package/framework/hooks/claude-code/notification/approval-reminder.js +3 -2
  36. package/framework/hooks/claude-code/post-tool-use/dispatch.js +154 -31
  37. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +7 -84
  38. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +8 -17
  39. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +16 -3
  40. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +4 -3
  41. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +3 -2
  42. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +60 -0
  43. package/framework/hooks/claude-code/session-start/inject-morph-context.js +55 -2
  44. package/framework/hooks/claude-code/session-start/post-compact-restore.js +41 -0
  45. package/framework/hooks/claude-code/stop/validate-completion.js +2 -15
  46. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +23 -5
  47. package/framework/hooks/shared/compact-restore.js +100 -0
  48. package/framework/hooks/shared/dispatch-helpers.js +116 -0
  49. package/framework/hooks/shared/phase-utils.js +9 -5
  50. package/framework/hooks/shared/state-reader.js +27 -3
  51. package/framework/phases.json +30 -7
  52. package/framework/rules/csharp-standards.md +3 -0
  53. package/framework/rules/frontend-standards.md +2 -0
  54. package/framework/rules/infrastructure-standards.md +3 -0
  55. package/framework/rules/morph-workflow.md +143 -86
  56. package/framework/rules/nextjs-standards.md +2 -0
  57. package/framework/rules/testing-standards.md +3 -0
  58. package/framework/skills/level-0-meta/mcp-registry.json +86 -51
  59. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +139 -0
  60. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +42 -19
  61. package/framework/skills/level-0-meta/{code-review → morph-code-review}/SKILL.md +8 -5
  62. package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/SKILL.md +8 -6
  63. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +362 -0
  64. package/framework/skills/level-0-meta/morph-init/SKILL.md +114 -20
  65. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +362 -0
  66. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +95 -87
  67. package/framework/skills/level-0-meta/{simulation-checklist → morph-simulation-checklist}/SKILL.md +24 -0
  68. package/framework/skills/level-0-meta/{tool-usage-guide → morph-tool-usage-guide}/SKILL.md +43 -43
  69. package/framework/skills/level-0-meta/{tool-usage-guide → morph-tool-usage-guide}/references/tools-per-phase.md +1 -2
  70. package/framework/skills/level-0-meta/{verification-before-completion → morph-verification-before-completion}/SKILL.md +23 -12
  71. package/framework/skills/level-0-meta/{verification-before-completion → morph-verification-before-completion}/scripts/check-phase-outputs.mjs +2 -2
  72. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -0
  73. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -0
  74. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +499 -0
  75. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
  76. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +472 -0
  77. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +50 -0
  78. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +45 -0
  79. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +47 -0
  80. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +246 -0
  81. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +238 -0
  82. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
  83. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +312 -0
  84. package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/scripts/validate-tasks.mjs +3 -3
  85. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +324 -0
  86. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +146 -0
  87. package/framework/standards/integration/mcp/mcp-tools.md +25 -7
  88. package/framework/templates/docs/onboarding.md +2 -2
  89. package/package.json +3 -4
  90. package/src/commands/agents/dispatch-agents.js +50 -3
  91. package/src/commands/mcp/mcp-setup.js +39 -2
  92. package/src/commands/phase/phase-reset.js +74 -0
  93. package/src/commands/project/doctor.js +26 -7
  94. package/src/commands/project/update.js +4 -4
  95. package/src/commands/scope/escalate.js +215 -0
  96. package/src/commands/state/advance-phase.js +27 -53
  97. package/src/commands/state/state.js +1 -1
  98. package/src/commands/task/expand.js +100 -0
  99. package/src/core/paths/output-schema.js +4 -3
  100. package/src/core/state/phase-state-machine.js +7 -4
  101. package/src/core/state/state-manager.js +4 -3
  102. package/src/lib/detectors/claude-config-detector.js +93 -347
  103. package/src/lib/detectors/design-system-detector.js +189 -189
  104. package/src/lib/detectors/index.js +155 -57
  105. package/src/lib/generators/context-generator.js +2 -2
  106. package/src/lib/installers/mcp-installer.js +37 -5
  107. package/src/lib/phase-chain/phase-validator.js +22 -16
  108. package/src/lib/scope/impact-analyzer.js +106 -0
  109. package/src/lib/stack-filter.js +58 -0
  110. package/src/lib/tasks/task-parser.js +1 -1
  111. package/src/lib/validators/shared/emit-validator-dispatch.js +64 -0
  112. package/src/scripts/setup-infra.js +68 -18
  113. package/src/utils/agents-installer.js +51 -17
  114. package/src/utils/claude-md-injector.js +90 -0
  115. package/src/utils/file-copier.js +0 -1
  116. package/src/utils/hooks-installer.js +16 -5
  117. package/src/utils/skills-installer.js +67 -7
  118. package/CLAUDE.md +0 -98
  119. package/framework/memory/patterns-learned.md +0 -766
  120. package/framework/skills/level-0-meta/brainstorming/SKILL.md +0 -137
  121. package/framework/skills/level-0-meta/frontend-review/SKILL.md +0 -359
  122. package/framework/skills/level-0-meta/post-implementation/SKILL.md +0 -362
  123. package/framework/skills/level-0-meta/terminal-title/SKILL.md +0 -61
  124. package/framework/skills/level-0-meta/terminal-title/scripts/set_title.sh +0 -65
  125. package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +0 -216
  126. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +0 -252
  127. package/framework/skills/level-1-workflows/phase-design/SKILL.md +0 -383
  128. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +0 -492
  129. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +0 -195
  130. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +0 -271
  131. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +0 -286
  132. package/src/commands/project/index.js +0 -8
  133. package/src/core/index.js +0 -10
  134. package/src/core/state/index.js +0 -8
  135. package/src/core/templates/index.js +0 -9
  136. package/src/core/templates/template-data-sources.js +0 -325
  137. package/src/core/workflows/index.js +0 -7
  138. package/src/lib/detectors/config-detector.js +0 -223
  139. package/src/lib/detectors/standards-generator.js +0 -335
  140. package/src/lib/detectors/structure-detector.js +0 -275
  141. package/src/lib/monitor/agent-resolver.js +0 -144
  142. package/src/lib/monitor/renderer.js +0 -230
  143. package/src/lib/orchestration/index.js +0 -7
  144. package/src/lib/orchestration/team-orchestrator.js +0 -404
  145. package/src/sanitizer/context-sanitizer.js +0 -221
  146. package/src/sanitizer/patterns.js +0 -163
  147. package/src/writer/file-writer.js +0 -86
  148. /package/framework/skills/level-0-meta/{brainstorming → morph-brainstorming}/references/proposal-example.md +0 -0
  149. /package/framework/skills/level-0-meta/{code-review → morph-code-review}/references/review-example.md +0 -0
  150. /package/framework/skills/level-0-meta/{code-review → morph-code-review}/references/review-guidelines.md +0 -0
  151. /package/framework/skills/level-0-meta/{code-review → morph-code-review}/scripts/scan-csharp.mjs +0 -0
  152. /package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/references/review-example-nextjs.md +0 -0
  153. /package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/scripts/scan-nextjs.mjs +0 -0
  154. /package/framework/skills/level-0-meta/{frontend-review → morph-frontend-review}/scripts/scan-accessibility.mjs +0 -0
  155. /package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/scripts/detect-dev-server.mjs +0 -0
  156. /package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/scripts/detect-stack.mjs +0 -0
  157. /package/framework/skills/level-1-workflows/{phase-clarify → morph-phase-clarify}/references/clarifications-example.md +0 -0
  158. /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/architecture-analysis-guide.md +0 -0
  159. /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/spec-authoring-guide.md +0 -0
  160. /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/spec-example.md +0 -0
  161. /package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/references/recap-example.md +0 -0
  162. /package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/references/vsa-implementation-guide.md +0 -0
  163. /package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/references/task-planning-patterns.md +0 -0
  164. /package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/references/tasks-example.md +0 -0
@@ -1,144 +0,0 @@
1
- /**
2
- * Agent Resolver — Resolves active agents for a given phase
3
- *
4
- * Reads .morph/framework/agents.json (installed copy) or falls back to
5
- * framework/agents.json (source). Filters agents by phase and VSA config.
6
- */
7
-
8
- import { readFileSync, existsSync } from 'fs';
9
- import { join } from 'path';
10
-
11
- const AGENTS_PATHS = [
12
- '.morph/framework/agents.json',
13
- 'framework/agents.json',
14
- ];
15
-
16
- /**
17
- * Load agents.json from the project or framework source.
18
- *
19
- * @param {string} [cwd]
20
- * @returns {Object|null}
21
- */
22
- export function loadAgentsJson(cwd = process.cwd()) {
23
- for (const rel of AGENTS_PATHS) {
24
- const full = join(cwd, rel);
25
- if (existsSync(full)) {
26
- try {
27
- return JSON.parse(readFileSync(full, 'utf-8'));
28
- } catch {
29
- // Try next path
30
- }
31
- }
32
- }
33
- return null;
34
- }
35
-
36
- /**
37
- * Determine which agents are active for the given phase.
38
- *
39
- * Rules:
40
- * - always_active: true → always included
41
- * - Agents with phase-scoped keywords matching the current phase
42
- * - VSA architecture: include vsa-architect, exclude domain-architect in phase-setup
43
- * - Tier-4 validators are always included in implement phase
44
- *
45
- * @param {string} [cwd]
46
- * @param {string} [phase]
47
- * @returns {{ tier1: Agent[], tier2: Agent[], tier3: Agent[], tier4: Agent[] }}
48
- */
49
- export function getActiveAgents(cwd = process.cwd(), phase = '') {
50
- const data = loadAgentsJson(cwd);
51
- if (!data?.agents) {
52
- return { tier1: [], tier2: [], tier3: [], tier4: [] };
53
- }
54
-
55
- // Detect VSA config
56
- let isVsa = false;
57
- try {
58
- const configPath = join(cwd, '.morph/config/config.json');
59
- if (existsSync(configPath)) {
60
- const cfg = JSON.parse(readFileSync(configPath, 'utf-8'));
61
- isVsa = cfg?.config?.architecture?.style === 'vertical-slice';
62
- }
63
- } catch {
64
- // Non-blocking
65
- }
66
-
67
- // Phase → active domains heuristic
68
- const PHASE_DOMAINS = {
69
- proposal: ['architecture', 'developer-experience', 'ai-orchestration'],
70
- setup: ['architecture', 'developer-experience', 'ai-orchestration'],
71
- design: ['architecture', 'dotnet', 'frontend', 'ai-orchestration'],
72
- uiux: ['frontend', 'ui', 'architecture'],
73
- clarify: ['architecture', 'developer-experience'],
74
- tasks: ['architecture', 'dotnet', 'frontend', 'testing'],
75
- implement: ['dotnet', 'frontend', 'testing', 'devops', 'blazor'],
76
- sync: ['architecture', 'developer-experience'],
77
- };
78
-
79
- const activeDomains = new Set(PHASE_DOMAINS[phase] || Object.values(PHASE_DOMAINS).flat());
80
-
81
- const result = { tier1: [], tier2: [], tier3: [], tier4: [] };
82
-
83
- for (const [name, agent] of Object.entries(data.agents)) {
84
- if (name.startsWith('_comment')) continue;
85
-
86
- const tier = agent.tier;
87
- if (!tier || tier < 1 || tier > 4) continue;
88
-
89
- const tierKey = `tier${tier}`;
90
-
91
- // Always-active agents
92
- if (agent.always_active === true) {
93
- // VSA: swap domain-architect for vsa-architect
94
- if (name === 'domain-architect' && isVsa) continue;
95
- result[tierKey].push({ name, ...agent });
96
- continue;
97
- }
98
-
99
- // VSA architect: only active when VSA config is set
100
- if (name === 'vsa-architect') {
101
- if (isVsa && (phase === 'setup' || phase === 'design')) {
102
- result[tierKey].push({ name, ...agent });
103
- }
104
- continue;
105
- }
106
-
107
- // Tier-4 validators: active in implement phase
108
- if (tier === 4) {
109
- if (phase === 'implement' || phase === 'sync') {
110
- result[tierKey].push({ name, ...agent });
111
- }
112
- continue;
113
- }
114
-
115
- // Domain-based activation
116
- const agentDomains = agent.domains || [];
117
- const isActive = agentDomains.some(d => activeDomains.has(d));
118
- if (isActive) {
119
- result[tierKey].push({ name, ...agent });
120
- }
121
- }
122
-
123
- return result;
124
- }
125
-
126
- /**
127
- * Get icon for an agent based on its teammate config or tier.
128
- *
129
- * @param {Object} agent
130
- * @returns {string}
131
- */
132
- export function getAgentIcon(agent) {
133
- return agent.teammate?.icon || '';
134
- }
135
-
136
- /**
137
- * Count total active agents across all tiers.
138
- *
139
- * @param {{ tier1: any[], tier2: any[], tier3: any[], tier4: any[] }} agentsByTier
140
- * @returns {number}
141
- */
142
- export function countActiveAgents(agentsByTier) {
143
- return Object.values(agentsByTier).flat().length;
144
- }
@@ -1,230 +0,0 @@
1
- /**
2
- * Monitor Renderer — TUI rendering utilities for `morph-spec monitor`
3
- *
4
- * Uses chalk (already a project dependency) + native box-drawing characters.
5
- * No additional dependencies required.
6
- */
7
-
8
- import chalk from 'chalk';
9
-
10
- // Box-drawing characters
11
- const BOX = {
12
- tl: '┌', tr: '┐', bl: '└', br: '┘',
13
- h: '─', v: '│',
14
- };
15
-
16
- const TIER_ICONS = {
17
- 1: '🎯',
18
- 2: '⚙️ ',
19
- 3: '🔧',
20
- 4: '✅',
21
- };
22
-
23
- const EVENT_COLORS = {
24
- SessionStart: 'cyan',
25
- UserPromptSubmit: 'yellow',
26
- PreToolUse: 'magenta',
27
- PostToolUse: 'blue',
28
- PostToolUseFailure: 'red',
29
- Stop: 'gray',
30
- PreCompact: 'gray',
31
- Notification: 'white',
32
- };
33
-
34
- /**
35
- * Render a bordered box with a title and lines of content.
36
- *
37
- * @param {string[]} lines - Content lines
38
- * @param {string} color - chalk color name ('green'|'blue'|'yellow'|'magenta'|'cyan'|'red'|'white')
39
- * @param {string} [title] - Optional title shown in top border
40
- * @param {number} [width] - Box width (default: 70)
41
- * @returns {string}
42
- */
43
- export function renderBox(lines, color, title = '', width = 70) {
44
- const paint = chalk[color] || chalk.white;
45
- const innerWidth = width - 2;
46
-
47
- // Top border with optional title
48
- let topBorder;
49
- if (title) {
50
- const titleText = ` ${title} `;
51
- const remaining = innerWidth - titleText.length;
52
- const left = Math.max(0, Math.floor(remaining / 2));
53
- const right = Math.max(0, remaining - left);
54
- topBorder = paint(BOX.tl + BOX.h.repeat(left) + titleText + BOX.h.repeat(right) + BOX.tr);
55
- } else {
56
- topBorder = paint(BOX.tl + BOX.h.repeat(innerWidth) + BOX.tr);
57
- }
58
-
59
- const bottomBorder = paint(BOX.bl + BOX.h.repeat(innerWidth) + BOX.br);
60
-
61
- const contentLines = lines.map(line => {
62
- const truncated = line.length > innerWidth - 2
63
- ? line.slice(0, innerWidth - 5) + '...'
64
- : line;
65
- const padded = truncated.padEnd(innerWidth - 2);
66
- return paint(BOX.v) + ' ' + padded + paint(BOX.v);
67
- });
68
-
69
- return [topBorder, ...contentLines, bottomBorder].join('\n');
70
- }
71
-
72
- /**
73
- * Render the chronological hook event feed.
74
- *
75
- * @param {Array<{name: string, event: string, result: string, ts: string}>} hooks
76
- * @param {number} [maxItems] - Max events to show (most recent first)
77
- * @returns {string}
78
- */
79
- export function renderFeed(hooks, maxItems = 12) {
80
- if (!hooks || hooks.length === 0) {
81
- return renderBox([' No hook events yet this session.'], 'blue', '🪝 HOOK EVENTS');
82
- }
83
-
84
- const recent = [...hooks].reverse().slice(0, maxItems);
85
- const lines = recent.map(h => {
86
- const color = EVENT_COLORS[h.event] || 'white';
87
- const eventLabel = chalk[color] ? chalk[color](h.event) : h.event;
88
- return `${h.ts} ${chalk.bold(h.name)} ${eventLabel} → ${h.result}`;
89
- });
90
-
91
- return renderBox(lines, 'blue', '🪝 HOOK EVENTS');
92
- }
93
-
94
- /**
95
- * Render the agents view, grouped by tier.
96
- *
97
- * @param {Object} agentsByTier - { tier1: [...], tier2: [...], tier3: [...], tier4: [...] }
98
- * @param {string} phase
99
- * @returns {string}
100
- */
101
- export function renderAgents(agentsByTier, phase) {
102
- const lines = [`Phase: ${chalk.bold(phase || 'unknown')}`];
103
- lines.push('');
104
-
105
- for (const [tierKey, agents] of Object.entries(agentsByTier)) {
106
- const tierNum = parseInt(tierKey.replace('tier', ''));
107
- const icon = TIER_ICONS[tierNum] || ' ';
108
- if (!agents || agents.length === 0) continue;
109
- const names = agents.map(a => a.name).join(' · ');
110
- lines.push(`T${tierNum} ${icon} ${names}`);
111
- }
112
-
113
- if (lines.length <= 2) {
114
- lines.push(' No active agents for this phase.');
115
- }
116
-
117
- const total = Object.values(agentsByTier).flat().length;
118
- return renderBox(lines, 'magenta', `🤖 AGENTS ATIVOS (${total} de 39)`);
119
- }
120
-
121
- /**
122
- * Render the skills view.
123
- *
124
- * @param {Array<{name: string, ts: string}>} skills - Skills invoked this session
125
- * @param {string[]} [available] - Available skill names
126
- * @returns {string}
127
- */
128
- export function renderSkills(skills, available = []) {
129
- const lines = [];
130
-
131
- if (skills && skills.length > 0) {
132
- lines.push('Invocadas nesta sessão:');
133
- for (const s of [...skills].reverse()) {
134
- lines.push(` ${s.ts} 🎯 ${s.name}`);
135
- }
136
- } else {
137
- lines.push(' Nenhuma skill invocada nesta sessão.');
138
- }
139
-
140
- if (available.length > 0) {
141
- lines.push('');
142
- lines.push(`Disponíveis: ${available.slice(0, 8).join(', ')}${available.length > 8 ? ` (+${available.length - 8})` : ''}`);
143
- }
144
-
145
- return renderBox(lines, 'yellow', '🎯 SKILLS');
146
- }
147
-
148
- /**
149
- * Render the rules view.
150
- *
151
- * @param {Array<{name: string, glob: string}>} rules
152
- * @returns {string}
153
- */
154
- export function renderRules(rules) {
155
- if (!rules || rules.length === 0) {
156
- return renderBox([' No rules found.'], 'cyan', '📏 RULES ATIVAS');
157
- }
158
-
159
- const lines = rules.map(r => ` ${chalk.bold(r.name).padEnd(35)} ${chalk.gray(r.glob || '*')}`);
160
- return renderBox(lines, 'cyan', `📏 RULES ATIVAS (${rules.length})`);
161
- }
162
-
163
- /**
164
- * Render the overview (compact summary of all views).
165
- *
166
- * @param {Object} data - { feature, phase, agentsByTier, hooks, skills, rules }
167
- * @returns {string}
168
- */
169
- export function renderOverview(data) {
170
- const { feature, phase, agentsByTier, hooks, skills, rules } = data;
171
- const totalAgents = Object.values(agentsByTier || {}).flat().length;
172
- const lines = [];
173
-
174
- lines.push(`Feature: ${chalk.bold.green(feature || '(none)')} | Phase: ${chalk.bold(phase || 'unknown')}`);
175
- lines.push('');
176
- lines.push(`🤖 Agents ativos: ${totalAgents} de 39`);
177
-
178
- // Tier breakdown
179
- for (const [tierKey, agents] of Object.entries(agentsByTier || {})) {
180
- if (!agents || agents.length === 0) continue;
181
- const tierNum = parseInt(tierKey.replace('tier', ''));
182
- lines.push(` T${tierNum}: ${agents.map(a => a.name).join(', ')}`);
183
- }
184
-
185
- lines.push('');
186
- lines.push(`🪝 Hooks disparados: ${hooks?.length || 0}`);
187
- if (hooks && hooks.length > 0) {
188
- const last = hooks[hooks.length - 1];
189
- lines.push(` Último: ${last.name} (${last.ts})`);
190
- }
191
-
192
- lines.push('');
193
- lines.push(`🎯 Skills invocadas: ${skills?.length || 0}`);
194
- lines.push(`📏 Rules ativas: ${rules?.length || 0}`);
195
-
196
- return renderBox(lines, 'green', '● MORPH-SPEC OVERVIEW');
197
- }
198
-
199
- /**
200
- * Render the bottom status bar.
201
- *
202
- * @param {string} mode - Current view mode
203
- * @param {string[]} modes - All available modes
204
- * @returns {string}
205
- */
206
- export function renderStatusBar(mode, modes) {
207
- const modeList = modes.map(m =>
208
- m === mode ? chalk.bold.white.bgBlue(` ${m} `) : chalk.gray(` ${m} `)
209
- ).join(' ');
210
-
211
- return '\n' + modeList + chalk.gray(' shift+tab: cycle | q: quit');
212
- }
213
-
214
- /**
215
- * Render the feature header (top of screen).
216
- *
217
- * @param {string} feature
218
- * @param {string} phase
219
- * @param {Object} tasks - { completed, total }
220
- * @returns {string}
221
- */
222
- export function renderHeader(feature, phase, tasks) {
223
- const taskInfo = tasks && tasks.total > 0
224
- ? ` [${phase} ${tasks.completed}/${tasks.total}]`
225
- : ` [${phase}]`;
226
- const title = feature
227
- ? chalk.bold.green(`● Watching ${feature}${taskInfo}`)
228
- : chalk.bold.yellow('● morph-spec monitor — no active feature');
229
- return title + '\n';
230
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * Team Orchestration
3
- *
4
- * Coordinates agent teams for complex features spanning multiple domains.
5
- */
6
-
7
- export * from './team-orchestrator.js';