@design-ai/cli 4.56.0 → 4.57.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 (264) hide show
  1. package/.claude-plugin/plugin.json +109 -25
  2. package/CHANGELOG.md +36 -0
  3. package/README.ko.md +9 -26
  4. package/README.md +10 -23
  5. package/cli/bin/design-ai.mjs +1 -0
  6. package/cli/commands/help.mjs +7 -4
  7. package/cli/commands/index.mjs +292 -0
  8. package/cli/commands/learn-help.mjs +149 -0
  9. package/cli/commands/learn-print-profile.mjs +373 -0
  10. package/cli/commands/learn-print-restore.mjs +349 -0
  11. package/cli/commands/learn-print-signals.mjs +453 -0
  12. package/cli/commands/learn.mjs +60 -1281
  13. package/cli/commands/pack.mjs +7 -3
  14. package/cli/commands/prompt.mjs +7 -3
  15. package/cli/commands/search.mjs +94 -1
  16. package/cli/lib/dispatch.mjs +3 -0
  17. package/cli/lib/embedding-index.mjs +199 -0
  18. package/cli/lib/embedding-provider.mjs +121 -0
  19. package/cli/lib/embedding-rerank.mjs +52 -0
  20. package/cli/lib/learn-args.mjs +490 -0
  21. package/cli/lib/learn-backup.mjs +748 -0
  22. package/cli/lib/learn-curation.mjs +612 -0
  23. package/cli/lib/learn-eval.mjs +459 -0
  24. package/cli/lib/learn-profile.mjs +763 -0
  25. package/cli/lib/learn-select.mjs +223 -0
  26. package/cli/lib/learn-shared.mjs +158 -0
  27. package/cli/lib/learn-test-support.mjs +218 -0
  28. package/cli/lib/learn-usage.mjs +360 -0
  29. package/cli/lib/learn.mjs +83 -3694
  30. package/cli/lib/lexical.mjs +137 -0
  31. package/cli/lib/local-config.mjs +110 -0
  32. package/cli/lib/mcp-server.mjs +13 -3
  33. package/cli/lib/pack.mjs +31 -4
  34. package/cli/lib/prompt.mjs +42 -4
  35. package/cli/lib/recall.mjs +193 -0
  36. package/cli/lib/retrieval-index.mjs +0 -0
  37. package/cli/lib/search-ranked.mjs +170 -0
  38. package/cli/lib/search.mjs +11 -1
  39. package/cli/lib/signals-backlog-commands.mjs +673 -0
  40. package/cli/lib/signals-backlog.mjs +361 -0
  41. package/cli/lib/signals-eval.mjs +176 -0
  42. package/cli/lib/signals-readiness.mjs +247 -0
  43. package/cli/lib/signals-registry.mjs +377 -0
  44. package/cli/lib/signals-render.mjs +478 -0
  45. package/cli/lib/signals-shared.mjs +75 -0
  46. package/cli/lib/signals.mjs +16 -2337
  47. package/cli/lib/site-bundle-handoff-expected.mjs +173 -0
  48. package/cli/lib/site-bundle-handoff-runbook-action-summary.mjs +332 -0
  49. package/cli/lib/site-bundle-handoff-runbook-human-lines.mjs +167 -0
  50. package/cli/lib/site-bundle-handoff-runbook-maps.mjs +238 -0
  51. package/cli/lib/site-bundle-handoff-runbook-next-step.mjs +278 -0
  52. package/cli/lib/site-bundle-handoff-runbook.mjs +44 -931
  53. package/cli/lib/site-test-support.mjs +68 -0
  54. package/cli/lib/skill-proposals-apply-commands.mjs +135 -0
  55. package/cli/lib/skill-proposals-apply-contract.mjs +750 -0
  56. package/cli/lib/skill-proposals-apply-plan.mjs +118 -0
  57. package/cli/lib/skill-proposals-generate.mjs +298 -0
  58. package/cli/lib/skill-proposals-render.mjs +532 -0
  59. package/cli/lib/skill-proposals-review.mjs +262 -0
  60. package/cli/lib/skill-proposals.mjs +15 -2046
  61. package/cli/lib/workspace-args.mjs +83 -0
  62. package/cli/lib/workspace-git.mjs +169 -0
  63. package/cli/lib/workspace-learning.mjs +483 -0
  64. package/cli/lib/workspace-repo.mjs +139 -0
  65. package/cli/lib/workspace-report.mjs +283 -0
  66. package/cli/lib/workspace-test-support.mjs +99 -0
  67. package/cli/lib/workspace.mjs +30 -1056
  68. package/docs/AI-LEARNING-PHASE2.md +215 -0
  69. package/docs/DISTRIBUTION.ko.md +2 -2
  70. package/docs/DISTRIBUTION.md +2 -2
  71. package/docs/NEXT-SURFACE-DECISION.md +125 -0
  72. package/docs/PRODUCT-READINESS.md +3 -3
  73. package/docs/RELEASE-GATES.ko.md +35 -0
  74. package/docs/RELEASE-GATES.md +234 -0
  75. package/docs/ROADMAP.md +53 -8
  76. package/docs/external-status.md +6 -8
  77. package/docs/inspection-20260630.md +169 -0
  78. package/docs/integrations/design-ai-mcp-server.md +4 -4
  79. package/docs/reference/ant-design.md +413 -0
  80. package/docs/reference/awesome-design-md.md +439 -0
  81. package/docs/reference/mui.md +783 -0
  82. package/docs/reference/shadcn-ui.md +298 -0
  83. package/examples/component-accordion-actions.md +5 -5
  84. package/examples/component-accordion-details.md +5 -5
  85. package/examples/component-accordion-summary.md +5 -5
  86. package/examples/component-accordion.md +3 -3
  87. package/examples/component-affix.md +1 -1
  88. package/examples/component-alert-dialog.md +1 -1
  89. package/examples/component-alert-title.md +1 -1
  90. package/examples/component-alert.md +3 -3
  91. package/examples/component-anchor.md +1 -1
  92. package/examples/component-app-bar.md +1 -1
  93. package/examples/component-aspect-ratio.md +1 -1
  94. package/examples/component-auto-complete.md +2 -2
  95. package/examples/component-avatar-group.md +5 -5
  96. package/examples/component-avatar.md +3 -3
  97. package/examples/component-back-top.md +1 -1
  98. package/examples/component-backdrop.md +1 -1
  99. package/examples/component-badge.md +3 -3
  100. package/examples/component-border-beam.md +3 -3
  101. package/examples/component-bottom-navigation.md +1 -1
  102. package/examples/component-box.md +1 -1
  103. package/examples/component-breadcrumb.md +3 -3
  104. package/examples/component-button-base.md +3 -3
  105. package/examples/component-button-group.md +2 -2
  106. package/examples/component-button.md +3 -3
  107. package/examples/component-calendar.md +2 -2
  108. package/examples/component-card-actions.md +1 -1
  109. package/examples/component-card-content.md +1 -1
  110. package/examples/component-card-header.md +1 -1
  111. package/examples/component-card-media.md +1 -1
  112. package/examples/component-card.md +3 -3
  113. package/examples/component-carousel.md +2 -2
  114. package/examples/component-cascader.md +1 -1
  115. package/examples/component-chart.md +1 -1
  116. package/examples/component-checkbox.md +3 -3
  117. package/examples/component-click-away-listener.md +1 -1
  118. package/examples/component-code.md +1 -1
  119. package/examples/component-collapsible.md +1 -1
  120. package/examples/component-color-picker.md +1 -1
  121. package/examples/component-combobox.md +1 -1
  122. package/examples/component-command.md +1 -1
  123. package/examples/component-config-provider.md +3 -3
  124. package/examples/component-context-menu.md +1 -1
  125. package/examples/component-css-baseline.md +3 -3
  126. package/examples/component-date-picker.md +2 -2
  127. package/examples/component-descriptions.md +1 -1
  128. package/examples/component-dialog-actions.md +1 -1
  129. package/examples/component-dialog-content-text.md +1 -1
  130. package/examples/component-dialog-content.md +1 -1
  131. package/examples/component-dialog-title.md +1 -1
  132. package/examples/component-dialog.md +2 -2
  133. package/examples/component-divider.md +3 -3
  134. package/examples/component-drawer.md +3 -3
  135. package/examples/component-dropdown.md +3 -3
  136. package/examples/component-empty.md +2 -2
  137. package/examples/component-fade.md +1 -1
  138. package/examples/component-field.md +1 -1
  139. package/examples/component-filled-input.md +1 -1
  140. package/examples/component-flex.md +1 -1
  141. package/examples/component-float-button.md +2 -2
  142. package/examples/component-form-control-label.md +1 -1
  143. package/examples/component-form-control.md +1 -1
  144. package/examples/component-form-controls.md +1 -1
  145. package/examples/component-form-group.md +1 -1
  146. package/examples/component-form-helper-text.md +1 -1
  147. package/examples/component-form-label.md +1 -1
  148. package/examples/component-form.md +2 -2
  149. package/examples/component-grid.md +2 -2
  150. package/examples/component-grow.md +1 -1
  151. package/examples/component-hover-card.md +1 -1
  152. package/examples/component-icon-button.md +1 -1
  153. package/examples/component-icon.md +1 -1
  154. package/examples/component-image-list.md +1 -1
  155. package/examples/component-image.md +1 -1
  156. package/examples/component-input-adornment.md +1 -1
  157. package/examples/component-input-base.md +1 -1
  158. package/examples/component-input-number.md +1 -1
  159. package/examples/component-input-otp.md +2 -2
  160. package/examples/component-input.md +3 -3
  161. package/examples/component-item.md +1 -1
  162. package/examples/component-label.md +1 -1
  163. package/examples/component-layout.md +1 -1
  164. package/examples/component-link.md +1 -1
  165. package/examples/component-list-item-avatar.md +1 -1
  166. package/examples/component-list-item-button.md +1 -1
  167. package/examples/component-list-item-icon.md +1 -1
  168. package/examples/component-list-item-text.md +1 -1
  169. package/examples/component-list-item.md +1 -1
  170. package/examples/component-list-subheader.md +1 -1
  171. package/examples/component-list.md +2 -2
  172. package/examples/component-masonry.md +1 -1
  173. package/examples/component-mentions.md +1 -1
  174. package/examples/component-menu-item.md +1 -1
  175. package/examples/component-menu-list.md +1 -1
  176. package/examples/component-menu.md +1 -1
  177. package/examples/component-menubar.md +1 -1
  178. package/examples/component-message.md +1 -1
  179. package/examples/component-mobile-stepper.md +1 -1
  180. package/examples/component-modal.md +5 -5
  181. package/examples/component-navigation-menu.md +1 -1
  182. package/examples/component-notification.md +1 -1
  183. package/examples/component-outlined-input.md +1 -1
  184. package/examples/component-pagination.md +3 -3
  185. package/examples/component-paper.md +1 -1
  186. package/examples/component-popconfirm.md +1 -1
  187. package/examples/component-popover.md +3 -3
  188. package/examples/component-popper.md +1 -1
  189. package/examples/component-progress.md +2 -2
  190. package/examples/component-qr-code.md +1 -1
  191. package/examples/component-radio.md +3 -3
  192. package/examples/component-rate.md +2 -2
  193. package/examples/component-resizable.md +1 -1
  194. package/examples/component-result.md +1 -1
  195. package/examples/component-scroll-area.md +1 -1
  196. package/examples/component-segmented.md +3 -3
  197. package/examples/component-select.md +3 -3
  198. package/examples/component-separator.md +1 -1
  199. package/examples/component-sheet.md +1 -1
  200. package/examples/component-sidebar.md +1 -1
  201. package/examples/component-skeleton.md +3 -3
  202. package/examples/component-slide.md +1 -1
  203. package/examples/component-slider.md +3 -3
  204. package/examples/component-snackbar-content.md +1 -1
  205. package/examples/component-snackbar.md +1 -1
  206. package/examples/component-sonner.md +1 -1
  207. package/examples/component-space.md +1 -1
  208. package/examples/component-speed-dial-action.md +1 -1
  209. package/examples/component-speed-dial.md +1 -1
  210. package/examples/component-spin.md +2 -2
  211. package/examples/component-spinner.md +1 -1
  212. package/examples/component-splitter.md +2 -2
  213. package/examples/component-stack.md +1 -1
  214. package/examples/component-statistic.md +1 -1
  215. package/examples/component-step-button.md +4 -4
  216. package/examples/component-step-connector.md +4 -4
  217. package/examples/component-step-content.md +1 -1
  218. package/examples/component-step-icon.md +1 -1
  219. package/examples/component-step-label.md +1 -1
  220. package/examples/component-step.md +2 -2
  221. package/examples/component-steps.md +2 -2
  222. package/examples/component-swipeable-drawer.md +1 -1
  223. package/examples/component-switch.md +3 -3
  224. package/examples/component-tab-scroll-button.md +5 -5
  225. package/examples/component-tab.md +1 -1
  226. package/examples/component-table-body.md +1 -1
  227. package/examples/component-table-cell.md +1 -1
  228. package/examples/component-table-container.md +1 -1
  229. package/examples/component-table-footer.md +1 -1
  230. package/examples/component-table-head.md +1 -1
  231. package/examples/component-table-pagination.md +1 -1
  232. package/examples/component-table-row.md +1 -1
  233. package/examples/component-table-sort-label.md +1 -1
  234. package/examples/component-table.md +2 -2
  235. package/examples/component-tabs.md +3 -3
  236. package/examples/component-tag-badge.md +2 -2
  237. package/examples/component-tag.md +1 -1
  238. package/examples/component-textarea-autosize.md +1 -1
  239. package/examples/component-textarea.md +1 -1
  240. package/examples/component-time-picker.md +1 -1
  241. package/examples/component-timeline.md +1 -1
  242. package/examples/component-toast.md +4 -4
  243. package/examples/component-toggle-button.md +1 -1
  244. package/examples/component-toggle.md +1 -1
  245. package/examples/component-toolbar.md +1 -1
  246. package/examples/component-tooltip.md +3 -3
  247. package/examples/component-tour.md +1 -1
  248. package/examples/component-transfer.md +1 -1
  249. package/examples/component-tree-select.md +1 -1
  250. package/examples/component-tree.md +1 -1
  251. package/examples/component-typography.md +2 -2
  252. package/examples/component-upload.md +1 -1
  253. package/examples/component-watermark.md +1 -1
  254. package/examples/component-zoom.md +1 -1
  255. package/knowledge/COVERAGE.md +4 -3
  256. package/knowledge/components/INDEX.md +202 -202
  257. package/knowledge/patterns/brand-references.md +72 -72
  258. package/package.json +1 -1
  259. package/tools/audit/local-ci.py +16 -1
  260. package/tools/audit/package-smoke.py +611 -9
  261. package/tools/audit/registry-smoke.py +534 -0
  262. package/tools/audit/release-metadata.py +47 -1
  263. package/tools/audit/smoke_assertions.py +915 -13
  264. package/tools/migrations/refs-links-to-reference-pages.py +179 -0
