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