chati-dev 4.2.2 → 4.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 (220) hide show
  1. package/README.md +80 -53
  2. package/bin/chati.js +150 -5
  3. package/framework/agents/build/dev.md +509 -76
  4. package/framework/agents/deploy/devops.md +40 -25
  5. package/framework/agents/discover/brief.md +156 -22
  6. package/framework/agents/discover/brownfield-wu.md +24 -14
  7. package/framework/agents/discover/greenfield-wu.md +100 -14
  8. package/framework/agents/plan/architect-data-engineer.md +6 -6
  9. package/framework/agents/plan/architect-system.md +46 -12
  10. package/framework/agents/plan/architect.md +40 -20
  11. package/framework/agents/plan/detail.md +36 -24
  12. package/framework/agents/plan/phases.md +36 -26
  13. package/framework/agents/plan/tasks.md +114 -33
  14. package/framework/agents/plan/ux-brand-architect.md +240 -8
  15. package/framework/agents/plan/ux-component-engineer.md +28 -13
  16. package/framework/agents/plan/ux-researcher.md +7 -6
  17. package/framework/agents/plan/ux.md +55 -22
  18. package/framework/agents/quality/qa-implementation.md +143 -74
  19. package/framework/agents/quality/qa-planning.md +115 -42
  20. package/framework/agents/quality/qa-visual.md +439 -0
  21. package/framework/agents/shared/visualizer.md +128 -0
  22. package/framework/config.yaml +7 -6
  23. package/framework/constitution.md +127 -44
  24. package/framework/context/governance.md +12 -7
  25. package/framework/context/quality.md +6 -5
  26. package/framework/context/root.md +6 -6
  27. package/framework/data/entity-registry.yaml +377 -4
  28. package/framework/data/model-limits.json +19 -0
  29. package/framework/domains/agents/qa-visual.yaml +74 -0
  30. package/framework/domains/constitution.yaml +46 -2
  31. package/framework/domains/workflows/greenfield-fullstack.yaml +2 -2
  32. package/framework/hooks/advance-trigger.js +131 -0
  33. package/framework/hooks/brief-validator.js +83 -0
  34. package/framework/hooks/constitution-guard.js +24 -5
  35. package/framework/hooks/license-guard.js +62 -27
  36. package/framework/hooks/mode-governance.js +13 -2
  37. package/framework/hooks/model-governance.js +1 -0
  38. package/framework/hooks/post-dev.js +207 -0
  39. package/framework/hooks/prism-engine.js +274 -105
  40. package/framework/hooks/reasoning-escalator.js +371 -0
  41. package/framework/hooks/reference-trigger.js +117 -0
  42. package/framework/hooks/session-digest.js +50 -1
  43. package/framework/hooks/settings.json +32 -1
  44. package/framework/hooks/style-guard.js +25 -6
  45. package/framework/hooks/team-quality-gate.js +19 -12
  46. package/framework/hooks/undercover-guard.js +4 -2
  47. package/framework/i18n/en.yaml +3 -3
  48. package/framework/i18n/es.yaml +3 -3
  49. package/framework/i18n/fr.yaml +3 -3
  50. package/framework/i18n/pt.yaml +3 -3
  51. package/framework/intelligence/context-engine.md +4 -5
  52. package/framework/intelligence/decision-engine.md +1 -1
  53. package/framework/intelligence/hooks-performance.md +3 -3
  54. package/framework/migrations/v1.0-to-v1.1.yaml +1 -1
  55. package/framework/migrations/v1.4-to-v2.0.yaml +11 -11
  56. package/framework/migrations/v4.0-to-v4.1.yaml +2 -2
  57. package/framework/migrations/v4.2-to-v4.3.yaml +29 -0
  58. package/framework/orchestrator/chati-router.js +387 -0
  59. package/framework/orchestrator/chati-update.md +40 -40
  60. package/framework/orchestrator/chati.md +294 -94
  61. package/framework/scaffold/motion-premium/README.md +89 -0
  62. package/framework/scaffold/motion-premium/app/globals.css.template +400 -0
  63. package/framework/scaffold/motion-premium/app/layout.tsx.template +110 -0
  64. package/framework/scaffold/motion-premium/components/animation/BackgroundCrossfadeProvider.tsx.template +170 -0
  65. package/framework/scaffold/motion-premium/components/animation/LenisProvider.tsx.template +49 -0
  66. package/framework/scaffold/motion-premium/components/animation/PageTransitionWrapper.tsx.template +83 -0
  67. package/framework/scaffold/motion-premium/components/animation/Preloader.tsx.template +171 -0
  68. package/framework/scaffold/motion-premium/components/ui/Container.tsx.template +69 -0
  69. package/framework/scaffold/motion-premium/components/ui/PageSection.tsx.template +74 -0
  70. package/framework/scaffold/motion-premium/lib/animations/gsap.ts.template +112 -0
  71. package/framework/scaffold/motion-premium/lib/animations/refreshCoordinator.ts.template +75 -0
  72. package/framework/scaffold/motion-premium/lib/animations/tokens.ts.template +119 -0
  73. package/framework/scaffold/motion-premium/lib/animations/useGsapContext.ts.template +92 -0
  74. package/framework/scaffold/motion-premium/lib/animations/useScrollSnapStepper.ts.template +265 -0
  75. package/framework/scaffold/motion-premium/lib/animations/useSmoothScroll.ts.template +67 -0
  76. package/framework/scaffold/motion-premium/lib/brand.ts.template +43 -0
  77. package/framework/scaffold/motion-premium/scaffold.yaml +174 -0
  78. package/framework/scaffold/motion-premium-3d/README.md +80 -0
  79. package/framework/scaffold/motion-premium-3d/app/(3d)/scroll-demo/ScrollDemoCanvas.tsx.template +81 -0
  80. package/framework/scaffold/motion-premium-3d/app/(3d)/scroll-demo/ScrollDemoClient.tsx.template +75 -0
  81. package/framework/scaffold/motion-premium-3d/app/(3d)/scroll-demo/page.tsx.template +26 -0
  82. package/framework/scaffold/motion-premium-3d/components/3d/CameraRig.tsx.template +100 -0
  83. package/framework/scaffold/motion-premium-3d/components/3d/CanvasProvider.tsx.template +85 -0
  84. package/framework/scaffold/motion-premium-3d/components/3d/InvalidateOnScroll.tsx.template +51 -0
  85. package/framework/scaffold/motion-premium-3d/components/3d/MeshCrossfade.tsx.template +79 -0
  86. package/framework/scaffold/motion-premium-3d/components/3d/ScrollCrossfade.tsx.template +88 -0
  87. package/framework/scaffold/motion-premium-3d/components/3d/ScrollScene.tsx.template +121 -0
  88. package/framework/scaffold/motion-premium-3d/components/webgl/SceneFallback.tsx.template +65 -0
  89. package/framework/scaffold/motion-premium-3d/components/webgl/WebGLContext.tsx.template +68 -0
  90. package/framework/scaffold/motion-premium-3d/lib/webgl/detect.ts.template +69 -0
  91. package/framework/scaffold/motion-premium-3d/scaffold.yaml +133 -0
  92. package/framework/schemas/session.schema.json +109 -21
  93. package/framework/scripts/reference-capture.js +430 -0
  94. package/framework/scripts/visual-qa.js +674 -0
  95. package/framework/tasks/orchestrator-handoff.md +1 -1
  96. package/framework/tasks/orchestrator-resume.md +1 -1
  97. package/framework/tasks/orchestrator-route.md +1 -1
  98. package/framework/tasks/orchestrator-status.md +3 -3
  99. package/framework/tasks/qa-planning-gate-define.md +1 -1
  100. package/framework/templates/brandbook-html-tmpl.md +1 -1
  101. package/framework/templates/brandbook-tmpl.yaml +1 -1
  102. package/framework/templates/component-spec-tmpl.yaml +1 -1
  103. package/framework/templates/design-token-tmpl.yaml +1 -1
  104. package/framework/templates/icon-system-tmpl.yaml +1 -1
  105. package/framework/templates/team-planning-tasks.yaml +6 -5
  106. package/framework/workflows/brownfield-discovery.yaml +2 -2
  107. package/framework/workflows/brownfield-fullstack.yaml +15 -11
  108. package/framework/workflows/brownfield-service.yaml +14 -10
  109. package/framework/workflows/brownfield-ui.yaml +15 -11
  110. package/framework/workflows/greenfield-fullstack.yaml +16 -13
  111. package/framework/workflows/quick-flow.yaml +3 -3
  112. package/framework/workflows/standard-flow.yaml +12 -9
  113. package/package.json +10 -5
  114. package/src/autonomy/autonomous-gate.js +1 -0
  115. package/src/autonomy/build-state.js +1 -2
  116. package/src/autonomy/progress-reporter.js +1 -1
  117. package/src/config/agent-customizer.js +11 -3
  118. package/src/config/claude-settings-generator.js +27 -7
  119. package/src/config/context-file-generator.js +41 -21
  120. package/src/config/framework-adapter.js +1 -0
  121. package/src/config/gemini-hooks-generator.js +19 -7
  122. package/src/config/mcp-configs.js +1 -0
  123. package/src/context/layers/l1-global.js +2 -1
  124. package/src/dashboard/data-reader.js +4 -3
  125. package/src/dashboard/layout.js +2 -1
  126. package/src/decision/analyzer.js +6 -30
  127. package/src/decision/engine.js +4 -28
  128. package/src/decision/registry-healer.js +3 -2
  129. package/src/decision/registry-updater.js +23 -14
  130. package/src/extensions/loader.js +2 -8
  131. package/src/gates/g1-planning-complete.js +2 -1
  132. package/src/gates/g2-qa-planning.js +2 -1
  133. package/src/gates/g3-implementation.js +2 -1
  134. package/src/gates/g4-qa-implementation.js +3 -2
  135. package/src/gates/g5-deploy-ready.js +2 -1
  136. package/src/health/engine.js +4 -3
  137. package/src/installer/core.js +422 -81
  138. package/src/installer/preflight.js +131 -0
  139. package/src/installer/provider-overlay.js +3 -3
  140. package/src/installer/scaffold-applier.js +358 -0
  141. package/src/installer/templates.js +46 -29
  142. package/src/installer/validator.js +17 -12
  143. package/src/intelligence/registry-manager.js +22 -29
  144. package/src/intelligence/timeline.js +11 -6
  145. package/src/license/commands.js +1 -1
  146. package/src/license/wait.js +102 -0
  147. package/src/memory/agent-memory.js +81 -0
  148. package/src/memory/dream.js +32 -1
  149. package/src/merger/replace-merger.js +28 -15
  150. package/src/orchestrator/agent-selector.js +2 -1
  151. package/src/orchestrator/cli.js +1869 -71
  152. package/src/orchestrator/doctor.js +270 -0
  153. package/src/orchestrator/handoff-engine.js +4 -3
  154. package/src/orchestrator/index.js +2 -0
  155. package/src/orchestrator/pipeline-manager.js +306 -15
  156. package/src/orchestrator/session-manager.js +331 -6
  157. package/src/tasks/handoff.js +3 -2
  158. package/src/telemetry/config.js +4 -3
  159. package/src/telemetry/schema.js +1 -0
  160. package/src/terminal/collector.js +3 -2
  161. package/src/terminal/index.js +1 -2
  162. package/src/terminal/isolation.js +52 -18
  163. package/src/terminal/prompt-builder.js +42 -25
  164. package/src/terminal/run-parallel.js +1 -1
  165. package/src/terminal/run-team.js +3 -3
  166. package/src/terminal/team-task-list.js +43 -4
  167. package/src/upgrade/backup.js +3 -2
  168. package/src/upgrade/checker.js +3 -2
  169. package/src/upgrade/migrator.js +65 -7
  170. package/src/upgrade/tracked-files-detector.js +86 -0
  171. package/src/upgrade/user-messages.js +94 -0
  172. package/src/utils/config-parser.js +2 -1
  173. package/src/utils/feature-flags.js +2 -1
  174. package/src/utils/flatten-entities.js +69 -0
  175. package/src/utils/framework-dir.js +16 -0
  176. package/src/utils/model-id.js +85 -0
  177. package/src/utils/provider-limits.js +84 -23
  178. package/src/utils/schema-validator.js +1 -1
  179. package/src/wizard/i18n.js +5 -4
  180. package/src/wizard/index.js +14 -0
  181. package/assets/logo - c/303/263pia.png +0 -0
  182. package/assets/logo.svg +0 -42
  183. package/assets/logo2.png +0 -0
  184. package/assets/social-preview.png +0 -0
  185. package/scripts/bundle-framework.js +0 -69
  186. package/scripts/changelog-generator.js +0 -222
  187. package/scripts/codebase-mapper.js +0 -728
  188. package/scripts/commit-message-generator.js +0 -167
  189. package/scripts/coverage-analyzer.js +0 -260
  190. package/scripts/dependency-analyzer.js +0 -280
  191. package/scripts/doctor/checks/agents.js +0 -77
  192. package/scripts/doctor/checks/constitution.js +0 -41
  193. package/scripts/doctor/checks/domain-alignment.js +0 -58
  194. package/scripts/doctor/checks/prism-layers.js +0 -84
  195. package/scripts/doctor/checks/registry.js +0 -55
  196. package/scripts/doctor/checks/schemas.js +0 -61
  197. package/scripts/doctor/fixes/reference-fix.js +0 -100
  198. package/scripts/doctor/fixes/registry-fix.js +0 -56
  199. package/scripts/doctor/index.js +0 -212
  200. package/scripts/framework-analyzer.js +0 -308
  201. package/scripts/generate-constitution-domain.js +0 -253
  202. package/scripts/generate-signing-key.js +0 -33
  203. package/scripts/health-check.js +0 -481
  204. package/scripts/ide-sync.js +0 -326
  205. package/scripts/performance-analyzer.js +0 -325
  206. package/scripts/plan-tracker.js +0 -278
  207. package/scripts/populate-entity-registry.js +0 -481
  208. package/scripts/pr-review.js +0 -317
  209. package/scripts/rollback-manager.js +0 -310
  210. package/scripts/semantic-lint.js +0 -328
  211. package/scripts/sign-manifest.js +0 -53
  212. package/scripts/stuck-detector.js +0 -343
  213. package/scripts/test-quality-assessment.js +0 -257
  214. package/scripts/validate-agents.js +0 -368
  215. package/scripts/validate-package.js +0 -505
  216. package/scripts/validate-tasks.js +0 -465
  217. package/src/autonomy/worktree-manager.js +0 -250
  218. package/src/intelligence/decision-engine.js +0 -256
  219. package/src/intelligence/document-sharder.js +0 -221
  220. package/src/intelligence/elicitation.js +0 -265
