@polymorphism-tech/morph-spec 4.22.0 → 5.0.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 (211) hide show
  1. package/CLAUDE.md +57 -71
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +224 -491
  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 +55 -38
  8. package/framework/MORPH.md +244 -0
  9. package/framework/agents.json +127 -1198
  10. package/framework/commands/morph-apply.md +56 -240
  11. package/framework/commands/morph-archive.md +48 -85
  12. package/framework/commands/morph-preflight.md +7 -7
  13. package/framework/commands/morph-proposal.md +35 -191
  14. package/framework/commands/morph-status.md +19 -50
  15. package/framework/commands/morph-troubleshoot.md +2 -2
  16. package/framework/evals/rubrics/README.md +44 -0
  17. package/framework/evals/rubrics/architecture.md +46 -0
  18. package/framework/evals/rubrics/code-quality.md +50 -0
  19. package/framework/evals/rubrics/contracts.md +47 -0
  20. package/framework/evals/rubrics/test-coverage.md +50 -0
  21. package/framework/evals/scenarios/dotnet-crud.yaml +42 -0
  22. package/framework/evals/scenarios/nextjs-auth.yaml +38 -0
  23. package/framework/evals/suites/standard.yaml +5 -0
  24. package/framework/evals/trace-schema.md +67 -0
  25. package/framework/hooks/claude-code/core/README.md +3 -0
  26. package/framework/hooks/claude-code/core/denylist.json +14 -0
  27. package/framework/hooks/claude-code/{pre-tool-use → core}/enforce-phase-writes.js +5 -5
  28. package/framework/hooks/claude-code/core/post-edit-typecheck.js +69 -0
  29. package/framework/hooks/claude-code/core/pre-bash-denylist.js +29 -0
  30. package/framework/hooks/claude-code/{pre-tool-use → core}/protect-spec-files.js +4 -6
  31. package/framework/hooks/claude-code/{stop → core}/validate-completion.js +13 -82
  32. package/framework/hooks/shared/phase-utils.js +20 -31
  33. package/framework/hooks/shared/state-reader.js +4 -5
  34. package/framework/{skills/level-0-meta/mcp-registry.json → mcp/registry.json} +254 -243
  35. package/framework/phases.json +41 -115
  36. package/framework/rubrics/eval-rubric.json +66 -0
  37. package/framework/skills/README.md +39 -64
  38. package/framework/skills/core/README.md +3 -0
  39. package/framework/skills/core/morph-brainstorming/SKILL.md +102 -0
  40. package/framework/skills/core/morph-eval/SKILL.md +57 -0
  41. package/framework/skills/core/morph-implement/SKILL.md +83 -0
  42. package/framework/skills/core/morph-plan/SKILL.md +64 -0
  43. package/framework/skills/core/morph-review/SKILL.md +62 -0
  44. package/framework/skills/core/morph-stack-scan/SKILL.md +109 -0
  45. package/framework/skills/core/morph-standards/SKILL.md +49 -0
  46. package/framework/templates/CLAUDE.md.core.guide.md +29 -0
  47. package/framework/templates/CLAUDE.md.core.template +22 -0
  48. package/framework/templates/REGISTRY.json +4 -4
  49. package/framework/workflows/configs/fast-track.json +5 -10
  50. package/framework/workflows/configs/full.json +4 -8
  51. package/framework/workflows/configs/quick.json +32 -0
  52. package/framework/workflows/configs/standard.json +57 -64
  53. package/package.json +7 -6
  54. package/src/commands/mcp/mcp-setup.js +58 -31
  55. package/src/commands/project/doctor.js +69 -70
  56. package/src/commands/project/init.js +26 -5
  57. package/src/commands/project/status.js +18 -19
  58. package/src/commands/state/approve.js +1 -1
  59. package/src/commands/validation/validate-feature.js +18 -112
  60. package/src/core/paths/output-schema.js +133 -152
  61. package/src/core/state/phase-state-machine.js +10 -24
  62. package/src/core/state/state-manager.js +17 -17
  63. package/src/core/workflows/workflow-detector.js +214 -31
  64. package/src/core/workflows/workflow-router.js +204 -0
  65. package/src/dashboard/app/pages/AgentMap.jsx +32 -33
  66. package/src/dashboard/app/pages/LiveState.jsx +1 -1
  67. package/src/dashboard/app/pages/PhasePipeline.jsx +2 -4
  68. package/src/dashboard/app/pages/SkillsLibrary.jsx +2 -3
  69. package/src/dashboard/app/pages/Workflows.jsx +2 -2
  70. package/src/dashboard/scanner/agents-scanner.js +30 -35
  71. package/src/lib/agents/metrics-aggregator.js +1 -1
  72. package/src/lib/agents/output-collector.js +7 -9
  73. package/src/lib/context/context-builder.js +289 -0
  74. package/src/lib/detectors/claude-config-detector.js +19 -3
  75. package/src/lib/generators/context-generator.js +20 -42
  76. package/src/lib/generators/index.js +1 -0
  77. package/src/lib/generators/mandate-generator.js +512 -0
  78. package/src/lib/generators/metadata-extractor.js +1 -1
  79. package/src/lib/generators/recap-generator.js +3 -4
  80. package/src/lib/installers/mcp-installer.js +300 -92
  81. package/src/lib/phase-chain/phase-validator.js +36 -40
  82. package/src/lib/stack/stack-profile.js +74 -91
  83. package/src/lib/tasks/task-parser.js +1 -1
  84. package/src/lib/tasks/wave-resolver.js +353 -0
  85. package/src/lib/validators/checkpoint-persistence.js +2 -2
  86. package/src/lib/validators/content/cross-phase-validator.js +281 -0
  87. package/src/lib/validators/content/index.js +1 -0
  88. package/src/lib/validators/shared/emit-validator-dispatch.js +6 -56
  89. package/src/scripts/global-install.js +2 -27
  90. package/src/utils/agents-installer.js +224 -447
  91. package/src/utils/claude-settings-manager.js +57 -15
  92. package/src/utils/file-copier.js +1 -0
  93. package/src/utils/hooks-installer.js +15 -117
  94. package/src/utils/skills-installer.js +12 -18
  95. package/bin/detect-agents.js +0 -226
  96. package/bin/task-manager.js +0 -1036
  97. package/framework/agents/README.md +0 -13
  98. package/framework/agents/ai-agents/ai-system-architect.md +0 -194
  99. package/framework/agents/ai-agents/vector-search-expert.md +0 -247
  100. package/framework/agents/architecture/architecture-expert.md +0 -98
  101. package/framework/agents/architecture/morph-spec-architect.md +0 -66
  102. package/framework/agents/architecture/packages-validator.md +0 -89
  103. package/framework/agents/architecture/security-expert.md +0 -79
  104. package/framework/agents/architecture/seo-growth-hacker.md +0 -168
  105. package/framework/agents/architecture/standards-architect.md +0 -153
  106. package/framework/agents/backend/dotnet-senior.md +0 -163
  107. package/framework/agents/backend/ef-modeler.md +0 -119
  108. package/framework/agents/backend/hangfire-orchestrator.md +0 -133
  109. package/framework/agents/backend/ms-agent-expert.md +0 -55
  110. package/framework/agents/backend/neon-expert.md +0 -379
  111. package/framework/agents/frontend/css-specialist.md +0 -89
  112. package/framework/agents/frontend/design-system-validator.md +0 -100
  113. package/framework/agents/frontend/gsap-animator.md +0 -131
  114. package/framework/agents/frontend/nextjs-component-validator.md +0 -97
  115. package/framework/agents/frontend/nextjs-expert.md +0 -201
  116. package/framework/agents/frontend/ui-designer.md +0 -259
  117. package/framework/agents/infrastructure/infra-architect.md +0 -215
  118. package/framework/agents/integrations/asaas-financial.md +0 -138
  119. package/framework/agents/integrations/neon-auth.md +0 -151
  120. package/framework/agents/integrations/resend-email.md +0 -127
  121. package/framework/hooks/claude-code/post-tool-use/agent-complete.js +0 -122
  122. package/framework/hooks/claude-code/post-tool-use/dispatch.js +0 -363
  123. package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +0 -78
  124. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +0 -194
  125. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +0 -199
  126. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +0 -55
  127. package/framework/hooks/claude-code/session-start/inject-morph-context.js +0 -323
  128. package/framework/hooks/claude-code/session-start/post-compact-restore.js +0 -41
  129. package/framework/hooks/claude-code/session-start/resume-context.js +0 -77
  130. package/framework/hooks/claude-code/teammate-idle/teammate-idle.js +0 -90
  131. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +0 -114
  132. package/framework/hooks/shared/compact-restore.js +0 -123
  133. package/framework/hooks/shared/dispatch-helpers.js +0 -147
  134. package/framework/hooks/shared/skill-reminder-helpers.js +0 -79
  135. package/framework/hooks/shared/stale-task-reset.js +0 -57
  136. package/framework/hooks/shared/worktree-helpers.js +0 -75
  137. package/framework/skills/level-0-meta/README.md +0 -7
  138. package/framework/skills/level-0-meta/morph-agent-teams/SKILL.md +0 -472
  139. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +0 -174
  140. package/framework/skills/level-0-meta/morph-brainstorming/references/proposal-example.md +0 -138
  141. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +0 -145
  142. package/framework/skills/level-0-meta/morph-code-review/SKILL.md +0 -250
  143. package/framework/skills/level-0-meta/morph-code-review/references/review-example.md +0 -164
  144. package/framework/skills/level-0-meta/morph-code-review/references/review-guidelines.md +0 -100
  145. package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +0 -151
  146. package/framework/skills/level-0-meta/morph-code-review-nextjs/SKILL.md +0 -165
  147. package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +0 -254
  148. package/framework/skills/level-0-meta/morph-code-review-nextjs/scripts/scan-nextjs.mjs +0 -189
  149. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +0 -344
  150. package/framework/skills/level-0-meta/morph-frontend-review/scripts/scan-accessibility.mjs +0 -376
  151. package/framework/skills/level-0-meta/morph-gemini-image/SKILL.md +0 -290
  152. package/framework/skills/level-0-meta/morph-init/SKILL.md +0 -537
  153. package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +0 -225
  154. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +0 -401
  155. package/framework/skills/level-0-meta/morph-post-implementation/scripts/detect-dev-server.mjs +0 -153
  156. package/framework/skills/level-0-meta/morph-post-implementation/scripts/detect-stack.mjs +0 -234
  157. package/framework/skills/level-0-meta/morph-simulation-checklist/SKILL.md +0 -106
  158. package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +0 -243
  159. package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +0 -169
  160. package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +0 -148
  161. package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +0 -110
  162. package/framework/skills/level-1-workflows/README.md +0 -7
  163. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +0 -269
  164. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +0 -453
  165. package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +0 -44
  166. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-authoring-guide.md +0 -55
  167. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +0 -253
  168. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
  169. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +0 -634
  170. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +0 -50
  171. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +0 -54
  172. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +0 -47
  173. package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +0 -132
  174. package/framework/skills/level-1-workflows/morph-phase-implement/references/vsa-implementation-guide.md +0 -92
  175. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +0 -257
  176. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
  177. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +0 -291
  178. package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -143
  179. package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +0 -404
  180. package/framework/skills/level-1-workflows/morph-phase-tasks/scripts/validate-tasks.mjs +0 -112
  181. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +0 -995
  182. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +0 -147
  183. package/framework/squad-templates/backend-only.json +0 -47
  184. package/framework/squad-templates/frontend-only.json +0 -56
  185. package/framework/squad-templates/full-stack.json +0 -74
  186. package/src/commands/agents/agent-metrics.js +0 -174
  187. package/src/commands/agents/audit-dispatch.js +0 -82
  188. package/src/commands/agents/detect-agents.js +0 -275
  189. package/src/commands/agents/dispatch-agents.js +0 -461
  190. package/src/commands/agents/index.js +0 -13
  191. package/src/commands/agents/manage-agents.js +0 -352
  192. package/src/commands/agents/project-metrics.js +0 -74
  193. package/src/commands/phase/phase-reset.js +0 -74
  194. package/src/commands/scope/escalate.js +0 -217
  195. package/src/commands/state/advance-phase.js +0 -600
  196. package/src/commands/state/phase-runner.js +0 -215
  197. package/src/commands/state/state.js +0 -444
  198. package/src/commands/task/expand.js +0 -100
  199. package/src/commands/tasks/index.js +0 -4
  200. package/src/commands/tasks/task.js +0 -105
  201. package/src/commands/templates/index.js +0 -5
  202. package/src/commands/templates/template-render.js +0 -93
  203. package/src/commands/trust/trust.js +0 -118
  204. package/src/lib/agents/agents-manager.js +0 -349
  205. package/src/lib/build/build-runner.js +0 -99
  206. package/src/lib/checkpoints/checkpoint-hooks.js +0 -111
  207. package/src/lib/contracts/sprint-contract-generator.js +0 -137
  208. package/src/lib/scope/impact-analyzer.js +0 -106
  209. package/src/lib/trust/trust-manager.js +0 -157
  210. package/src/utils/tier-helpers.js +0 -24
  211. /package/framework/hooks/claude-code/{post-tool-use → core}/loop-detect.js +0 -0