@@ -0,0 +1,349 @@
1
+ // Human-readable output for learn diff/restore/eval/init results and strict exits.
2
+
3
+ import { dim, header, info } from "../lib/log.mjs";
4
+
5
+ export function printDiff(payload) {
6
+ header("design-ai learn", "Learning profile diff");
7
+ info(`File: ${payload.file}`);
8
+ info(`Compare: ${payload.source}`);
9
+ info(`Profile entries: ${payload.profileCount}`);
10
+ info(`Comparison entries: ${payload.comparisonCount}`);
11
+ info(`Profile-only: ${payload.profileOnlyCount}`);
12
+ info(`Comparison-only: ${payload.comparisonOnlyCount}`);
13
+ info(`Metadata changes: ${payload.metadataChangedCount}`);
14
+ info(`ID conflicts: ${payload.idConflictCount}`);
15
+ info(`Profile audit: ${payload.profileAuditSummary.status} (${payload.profileAuditSummary.failures} failure(s), ${payload.profileAuditSummary.warnings} warning(s))`);
16
+ info(`Comparison audit: ${payload.comparisonAuditSummary.status} (${payload.comparisonAuditSummary.failures} failure(s), ${payload.comparisonAuditSummary.warnings} warning(s))`);
17
+ console.log();
18
+
19
+ if (
20
+ payload.profileOnly.length === 0
21
+ && payload.comparisonOnly.length === 0
22
+ && payload.metadataChanged.length === 0
23
+ && payload.idConflicts.length === 0
24
+ ) {
25
+ console.log("Profiles match by category, normalized text, id, source, and createdAt metadata.");
26
+ }
27
+
28
+ if (payload.profileOnly.length > 0) {
29
+ console.log("Profile-only entries:");
30
+ for (const entry of payload.profileOnly) {
31
+ console.log(`- ${entry.id}: [${entry.category}] ${entry.textPreview}`);
32
+ }
33
+ console.log();
34
+ }
35
+
36
+ if (payload.comparisonOnly.length > 0) {
37
+ console.log("Comparison-only entries:");
38
+ for (const entry of payload.comparisonOnly) {
39
+ console.log(`- ${entry.id}: [${entry.category}] ${entry.textPreview}`);
40
+ }
41
+ console.log();
42
+ }
43
+
44
+ if (payload.metadataChanged.length > 0) {
45
+ console.log("Metadata changes:");
46
+ for (const item of payload.metadataChanged) {
47
+ console.log(`- ${item.profile.id}: ${item.changedFields.join(", ")}`);
48
+ console.log(` ${dim(`profile ${item.profile.source} · ${item.profile.createdAt}`)}`);
49
+ console.log(` ${dim(`comparison ${item.comparison.source} · ${item.comparison.createdAt}`)}`);
50
+ }
51
+ console.log();
52
+ }
53
+
54
+ if (payload.idConflicts.length > 0) {
55
+ console.log("ID conflicts:");
56
+ for (const item of payload.idConflicts) {
57
+ console.log(`- ${item.id}`);
58
+ console.log(` profile: [${item.profile.category}] ${item.profile.textPreview}`);
59
+ console.log(` comparison: [${item.comparison.category}] ${item.comparison.textPreview}`);
60
+ }
61
+ console.log();
62
+ }
63
+
64
+ if (payload.recommendations.length > 0) {
65
+ console.log("Recommendations:");
66
+ for (const recommendation of payload.recommendations) {
67
+ console.log(`- ${recommendation.level}: ${recommendation.text}`);
68
+ }
69
+ console.log();
70
+ }
71
+
72
+ console.log("No changes made. Use `design-ai learn --import --dry-run` if comparison-only entries should be added.");
73
+ }
74
+
75
+ export function printRestore(payload) {
76
+ header("design-ai learn", payload.dryRun ? "Learning restore preview" : "Learning restore applied");
77
+ info(`File: ${payload.file}`);
78
+ info(`Source: ${payload.source}`);
79
+ info(`Restorable: ${payload.restorable ? "yes" : "no"}`);
80
+ info(`Previous entries: ${payload.previousCount}`);
81
+ info(`Restored entries: ${payload.restoredCount}`);
82
+ info(`${payload.dryRun ? "Would remove" : "Removed"}: ${payload.removedCount}`);
83
+ info(`${payload.dryRun ? "Would add" : "Added"}: ${payload.addedCount}`);
84
+ info(`Metadata changes: ${payload.metadataChangedCount}`);
85
+ info(`ID conflicts: ${payload.idConflictCount}`);
86
+ info(`${payload.dryRun ? "Rollback backup target" : "Rollback backup"}: ${payload.backupFile}`);
87
+ info(`Backup created: ${payload.backupCreated ? "yes" : "no"}`);
88
+ info(`Restore audit: ${payload.auditSummary.status} (${payload.auditSummary.failures} failure(s), ${payload.auditSummary.warnings} warning(s))`);
89
+ console.log();
90
+
91
+ if (payload.issues.length > 0) {
92
+ console.log("Restore source issues:");
93
+ for (const issue of payload.issues) {
94
+ const entry = issue.entryId ? ` (${issue.entryId})` : "";
95
+ console.log(`- ${issue.level.toUpperCase()} ${issue.code}${entry}: ${issue.message}`);
96
+ }
97
+ console.log();
98
+ }
99
+
100
+ if (!payload.restorable) {
101
+ console.log("No changes made. Fix the restore source audit failures before applying restore.");
102
+ return;
103
+ }
104
+
105
+ if (payload.diff.profileOnly.length > 0) {
106
+ console.log(payload.dryRun ? "Entries that would be removed:" : "Removed entries:");
107
+ for (const entry of payload.diff.profileOnly) {
108
+ console.log(`- ${entry.id}: [${entry.category}] ${entry.textPreview}`);
109
+ }
110
+ console.log();
111
+ }
112
+
113
+ if (payload.diff.comparisonOnly.length > 0) {
114
+ console.log(payload.dryRun ? "Entries that would be added:" : "Added entries:");
115
+ for (const entry of payload.diff.comparisonOnly) {
116
+ console.log(`- ${entry.id}: [${entry.category}] ${entry.textPreview}`);
117
+ }
118
+ console.log();
119
+ }
120
+
121
+ if (payload.idConflictCount > 0) {
122
+ console.log("ID conflicts:");
123
+ for (const item of payload.diff.idConflicts) {
124
+ console.log(`- ${item.id}`);
125
+ console.log(` active: [${item.profile.category}] ${item.profile.textPreview}`);
126
+ console.log(` restore: [${item.comparison.category}] ${item.comparison.textPreview}`);
127
+ }
128
+ console.log();
129
+ }
130
+
131
+ if (payload.dryRun) {
132
+ console.log("No changes made. Re-run with `--yes` instead of `--dry-run` to replace the active learning profile.");
133
+ console.log(`Rollback backup will be written before apply: ${payload.backupFile}`);
134
+ } else {
135
+ console.log(`Rollback preview: ${payload.rollbackCommand}`);
136
+ }
137
+ }
138
+
139
+ export function printRestoreBackups(payload) {
140
+ header("design-ai learn", "Learning restore rollback backups");
141
+ info(`File: ${payload.file}`);
142
+ info(`Directory: ${payload.directory}`);
143
+ info(`Pattern: ${payload.pattern}`);
144
+ info(`Backups: ${payload.count}/${payload.totalCount}`);
145
+ info(`Limit: ${payload.limit}`);
146
+ console.log();
147
+
148
+ if (payload.backups.length === 0) {
149
+ console.log("No restore rollback backups found for this learning profile.");
150
+ console.log("Confirmed `design-ai learn --restore --yes` runs create sibling rollback backups automatically.");
151
+ return;
152
+ }
153
+
154
+ for (let i = 0; i < payload.backups.length; i += 1) {
155
+ const backup = payload.backups[i];
156
+ console.log(`${i + 1}. ${backup.name}`);
157
+ console.log(` ${dim(`created ${backup.createdAt || "unknown"} · modified ${backup.modifiedAt} · ${backup.sizeBytes} bytes`)}`);
158
+ console.log(` ${dim(`entries ${backup.entryCount} · updatedAt ${backup.updatedAt || "unknown"} · audit ${backup.auditSummary.status} (${backup.auditSummary.failures} failure(s), ${backup.auditSummary.warnings} warning(s))`)}`);
159
+ if (backup.issueCount > 0) {
160
+ console.log(` ${dim(`issues ${backup.issueCount}`)}`);
161
+ }
162
+ console.log(` Preview: ${backup.restorePreviewCommand}`);
163
+ }
164
+
165
+ console.log();
166
+ console.log("No changes made. Run the preview command first, then add `--yes` only after reviewing the restore diff.");
167
+ }
168
+
169
+ export function printRestoreBackupPrune(payload) {
170
+ const prune = payload.prune;
171
+ header("design-ai learn", prune.dryRun ? "Learning restore backup prune preview" : "Learning restore backup prune applied");
172
+ info(`File: ${payload.file}`);
173
+ info(`Directory: ${payload.directory}`);
174
+ info(`Pattern: ${payload.pattern}`);
175
+ info(`Backups: ${payload.totalCount}`);
176
+ info(`Keep newest: ${prune.keep}`);
177
+ info(`Prune candidates: ${prune.candidateCount}`);
178
+ if (!prune.dryRun) {
179
+ info(`Deleted: ${prune.deletedCount}`);
180
+ if (prune.failureCount > 0) {
181
+ info(`Failures: ${prune.failureCount}`);
182
+ }
183
+ }
184
+ console.log();
185
+
186
+ if (prune.candidateCount === 0) {
187
+ console.log("No restore rollback backups are old enough to prune.");
188
+ console.log("No changes made.");
189
+ return;
190
+ }
191
+
192
+ const candidateLabel = prune.dryRun ? "Would delete:" : "Deleted:";
193
+ const rows = prune.dryRun ? prune.candidates : prune.deleted;
194
+ console.log(candidateLabel);
195
+ for (const backup of rows) {
196
+ console.log(`- ${backup.name}`);
197
+ console.log(` ${dim(`created ${backup.createdAt || "unknown"} · modified ${backup.modifiedAt} · ${backup.sizeBytes} bytes · audit ${backup.auditSummary.status}`)}`);
198
+ }
199
+
200
+ if (prune.failures.length > 0) {
201
+ console.log();
202
+ console.log("Delete failures:");
203
+ for (const failure of prune.failures) {
204
+ console.log(`- ${failure.name}: ${failure.message}`);
205
+ }
206
+ }
207
+
208
+ console.log();
209
+ if (prune.dryRun) {
210
+ console.log("No changes made. Re-run with `--yes` after reviewing the prune candidates.");
211
+ } else if (prune.failureCount > 0) {
212
+ console.log("Some backup files could not be deleted. Review the failure list before retrying.");
213
+ } else {
214
+ console.log("Prune complete. Active learning profile was not changed.");
215
+ }
216
+ }
217
+
218
+ export function printEval(payload) {
219
+ header("design-ai learn", "Local learning eval report");
220
+ info(`File: ${payload.file}`);
221
+ info(`Checkpoint: ${payload.source}`);
222
+ info(`Status: ${payload.status}`);
223
+ info(`Cases: ${payload.caseCount}`);
224
+ info(`Passed: ${payload.passed}`);
225
+ info(`Warned: ${payload.warned}`);
226
+ info(`Failed: ${payload.failed}`);
227
+ info(`Profile entries: ${payload.profileEntryCount}`);
228
+ info(`Default limit: ${payload.defaultLimit}`);
229
+ if (payload.defaultCategory) info(`Default category: ${payload.defaultCategory}`);
230
+ console.log();
231
+
232
+ for (const item of payload.cases) {
233
+ const route = item.routeId ? ` / ${item.routeId}` : "";
234
+ const category = item.category ? ` / ${item.category}` : "";
235
+ console.log(`- ${item.id}${route}${category}: ${item.status}`);
236
+ console.log(` ${dim(`briefHash ${item.briefHash} · matched ${item.matchedCount}/${item.candidateCount} · selected ${item.selectedEntryIds.join(", ") || "none"} · fallback ${item.fallbackCount}`)}`);
237
+ if (item.missingExpectedIds.length > 0) {
238
+ console.log(` missing expected: ${item.missingExpectedIds.join(", ")}`);
239
+ }
240
+ if (item.unexpectedAvoidedIds.length > 0) {
241
+ console.log(` avoided selected: ${item.unexpectedAvoidedIds.join(", ")}`);
242
+ }
243
+ for (const issue of item.issues) {
244
+ console.log(` ${issue.level.toUpperCase()} ${issue.code}: ${issue.message}`);
245
+ }
246
+ }
247
+
248
+ if (payload.recommendations.length > 0) {
249
+ console.log();
250
+ console.log("Recommendations:");
251
+ for (const recommendation of payload.recommendations) {
252
+ console.log(`- ${recommendation.level}: ${recommendation.text}`);
253
+ }
254
+ }
255
+
256
+ console.log();
257
+ console.log("Privacy: eval reports expose brief hashes and selected ids, not raw brief text.");
258
+ }
259
+
260
+ export function printEvalTemplate(payload) {
261
+ header("design-ai learn", "Learning eval checkpoint template");
262
+ info(`File: ${payload.sourceProfile.file}`);
263
+ info(`Profile entries: ${payload.sourceProfile.entryCount}`);
264
+ info(`Cases: ${payload.caseCount}`);
265
+ info(`Limit: ${payload.sourceProfile.limit}`);
266
+ if (payload.sourceProfile.category) info(`Category: ${payload.sourceProfile.category}`);
267
+ if (payload.sourceProfile.query) info(`Query: ${payload.sourceProfile.query}`);
268
+ console.log();
269
+
270
+ if (payload.cases.length === 0) {
271
+ console.log("No checkpoint cases generated.");
272
+ } else {
273
+ console.log("Generated cases:");
274
+ for (const item of payload.cases) {
275
+ const category = item.category ? ` / ${item.category}` : "";
276
+ console.log(`- ${item.id}${category}: expects ${item.expectedSelectedIds.join(", ")}`);
277
+ }
278
+ }
279
+
280
+ if (payload.recommendations.length > 0) {
281
+ console.log();
282
+ console.log("Recommendations:");
283
+ for (const recommendation of payload.recommendations) {
284
+ console.log(`- ${recommendation.level}: ${recommendation.text}`);
285
+ }
286
+ }
287
+
288
+ console.log();
289
+ console.log("Privacy: checkpoint templates store raw brief text so they can be re-run locally. Review before sharing.");
290
+ }
291
+
292
+ export function applyEvalStrictExit(parsed, payload) {
293
+ if (parsed.strict && payload.status !== "pass") {
294
+ process.exitCode = 1;
295
+ }
296
+ }
297
+
298
+ export function applySignalsStrictExit(parsed, payload) {
299
+ if (
300
+ parsed.strict
301
+ && (payload.status !== "pass" || payload.agentDevelopment?.status !== "pass")
302
+ ) {
303
+ process.exitCode = 1;
304
+ }
305
+ }
306
+
307
+ export function applyAgentBacklogStrictExit(parsed, payload) {
308
+ if (parsed.strict && (payload.status !== "pass" || payload.signalStatus === "fail")) {
309
+ process.exitCode = 1;
310
+ }
311
+ }
312
+
313
+ export function applySkillProposalsStrictExit(parsed, payload) {
314
+ if (parsed.strict && payload.status !== "pass") {
315
+ process.exitCode = 1;
316
+ }
317
+ }
318
+
319
+ export function printInit(payload) {
320
+ header("design-ai learn", payload.dryRun ? "Learning profile init preview" : "Learning profile init applied");
321
+ info(`File: ${payload.file}`);
322
+ info(`Candidates: ${payload.candidateCount}`);
323
+ info(`Added: ${payload.addedCount}`);
324
+ info(`Skipped: ${payload.skippedCount}`);
325
+ info(`Entries: ${payload.count}`);
326
+ console.log();
327
+
328
+ if (payload.entries.length > 0) {
329
+ console.log(payload.dryRun ? "Would add:" : "Added:");
330
+ for (const entry of payload.entries) {
331
+ console.log(`- [${entry.category}] ${entry.text}`);
332
+ }
333
+ } else {
334
+ console.log("No starter learning entries to add.");
335
+ }
336
+
337
+ if (payload.skipped.length > 0) {
338
+ console.log();
339
+ console.log("Skipped:");
340
+ for (const skipped of payload.skipped) {
341
+ console.log(`- [${skipped.category}] ${skipped.reason}: ${skipped.textPreview}`);
342
+ }
343
+ }
344
+
345
+ if (payload.dryRun) {
346
+ console.log();
347
+ console.log("No changes made. Re-run with `--yes` to create the starter learning profile.");
348
+ }
349
+ }