@jack200714/mafw 4.5.1 → 4.5.2

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 (320) hide show
  1. package/README.md +5 -2
  2. package/bin/mafw.js +16 -14
  3. package/package.json +1 -7
  4. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +0 -2
  5. package/.opencode/mafw/STATUS.md +0 -6
  6. package/.opencode/mafw/ledger.md +0 -20
  7. package/.opencode/mafw/memory/.harmonic_index.json +0 -28
  8. package/.opencode/mafw/memory/.review_queue.json +0 -1
  9. package/.opencode/mafw/memory/tier3/parametric.json +0 -13
  10. package/.opencode/mafw/memory/tier3/test-goal.json +0 -19
  11. package/.opencode/mafw/memory-index.json +0 -6
  12. package/.opencode/mafw/parametric/base-skill-manifest.yaml +0 -2
  13. package/.opencode/mafw/waves.json +0 -4
  14. package/.opencode/opencode.json +0 -3
  15. package/.opencode/plugins/mafw-plugin.ts +0 -8
  16. package/.opencode/skills/banner-design/SKILL.md +0 -196
  17. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +0 -118
  18. package/.opencode/skills/brand/SKILL.md +0 -97
  19. package/.opencode/skills/brand/references/approval-checklist.md +0 -169
  20. package/.opencode/skills/brand/references/asset-organization.md +0 -157
  21. package/.opencode/skills/brand/references/brand-guideline-template.md +0 -140
  22. package/.opencode/skills/brand/references/color-palette-management.md +0 -186
  23. package/.opencode/skills/brand/references/consistency-checklist.md +0 -94
  24. package/.opencode/skills/brand/references/logo-usage-rules.md +0 -185
  25. package/.opencode/skills/brand/references/messaging-framework.md +0 -85
  26. package/.opencode/skills/brand/references/typography-specifications.md +0 -214
  27. package/.opencode/skills/brand/references/update.md +0 -118
  28. package/.opencode/skills/brand/references/visual-identity.md +0 -96
  29. package/.opencode/skills/brand/references/voice-framework.md +0 -88
  30. package/.opencode/skills/brand/scripts/extract-colors.cjs +0 -341
  31. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +0 -349
  32. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +0 -248
  33. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +0 -52
  34. package/.opencode/skills/brand/scripts/validate-asset.cjs +0 -387
  35. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +0 -275
  36. package/.opencode/skills/design/SKILL.md +0 -313
  37. package/.opencode/skills/design/data/cip/deliverables.csv +0 -51
  38. package/.opencode/skills/design/data/cip/industries.csv +0 -21
  39. package/.opencode/skills/design/data/cip/mockup-contexts.csv +0 -21
  40. package/.opencode/skills/design/data/cip/styles.csv +0 -21
  41. package/.opencode/skills/design/data/icon/styles.csv +0 -16
  42. package/.opencode/skills/design/data/logo/colors.csv +0 -56
  43. package/.opencode/skills/design/data/logo/industries.csv +0 -56
  44. package/.opencode/skills/design/data/logo/styles.csv +0 -56
  45. package/.opencode/skills/design/references/banner-sizes-and-styles.md +0 -118
  46. package/.opencode/skills/design/references/cip-deliverable-guide.md +0 -95
  47. package/.opencode/skills/design/references/cip-design.md +0 -121
  48. package/.opencode/skills/design/references/cip-prompt-engineering.md +0 -84
  49. package/.opencode/skills/design/references/cip-style-guide.md +0 -68
  50. package/.opencode/skills/design/references/design-routing.md +0 -207
  51. package/.opencode/skills/design/references/icon-design.md +0 -122
  52. package/.opencode/skills/design/references/logo-color-psychology.md +0 -101
  53. package/.opencode/skills/design/references/logo-design.md +0 -92
  54. package/.opencode/skills/design/references/logo-prompt-engineering.md +0 -158
  55. package/.opencode/skills/design/references/logo-style-guide.md +0 -109
  56. package/.opencode/skills/design/references/slides-copywriting-formulas.md +0 -84
  57. package/.opencode/skills/design/references/slides-create.md +0 -4
  58. package/.opencode/skills/design/references/slides-html-template.md +0 -295
  59. package/.opencode/skills/design/references/slides-layout-patterns.md +0 -137
  60. package/.opencode/skills/design/references/slides-strategies.md +0 -94
  61. package/.opencode/skills/design/references/slides.md +0 -42
  62. package/.opencode/skills/design/references/social-photos-design.md +0 -329
  63. package/.opencode/skills/design/scripts/cip/core.py +0 -215
  64. package/.opencode/skills/design/scripts/cip/generate.py +0 -484
  65. package/.opencode/skills/design/scripts/cip/render-html.py +0 -424
  66. package/.opencode/skills/design/scripts/cip/search.py +0 -127
  67. package/.opencode/skills/design/scripts/icon/generate.py +0 -487
  68. package/.opencode/skills/design/scripts/logo/core.py +0 -175
  69. package/.opencode/skills/design/scripts/logo/generate.py +0 -362
  70. package/.opencode/skills/design/scripts/logo/search.py +0 -114
  71. package/.opencode/skills/design-system/SKILL.md +0 -244
  72. package/.opencode/skills/design-system/data/slide-backgrounds.csv +0 -11
  73. package/.opencode/skills/design-system/data/slide-charts.csv +0 -26
  74. package/.opencode/skills/design-system/data/slide-color-logic.csv +0 -14
  75. package/.opencode/skills/design-system/data/slide-copy.csv +0 -26
  76. package/.opencode/skills/design-system/data/slide-layout-logic.csv +0 -16
  77. package/.opencode/skills/design-system/data/slide-layouts.csv +0 -26
  78. package/.opencode/skills/design-system/data/slide-strategies.csv +0 -16
  79. package/.opencode/skills/design-system/data/slide-typography.csv +0 -15
  80. package/.opencode/skills/design-system/references/component-specs.md +0 -236
  81. package/.opencode/skills/design-system/references/component-tokens.md +0 -214
  82. package/.opencode/skills/design-system/references/primitive-tokens.md +0 -203
  83. package/.opencode/skills/design-system/references/semantic-tokens.md +0 -215
  84. package/.opencode/skills/design-system/references/states-and-variants.md +0 -241
  85. package/.opencode/skills/design-system/references/tailwind-integration.md +0 -251
  86. package/.opencode/skills/design-system/references/token-architecture.md +0 -224
  87. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +0 -99
  88. package/.opencode/skills/design-system/scripts/fetch-background.py +0 -317
  89. package/.opencode/skills/design-system/scripts/generate-slide.py +0 -770
  90. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +0 -205
  91. package/.opencode/skills/design-system/scripts/html-token-validator.py +0 -327
  92. package/.opencode/skills/design-system/scripts/search-slides.py +0 -218
  93. package/.opencode/skills/design-system/scripts/slide-token-validator.py +0 -35
  94. package/.opencode/skills/design-system/scripts/slide_search_core.py +0 -453
  95. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +0 -48
  96. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +0 -246
  97. package/.opencode/skills/design-system/templates/design-tokens-starter.json +0 -143
  98. package/.opencode/skills/frontend-design/LICENSE.txt +0 -21
  99. package/.opencode/skills/frontend-design/SKILL.md +0 -115
  100. package/.opencode/skills/mafw-automation-interview/SKILL.md +0 -43
  101. package/.opencode/skills/mafw-cli-scanner/SKILL.md +0 -37
  102. package/.opencode/skills/mafw-compression-verifier/SKILL.md +0 -52
  103. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +0 -170
  104. package/.opencode/skills/mafw-execute/SKILL.md +0 -62
  105. package/.opencode/skills/mafw-gateway-restart/SKILL.md +0 -87
  106. package/.opencode/skills/mafw-github-scanner/SKILL.md +0 -38
  107. package/.opencode/skills/mafw-goal/SKILL.md +0 -76
  108. package/.opencode/skills/mafw-interview/SKILL.md +0 -68
  109. package/.opencode/skills/mafw-memory-extractor/SKILL.md +0 -65
  110. package/.opencode/skills/mafw-plan/SKILL.md +0 -58
  111. package/.opencode/skills/mafw-review/SKILL.md +0 -85
  112. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +0 -791
  113. package/.opencode/skills/slides/SKILL.md +0 -40
  114. package/.opencode/skills/slides/references/copywriting-formulas.md +0 -84
  115. package/.opencode/skills/slides/references/create.md +0 -4
  116. package/.opencode/skills/slides/references/html-template.md +0 -295
  117. package/.opencode/skills/slides/references/layout-patterns.md +0 -137
  118. package/.opencode/skills/slides/references/slide-strategies.md +0 -94
  119. package/.opencode/skills/ui-styling/LICENSE.txt +0 -202
  120. package/.opencode/skills/ui-styling/SKILL.md +0 -324
  121. package/.opencode/skills/ui-styling/references/canvas-design-system.md +0 -320
  122. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +0 -471
  123. package/.opencode/skills/ui-styling/references/shadcn-components.md +0 -424
  124. package/.opencode/skills/ui-styling/references/shadcn-theming.md +0 -373
  125. package/.opencode/skills/ui-styling/references/tailwind-customization.md +0 -483
  126. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +0 -382
  127. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +0 -455
  128. package/.opencode/skills/ui-styling/scripts/requirements.txt +0 -17
  129. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +0 -308
  130. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +0 -473
  131. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +0 -1
  132. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +0 -3
  133. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +0 -266
  134. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +0 -394
  135. package/.opencode/skills/ui-ux-pro-max/SKILL.md +0 -388
  136. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +0 -31
  137. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +0 -26
  138. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +0 -193
  139. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +0 -1924
  140. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +0 -106
  141. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +0 -35
  142. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +0 -17
  143. package/.opencode/skills/ui-ux-pro-max/data/products.csv +0 -193
  144. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  145. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +0 -51
  146. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
  147. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +0 -57
  148. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  149. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  150. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +0 -76
  151. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  152. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +0 -51
  153. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  154. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -71
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +0 -54
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +0 -60
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +0 -56
  164. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  165. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +0 -60
  166. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +0 -57
  167. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +0 -85
  168. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +0 -75
  169. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -162
  170. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  171. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +0 -464
  172. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +0 -1479
  173. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +0 -162
  174. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +0 -134
  175. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +0 -159
  176. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +0 -114
  177. package/dist/hooks/bash-python-guide.d.ts +0 -4
  178. package/dist/hooks/bash-python-guide.d.ts.map +0 -1
  179. package/dist/hooks/bash-python-guide.js +0 -67
  180. package/dist/hooks/bash-python-guide.js.map +0 -1
  181. package/dist/hooks/handoff.d.ts +0 -9
  182. package/dist/hooks/handoff.d.ts.map +0 -1
  183. package/dist/hooks/handoff.js +0 -8
  184. package/dist/hooks/handoff.js.map +0 -1
  185. package/dist/hooks/hook-manager.d.ts +0 -32
  186. package/dist/hooks/hook-manager.d.ts.map +0 -1
  187. package/dist/hooks/hook-manager.js +0 -91
  188. package/dist/hooks/hook-manager.js.map +0 -1
  189. package/dist/hooks/llm-after.d.ts +0 -8
  190. package/dist/hooks/llm-after.d.ts.map +0 -1
  191. package/dist/hooks/llm-after.js +0 -8
  192. package/dist/hooks/llm-after.js.map +0 -1
  193. package/dist/hooks/media-ingest.d.ts +0 -43
  194. package/dist/hooks/media-ingest.d.ts.map +0 -1
  195. package/dist/hooks/media-ingest.js +0 -269
  196. package/dist/hooks/media-ingest.js.map +0 -1
  197. package/dist/hooks/memory-guide.d.ts +0 -3
  198. package/dist/hooks/memory-guide.d.ts.map +0 -1
  199. package/dist/hooks/memory-guide.js +0 -47
  200. package/dist/hooks/memory-guide.js.map +0 -1
  201. package/dist/hooks/observation-capture.d.ts +0 -17
  202. package/dist/hooks/observation-capture.d.ts.map +0 -1
  203. package/dist/hooks/observation-capture.js +0 -20
  204. package/dist/hooks/observation-capture.js.map +0 -1
  205. package/dist/hooks/session-compacting.d.ts +0 -6
  206. package/dist/hooks/session-compacting.d.ts.map +0 -1
  207. package/dist/hooks/session-compacting.js +0 -6
  208. package/dist/hooks/session-compacting.js.map +0 -1
  209. package/dist/hooks/session-ending.d.ts +0 -20
  210. package/dist/hooks/session-ending.d.ts.map +0 -1
  211. package/dist/hooks/session-ending.js +0 -113
  212. package/dist/hooks/session-ending.js.map +0 -1
  213. package/dist/hooks/session-recall.d.ts +0 -2
  214. package/dist/hooks/session-recall.d.ts.map +0 -1
  215. package/dist/hooks/session-recall.js +0 -103
  216. package/dist/hooks/session-recall.js.map +0 -1
  217. package/dist/hooks/session-start.d.ts +0 -9
  218. package/dist/hooks/session-start.d.ts.map +0 -1
  219. package/dist/hooks/session-start.js +0 -42
  220. package/dist/hooks/session-start.js.map +0 -1
  221. package/dist/hooks/tool-before.d.ts +0 -10
  222. package/dist/hooks/tool-before.d.ts.map +0 -1
  223. package/dist/hooks/tool-before.js +0 -6
  224. package/dist/hooks/tool-before.js.map +0 -1
  225. package/dist/hooks/tool-executed.d.ts +0 -19
  226. package/dist/hooks/tool-executed.d.ts.map +0 -1
  227. package/dist/hooks/tool-executed.js +0 -12
  228. package/dist/hooks/tool-executed.js.map +0 -1
  229. package/dist/hooks/user-profile.d.ts +0 -2
  230. package/dist/hooks/user-profile.d.ts.map +0 -1
  231. package/dist/hooks/user-profile.js +0 -30
  232. package/dist/hooks/user-profile.js.map +0 -1
  233. package/dist/hooks/user-prompt.d.ts +0 -9
  234. package/dist/hooks/user-prompt.d.ts.map +0 -1
  235. package/dist/hooks/user-prompt.js +0 -8
  236. package/dist/hooks/user-prompt.js.map +0 -1
  237. package/dist/hooks/voice-guide.d.ts +0 -8
  238. package/dist/hooks/voice-guide.d.ts.map +0 -1
  239. package/dist/hooks/voice-guide.js +0 -101
  240. package/dist/hooks/voice-guide.js.map +0 -1
  241. package/dist/plugin.d.ts +0 -55
  242. package/dist/plugin.d.ts.map +0 -1
  243. package/dist/plugin.js +0 -342
  244. package/dist/plugin.js.map +0 -1
  245. package/dist/tools/add-memory.d.ts +0 -17
  246. package/dist/tools/add-memory.d.ts.map +0 -1
  247. package/dist/tools/add-memory.js +0 -60
  248. package/dist/tools/add-memory.js.map +0 -1
  249. package/dist/tools/media-ask.d.ts +0 -14
  250. package/dist/tools/media-ask.d.ts.map +0 -1
  251. package/dist/tools/media-ask.js +0 -224
  252. package/dist/tools/media-ask.js.map +0 -1
  253. package/dist/tools/media-speak.d.ts +0 -16
  254. package/dist/tools/media-speak.d.ts.map +0 -1
  255. package/dist/tools/media-speak.js +0 -78
  256. package/dist/tools/media-speak.js.map +0 -1
  257. package/dist/tools/media-upload.d.ts +0 -14
  258. package/dist/tools/media-upload.d.ts.map +0 -1
  259. package/dist/tools/media-upload.js +0 -155
  260. package/dist/tools/media-upload.js.map +0 -1
  261. package/dist/tools/python-exec.d.ts +0 -13
  262. package/dist/tools/python-exec.d.ts.map +0 -1
  263. package/dist/tools/python-exec.js +0 -99
  264. package/dist/tools/python-exec.js.map +0 -1
  265. package/dist/tools/python-restart.d.ts +0 -11
  266. package/dist/tools/python-restart.d.ts.map +0 -1
  267. package/dist/tools/python-restart.js +0 -33
  268. package/dist/tools/python-restart.js.map +0 -1
  269. package/dist/utils/circuit-breaker.d.ts +0 -23
  270. package/dist/utils/circuit-breaker.d.ts.map +0 -1
  271. package/dist/utils/circuit-breaker.js +0 -75
  272. package/dist/utils/circuit-breaker.js.map +0 -1
  273. package/dist/utils/config-loader.d.ts +0 -20
  274. package/dist/utils/config-loader.d.ts.map +0 -1
  275. package/dist/utils/config-loader.js +0 -194
  276. package/dist/utils/config-loader.js.map +0 -1
  277. package/dist/utils/fallback.d.ts +0 -7
  278. package/dist/utils/fallback.d.ts.map +0 -1
  279. package/dist/utils/fallback.js +0 -20
  280. package/dist/utils/fallback.js.map +0 -1
  281. package/dist/utils/git.d.ts +0 -24
  282. package/dist/utils/git.d.ts.map +0 -1
  283. package/dist/utils/git.js +0 -71
  284. package/dist/utils/git.js.map +0 -1
  285. package/dist/utils/github.d.ts +0 -37
  286. package/dist/utils/github.d.ts.map +0 -1
  287. package/dist/utils/github.js +0 -53
  288. package/dist/utils/github.js.map +0 -1
  289. package/dist/utils/global-path.d.ts +0 -2
  290. package/dist/utils/global-path.d.ts.map +0 -1
  291. package/dist/utils/global-path.js +0 -32
  292. package/dist/utils/global-path.js.map +0 -1
  293. package/dist/utils/logger.d.ts +0 -6
  294. package/dist/utils/logger.d.ts.map +0 -1
  295. package/dist/utils/logger.js +0 -69
  296. package/dist/utils/logger.js.map +0 -1
  297. package/dist/utils/obs-capture.d.ts +0 -7
  298. package/dist/utils/obs-capture.d.ts.map +0 -1
  299. package/dist/utils/obs-capture.js +0 -49
  300. package/dist/utils/obs-capture.js.map +0 -1
  301. package/dist/utils/retry.d.ts +0 -11
  302. package/dist/utils/retry.d.ts.map +0 -1
  303. package/dist/utils/retry.js +0 -45
  304. package/dist/utils/retry.js.map +0 -1
  305. package/dist/utils/self-wiring.d.ts +0 -13
  306. package/dist/utils/self-wiring.d.ts.map +0 -1
  307. package/dist/utils/self-wiring.js +0 -86
  308. package/dist/utils/self-wiring.js.map +0 -1
  309. package/dist/utils/state.d.ts +0 -106
  310. package/dist/utils/state.d.ts.map +0 -1
  311. package/dist/utils/state.js +0 -166
  312. package/dist/utils/state.js.map +0 -1
  313. package/dist/utils/status.d.ts +0 -47
  314. package/dist/utils/status.d.ts.map +0 -1
  315. package/dist/utils/status.js +0 -147
  316. package/dist/utils/status.js.map +0 -1
  317. package/dist/utils/ttl-map.d.ts +0 -17
  318. package/dist/utils/ttl-map.d.ts.map +0 -1
  319. package/dist/utils/ttl-map.js +0 -67
  320. package/dist/utils/ttl-map.js.map +0 -1