@@ -1,106 +0,0 @@
1
- /**
2
- * Impact Analyzer for Scope Escalation
3
- *
4
- * Analyzes tasks.md + spec.md to determine the impact of a discovered
5
- * complexity and recommend an escalation action.
6
- *
7
- * Pure functions — no I/O, no state mutations.
8
- */
9
-
10
- /**
11
- * Classify impact based on affected task count and spec status.
12
- *
13
- * @param {{ affectedTasks: string[], specNeedsUpdate: boolean }} input
14
- * @returns {{ impact: 'low'|'medium'|'high', recommendation: string, targetPhase?: string }}
15
- */
16
- export function classifyImpact({ affectedTasks, specNeedsUpdate }) {
17
- if (specNeedsUpdate) {
18
- return { impact: 'high', recommendation: 'regress-design', targetPhase: 'design' };
19
- }
20
- if (affectedTasks.length <= 3) {
21
- return { impact: 'low', recommendation: 'expand' };
22
- }
23
- return { impact: 'medium', recommendation: 'regress-tasks', targetPhase: 'tasks' };
24
- }
25
-
26
- /**
27
- * Parse task IDs from tasks.md content.
28
- * @param {string} tasksMd
29
- * @returns {string[]} Ordered task IDs
30
- */
31
- function parseTaskIds(tasksMd) {
32
- const ids = [];
33
- const re = /^###\s+(T\d+)\s*[—–:\-]/gm;
34
- let match;
35
- while ((match = re.exec(tasksMd)) !== null) {
36
- ids.push(match[1]);
37
- }
38
- return ids;
39
- }
40
-
41
- /**
42
- * Find consecutive task IDs starting from a trigger task.
43
- * Tasks are "consecutive" if their numeric IDs have no gaps.
44
- *
45
- * @param {string[]} allIds - All task IDs in order
46
- * @param {string} triggerId - The trigger task ID
47
- * @returns {string[]} Consecutive group including trigger
48
- */
49
- function findConsecutiveGroup(allIds, triggerId) {
50
- const triggerIdx = allIds.indexOf(triggerId);
51
- if (triggerIdx === -1) return [triggerId];
52
-
53
- const numOf = id => parseInt(id.replace(/\D/g, ''), 10);
54
-
55
- const group = [triggerId];
56
-
57
- // Look forward
58
- for (let i = triggerIdx + 1; i < allIds.length; i++) {
59
- const prevNum = numOf(allIds[i - 1]);
60
- const currNum = numOf(allIds[i]);
61
- if (currNum - prevNum <= 1) {
62
- group.push(allIds[i]);
63
- } else {
64
- break;
65
- }
66
- }
67
-
68
- // Look backward
69
- for (let i = triggerIdx - 1; i >= 0; i--) {
70
- const nextNum = numOf(allIds[i + 1]);
71
- const currNum = numOf(allIds[i]);
72
- if (nextNum - currNum <= 1) {
73
- group.unshift(allIds[i]);
74
- } else {
75
- break;
76
- }
77
- }
78
-
79
- return group;
80
- }
81
-
82
- /**
83
- * Analyze the impact of a scope escalation.
84
- *
85
- * @param {{ triggerTaskId: string, tasksMd: string, specMd: string, reason: string }} input
86
- * @returns {{ triggerTask: string, affectedTasks: string[], impact: string, recommendation: string, targetPhase?: string, reason: string }}
87
- */
88
- export function analyzeImpact({ triggerTaskId, tasksMd, specMd, reason }) {
89
- const allIds = parseTaskIds(tasksMd);
90
- const affectedTasks = findConsecutiveGroup(allIds, triggerTaskId);
91
-
92
- // Heuristic: detect phrases that indicate the spec itself is wrong, not just casual mentions.
93
- // Requires phrases like "spec is wrong", "architecture needs", "contract mismatch", etc.
94
- // Avoids false positives on casual uses like "the design of the component" or "schema file".
95
- const specPhrases = /\b(spec\s+(is|was|needs|incorrect|wrong|outdated|assumed|missed)|architecture\s+(needs|is wrong|incorrect|mismatch)|contract\s+(mismatch|wrong|incorrect|needs|outdated)|schema\s+(needs|incorrect|wrong|mismatch|change))\b/i;
96
- const specNeedsUpdate = specPhrases.test(reason);
97
-
98
- const classification = classifyImpact({ affectedTasks, specNeedsUpdate });
99
-
100
- return {
101
- triggerTask: triggerTaskId,
102
- affectedTasks,
103
- ...classification,
104
- reason
105
- };
106
- }
@@ -1,157 +0,0 @@
1
- /**
2
- * Trust Manager — Simplified 3-level trust model
3
- *
4
- * Trust levels:
5
- * manual — nothing auto-approved (default)
6
- * high — auto-approve low-risk gates (design, tasks)
7
- * auto — auto-approve all gates
8
- *
9
- * Set with: morph-spec trust set <feature> <level>
10
- */
11
-
12
- import { readFileSync, existsSync } from 'fs';
13
- import { join } from 'path';
14
- import { saveState } from '../../core/state/state-manager.js';
15
-
16
- const VALID_LEVELS = ['manual', 'high', 'auto'];
17
-
18
- // Gates that can be auto-approved at each trust level
19
- export const AUTO_APPROVE_GATES = {
20
- manual: [],
21
- high: ['design', 'tasks'],
22
- auto: ['design', 'tasks', 'proposal', 'uiux']
23
- };
24
-
25
- /**
26
- * Load state.json
27
- * @returns {Object} State
28
- */
29
- function loadState() {
30
- const statePath = join(process.cwd(), '.morph/state.json');
31
- if (!existsSync(statePath)) return { features: {} };
32
- try {
33
- return JSON.parse(readFileSync(statePath, 'utf8'));
34
- } catch {
35
- return { features: {} };
36
- }
37
- }
38
-
39
- /**
40
- * Get current trust config for a feature
41
- * @param {string} featureName
42
- * @returns {{ level: string, autoApprove: string[], source: string, overrideReason?: string }}
43
- */
44
- export function getTrust(featureName) {
45
- const state = loadState();
46
- const feature = state.features?.[featureName];
47
-
48
- if (!feature) {
49
- return { level: 'manual', autoApprove: [], source: 'default' };
50
- }
51
-
52
- const override = feature.trustConfig?.override;
53
- const level = VALID_LEVELS.includes(override?.level) ? override.level : 'manual';
54
- const source = override ? 'manual' : 'default';
55
-
56
- return {
57
- level,
58
- autoApprove: AUTO_APPROVE_GATES[level] || [],
59
- source,
60
- overrideReason: override?.reason,
61
- overrideAt: override?.setAt
62
- };
63
- }
64
-
65
- /**
66
- * Manually set trust level with reason
67
- * @param {string} featureName
68
- * @param {string} level - 'manual' | 'high' | 'auto'
69
- * @param {string} [reason]
70
- */
71
- export function setTrust(featureName, level, reason) {
72
- if (!VALID_LEVELS.includes(level)) {
73
- throw new Error(`Invalid trust level: ${level}. Valid: ${VALID_LEVELS.join(', ')}`);
74
- }
75
-
76
- const state = loadState();
77
- if (!state.features[featureName]) {
78
- throw new Error(`Feature not found: ${featureName}`);
79
- }
80
-
81
- if (!state.features[featureName].trustConfig) {
82
- state.features[featureName].trustConfig = {};
83
- }
84
-
85
- state.features[featureName].trustConfig.override = {
86
- level,
87
- reason: reason || `Manual override to ${level}`,
88
- setAt: new Date().toISOString(),
89
- setBy: 'manual'
90
- };
91
-
92
- saveState(state);
93
-
94
- return {
95
- feature: featureName,
96
- level,
97
- autoApprove: AUTO_APPROVE_GATES[level] || [],
98
- reason: state.features[featureName].trustConfig.override.reason
99
- };
100
- }
101
-
102
- /**
103
- * Clear manual trust override (reverts to default: manual)
104
- * @param {string} featureName
105
- */
106
- export function clearTrustOverride(featureName) {
107
- const state = loadState();
108
- if (state.features[featureName]?.trustConfig?.override) {
109
- delete state.features[featureName].trustConfig.override;
110
- saveState(state);
111
- }
112
- }
113
-
114
- /**
115
- * Check if a gate should be auto-approved based on trust level
116
- * @param {string} featureName
117
- * @param {string} gate - 'design' | 'tasks' | 'proposal' | 'uiux'
118
- * @returns {{ autoApprove: boolean, level: string, reason: string }}
119
- */
120
- export function shouldAutoApprove(featureName, gate) {
121
- const trust = getTrust(featureName);
122
-
123
- if (!trust.autoApprove.includes(gate)) {
124
- return {
125
- autoApprove: false,
126
- level: trust.level,
127
- reason: `Trust level "${trust.level}" does not auto-approve "${gate}" gate`
128
- };
129
- }
130
-
131
- return {
132
- autoApprove: true,
133
- level: trust.level,
134
- reason: `Auto-approved: trust level "${trust.level}" includes gate "${gate}"`
135
- };
136
- }
137
-
138
- /**
139
- * Get trust info for all features
140
- * @returns {Array} Feature trust summaries
141
- */
142
- export function getTrustHistory() {
143
- const state = loadState();
144
- const features = state.features || {};
145
-
146
- return Object.entries(features).map(([name, feature]) => {
147
- const trust = getTrust(name);
148
- return {
149
- feature: name,
150
- level: trust.level,
151
- autoApprove: trust.autoApprove,
152
- source: trust.source,
153
- phase: feature.phase,
154
- status: feature.status
155
- };
156
- });
157
- }
@@ -1,24 +0,0 @@
1
- /**
2
- * Tier-to-role helpers for agents.json v4.0
3
- *
4
- * Derives role strings from tier numbers, eliminating the need
5
- * for an explicit `role` field on each agent.
6
- *
7
- * @module tier-helpers
8
- */
9
-
10
- const TIER_ROLES = {
11
- 1: 'orchestrator',
12
- 2: 'leader',
13
- 3: 'specialist',
14
- 4: 'validator',
15
- };
16
-
17
- /**
18
- * Derive role string from agent tier number.
19
- * @param {number} tier - Agent tier (1-4)
20
- * @returns {string} Role name
21
- */
22
- export function tierToRole(tier) {
23
- return TIER_ROLES[tier] || 'specialist';
24
- }