@@ -1,278 +0,0 @@
1
- /**
2
- * Plan Tracker — Tracks progress of development phases and tasks.
3
- *
4
- * Persists plan state to .chati/plan.json and provides progress calculation,
5
- * visual progress bars, and formatted reports.
6
- *
7
- * @module scripts/plan-tracker
8
- */
9
-
10
- import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
11
- import { join, dirname } from 'node:path';
12
-
13
- /**
14
- * @typedef {Object} Task
15
- * @property {string} id
16
- * @property {string} name
17
- * @property {string} status — 'pending' | 'in_progress' | 'completed' | 'skipped'
18
- * @property {string} [assignee]
19
- * @property {number} [updatedAt]
20
- */
21
-
22
- /**
23
- * @typedef {Object} Phase
24
- * @property {string} id
25
- * @property {string} name
26
- * @property {string} status — 'pending' | 'in_progress' | 'completed' | 'skipped'
27
- * @property {Task[]} tasks
28
- * @property {number} [updatedAt]
29
- */
30
-
31
- /**
32
- * @typedef {Object} Plan
33
- * @property {string} name
34
- * @property {Phase[]} phases
35
- * @property {number} createdAt
36
- * @property {number} updatedAt
37
- */
38
-
39
- /**
40
- * @typedef {Object} Progress
41
- * @property {number} totalPhases
42
- * @property {number} completedPhases
43
- * @property {number} totalTasks
44
- * @property {number} completedTasks
45
- * @property {number} percentComplete
46
- */
47
-
48
- const VALID_STATUSES = new Set(['pending', 'in_progress', 'completed', 'skipped']);
49
-
50
- export class PlanTracker {
51
- /**
52
- * @param {string} targetDir — project root directory
53
- */
54
- constructor(targetDir) {
55
- this.targetDir = targetDir;
56
- this.planPath = join(targetDir, '.chati', 'plan.json');
57
- }
58
-
59
- /**
60
- * Loads the plan from disk. Returns a default empty plan if none exists.
61
- * @returns {Plan}
62
- */
63
- loadPlan() {
64
- if (!existsSync(this.planPath)) {
65
- return {
66
- name: 'Untitled Plan',
67
- phases: [],
68
- createdAt: Date.now(),
69
- updatedAt: Date.now(),
70
- };
71
- }
72
-
73
- try {
74
- const raw = readFileSync(this.planPath, 'utf-8');
75
- return JSON.parse(raw);
76
- } catch {
77
- return {
78
- name: 'Untitled Plan',
79
- phases: [],
80
- createdAt: Date.now(),
81
- updatedAt: Date.now(),
82
- };
83
- }
84
- }
85
-
86
- /**
87
- * Saves the plan to disk.
88
- * @param {Plan} plan
89
- */
90
- savePlan(plan) {
91
- const dir = dirname(this.planPath);
92
- if (!existsSync(dir)) {
93
- mkdirSync(dir, { recursive: true });
94
- }
95
- plan.updatedAt = Date.now();
96
- writeFileSync(this.planPath, JSON.stringify(plan, null, 2), 'utf-8');
97
- }
98
-
99
- /**
100
- * Adds a phase to the plan.
101
- * @param {{ id: string, name: string, status?: string }} phase
102
- */
103
- addPhase(phase) {
104
- if (!phase.id || !phase.name) {
105
- throw new Error('Phase must have an id and name');
106
- }
107
- const plan = this.loadPlan();
108
- const existing = plan.phases.find((p) => p.id === phase.id);
109
- if (existing) {
110
- throw new Error(`Phase "${phase.id}" already exists`);
111
- }
112
- plan.phases.push({
113
- id: phase.id,
114
- name: phase.name,
115
- status: phase.status || 'pending',
116
- tasks: [],
117
- updatedAt: Date.now(),
118
- });
119
- this.savePlan(plan);
120
- }
121
-
122
- /**
123
- * Updates the status of a phase.
124
- * @param {string} phaseId
125
- * @param {string} status
126
- */
127
- updatePhaseStatus(phaseId, status) {
128
- if (!VALID_STATUSES.has(status)) {
129
- throw new Error(`Invalid status "${status}". Must be one of: ${[...VALID_STATUSES].join(', ')}`);
130
- }
131
- const plan = this.loadPlan();
132
- const phase = plan.phases.find((p) => p.id === phaseId);
133
- if (!phase) {
134
- throw new Error(`Phase "${phaseId}" not found`);
135
- }
136
- phase.status = status;
137
- phase.updatedAt = Date.now();
138
- this.savePlan(plan);
139
- }
140
-
141
- /**
142
- * Adds a task to a phase.
143
- * @param {string} phaseId
144
- * @param {{ id: string, name: string, status?: string, assignee?: string }} task
145
- */
146
- addTask(phaseId, task) {
147
- if (!task.id || !task.name) {
148
- throw new Error('Task must have an id and name');
149
- }
150
- const plan = this.loadPlan();
151
- const phase = plan.phases.find((p) => p.id === phaseId);
152
- if (!phase) {
153
- throw new Error(`Phase "${phaseId}" not found`);
154
- }
155
- const existing = phase.tasks.find((t) => t.id === task.id);
156
- if (existing) {
157
- throw new Error(`Task "${task.id}" already exists in phase "${phaseId}"`);
158
- }
159
- phase.tasks.push({
160
- id: task.id,
161
- name: task.name,
162
- status: task.status || 'pending',
163
- assignee: task.assignee || null,
164
- updatedAt: Date.now(),
165
- });
166
- phase.updatedAt = Date.now();
167
- this.savePlan(plan);
168
- }
169
-
170
- /**
171
- * Updates the status of a task within a phase.
172
- * @param {string} phaseId
173
- * @param {string} taskId
174
- * @param {string} status
175
- */
176
- updateTaskStatus(phaseId, taskId, status) {
177
- if (!VALID_STATUSES.has(status)) {
178
- throw new Error(`Invalid status "${status}". Must be one of: ${[...VALID_STATUSES].join(', ')}`);
179
- }
180
- const plan = this.loadPlan();
181
- const phase = plan.phases.find((p) => p.id === phaseId);
182
- if (!phase) {
183
- throw new Error(`Phase "${phaseId}" not found`);
184
- }
185
- const task = phase.tasks.find((t) => t.id === taskId);
186
- if (!task) {
187
- throw new Error(`Task "${taskId}" not found in phase "${phaseId}"`);
188
- }
189
- task.status = status;
190
- task.updatedAt = Date.now();
191
- phase.updatedAt = Date.now();
192
- this.savePlan(plan);
193
- }
194
-
195
- /**
196
- * Calculates overall progress across all phases and tasks.
197
- * @returns {Progress}
198
- */
199
- getProgress() {
200
- const plan = this.loadPlan();
201
- const totalPhases = plan.phases.length;
202
- const completedPhases = plan.phases.filter((p) => p.status === 'completed').length;
203
-
204
- let totalTasks = 0;
205
- let completedTasks = 0;
206
- for (const phase of plan.phases) {
207
- totalTasks += phase.tasks.length;
208
- completedTasks += phase.tasks.filter((t) => t.status === 'completed').length;
209
- }
210
-
211
- const percentComplete =
212
- totalTasks > 0
213
- ? Math.round((completedTasks / totalTasks) * 10000) / 100
214
- : totalPhases > 0
215
- ? Math.round((completedPhases / totalPhases) * 10000) / 100
216
- : 0;
217
-
218
- return { totalPhases, completedPhases, totalTasks, completedTasks, percentComplete };
219
- }
220
-
221
- /**
222
- * Generates a visual progress bar.
223
- *
224
- * @param {Progress} progress
225
- * @param {number} [width=30] — bar width in characters
226
- * @returns {string}
227
- */
228
- formatProgressBar(progress, width = 30) {
229
- const ratio = progress.percentComplete / 100;
230
- const filled = Math.round(ratio * width);
231
- const empty = width - filled;
232
- const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(empty);
233
- return `[${bar}] ${progress.percentComplete.toFixed(1)}%`;
234
- }
235
-
236
- /**
237
- * Generates a detailed progress report.
238
- *
239
- * @param {Progress} [progress]
240
- * @returns {string}
241
- */
242
- formatProgressReport(progress) {
243
- const p = progress || this.getProgress();
244
- const plan = this.loadPlan();
245
- const lines = [];
246
-
247
- lines.push(`=== Plan: ${plan.name} ===`);
248
- lines.push('');
249
- lines.push(`Progress: ${this.formatProgressBar(p)}`);
250
- lines.push(`Phases : ${p.completedPhases}/${p.totalPhases}`);
251
- lines.push(`Tasks : ${p.completedTasks}/${p.totalTasks}`);
252
- lines.push('');
253
-
254
- const statusIcons = {
255
- pending: '[ ]',
256
- in_progress: '[~]',
257
- completed: '[x]',
258
- skipped: '[-]',
259
- };
260
-
261
- for (const phase of plan.phases) {
262
- const icon = statusIcons[phase.status] || '[ ]';
263
- const phaseTasks = phase.tasks.length;
264
- const phaseDone = phase.tasks.filter((t) => t.status === 'completed').length;
265
- lines.push(`${icon} ${phase.name} (${phaseDone}/${phaseTasks} tasks)`);
266
-
267
- for (const task of phase.tasks) {
268
- const taskIcon = statusIcons[task.status] || '[ ]';
269
- const assignee = task.assignee ? ` @${task.assignee}` : '';
270
- lines.push(` ${taskIcon} ${task.name}${assignee}`);
271
- }
272
-
273
- lines.push('');
274
- }
275
-
276
- return lines.join('\n');
277
- }
278
- }