@@ -1,387 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * validate-asset.cjs
4
- *
5
- * Validates marketing assets against brand guidelines.
6
- * Checks: file naming, dimensions, file size, metadata.
7
- *
8
- * Usage:
9
- * node validate-asset.cjs <asset-path>
10
- * node validate-asset.cjs <asset-path> --json
11
- * node validate-asset.cjs <asset-path> --fix
12
- *
13
- * For color validation of images, use with extract-colors.cjs
14
- */
15
-
16
- const fs = require("fs");
17
- const path = require("path");
18
-
19
- // Validation rules
20
- const RULES = {
21
- naming: {
22
- pattern: /^[a-z]+_[a-z0-9-]+_[a-z0-9-]+_\d{8}(_[a-z0-9-]+)?\.[a-z]+$/,
23
- description:
24
- "{type}_{campaign}_{description}_{timestamp}_{variant}.{ext}",
25
- examples: [
26
- "banner_claude-launch_hero-image_20251209.png",
27
- "logo_brand-refresh_horizontal_20251209_dark.svg",
28
- ],
29
- },
30
- dimensions: {
31
- banner: { minWidth: 600, minHeight: 300 },
32
- logo: { minWidth: 100, minHeight: 100 },
33
- design: { minWidth: 800, minHeight: 600 },
34
- video: { minWidth: 640, minHeight: 480 },
35
- default: { minWidth: 100, minHeight: 100 },
36
- },
37
- fileSize: {
38
- image: { max: 5 * 1024 * 1024, recommended: 1 * 1024 * 1024 },
39
- video: { max: 100 * 1024 * 1024, recommended: 50 * 1024 * 1024 },
40
- svg: { max: 500 * 1024, recommended: 100 * 1024 },
41
- },
42
- formats: {
43
- image: ["png", "jpg", "jpeg", "webp", "gif"],
44
- vector: ["svg"],
45
- video: ["mp4", "mov", "webm"],
46
- document: ["pdf", "psd", "ai", "fig"],
47
- },
48
- };
49
-
50
- /**
51
- * Parse asset filename
52
- */
53
- function parseFilename(filename) {
54
- const parts = filename.replace(/\.[^.]+$/, "").split("_");
55
-
56
- if (parts.length < 4) {
57
- return null;
58
- }
59
-
60
- return {
61
- type: parts[0],
62
- campaign: parts[1],
63
- description: parts[2],
64
- timestamp: parts[3],
65
- variant: parts.length > 4 ? parts[4] : null,
66
- extension: path.extname(filename).slice(1).toLowerCase(),
67
- };
68
- }
69
-
70
- /**
71
- * Validate filename convention
72
- */
73
- function validateFilename(filename) {
74
- const issues = [];
75
- const suggestions = [];
76
-
77
- // Check pattern match
78
- if (!RULES.naming.pattern.test(filename)) {
79
- issues.push("Filename does not match naming convention");
80
- suggestions.push(`Expected format: ${RULES.naming.description}`);
81
- suggestions.push(`Examples: ${RULES.naming.examples.join(", ")}`);
82
- }
83
-
84
- // Parse and check components
85
- const parsed = parseFilename(filename);
86
- if (parsed) {
87
- // Check timestamp format
88
- if (!/^\d{8}$/.test(parsed.timestamp)) {
89
- issues.push("Timestamp should be YYYYMMDD format");
90
- }
91
-
92
- // Check kebab-case for campaign and description
93
- if (parsed.campaign && !/^[a-z0-9-]+$/.test(parsed.campaign)) {
94
- issues.push("Campaign name should be kebab-case");
95
- }
96
-
97
- if (parsed.description && !/^[a-z0-9-]+$/.test(parsed.description)) {
98
- issues.push("Description should be kebab-case");
99
- }
100
-
101
- // Check valid type
102
- const validTypes = [
103
- "banner",
104
- "logo",
105
- "design",
106
- "video",
107
- "infographic",
108
- "icon",
109
- "photo",
110
- ];
111
- if (!validTypes.includes(parsed.type)) {
112
- suggestions.push(`Consider using type: ${validTypes.join(", ")}`);
113
- }
114
- }
115
-
116
- return { valid: issues.length === 0, issues, suggestions, parsed };
117
- }
118
-
119
- /**
120
- * Validate file size
121
- */
122
- function validateFileSize(filepath, extension) {
123
- const issues = [];
124
- const warnings = [];
125
-
126
- const stats = fs.statSync(filepath);
127
- const size = stats.size;
128
-
129
- let limits;
130
- if (RULES.formats.video.includes(extension)) {
131
- limits = RULES.fileSize.video;
132
- } else if (extension === "svg") {
133
- limits = RULES.fileSize.svg;
134
- } else {
135
- limits = RULES.fileSize.image;
136
- }
137
-
138
- if (size > limits.max) {
139
- issues.push(
140
- `File size (${formatBytes(size)}) exceeds maximum (${formatBytes(
141
- limits.max
142
- )})`
143
- );
144
- } else if (size > limits.recommended) {
145
- warnings.push(
146
- `File size (${formatBytes(size)}) exceeds recommended (${formatBytes(
147
- limits.recommended
148
- )})`
149
- );
150
- }
151
-
152
- return { valid: issues.length === 0, issues, warnings, size };
153
- }
154
-
155
- /**
156
- * Validate file format
157
- */
158
- function validateFormat(extension) {
159
- const issues = [];
160
- const info = { category: null };
161
-
162
- const allFormats = [
163
- ...RULES.formats.image,
164
- ...RULES.formats.vector,
165
- ...RULES.formats.video,
166
- ...RULES.formats.document,
167
- ];
168
-
169
- if (!allFormats.includes(extension)) {
170
- issues.push(`Unsupported file format: .${extension}`);
171
- return { valid: false, issues, info };
172
- }
173
-
174
- // Determine category
175
- if (RULES.formats.image.includes(extension)) info.category = "image";
176
- else if (RULES.formats.vector.includes(extension)) info.category = "vector";
177
- else if (RULES.formats.video.includes(extension)) info.category = "video";
178
- else if (RULES.formats.document.includes(extension))
179
- info.category = "document";
180
-
181
- return { valid: true, issues, info };
182
- }
183
-
184
- /**
185
- * Check if asset exists in manifest
186
- */
187
- function checkManifest(filepath) {
188
- const manifestPath = path.join(process.cwd(), ".assets", "manifest.json");
189
-
190
- if (!fs.existsSync(manifestPath)) {
191
- return { registered: false, message: "Manifest not found" };
192
- }
193
-
194
- try {
195
- const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
196
- const relativePath = path.relative(process.cwd(), filepath);
197
- const found = manifest.assets?.find(
198
- (a) => a.path === relativePath || a.path === filepath
199
- );
200
-
201
- return {
202
- registered: !!found,
203
- message: found ? "Asset registered in manifest" : "Asset not in manifest",
204
- asset: found,
205
- };
206
- } catch {
207
- return { registered: false, message: "Error reading manifest" };
208
- }
209
- }
210
-
211
- /**
212
- * Generate suggested filename
213
- */
214
- function suggestFilename(original, parsed) {
215
- if (!parsed) return null;
216
-
217
- const today = new Date().toISOString().slice(0, 10).replace(/-/g, "");
218
- const type = parsed.type || "asset";
219
- const campaign = parsed.campaign || "general";
220
- const description = parsed.description || "untitled";
221
- const ext = parsed.extension || "png";
222
-
223
- return `${type}_${campaign}_${description}_${today}.${ext}`;
224
- }
225
-
226
- /**
227
- * Format bytes to human readable
228
- */
229
- function formatBytes(bytes) {
230
- if (bytes === 0) return "0 Bytes";
231
- const k = 1024;
232
- const sizes = ["Bytes", "KB", "MB", "GB"];
233
- const i = Math.floor(Math.log(bytes) / Math.log(k));
234
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
235
- }
236
-
237
- /**
238
- * Main validation function
239
- */
240
- function validateAsset(assetPath) {
241
- const results = {
242
- path: assetPath,
243
- filename: path.basename(assetPath),
244
- valid: true,
245
- issues: [],
246
- warnings: [],
247
- suggestions: [],
248
- checks: {},
249
- };
250
-
251
- // Check file exists
252
- if (!fs.existsSync(assetPath)) {
253
- results.valid = false;
254
- results.issues.push(`File not found: ${assetPath}`);
255
- return results;
256
- }
257
-
258
- const filename = path.basename(assetPath);
259
- const extension = path.extname(filename).slice(1).toLowerCase();
260
-
261
- // 1. Validate filename
262
- const filenameResult = validateFilename(filename);
263
- results.checks.filename = filenameResult;
264
- if (!filenameResult.valid) {
265
- results.issues.push(...filenameResult.issues);
266
- results.suggestions.push(...filenameResult.suggestions);
267
- }
268
-
269
- // 2. Validate format
270
- const formatResult = validateFormat(extension);
271
- results.checks.format = formatResult;
272
- if (!formatResult.valid) {
273
- results.issues.push(...formatResult.issues);
274
- }
275
-
276
- // 3. Validate file size
277
- const sizeResult = validateFileSize(assetPath, extension);
278
- results.checks.fileSize = sizeResult;
279
- if (!sizeResult.valid) {
280
- results.issues.push(...sizeResult.issues);
281
- }
282
- results.warnings.push(...sizeResult.warnings);
283
-
284
- // 4. Check manifest registration
285
- const manifestResult = checkManifest(assetPath);
286
- results.checks.manifest = manifestResult;
287
- if (!manifestResult.registered) {
288
- results.warnings.push("Asset not registered in manifest.json");
289
- results.suggestions.push(
290
- "Register asset in .assets/manifest.json for tracking"
291
- );
292
- }
293
-
294
- // 5. Suggest corrected filename if needed
295
- if (!filenameResult.valid && filenameResult.parsed) {
296
- const suggested = suggestFilename(filename, filenameResult.parsed);
297
- if (suggested) {
298
- results.suggestions.push(`Suggested filename: ${suggested}`);
299
- }
300
- }
301
-
302
- // Overall validity
303
- results.valid = results.issues.length === 0;
304
-
305
- return results;
306
- }
307
-
308
- /**
309
- * Format output for console
310
- */
311
- function formatOutput(results) {
312
- const lines = [];
313
-
314
- lines.push("\n" + "=".repeat(60));
315
- lines.push(`ASSET VALIDATION: ${results.filename}`);
316
- lines.push("=".repeat(60));
317
-
318
- lines.push(`\nStatus: ${results.valid ? "PASS" : "FAIL"}`);
319
- lines.push(`Path: ${results.path}`);
320
-
321
- if (results.issues.length > 0) {
322
- lines.push("\nISSUES:");
323
- results.issues.forEach((issue) => lines.push(` - ${issue}`));
324
- }
325
-
326
- if (results.warnings.length > 0) {
327
- lines.push("\nWARNINGS:");
328
- results.warnings.forEach((warning) => lines.push(` - ${warning}`));
329
- }
330
-
331
- if (results.suggestions.length > 0) {
332
- lines.push("\nSUGGESTIONS:");
333
- results.suggestions.forEach((suggestion) =>
334
- lines.push(` - ${suggestion}`)
335
- );
336
- }
337
-
338
- // File size info
339
- if (results.checks.fileSize?.size) {
340
- lines.push(`\nFile Size: ${formatBytes(results.checks.fileSize.size)}`);
341
- }
342
-
343
- lines.push("\n" + "=".repeat(60));
344
-
345
- return lines.join("\n");
346
- }
347
-
348
- /**
349
- * Main
350
- */
351
- function main() {
352
- const args = process.argv.slice(2);
353
- const jsonOutput = args.includes("--json");
354
- const assetPath = args.find((a) => !a.startsWith("--"));
355
-
356
- if (!assetPath) {
357
- console.error("Usage: node validate-asset.cjs <asset-path> [--json]");
358
- console.error("\nExamples:");
359
- console.error(
360
- " node validate-asset.cjs assets/banners/social-media/banner_launch_hero_20251209.png"
361
- );
362
- console.error(
363
- " node validate-asset.cjs assets/logos/icon-only/logo-icon.svg --json"
364
- );
365
- process.exit(1);
366
- }
367
-
368
- // Resolve path
369
- const resolvedPath = path.isAbsolute(assetPath)
370
- ? assetPath
371
- : path.join(process.cwd(), assetPath);
372
-
373
- // Validate
374
- const results = validateAsset(resolvedPath);
375
-
376
- // Output
377
- if (jsonOutput) {
378
- console.log(JSON.stringify(results, null, 2));
379
- } else {
380
- console.log(formatOutput(results));
381
- }
382
-
383
- // Exit with appropriate code
384
- process.exit(results.valid ? 0 : 1);
385
- }
386
-
387
- main();
@@ -1,275 +0,0 @@
1
- # Brand Guidelines v1.0
2
-
3
- > Last updated: {DATE}
4
- > Status: Draft
5
-
6
- ## Quick Reference
7
-
8
- | Element | Value |
9
- |---------|-------|
10
- | Primary Color | #2563EB |
11
- | Secondary Color | #8B5CF6 |
12
- | Primary Font | Inter |
13
- | Voice | Professional, Helpful, Clear |
14
-
15
- ---
16
-
17
- ## 1. Color Palette
18
-
19
- ### Primary Colors
20
-
21
- | Name | Hex | RGB | Usage |
22
- |------|-----|-----|-------|
23
- | Primary Blue | #2563EB | rgb(37,99,235) | CTAs, headers, links |
24
- | Primary Dark | #1D4ED8 | rgb(29,78,216) | Hover states, emphasis |
25
-
26
- ### Secondary Colors
27
-
28
- | Name | Hex | RGB | Usage |
29
- |------|-----|-----|-------|
30
- | Secondary Purple | #8B5CF6 | rgb(139,92,246) | Accents, highlights |
31
- | Accent Green | #10B981 | rgb(16,185,129) | Success, positive states |
32
-
33
- ### Neutral Palette
34
-
35
- | Name | Hex | RGB | Usage |
36
- |------|-----|-----|-------|
37
- | Background | #FFFFFF | rgb(255,255,255) | Page backgrounds |
38
- | Surface | #F9FAFB | rgb(249,250,251) | Cards, sections |
39
- | Text Primary | #111827 | rgb(17,24,39) | Headings, body text |
40
- | Text Secondary | #6B7280 | rgb(107,114,128) | Captions, muted text |
41
- | Border | #E5E7EB | rgb(229,231,235) | Dividers, borders |
42
-
43
- ### Semantic Colors
44
-
45
- | State | Hex | Usage |
46
- |-------|-----|-------|
47
- | Success | #22C55E | Positive actions, confirmations |
48
- | Warning | #F59E0B | Cautions, pending states |
49
- | Error | #EF4444 | Errors, destructive actions |
50
- | Info | #3B82F6 | Informational messages |
51
-
52
- ### Accessibility
53
-
54
- - Text on white background: 7.2:1 contrast ratio (AAA)
55
- - Primary on white: 4.6:1 contrast ratio (AA)
56
- - All interactive elements meet WCAG 2.1 AA standards
57
-
58
- ---
59
-
60
- ## 2. Typography
61
-
62
- ### Font Stack
63
-
64
- ```css
65
- --font-heading: 'Inter', system-ui, -apple-system, sans-serif;
66
- --font-body: 'Inter', system-ui, -apple-system, sans-serif;
67
- --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
68
- ```
69
-
70
- ### Type Scale
71
-
72
- | Element | Size (Desktop) | Size (Mobile) | Weight | Line Height |
73
- |---------|----------------|---------------|--------|-------------|
74
- | H1 | 48px | 32px | 700 | 1.2 |
75
- | H2 | 36px | 28px | 600 | 1.25 |
76
- | H3 | 28px | 24px | 600 | 1.3 |
77
- | H4 | 24px | 20px | 600 | 1.35 |
78
- | Body | 16px | 16px | 400 | 1.5 |
79
- | Body Large | 18px | 18px | 400 | 1.6 |
80
- | Small | 14px | 14px | 400 | 1.5 |
81
- | Caption | 12px | 12px | 400 | 1.4 |
82
-
83
- ### Font Loading
84
-
85
- ```html
86
- <link rel="preconnect" href="https://fonts.googleapis.com">
87
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
88
- ```
89
-
90
- ---
91
-
92
- ## 3. Logo Usage
93
-
94
- ### Variants
95
-
96
- | Variant | File | Use Case |
97
- |---------|------|----------|
98
- | Full Horizontal | logo-full-horizontal.svg | Headers, documents |
99
- | Stacked | logo-stacked.svg | Square spaces |
100
- | Icon Only | logo-icon.svg | Favicons, small spaces |
101
- | Monochrome | logo-mono.svg | Limited color contexts |
102
-
103
- ### Clear Space
104
-
105
- Minimum clear space = height of the logo icon (mark)
106
-
107
- ### Minimum Size
108
-
109
- | Context | Minimum Width |
110
- |---------|---------------|
111
- | Digital - Full Logo | 120px |
112
- | Digital - Icon | 24px |
113
- | Print - Full Logo | 35mm |
114
- | Print - Icon | 10mm |
115
-
116
- ### Don'ts
117
-
118
- - Don't rotate or skew the logo
119
- - Don't change colors outside approved palette
120
- - Don't add shadows or effects
121
- - Don't crop or modify proportions
122
- - Don't place on busy backgrounds without sufficient contrast
123
-
124
- ---
125
-
126
- ## 4. Voice & Tone
127
-
128
- ### Brand Personality
129
-
130
- | Trait | Description |
131
- |-------|-------------|
132
- | **Professional** | Expert knowledge, authoritative yet approachable |
133
- | **Helpful** | Solution-focused, actionable guidance |
134
- | **Clear** | Direct communication, jargon-free |
135
- | **Confident** | Assured without being arrogant |
136
-
137
- ### Voice Chart
138
-
139
- | Trait | We Are | We Are Not |
140
- |-------|--------|------------|
141
- | Professional | Expert, knowledgeable | Stuffy, corporate |
142
- | Helpful | Supportive, empowering | Patronizing |
143
- | Clear | Direct, concise | Vague, wordy |
144
- | Confident | Assured, trustworthy | Arrogant, overselling |
145
-
146
- ### Tone by Context
147
-
148
- | Context | Tone | Example |
149
- |---------|------|---------|
150
- | Marketing | Engaging, benefit-focused | "Create campaigns that convert." |
151
- | Documentation | Clear, instructional | "Run the command to start." |
152
- | Error messages | Calm, solution-focused | "Try refreshing the page." |
153
- | Success | Brief, celebratory | "Campaign published!" |
154
-
155
- ### Prohibited Terms
156
-
157
- | Avoid | Reason |
158
- |-------|--------|
159
- | Revolutionary | Overused |
160
- | Best-in-class | Vague claim |
161
- | Seamless | Overused |
162
- | Synergy | Corporate jargon |
163
- | Leverage | Use "use" instead |
164
-
165
- ---
166
-
167
- ## 5. Imagery Guidelines
168
-
169
- ### Photography Style
170
-
171
- - **Lighting:** Natural, soft lighting preferred
172
- - **Subjects:** Real people, authentic scenarios
173
- - **Color treatment:** Maintain brand colors in post
174
- - **Composition:** Clean, focused subjects
175
-
176
- ### Illustrations
177
-
178
- - Style: Modern, flat design with subtle gradients
179
- - Colors: Brand palette only
180
- - Line weight: 2px consistent stroke
181
- - Corners: 4px rounded
182
-
183
- ### Icons
184
-
185
- - Style: Outlined, 24px base grid
186
- - Stroke: 1.5px consistent
187
- - Corner radius: 2px
188
- - Fill: None (outline only)
189
-
190
- ---
191
-
192
- ## 6. Design Components
193
-
194
- ### Buttons
195
-
196
- | Type | Background | Text | Border Radius |
197
- |------|------------|------|---------------|
198
- | Primary | #2563EB | #FFFFFF | 8px |
199
- | Secondary | Transparent | #2563EB | 8px |
200
- | Tertiary | Transparent | #6B7280 | 8px |
201
-
202
- ### Spacing Scale
203
-
204
- | Token | Value | Usage |
205
- |-------|-------|-------|
206
- | xs | 4px | Tight spacing |
207
- | sm | 8px | Compact elements |
208
- | md | 16px | Standard spacing |
209
- | lg | 24px | Section spacing |
210
- | xl | 32px | Large gaps |
211
- | 2xl | 48px | Section dividers |
212
-
213
- ### Border Radius
214
-
215
- | Element | Radius |
216
- |---------|--------|
217
- | Buttons | 8px |
218
- | Cards | 12px |
219
- | Inputs | 8px |
220
- | Modals | 16px |
221
- | Pills/Tags | 9999px |
222
-
223
- ---
224
-
225
- ## AI Image Generation
226
-
227
- ### Base Prompt Template
228
-
229
- Always prepend to image generation prompts:
230
-
231
- ```
232
- {DESCRIBE YOUR VISUAL STYLE HERE - mood, colors with hex codes, lighting, atmosphere}
233
- ```
234
-
235
- ### Style Keywords
236
-
237
- | Category | Keywords |
238
- |----------|----------|
239
- | **Lighting** | {e.g., soft lighting, dramatic, natural} |
240
- | **Mood** | {e.g., professional, energetic, calm} |
241
- | **Composition** | {e.g., centered, rule of thirds, minimal} |
242
- | **Treatment** | {e.g., high contrast, muted, vibrant} |
243
- | **Aesthetic** | {e.g., modern, vintage, minimalist} |
244
-
245
- ### Visual Mood Descriptors
246
-
247
- - {Mood descriptor 1}
248
- - {Mood descriptor 2}
249
- - {Mood descriptor 3}
250
-
251
- ### Visual Don'ts
252
-
253
- | Avoid | Reason |
254
- |-------|--------|
255
- | {Item to avoid} | {Why to avoid it} |
256
-
257
- ### Example Prompts
258
-
259
- **Hero Banner:**
260
- ```
261
- {Example prompt for hero banners}
262
- ```
263
-
264
- **Social Media Post:**
265
- ```
266
- {Example prompt for social graphics}
267
- ```
268
-
269
- ---
270
-
271
- ## Changelog
272
-
273
- | Version | Date | Changes |
274
- |---------|------|---------|
275
- | 1.0 | {DATE} | Initial guidelines |