@nurix/etna 0.18.19 → 0.18.21

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 (283) hide show
  1. package/README.md +1 -1
  2. package/data/harness-index.json +1 -1
  3. package/data/harnesses/code/CLAUDE.md +1 -1
  4. package/data/harnesses/code/agents/brainstorm.md +1 -1
  5. package/data/harnesses/code/agents/maintenance.md +2 -2
  6. package/data/harnesses/code/harness.json +2 -2
  7. package/data/harnesses/code/rules/database.md +38 -0
  8. package/data/harnesses/code/rules/express.md +28 -0
  9. package/data/harnesses/code/rules/frontend.md +14 -0
  10. package/data/harnesses/code/rules/general.md +2 -40
  11. package/data/harnesses/code/rules/nomenclature.md +1 -8
  12. package/data/harnesses/code/rules/nustack.md +150 -0
  13. package/data/harnesses/code/skills/brainstorm/README.md +1 -1
  14. package/data/harnesses/code/skills/brainstorm/SKILL.md +1 -1
  15. package/data/harnesses/code/skills/brainstorm/exit-artifacts.md +4 -4
  16. package/data/harnesses/code/skills/brainstorm/templates/source-of-truth.md +3 -3
  17. package/data/harnesses/code/skills/design/SKILL.md +68 -0
  18. package/data/harnesses/code/skills/design/data/catalog/rules.csv +132 -0
  19. package/data/harnesses/code/skills/design/data/combinations/Readme.md +29 -0
  20. package/data/harnesses/code/skills/design/data/combinations/charts.csv +33 -0
  21. package/data/harnesses/code/skills/design/data/combinations/fonts-known.json +437 -0
  22. package/data/harnesses/code/skills/design/data/combinations/icons.csv +157 -0
  23. package/data/harnesses/code/skills/design/data/combinations/landing.csv +38 -0
  24. package/data/harnesses/code/skills/design/data/combinations/lucide-names.json +2001 -0
  25. package/data/harnesses/code/skills/design/data/combinations/manifest.json +283 -0
  26. package/data/harnesses/code/skills/design/data/combinations/palettes.csv +49 -0
  27. package/data/harnesses/code/skills/design/data/combinations/product-router.csv +80 -0
  28. package/data/harnesses/code/skills/design/data/combinations/styles.csv +54 -0
  29. package/data/harnesses/code/skills/design/data/combinations/typography.csv +61 -0
  30. package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +106 -0
  31. package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +154 -0
  32. package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +151 -0
  33. package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +139 -0
  34. package/data/harnesses/code/skills/design/data/design-md/library/apple.md +139 -0
  35. package/data/harnesses/code/skills/design/data/design-md/library/binance.md +140 -0
  36. package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +140 -0
  37. package/data/harnesses/code/skills/design/data/design-md/library/cal.md +140 -0
  38. package/data/harnesses/code/skills/design/data/design-md/library/clay.md +139 -0
  39. package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +139 -0
  40. package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +147 -0
  41. package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +156 -0
  42. package/data/harnesses/code/skills/design/data/design-md/library/composio.md +138 -0
  43. package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +138 -0
  44. package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +137 -0
  45. package/data/harnesses/code/skills/design/data/design-md/library/expo.md +148 -0
  46. package/data/harnesses/code/skills/design/data/design-md/library/figma.md +141 -0
  47. package/data/harnesses/code/skills/design/data/design-md/library/framer.md +156 -0
  48. package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +140 -0
  49. package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +153 -0
  50. package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +158 -0
  51. package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +156 -0
  52. package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +122 -0
  53. package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +140 -0
  54. package/data/harnesses/code/skills/design/data/design-md/library/meta.md +139 -0
  55. package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +139 -0
  56. package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +139 -0
  57. package/data/harnesses/code/skills/design/data/design-md/library/miro.md +153 -0
  58. package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +140 -0
  59. package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +155 -0
  60. package/data/harnesses/code/skills/design/data/design-md/library/notion.md +140 -0
  61. package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +141 -0
  62. package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +145 -0
  63. package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +142 -0
  64. package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +152 -0
  65. package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +137 -0
  66. package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +140 -0
  67. package/data/harnesses/code/skills/design/data/design-md/library/resend.md +170 -0
  68. package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +145 -0
  69. package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +137 -0
  70. package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +168 -0
  71. package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +163 -0
  72. package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +147 -0
  73. package/data/harnesses/code/skills/design/data/design-md/library/slack.md +158 -0
  74. package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +171 -0
  75. package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +166 -0
  76. package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +160 -0
  77. package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +173 -0
  78. package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +145 -0
  79. package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +153 -0
  80. package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +167 -0
  81. package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +140 -0
  82. package/data/harnesses/code/skills/design/data/design-md/library/uber.md +140 -0
  83. package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +140 -0
  84. package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +130 -0
  85. package/data/harnesses/code/skills/design/data/design-md/library/warp.md +140 -0
  86. package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +140 -0
  87. package/data/harnesses/code/skills/design/data/design-md/library/wired.md +139 -0
  88. package/data/harnesses/code/skills/design/data/design-md/library/wise.md +137 -0
  89. package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +138 -0
  90. package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +158 -0
  91. package/data/harnesses/code/skills/design/data/design-md/nurix.md +134 -0
  92. package/data/harnesses/code/skills/design/data/design-tokens/SCHEMA.md +580 -0
  93. package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.resolver.json +20 -0
  94. package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.tokens.json +964 -0
  95. package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.resolver.json +20 -0
  96. package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.tokens.json +960 -0
  97. package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.resolver.json +20 -0
  98. package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.tokens.json +965 -0
  99. package/data/harnesses/code/skills/design/data/design-tokens/apple/design.resolver.json +20 -0
  100. package/data/harnesses/code/skills/design/data/design-tokens/apple/design.tokens.json +954 -0
  101. package/data/harnesses/code/skills/design/data/design-tokens/binance/design.resolver.json +20 -0
  102. package/data/harnesses/code/skills/design/data/design-tokens/binance/design.tokens.json +949 -0
  103. package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.resolver.json +20 -0
  104. package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.tokens.json +962 -0
  105. package/data/harnesses/code/skills/design/data/design-tokens/cal/design.resolver.json +20 -0
  106. package/data/harnesses/code/skills/design/data/design-tokens/cal/design.tokens.json +958 -0
  107. package/data/harnesses/code/skills/design/data/design-tokens/clay/design.resolver.json +20 -0
  108. package/data/harnesses/code/skills/design/data/design-tokens/clay/design.tokens.json +953 -0
  109. package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.resolver.json +20 -0
  110. package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.tokens.json +960 -0
  111. package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.resolver.json +20 -0
  112. package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.tokens.json +973 -0
  113. package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.resolver.json +20 -0
  114. package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.tokens.json +954 -0
  115. package/data/harnesses/code/skills/design/data/design-tokens/composio/design.resolver.json +20 -0
  116. package/data/harnesses/code/skills/design/data/design-tokens/composio/design.tokens.json +963 -0
  117. package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.resolver.json +20 -0
  118. package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.tokens.json +968 -0
  119. package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.resolver.json +20 -0
  120. package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.tokens.json +981 -0
  121. package/data/harnesses/code/skills/design/data/design-tokens/expo/design.resolver.json +20 -0
  122. package/data/harnesses/code/skills/design/data/design-tokens/expo/design.tokens.json +962 -0
  123. package/data/harnesses/code/skills/design/data/design-tokens/figma/design.resolver.json +20 -0
  124. package/data/harnesses/code/skills/design/data/design-tokens/figma/design.tokens.json +964 -0
  125. package/data/harnesses/code/skills/design/data/design-tokens/framer/design.resolver.json +20 -0
  126. package/data/harnesses/code/skills/design/data/design-tokens/framer/design.tokens.json +959 -0
  127. package/data/harnesses/code/skills/design/data/design-tokens/goldens.json +251 -0
  128. package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.resolver.json +20 -0
  129. package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.tokens.json +965 -0
  130. package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.resolver.json +20 -0
  131. package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.tokens.json +978 -0
  132. package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.resolver.json +20 -0
  133. package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.tokens.json +982 -0
  134. package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.resolver.json +20 -0
  135. package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.tokens.json +958 -0
  136. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.resolver.json +23 -0
  137. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.dark.json +589 -0
  138. package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.json +964 -0
  139. package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.resolver.json +20 -0
  140. package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.tokens.json +955 -0
  141. package/data/harnesses/code/skills/design/data/design-tokens/meta/design.resolver.json +20 -0
  142. package/data/harnesses/code/skills/design/data/design-tokens/meta/design.tokens.json +977 -0
  143. package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.resolver.json +20 -0
  144. package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.tokens.json +950 -0
  145. package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.resolver.json +20 -0
  146. package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.tokens.json +976 -0
  147. package/data/harnesses/code/skills/design/data/design-tokens/miro/design.resolver.json +20 -0
  148. package/data/harnesses/code/skills/design/data/design-tokens/miro/design.tokens.json +979 -0
  149. package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.resolver.json +20 -0
  150. package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.tokens.json +955 -0
  151. package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.resolver.json +20 -0
  152. package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.tokens.json +958 -0
  153. package/data/harnesses/code/skills/design/data/design-tokens/notion/design.resolver.json +20 -0
  154. package/data/harnesses/code/skills/design/data/design-tokens/notion/design.tokens.json +953 -0
  155. package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.resolver.json +20 -0
  156. package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.tokens.json +904 -0
  157. package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.resolver.json +20 -0
  158. package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.tokens.json +957 -0
  159. package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.resolver.json +20 -0
  160. package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.tokens.json +945 -0
  161. package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.resolver.json +20 -0
  162. package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.tokens.json +960 -0
  163. package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.resolver.json +20 -0
  164. package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.tokens.json +953 -0
  165. package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.resolver.json +20 -0
  166. package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.tokens.json +955 -0
  167. package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.resolver.json +20 -0
  168. package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.tokens.json +958 -0
  169. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.resolver.json +23 -0
  170. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.dark.json +613 -0
  171. package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.json +968 -0
  172. package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.resolver.json +20 -0
  173. package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.tokens.json +956 -0
  174. package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.resolver.json +20 -0
  175. package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.tokens.json +960 -0
  176. package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.resolver.json +20 -0
  177. package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.tokens.json +958 -0
  178. package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.resolver.json +20 -0
  179. package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.tokens.json +980 -0
  180. package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.resolver.json +20 -0
  181. package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.tokens.json +964 -0
  182. package/data/harnesses/code/skills/design/data/design-tokens/slack/design.resolver.json +20 -0
  183. package/data/harnesses/code/skills/design/data/design-tokens/slack/design.tokens.json +957 -0
  184. package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.resolver.json +20 -0
  185. package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.tokens.json +979 -0
  186. package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.resolver.json +20 -0
  187. package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.tokens.json +974 -0
  188. package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.resolver.json +20 -0
  189. package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.tokens.json +973 -0
  190. package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.resolver.json +20 -0
  191. package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.tokens.json +979 -0
  192. package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.resolver.json +20 -0
  193. package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.tokens.json +966 -0
  194. package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.resolver.json +20 -0
  195. package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.tokens.json +961 -0
  196. package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.resolver.json +20 -0
  197. package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.tokens.json +977 -0
  198. package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.resolver.json +20 -0
  199. package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.tokens.json +991 -0
  200. package/data/harnesses/code/skills/design/data/design-tokens/uber/design.resolver.json +20 -0
  201. package/data/harnesses/code/skills/design/data/design-tokens/uber/design.tokens.json +966 -0
  202. package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.resolver.json +20 -0
  203. package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.tokens.json +988 -0
  204. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.resolver.json +23 -0
  205. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.dark.json +602 -0
  206. package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.json +974 -0
  207. package/data/harnesses/code/skills/design/data/design-tokens/warp/design.resolver.json +20 -0
  208. package/data/harnesses/code/skills/design/data/design-tokens/warp/design.tokens.json +979 -0
  209. package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.resolver.json +20 -0
  210. package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.tokens.json +960 -0
  211. package/data/harnesses/code/skills/design/data/design-tokens/wired/design.resolver.json +20 -0
  212. package/data/harnesses/code/skills/design/data/design-tokens/wired/design.tokens.json +968 -0
  213. package/data/harnesses/code/skills/design/data/design-tokens/wise/design.resolver.json +20 -0
  214. package/data/harnesses/code/skills/design/data/design-tokens/wise/design.tokens.json +965 -0
  215. package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.resolver.json +20 -0
  216. package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.tokens.json +988 -0
  217. package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.resolver.json +20 -0
  218. package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.tokens.json +978 -0
  219. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +249 -0
  220. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +249 -0
  221. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +248 -0
  222. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +245 -0
  223. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +223 -0
  224. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +249 -0
  225. package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +88 -0
  226. package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +132 -0
  227. package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +76 -0
  228. package/data/harnesses/code/skills/design/references/create.md +131 -0
  229. package/data/harnesses/code/skills/design/references/diagnosis.md +108 -0
  230. package/data/harnesses/code/skills/design/references/hard-rules.md +155 -0
  231. package/data/harnesses/code/skills/design/references/improve.md +87 -0
  232. package/data/harnesses/code/skills/design/references/interaction.md +77 -0
  233. package/data/harnesses/code/skills/design/references/introspect.md +100 -0
  234. package/data/harnesses/code/skills/design/references/lifecycle.md +73 -0
  235. package/data/harnesses/code/skills/design/references/personality.md +428 -0
  236. package/data/harnesses/code/skills/design/references/structure.md +138 -0
  237. package/data/harnesses/code/skills/design/scripts/convert-design-md.mjs +1032 -0
  238. package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +1006 -0
  239. package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +551 -0
  240. package/data/harnesses/code/skills/design/scripts/lib/checks.mjs +903 -0
  241. package/data/harnesses/code/skills/design/scripts/lib/golden.mjs +26 -0
  242. package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +454 -0
  243. package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +267 -0
  244. package/data/harnesses/code/skills/design/scripts/render-rung.mjs +690 -0
  245. package/data/harnesses/code/skills/design/scripts/scaffold.mjs +552 -0
  246. package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +600 -0
  247. package/data/harnesses/code/skills/design/scripts/snapshot-goldens.mjs +68 -0
  248. package/data/harnesses/code/skills/design/scripts/validate-combinations.mjs +314 -0
  249. package/data/harnesses/code/skills/documentation/SKILL.md +61 -17
  250. package/data/harnesses/code/skills/documentation/references/examples.md +41 -0
  251. package/data/harnesses/code/skills/documentation/references/style-guide.md +14 -9
  252. package/data/harnesses/code/skills/documentation/references/templates.md +305 -51
  253. package/data/harnesses/etna/CLAUDE.md +1 -1
  254. package/data/harnesses/etna/agents/brainstorm.md +1 -1
  255. package/data/harnesses/etna/agents/maintenance.md +2 -2
  256. package/data/harnesses/etna/harness.json +2 -2
  257. package/data/harnesses/etna/rules/general.md +2 -40
  258. package/data/harnesses/etna/rules/nomenclature.md +1 -8
  259. package/data/harnesses/etna/skills/brainstorm/README.md +1 -1
  260. package/data/harnesses/etna/skills/brainstorm/SKILL.md +1 -1
  261. package/data/harnesses/etna/skills/brainstorm/exit-artifacts.md +4 -4
  262. package/data/harnesses/etna/skills/brainstorm/templates/source-of-truth.md +3 -3
  263. package/data/harnesses/etna/skills/documentation/SKILL.md +61 -17
  264. package/data/harnesses/etna/skills/documentation/references/examples.md +41 -0
  265. package/data/harnesses/etna/skills/documentation/references/style-guide.md +14 -9
  266. package/data/harnesses/etna/skills/documentation/references/templates.md +305 -51
  267. package/data/harnesses/mobile/CLAUDE.md +1 -1
  268. package/data/harnesses/mobile/agents/brainstorm.md +1 -1
  269. package/data/harnesses/mobile/agents/maintenance.md +2 -2
  270. package/data/harnesses/mobile/harness.json +2 -2
  271. package/data/harnesses/mobile/rules/database.md +38 -0
  272. package/data/harnesses/mobile/rules/general.md +2 -40
  273. package/data/harnesses/mobile/rules/nomenclature.md +1 -8
  274. package/data/harnesses/mobile/rules/nustack.md +150 -0
  275. package/data/harnesses/mobile/skills/brainstorm/README.md +1 -1
  276. package/data/harnesses/mobile/skills/brainstorm/SKILL.md +1 -1
  277. package/data/harnesses/mobile/skills/brainstorm/exit-artifacts.md +4 -4
  278. package/data/harnesses/mobile/skills/brainstorm/templates/source-of-truth.md +3 -3
  279. package/data/harnesses/mobile/skills/documentation/SKILL.md +61 -17
  280. package/data/harnesses/mobile/skills/documentation/references/examples.md +41 -0
  281. package/data/harnesses/mobile/skills/documentation/references/style-guide.md +14 -9
  282. package/data/harnesses/mobile/skills/documentation/references/templates.md +305 -51
  283. package/package.json +1 -1
