chati-dev 4.2.1 → 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 (222) 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 +8 -7
  23. package/framework/constitution.md +127 -43
  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 +91 -36
  35. package/framework/hooks/license-guard.js +129 -190
  36. package/framework/hooks/mode-governance.js +68 -16
  37. package/framework/hooks/model-governance.js +19 -8
  38. package/framework/hooks/package.json +3 -0
  39. package/framework/hooks/post-dev.js +207 -0
  40. package/framework/hooks/prism-engine.js +288 -105
  41. package/framework/hooks/read-protection.js +37 -9
  42. package/framework/hooks/reasoning-escalator.js +371 -0
  43. package/framework/hooks/reference-trigger.js +117 -0
  44. package/framework/hooks/session-digest.js +94 -20
  45. package/framework/hooks/settings.json +32 -1
  46. package/framework/hooks/style-guard.js +52 -13
  47. package/framework/hooks/team-quality-gate.js +58 -25
  48. package/framework/hooks/undercover-guard.js +34 -13
  49. package/framework/i18n/en.yaml +3 -3
  50. package/framework/i18n/es.yaml +3 -3
  51. package/framework/i18n/fr.yaml +3 -3
  52. package/framework/i18n/pt.yaml +3 -3
  53. package/framework/intelligence/context-engine.md +4 -5
  54. package/framework/intelligence/decision-engine.md +1 -1
  55. package/framework/intelligence/hooks-performance.md +3 -3
  56. package/framework/migrations/v1.0-to-v1.1.yaml +1 -1
  57. package/framework/migrations/v1.4-to-v2.0.yaml +11 -11
  58. package/framework/migrations/v4.0-to-v4.1.yaml +2 -2
  59. package/framework/migrations/v4.2-to-v4.3.yaml +29 -0
  60. package/framework/orchestrator/chati-router.js +387 -0
  61. package/framework/orchestrator/chati-update.md +40 -40
  62. package/framework/orchestrator/chati.md +318 -115
  63. package/framework/scaffold/motion-premium/README.md +89 -0
  64. package/framework/scaffold/motion-premium/app/globals.css.template +400 -0
  65. package/framework/scaffold/motion-premium/app/layout.tsx.template +110 -0
  66. package/framework/scaffold/motion-premium/components/animation/BackgroundCrossfadeProvider.tsx.template +170 -0
  67. package/framework/scaffold/motion-premium/components/animation/LenisProvider.tsx.template +49 -0
  68. package/framework/scaffold/motion-premium/components/animation/PageTransitionWrapper.tsx.template +83 -0
  69. package/framework/scaffold/motion-premium/components/animation/Preloader.tsx.template +171 -0
  70. package/framework/scaffold/motion-premium/components/ui/Container.tsx.template +69 -0
  71. package/framework/scaffold/motion-premium/components/ui/PageSection.tsx.template +74 -0
  72. package/framework/scaffold/motion-premium/lib/animations/gsap.ts.template +112 -0
  73. package/framework/scaffold/motion-premium/lib/animations/refreshCoordinator.ts.template +75 -0
  74. package/framework/scaffold/motion-premium/lib/animations/tokens.ts.template +119 -0
  75. package/framework/scaffold/motion-premium/lib/animations/useGsapContext.ts.template +92 -0
  76. package/framework/scaffold/motion-premium/lib/animations/useScrollSnapStepper.ts.template +265 -0
  77. package/framework/scaffold/motion-premium/lib/animations/useSmoothScroll.ts.template +67 -0
  78. package/framework/scaffold/motion-premium/lib/brand.ts.template +43 -0
  79. package/framework/scaffold/motion-premium/scaffold.yaml +174 -0
  80. package/framework/scaffold/motion-premium-3d/README.md +80 -0
  81. package/framework/scaffold/motion-premium-3d/app/(3d)/scroll-demo/ScrollDemoCanvas.tsx.template +81 -0
  82. package/framework/scaffold/motion-premium-3d/app/(3d)/scroll-demo/ScrollDemoClient.tsx.template +75 -0
  83. package/framework/scaffold/motion-premium-3d/app/(3d)/scroll-demo/page.tsx.template +26 -0
  84. package/framework/scaffold/motion-premium-3d/components/3d/CameraRig.tsx.template +100 -0
  85. package/framework/scaffold/motion-premium-3d/components/3d/CanvasProvider.tsx.template +85 -0
  86. package/framework/scaffold/motion-premium-3d/components/3d/InvalidateOnScroll.tsx.template +51 -0
  87. package/framework/scaffold/motion-premium-3d/components/3d/MeshCrossfade.tsx.template +79 -0
  88. package/framework/scaffold/motion-premium-3d/components/3d/ScrollCrossfade.tsx.template +88 -0
  89. package/framework/scaffold/motion-premium-3d/components/3d/ScrollScene.tsx.template +121 -0
  90. package/framework/scaffold/motion-premium-3d/components/webgl/SceneFallback.tsx.template +65 -0
  91. package/framework/scaffold/motion-premium-3d/components/webgl/WebGLContext.tsx.template +68 -0
  92. package/framework/scaffold/motion-premium-3d/lib/webgl/detect.ts.template +69 -0
  93. package/framework/scaffold/motion-premium-3d/scaffold.yaml +133 -0
  94. package/framework/schemas/session.schema.json +109 -21
  95. package/framework/scripts/reference-capture.js +430 -0
  96. package/framework/scripts/visual-qa.js +674 -0
  97. package/framework/tasks/orchestrator-handoff.md +1 -1
  98. package/framework/tasks/orchestrator-resume.md +1 -1
  99. package/framework/tasks/orchestrator-route.md +1 -1
  100. package/framework/tasks/orchestrator-status.md +3 -3
  101. package/framework/tasks/qa-planning-gate-define.md +1 -1
  102. package/framework/templates/brandbook-html-tmpl.md +1 -1
  103. package/framework/templates/brandbook-tmpl.yaml +1 -1
  104. package/framework/templates/component-spec-tmpl.yaml +1 -1
  105. package/framework/templates/design-token-tmpl.yaml +1 -1
  106. package/framework/templates/icon-system-tmpl.yaml +1 -1
  107. package/framework/templates/team-planning-tasks.yaml +6 -5
  108. package/framework/workflows/brownfield-discovery.yaml +2 -2
  109. package/framework/workflows/brownfield-fullstack.yaml +15 -11
  110. package/framework/workflows/brownfield-service.yaml +14 -10
  111. package/framework/workflows/brownfield-ui.yaml +15 -11
  112. package/framework/workflows/greenfield-fullstack.yaml +16 -13
  113. package/framework/workflows/quick-flow.yaml +3 -3
  114. package/framework/workflows/standard-flow.yaml +12 -9
  115. package/package.json +10 -5
  116. package/src/autonomy/autonomous-gate.js +1 -0
  117. package/src/autonomy/build-state.js +1 -2
  118. package/src/autonomy/progress-reporter.js +1 -1
  119. package/src/config/agent-customizer.js +11 -3
  120. package/src/config/claude-settings-generator.js +226 -0
  121. package/src/config/context-file-generator.js +41 -21
  122. package/src/config/framework-adapter.js +1 -0
  123. package/src/config/gemini-hooks-generator.js +76 -6
  124. package/src/config/mcp-configs.js +1 -0
  125. package/src/context/layers/l1-global.js +2 -1
  126. package/src/dashboard/data-reader.js +4 -3
  127. package/src/dashboard/layout.js +2 -1
  128. package/src/decision/analyzer.js +6 -30
  129. package/src/decision/engine.js +4 -28
  130. package/src/decision/registry-healer.js +3 -2
  131. package/src/decision/registry-updater.js +23 -14
  132. package/src/extensions/loader.js +2 -8
  133. package/src/gates/g1-planning-complete.js +2 -1
  134. package/src/gates/g2-qa-planning.js +2 -1
  135. package/src/gates/g3-implementation.js +2 -1
  136. package/src/gates/g4-qa-implementation.js +3 -2
  137. package/src/gates/g5-deploy-ready.js +2 -1
  138. package/src/health/engine.js +4 -3
  139. package/src/installer/core.js +557 -81
  140. package/src/installer/preflight.js +131 -0
  141. package/src/installer/provider-overlay.js +3 -3
  142. package/src/installer/scaffold-applier.js +358 -0
  143. package/src/installer/templates.js +52 -31
  144. package/src/installer/validator.js +17 -12
  145. package/src/intelligence/registry-manager.js +22 -29
  146. package/src/intelligence/timeline.js +11 -6
  147. package/src/license/commands.js +1 -1
  148. package/src/license/wait.js +102 -0
  149. package/src/memory/agent-memory.js +81 -0
  150. package/src/memory/dream.js +32 -1
  151. package/src/merger/replace-merger.js +28 -15
  152. package/src/orchestrator/agent-selector.js +2 -1
  153. package/src/orchestrator/cli.js +1908 -80
  154. package/src/orchestrator/doctor.js +270 -0
  155. package/src/orchestrator/handoff-engine.js +4 -3
  156. package/src/orchestrator/index.js +2 -0
  157. package/src/orchestrator/pipeline-manager.js +306 -15
  158. package/src/orchestrator/session-manager.js +331 -6
  159. package/src/tasks/handoff.js +3 -2
  160. package/src/telemetry/config.js +4 -3
  161. package/src/telemetry/schema.js +1 -0
  162. package/src/terminal/collector.js +3 -2
  163. package/src/terminal/index.js +1 -2
  164. package/src/terminal/isolation.js +52 -18
  165. package/src/terminal/prompt-builder.js +42 -25
  166. package/src/terminal/run-parallel.js +1 -1
  167. package/src/terminal/run-team.js +3 -3
  168. package/src/terminal/team-task-list.js +43 -4
  169. package/src/upgrade/backup.js +3 -2
  170. package/src/upgrade/checker.js +3 -2
  171. package/src/upgrade/migrator.js +65 -7
  172. package/src/upgrade/tracked-files-detector.js +86 -0
  173. package/src/upgrade/user-messages.js +94 -0
  174. package/src/utils/config-parser.js +2 -1
  175. package/src/utils/feature-flags.js +2 -1
  176. package/src/utils/flatten-entities.js +69 -0
  177. package/src/utils/framework-dir.js +16 -0
  178. package/src/utils/model-id.js +85 -0
  179. package/src/utils/provider-limits.js +84 -23
  180. package/src/utils/schema-validator.js +1 -1
  181. package/src/wizard/i18n.js +5 -4
  182. package/src/wizard/index.js +14 -0
  183. package/assets/logo - c/303/263pia.png +0 -0
  184. package/assets/logo.svg +0 -42
  185. package/assets/logo2.png +0 -0
  186. package/assets/social-preview.png +0 -0
  187. package/scripts/bundle-framework.js +0 -69
  188. package/scripts/changelog-generator.js +0 -222
  189. package/scripts/codebase-mapper.js +0 -728
  190. package/scripts/commit-message-generator.js +0 -167
  191. package/scripts/coverage-analyzer.js +0 -260
  192. package/scripts/dependency-analyzer.js +0 -280
  193. package/scripts/doctor/checks/agents.js +0 -77
  194. package/scripts/doctor/checks/constitution.js +0 -41
  195. package/scripts/doctor/checks/domain-alignment.js +0 -58
  196. package/scripts/doctor/checks/prism-layers.js +0 -84
  197. package/scripts/doctor/checks/registry.js +0 -55
  198. package/scripts/doctor/checks/schemas.js +0 -61
  199. package/scripts/doctor/fixes/reference-fix.js +0 -100
  200. package/scripts/doctor/fixes/registry-fix.js +0 -56
  201. package/scripts/doctor/index.js +0 -212
  202. package/scripts/framework-analyzer.js +0 -308
  203. package/scripts/generate-constitution-domain.js +0 -253
  204. package/scripts/generate-signing-key.js +0 -33
  205. package/scripts/health-check.js +0 -481
  206. package/scripts/ide-sync.js +0 -326
  207. package/scripts/performance-analyzer.js +0 -325
  208. package/scripts/plan-tracker.js +0 -278
  209. package/scripts/populate-entity-registry.js +0 -481
  210. package/scripts/pr-review.js +0 -317
  211. package/scripts/rollback-manager.js +0 -310
  212. package/scripts/semantic-lint.js +0 -328
  213. package/scripts/sign-manifest.js +0 -53
  214. package/scripts/stuck-detector.js +0 -343
  215. package/scripts/test-quality-assessment.js +0 -257
  216. package/scripts/validate-agents.js +0 -368
  217. package/scripts/validate-package.js +0 -367
  218. package/scripts/validate-tasks.js +0 -465
  219. package/src/autonomy/worktree-manager.js +0 -250
  220. package/src/intelligence/decision-engine.js +0 -256
  221. package/src/intelligence/document-sharder.js +0 -221
  222. 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
- }