@@ -0,0 +1,267 @@
1
+ // skills/design/scripts/preship-sweep.mjs — verification-ladder rung 1 (D21/D23): static sweep — per-file catalog + manifest drift via lib/checks.mjs + cross-file machine checks + mandatory-procedures checklist + scope cross-check. --files <a> <b> … scopes the sweep (improve's end-of-run verify); no args = whole-app. --manifest <design.tokens.json | artifact dir> overrides the drift vocabulary source (default: <project>/design.tokens.json).
2
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
3
+ import { join, dirname, resolve, relative } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { runChecks } from './lib/checks.mjs';
6
+
7
+ const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
8
+ const CATALOG = join(SCRIPT_DIR, '..', 'data', 'catalog', 'rules.csv');
9
+ const HARD_RULES = join(SCRIPT_DIR, '..', 'references', 'hard-rules.md');
10
+
11
+ const useColor = process.stdout.isTTY;
12
+ // Wrap a string in red/yellow/green when writing to a TTY, plain otherwise.
13
+ const red = (s) => (useColor ? `\x1b[31m${s}\x1b[0m` : s);
14
+ const yellow = (s) => (useColor ? `\x1b[33m${s}\x1b[0m` : s);
15
+ const green = (s) => (useColor ? `\x1b[32m${s}\x1b[0m` : s);
16
+ const bold = (s) => (useColor ? `\x1b[1m${s}\x1b[0m` : s);
17
+
18
+ // Read a UTF-8 file, returning '' when it is absent.
19
+ function readText(path) {
20
+ try { return readFileSync(path, 'utf8'); } catch { return ''; }
21
+ }
22
+
23
+ // Recursively collect files under a dir whose name ends with one of the given extensions.
24
+ function walk(dir, exts, acc = []) {
25
+ if (!existsSync(dir)) return acc;
26
+ let entries;
27
+ try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return acc; }
28
+ for (const ent of entries) {
29
+ if (ent.name === 'node_modules' || ent.name.startsWith('.')) continue;
30
+ const full = join(dir, ent.name);
31
+ if (ent.isDirectory()) walk(full, exts, acc);
32
+ else if (exts.some((e) => ent.name.endsWith(e))) acc.push(full);
33
+ }
34
+ return acc;
35
+ }
36
+
37
+ // Parse RFC-4180-ish CSV (quoted fields, "" escapes) into an array of row arrays.
38
+ function parseCsv(text) {
39
+ const rows = [];
40
+ let row = [];
41
+ let field = '';
42
+ let inQ = false;
43
+ for (let i = 0; i < text.length; i++) {
44
+ const c = text[i];
45
+ if (inQ) {
46
+ if (c === '"') { if (text[i + 1] === '"') { field += '"'; i++; } else inQ = false; }
47
+ else field += c;
48
+ } else if (c === '"') inQ = true;
49
+ else if (c === ',') { row.push(field); field = ''; }
50
+ else if (c === '\n') { row.push(field); rows.push(row); row = []; field = ''; }
51
+ else if (c === '\r') { /* ignore */ }
52
+ else field += c;
53
+ }
54
+ if (field.length || row.length) { row.push(field); rows.push(row); }
55
+ return rows;
56
+ }
57
+
58
+ // Load rules.csv into an array of header-keyed row objects.
59
+ function loadCatalog() {
60
+ const rows = parseCsv(readText(CATALOG));
61
+ if (!rows.length) return [];
62
+ const header = rows[0];
63
+ return rows.slice(1).filter((r) => r.length > 1).map((r) => Object.fromEntries(header.map((h, i) => [h, r[i] ?? ''])));
64
+ }
65
+
66
+ // Extract the sequence of heading levels (1-6) appearing in a source blob.
67
+ function headingLevels(text) {
68
+ const levels = [];
69
+ const re = /<h([1-6])[\s/>]/g;
70
+ let m;
71
+ while ((m = re.exec(text))) levels.push(Number(m[1]));
72
+ return levels;
73
+ }
74
+
75
+ // Return the forward heading-level skips (prev -> level jump greater than one) in order.
76
+ function headingSkips(levels) {
77
+ const skips = [];
78
+ let prev = 0;
79
+ for (const l of levels) {
80
+ if (prev && l > prev + 1) skips.push(`h${prev}->h${l}`);
81
+ prev = l;
82
+ }
83
+ return skips;
84
+ }
85
+
86
+ // Count the route directories under src/routes that hold at least one view file.
87
+ function countDeliverables(project) {
88
+ const rd = join(project, 'src/routes');
89
+ if (!existsSync(rd)) return 0;
90
+ let n = 0;
91
+ for (const ent of readdirSync(rd, { withFileTypes: true })) {
92
+ if (!ent.isDirectory()) continue;
93
+ if (walk(join(rd, ent.name), ['.tsx']).length) n++;
94
+ }
95
+ return n;
96
+ }
97
+
98
+ // Count surfaces declared in the structure map by its per-surface archetype lines.
99
+ function countSurfaces(project) {
100
+ const p = join(project, 'docs/design/structure.md');
101
+ if (!existsSync(p)) return null;
102
+ const m = readText(p).match(/```yaml structure\r?\n([\s\S]*?)```/);
103
+ if (!m) return null;
104
+ return (m[1].match(/^\s*archetype\s*:/gm) || []).length;
105
+ }
106
+
107
+ // Read the spc-14 nav bound (nav 5-9) from the catalog.
108
+ function navBounds(catalog) {
109
+ const row = catalog.find((r) => r.id === 'spc-14');
110
+ const m = row && row.numbers && row.numbers.match(/nav\s*(\d+)\s*[-–]\s*(\d+)/);
111
+ return m ? { min: Number(m[1]), max: Number(m[2]) } : null;
112
+ }
113
+
114
+ // Count nav items in src/App.tsx, preferring an explicit <nav> region, else route entries.
115
+ function countNav(project) {
116
+ const text = readText(join(project, 'src/App.tsx'));
117
+ const nav = text.match(/<nav[\s\S]*?<\/nav>/i);
118
+ if (nav) {
119
+ const items = (nav[0].match(/<(a|NavLink|Link|NavItem|button)\b/gi) || []).length;
120
+ if (items) return items;
121
+ }
122
+ return (text.match(/\bpath\s*=/g) || []).length;
123
+ }
124
+
125
+ // Render one catalog finding as a single fix-or-classify line.
126
+ function formatFinding(f, project) {
127
+ const anchor = f.rule || '?';
128
+ const file = f.file ? relative(project, f.file) || f.file : '';
129
+ const loc = f.line != null ? `${file}:${f.line}` : file;
130
+ const ev = f.excerpt ? ` [${f.excerpt}]` : '';
131
+ return ` ${red(anchor)} ${loc}${ev} ${f.fix || ''}`.trimEnd();
132
+ }
133
+
134
+ // Run the per-file catalog + manifest drift (lib/checks.mjs) over the file set; returns the violation count.
135
+ function runCatalog(project, files, manifestPath, section) {
136
+ if (!files.length) { section.push(' (no src/**/*.{tsx,ts,css,html} files to scan)'); return 0; }
137
+ const findings = runChecks(files, { manifestPath });
138
+ if (!findings.length) { section.push(green(' catalog checks: no per-file violations.')); return 0; }
139
+ section.push(` catalog checks reported ${findings.length} violation(s) — fix each now, or classify why it does not apply in docs/memory/design-decay.md; never ignore silently:`);
140
+ for (const f of findings) section.push(formatFinding(f, project));
141
+ return findings.length;
142
+ }
143
+
144
+ // Run the cross-file machine checks (dep-02 one-h1 + heading skips) and, on whole-app runs, the route-shell aggregate and advisory nav-count.
145
+ function crossFileChecks(project, files, catalog, section, scoped) {
146
+ const violations = [];
147
+ for (const file of files) {
148
+ if (!/\.(tsx|html)$/.test(file)) continue;
149
+ const text = readText(file);
150
+ const rel = relative(project, file) || file;
151
+ const h1 = (text.match(/<h1[\s/>]/g) || []).length;
152
+ if (h1 >= 2) violations.push(` ${red('dep-02')} ${rel} ${h1} <h1> elements in one view; exactly one h1 per view.`);
153
+ const skips = headingSkips(headingLevels(text));
154
+ if (skips.length) violations.push(` ${red('dep-02')} ${rel} heading level skips (${skips.join(', ')}); heading levels never skip.`);
155
+ }
156
+ const routesDir = join(project, 'src/routes');
157
+ if (!scoped && existsSync(routesDir)) {
158
+ for (const ent of readdirSync(routesDir, { withFileTypes: true })) {
159
+ if (!ent.isDirectory()) continue;
160
+ const dir = join(routesDir, ent.name);
161
+ const total = walk(dir, ['.tsx']).reduce((n, f) => n + (readText(f).match(/<h1[\s/>]/g) || []).length, 0);
162
+ if (total > 1) violations.push(` ${red('dep-02')} src/routes/${ent.name}/ ${total} <h1> across the route shell; one h1 per route view.`);
163
+ }
164
+ }
165
+ if (violations.length) { section.push(...violations); }
166
+ else section.push(green(' cross-file machine checks (dep-02 one-h1, heading-skip): clean.'));
167
+
168
+ if (!scoped) {
169
+ const bounds = navBounds(catalog);
170
+ const nav = countNav(project);
171
+ if (bounds) {
172
+ const within = nav >= bounds.min && nav <= bounds.max;
173
+ const note = ` ${within ? '' : yellow('[advisory] ')}nav items: ${nav} (spc-14 advisory band ${bounds.min}-${bounds.max}${within ? ', within' : ', outside — judged, not gated'}).`;
174
+ section.push(note);
175
+ }
176
+ }
177
+ return violations.length;
178
+ }
179
+
180
+ // Print the proc-* mandatory-procedures checklist, each row's imperative sourced from hard-rules.md.
181
+ function procChecklist(catalog) {
182
+ const hard = readText(HARD_RULES);
183
+ const imperatives = new Map();
184
+ for (const line of hard.split(/\r?\n/)) {
185
+ const m = line.match(/^- `(proc-\d+)`\s*(.*)$/);
186
+ if (m) imperatives.set(m[1], m[2].trim());
187
+ }
188
+ const procs = catalog.filter((r) => /^proc-\d+$/.test(r.id)).sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }));
189
+ const lines = [];
190
+ for (const r of procs) {
191
+ const text = imperatives.get(r.id) || r.statement || '';
192
+ lines.push(` [ ] ${r.id} — ${text}`);
193
+ }
194
+ return lines;
195
+ }
196
+
197
+ // Assemble and print the whole sweep, then exit non-zero when catalog or cross-file checks found violations.
198
+ function main() {
199
+ const args = process.argv.slice(2);
200
+ let project = process.cwd();
201
+ let scopedFiles = null;
202
+ let manifestArg = null;
203
+ for (let i = 0; i < args.length; i++) {
204
+ if (args[i] === '--project') project = resolve(args[++i] || '.');
205
+ else if (args[i].startsWith('--project=')) project = resolve(args[i].slice('--project='.length));
206
+ else if (args[i] === '--manifest') manifestArg = resolve(args[++i] || '.');
207
+ else if (args[i].startsWith('--manifest=')) manifestArg = resolve(args[i].slice('--manifest='.length));
208
+ else if (args[i] === '--files') {
209
+ scopedFiles = [];
210
+ while (i + 1 < args.length && !args[i + 1].startsWith('--')) scopedFiles.push(resolve(args[++i]));
211
+ }
212
+ }
213
+
214
+ const catalog = loadCatalog();
215
+ const scoped = scopedFiles !== null;
216
+ const files = scoped ? scopedFiles : walk(join(project, 'src'), ['.tsx', '.ts', '.css', '.html']);
217
+ const defaultManifest = join(project, 'design.tokens.json');
218
+ const manifestPath = manifestArg || (existsSync(defaultManifest) ? defaultManifest : null);
219
+
220
+ console.log(bold(`preship-sweep — verification ladder rung 1 (project: ${project}${scoped ? `, scoped to ${files.length} file(s) via --files` : ''})`));
221
+ console.log('');
222
+
223
+ console.log(bold('(a) Per-file catalog + manifest drift — lib/checks.mjs'));
224
+ const secA = [];
225
+ const catalogCount = runCatalog(project, files, manifestPath, secA);
226
+ console.log(secA.join('\n'));
227
+ console.log('');
228
+
229
+ console.log(bold('(b) Cross-file machine checks'));
230
+ const secB = [];
231
+ const crossCount = crossFileChecks(project, files, catalog, secB, scoped);
232
+ console.log(secB.join('\n'));
233
+ console.log('');
234
+
235
+ if (!scoped) {
236
+ console.log(bold('(c) Mandatory procedures — self-audit checklist (proc-*)'));
237
+ console.log(procChecklist(catalog).join('\n'));
238
+ console.log('');
239
+
240
+ console.log(bold('(c) Scope cross-check (proc-14)'));
241
+ const surfaces = countSurfaces(project);
242
+ const deliverables = countDeliverables(project);
243
+ if (surfaces == null) {
244
+ console.log(` ${yellow('no docs/design/structure.md map found — cannot cross-check scope.')}`);
245
+ } else {
246
+ console.log(` structure map declares ${surfaces} surface(s); found ${deliverables} route deliverable(s) under src/routes/.`);
247
+ if (surfaces !== deliverables) console.log(` ${yellow(`[advisory] scope mismatch (${surfaces} vs ${deliverables}) — add or reconcile before responding (proc-14).`)}`);
248
+ }
249
+ console.log('');
250
+ } else {
251
+ console.log('(scoped run — the mandatory-procedures checklist and scope cross-check run on the whole-app sweep)');
252
+ console.log('');
253
+ }
254
+
255
+ const failed = catalogCount > 0 || crossCount > 0;
256
+ if (failed) {
257
+ const reasons = [];
258
+ if (catalogCount > 0) reasons.push(`${catalogCount} per-file violation(s)`);
259
+ if (crossCount > 0) reasons.push(`${crossCount} cross-file violation(s)`);
260
+ console.log(red(`FAIL preship-sweep — ${reasons.join('; ')}. Resolve, then re-run.`));
261
+ process.exit(1);
262
+ }
263
+ console.log(green(scoped ? 'PASS preship-sweep (scoped) — no static violations in the given files.' : 'PASS preship-sweep — no static violations; work the checklist above before ship.'));
264
+ process.exit(0);
265
+ }
266
+
267
+ main();