exonous 0.0.0-stage → 2.10.4

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 (385) hide show
  1. package/README.md +100 -2
  2. package/assets/THIRD-PARTY-NOTICES.md +29 -0
  3. package/assets/adapters/opencode/exonous.js +54 -0
  4. package/assets/agents/exo-backend.md +22 -0
  5. package/assets/agents/exo-cto.md +22 -0
  6. package/assets/agents/exo-data-ai.md +22 -0
  7. package/assets/agents/exo-designer.md +22 -0
  8. package/assets/agents/exo-devops.md +22 -0
  9. package/assets/agents/exo-frontend.md +22 -0
  10. package/assets/agents/exo-infra.md +22 -0
  11. package/assets/agents/exo-mobile.md +22 -0
  12. package/assets/agents/exo-pm.md +22 -0
  13. package/assets/agents/exo-qa.md +22 -0
  14. package/assets/agents/exo-researcher.md +22 -0
  15. package/assets/agents/exo-security.md +22 -0
  16. package/assets/agents/roster.json +209 -0
  17. package/assets/agents/taxis.js +189 -0
  18. package/assets/editors/cursor/frontend-skills.mdc +27 -0
  19. package/assets/editors/hooks/cursor/hooks.json +11 -0
  20. package/assets/machine/PR-TEMPLATE.md +21 -0
  21. package/assets/machine/hooks/anamnesis.cjs +61 -0
  22. package/assets/machine/hooks/ethos.cjs +48 -0
  23. package/assets/machine/hooks/kairos.cjs +46 -0
  24. package/assets/machine/hooks/lib/cli-options.cjs +133 -0
  25. package/assets/machine/hooks/lib/memory.cjs +488 -0
  26. package/assets/machine/hooks/lib/metron.cjs +52 -0
  27. package/assets/machine/hooks/lib/paths.cjs +99 -0
  28. package/assets/machine/hooks/lib/payload.cjs +81 -0
  29. package/assets/machine/hooks/lib/pr-template-validate.cjs +103 -0
  30. package/assets/machine/hooks/lib/release.cjs +58 -0
  31. package/assets/machine/hooks/lib/repo.cjs +138 -0
  32. package/assets/machine/hooks/lib/sanitize.cjs +37 -0
  33. package/assets/machine/hooks/lib/selfupdate.cjs +354 -0
  34. package/assets/machine/hooks/lib/shell.cjs +722 -0
  35. package/assets/machine/hooks/lib/template.cjs +70 -0
  36. package/assets/machine/hooks/lib/token.cjs +110 -0
  37. package/assets/machine/hooks/lib/validate-pr-body.cjs +21 -0
  38. package/assets/machine/hooks/pyle.cjs +302 -0
  39. package/assets/rules/nomos.md +59 -0
  40. package/assets/rules/praxis.md +38 -0
  41. package/assets/skills/code-review/SKILL.md +124 -0
  42. package/assets/skills/commit-changes/SKILL.md +49 -0
  43. package/assets/skills/deliver/SKILL.md +114 -0
  44. package/assets/skills/deliver/references/parallel.md +37 -0
  45. package/assets/skills/doc/SKILL.md +140 -0
  46. package/assets/skills/doc/doc.mjs +277 -0
  47. package/assets/skills/issue-board/SKILL.md +84 -0
  48. package/assets/skills/issue-board/board.mjs +389 -0
  49. package/assets/skills/issue-board/config.example.json +9 -0
  50. package/assets/skills/issue-board/render.py +189 -0
  51. package/assets/skills/make-pr/SKILL.md +24 -0
  52. package/assets/skills/native-ui/SKILL.md +67 -0
  53. package/assets/skills/native-ui/reference/apple.md +180 -0
  54. package/assets/skills/native-ui/reference/mobile-feel.md +221 -0
  55. package/assets/skills/native-ui/reference/swift.md +289 -0
  56. package/assets/skills/project-memory/SKILL.md +59 -0
  57. package/assets/skills/project-memory/config.example.json +4 -0
  58. package/assets/skills/project-memory/project-memory.mjs +478 -0
  59. package/assets/skills/security-review/SKILL.md +102 -0
  60. package/assets/skills/session-handoff/SKILL.md +23 -0
  61. package/assets/skills/session-handoff/config.example.json +3 -0
  62. package/assets/skills/ui-design/SKILL.md +75 -0
  63. package/assets/skills/ui-design/reference/adapt.md +151 -0
  64. package/assets/skills/ui-design/reference/adapt.native.md +35 -0
  65. package/assets/skills/ui-design/reference/android.md +50 -0
  66. package/assets/skills/ui-design/reference/animate.md +87 -0
  67. package/assets/skills/ui-design/reference/audit.md +76 -0
  68. package/assets/skills/ui-design/reference/audit.native.md +126 -0
  69. package/assets/skills/ui-design/reference/bolder.md +33 -0
  70. package/assets/skills/ui-design/reference/clarify.md +84 -0
  71. package/assets/skills/ui-design/reference/colorize.md +86 -0
  72. package/assets/skills/ui-design/reference/craft-floor.md +25 -0
  73. package/assets/skills/ui-design/reference/critique.md +345 -0
  74. package/assets/skills/ui-design/reference/degraded/asset-producer.md +35 -0
  75. package/assets/skills/ui-design/reference/degraded/documenter.md +23 -0
  76. package/assets/skills/ui-design/reference/degraded/finish-reviewer.md +43 -0
  77. package/assets/skills/ui-design/reference/degraded/manual-edit-applier.md +56 -0
  78. package/assets/skills/ui-design/reference/delight.md +63 -0
  79. package/assets/skills/ui-design/reference/distill.md +98 -0
  80. package/assets/skills/ui-design/reference/doctor.md +49 -0
  81. package/assets/skills/ui-design/reference/document.md +273 -0
  82. package/assets/skills/ui-design/reference/extract.md +52 -0
  83. package/assets/skills/ui-design/reference/harden.md +122 -0
  84. package/assets/skills/ui-design/reference/hooks.md +114 -0
  85. package/assets/skills/ui-design/reference/init.md +47 -0
  86. package/assets/skills/ui-design/reference/ios.md +55 -0
  87. package/assets/skills/ui-design/reference/layout.md +81 -0
  88. package/assets/skills/ui-design/reference/live-setup.md +75 -0
  89. package/assets/skills/ui-design/reference/live.md +326 -0
  90. package/assets/skills/ui-design/reference/new-work.md +350 -0
  91. package/assets/skills/ui-design/reference/onboard.md +85 -0
  92. package/assets/skills/ui-design/reference/operate.md +29 -0
  93. package/assets/skills/ui-design/reference/optimize.md +101 -0
  94. package/assets/skills/ui-design/reference/overdrive.md +83 -0
  95. package/assets/skills/ui-design/reference/polish.md +77 -0
  96. package/assets/skills/ui-design/reference/quieter.md +95 -0
  97. package/assets/skills/ui-design/reference/routing.md +37 -0
  98. package/assets/skills/ui-design/reference/shape.md +43 -0
  99. package/assets/skills/ui-design/reference/styles/brutalist.md +45 -0
  100. package/assets/skills/ui-design/reference/styles/design-md.md +70 -0
  101. package/assets/skills/ui-design/reference/styles/direction.md +95 -0
  102. package/assets/skills/ui-design/reference/styles/full-output.md +42 -0
  103. package/assets/skills/ui-design/reference/styles/minimalist.md +64 -0
  104. package/assets/skills/ui-design/reference/styles/premium.md +65 -0
  105. package/assets/skills/ui-design/reference/styles/redesign.md +59 -0
  106. package/assets/skills/ui-design/reference/typeset.md +73 -0
  107. package/assets/skills/ui-design/reference/visualize.md +156 -0
  108. package/assets/skills/ui-design/scripts/ENGINE-LICENSE +191 -0
  109. package/assets/skills/ui-design/scripts/VERSION +1 -0
  110. package/assets/skills/ui-design/scripts/bin/darwin-arm64/impeccable +0 -0
  111. package/assets/skills/ui-design/scripts/command-metadata.json +94 -0
  112. package/assets/skills/ui-design/scripts/data/font-index-failures.json +121 -0
  113. package/assets/skills/ui-design/scripts/data/font-index.json +1 -0
  114. package/assets/skills/ui-design/scripts/impeccable +206 -0
  115. package/assets/skills/ui-design/scripts/impeccable.cmd +214 -0
  116. package/assets/skills/ui-design/scripts/live-browser-dom.js +167 -0
  117. package/assets/skills/ui-design/scripts/live-browser-ignores.js +242 -0
  118. package/assets/skills/ui-design/scripts/live-browser-session.js +144 -0
  119. package/assets/skills/ui-design/scripts/live-browser.js +12990 -0
  120. package/assets/skills/ui-design/scripts/modern-screenshot.umd.js +14 -0
  121. package/assets/skills/ui-design/scripts/ui-design +6 -0
  122. package/assets/skills/ui-design/scripts/ui-design.cmd +3 -0
  123. package/assets/skills/ui-design/scripts/ui-design.mjs +124 -0
  124. package/assets/skills/ui-mockup/SKILL.md +68 -0
  125. package/assets/skills/ui-mockup/reference/brandkit.md +101 -0
  126. package/assets/skills/ui-mockup/reference/image-to-code.md +83 -0
  127. package/assets/skills/ui-mockup/reference/mobile-comps.md +94 -0
  128. package/assets/skills/ui-mockup/reference/web-comps.md +83 -0
  129. package/assets/skills/ui-motion/SKILL.md +112 -0
  130. package/assets/skills/ui-motion/reference/expo.md +224 -0
  131. package/assets/skills/ui-motion/reference/opportunities.md +81 -0
  132. package/assets/skills/ui-motion/reference/prototype.md +238 -0
  133. package/assets/skills/ui-motion/reference/review.md +163 -0
  134. package/assets/skills/ui-motion/reference/toasts.md +144 -0
  135. package/assets/skills/ui-motion/reference/ui-libraries.md +71 -0
  136. package/assets/skills/ui-motion/reference/vocabulary.md +130 -0
  137. package/assets/skills/ui-motion/reference/web.md +294 -0
  138. package/assets/skills/ui-patterns/SKILL.md +105 -0
  139. package/assets/skills/ui-patterns/references/stacks/html-tailwind.md +40 -0
  140. package/assets/skills/ui-patterns/references/stacks/nextjs.md +52 -0
  141. package/assets/skills/ui-patterns/references/stacks/nuxt.md +100 -0
  142. package/assets/skills/ui-patterns/references/stacks/react-native.md +48 -0
  143. package/assets/skills/ui-patterns/references/stacks/react.md +49 -0
  144. package/assets/skills/ui-patterns/references/stacks/shadcn.md +57 -0
  145. package/assets/skills/ui-patterns/references/stacks/vue.md +37 -0
  146. package/assets/techne/.claude-plugin/marketplace.json +31 -0
  147. package/assets/techne/.claude-plugin/plugin.json +24 -0
  148. package/assets/techne/.mcp.json +8 -0
  149. package/assets/techne/commands/build-fix.md +48 -0
  150. package/assets/techne/commands/refactor-clean.md +46 -0
  151. package/assets/techne/commands/test-coverage.md +42 -0
  152. package/assets/techne/hooks/hooks.json +49 -0
  153. package/assets/techne/rules/angular/coding-style.md +49 -0
  154. package/assets/techne/rules/angular/hooks.md +23 -0
  155. package/assets/techne/rules/angular/patterns.md +48 -0
  156. package/assets/techne/rules/angular/security.md +26 -0
  157. package/assets/techne/rules/angular/testing.md +46 -0
  158. package/assets/techne/rules/arkts/coding-style.md +63 -0
  159. package/assets/techne/rules/arkts/hooks.md +38 -0
  160. package/assets/techne/rules/arkts/patterns.md +42 -0
  161. package/assets/techne/rules/arkts/security.md +35 -0
  162. package/assets/techne/rules/arkts/testing.md +39 -0
  163. package/assets/techne/rules/common/agents.md +6 -0
  164. package/assets/techne/rules/common/code-review.md +15 -0
  165. package/assets/techne/rules/common/coding-style.md +13 -0
  166. package/assets/techne/rules/common/development-workflow.md +5 -0
  167. package/assets/techne/rules/common/git-workflow.md +30 -0
  168. package/assets/techne/rules/common/hooks.md +7 -0
  169. package/assets/techne/rules/common/patterns.md +3 -0
  170. package/assets/techne/rules/common/performance.md +3 -0
  171. package/assets/techne/rules/common/security.md +5 -0
  172. package/assets/techne/rules/common/testing.md +3 -0
  173. package/assets/techne/rules/cpp/coding-style.md +31 -0
  174. package/assets/techne/rules/cpp/hooks.md +26 -0
  175. package/assets/techne/rules/cpp/patterns.md +31 -0
  176. package/assets/techne/rules/cpp/security.md +37 -0
  177. package/assets/techne/rules/cpp/testing.md +31 -0
  178. package/assets/techne/rules/csharp/coding-style.md +30 -0
  179. package/assets/techne/rules/csharp/hooks.md +24 -0
  180. package/assets/techne/rules/csharp/patterns.md +28 -0
  181. package/assets/techne/rules/csharp/security.md +32 -0
  182. package/assets/techne/rules/csharp/testing.md +27 -0
  183. package/assets/techne/rules/dart/coding-style.md +47 -0
  184. package/assets/techne/rules/dart/hooks.md +26 -0
  185. package/assets/techne/rules/dart/patterns.md +38 -0
  186. package/assets/techne/rules/dart/security.md +44 -0
  187. package/assets/techne/rules/dart/testing.md +39 -0
  188. package/assets/techne/rules/fsharp/coding-style.md +34 -0
  189. package/assets/techne/rules/fsharp/hooks.md +25 -0
  190. package/assets/techne/rules/fsharp/patterns.md +43 -0
  191. package/assets/techne/rules/fsharp/security.md +32 -0
  192. package/assets/techne/rules/fsharp/testing.md +27 -0
  193. package/assets/techne/rules/golang/coding-style.md +30 -0
  194. package/assets/techne/rules/golang/hooks.md +17 -0
  195. package/assets/techne/rules/golang/patterns.md +43 -0
  196. package/assets/techne/rules/golang/security.md +33 -0
  197. package/assets/techne/rules/golang/testing.md +20 -0
  198. package/assets/techne/rules/java/coding-style.md +51 -0
  199. package/assets/techne/rules/java/hooks.md +18 -0
  200. package/assets/techne/rules/java/patterns.md +55 -0
  201. package/assets/techne/rules/java/security.md +33 -0
  202. package/assets/techne/rules/java/testing.md +33 -0
  203. package/assets/techne/rules/kotlin/coding-style.md +50 -0
  204. package/assets/techne/rules/kotlin/hooks.md +17 -0
  205. package/assets/techne/rules/kotlin/patterns.md +44 -0
  206. package/assets/techne/rules/kotlin/security.md +34 -0
  207. package/assets/techne/rules/kotlin/testing.md +38 -0
  208. package/assets/techne/rules/nuxt/coding-style.md +20 -0
  209. package/assets/techne/rules/nuxt/hooks.md +16 -0
  210. package/assets/techne/rules/nuxt/patterns.md +46 -0
  211. package/assets/techne/rules/nuxt/security.md +19 -0
  212. package/assets/techne/rules/nuxt/testing.md +15 -0
  213. package/assets/techne/rules/perl/coding-style.md +33 -0
  214. package/assets/techne/rules/perl/hooks.md +22 -0
  215. package/assets/techne/rules/perl/patterns.md +43 -0
  216. package/assets/techne/rules/perl/security.md +39 -0
  217. package/assets/techne/rules/perl/testing.md +42 -0
  218. package/assets/techne/rules/php/coding-style.md +30 -0
  219. package/assets/techne/rules/php/hooks.md +24 -0
  220. package/assets/techne/rules/php/patterns.md +26 -0
  221. package/assets/techne/rules/php/security.md +27 -0
  222. package/assets/techne/rules/php/testing.md +28 -0
  223. package/assets/techne/rules/python/coding-style.md +38 -0
  224. package/assets/techne/rules/python/fastapi.md +57 -0
  225. package/assets/techne/rules/python/hooks.md +19 -0
  226. package/assets/techne/rules/python/patterns.md +37 -0
  227. package/assets/techne/rules/python/security.md +26 -0
  228. package/assets/techne/rules/python/testing.md +32 -0
  229. package/assets/techne/rules/react/coding-style.md +24 -0
  230. package/assets/techne/rules/react/hooks.md +62 -0
  231. package/assets/techne/rules/react/patterns.md +48 -0
  232. package/assets/techne/rules/react/security.md +45 -0
  233. package/assets/techne/rules/react/testing.md +42 -0
  234. package/assets/techne/rules/react-native/accessibility.md +14 -0
  235. package/assets/techne/rules/react-native/coding-style.md +16 -0
  236. package/assets/techne/rules/react-native/hooks.md +16 -0
  237. package/assets/techne/rules/react-native/patterns.md +18 -0
  238. package/assets/techne/rules/react-native/performance.md +14 -0
  239. package/assets/techne/rules/react-native/production-readiness.md +16 -0
  240. package/assets/techne/rules/react-native/security.md +16 -0
  241. package/assets/techne/rules/react-native/testing.md +14 -0
  242. package/assets/techne/rules/ruby/coding-style.md +40 -0
  243. package/assets/techne/rules/ruby/hooks.md +33 -0
  244. package/assets/techne/rules/ruby/patterns.md +33 -0
  245. package/assets/techne/rules/ruby/security.md +39 -0
  246. package/assets/techne/rules/ruby/testing.md +35 -0
  247. package/assets/techne/rules/rust/coding-style.md +41 -0
  248. package/assets/techne/rules/rust/hooks.md +16 -0
  249. package/assets/techne/rules/rust/patterns.md +42 -0
  250. package/assets/techne/rules/rust/security.md +33 -0
  251. package/assets/techne/rules/rust/testing.md +30 -0
  252. package/assets/techne/rules/swift/coding-style.md +30 -0
  253. package/assets/techne/rules/swift/hooks.md +20 -0
  254. package/assets/techne/rules/swift/patterns.md +30 -0
  255. package/assets/techne/rules/swift/security.md +22 -0
  256. package/assets/techne/rules/swift/testing.md +28 -0
  257. package/assets/techne/rules/typescript/coding-style.md +38 -0
  258. package/assets/techne/rules/typescript/hooks.md +14 -0
  259. package/assets/techne/rules/typescript/patterns.md +12 -0
  260. package/assets/techne/rules/typescript/security.md +14 -0
  261. package/assets/techne/rules/typescript/testing.md +12 -0
  262. package/assets/techne/rules/vue/coding-style.md +19 -0
  263. package/assets/techne/rules/vue/hooks.md +13 -0
  264. package/assets/techne/rules/vue/patterns.md +29 -0
  265. package/assets/techne/rules/vue/security.md +11 -0
  266. package/assets/techne/rules/vue/testing.md +11 -0
  267. package/assets/techne/rules/web/coding-style.md +25 -0
  268. package/assets/techne/rules/web/design-quality.md +21 -0
  269. package/assets/techne/rules/web/hooks.md +39 -0
  270. package/assets/techne/rules/web/patterns.md +23 -0
  271. package/assets/techne/rules/web/performance.md +25 -0
  272. package/assets/techne/rules/web/security.md +23 -0
  273. package/assets/techne/rules/web/testing.md +21 -0
  274. package/assets/techne/scripts/hooks/config-guard.js +50 -0
  275. package/assets/techne/scripts/hooks/edit-tracker.js +26 -0
  276. package/assets/techne/scripts/hooks/lib/shell.js +204 -0
  277. package/assets/techne/scripts/hooks/no-verify-guard.js +205 -0
  278. package/assets/techne/scripts/hooks/run.js +92 -0
  279. package/assets/techne/scripts/hooks/stop-checks.js +136 -0
  280. package/assets/techne/skills/angular/SKILL.md +34 -0
  281. package/assets/techne/skills/angular/reference/components-and-templates.md +63 -0
  282. package/assets/techne/skills/angular/reference/dependency-injection.md +44 -0
  283. package/assets/techne/skills/angular/reference/forms.md +97 -0
  284. package/assets/techne/skills/angular/reference/routing.md +50 -0
  285. package/assets/techne/skills/angular/reference/signals-and-state.md +59 -0
  286. package/assets/techne/skills/angular/reference/styling-motion-a11y.md +54 -0
  287. package/assets/techne/skills/angular/reference/testing.md +52 -0
  288. package/assets/techne/skills/angular/reference/tooling.md +31 -0
  289. package/assets/techne/skills/cpp/SKILL.md +27 -0
  290. package/assets/techne/skills/cpp/reference/coding-standards.md +160 -0
  291. package/assets/techne/skills/databases/SKILL.md +35 -0
  292. package/assets/techne/skills/databases/reference/clickhouse.md +102 -0
  293. package/assets/techne/skills/databases/reference/migrations.md +94 -0
  294. package/assets/techne/skills/databases/reference/mysql.md +101 -0
  295. package/assets/techne/skills/databases/reference/postgres.md +72 -0
  296. package/assets/techne/skills/databases/reference/prisma.md +105 -0
  297. package/assets/techne/skills/databases/reference/redis.md +108 -0
  298. package/assets/techne/skills/delivery/SKILL.md +35 -0
  299. package/assets/techne/skills/delivery/reference/deployment-patterns.md +58 -0
  300. package/assets/techne/skills/delivery/reference/docker-patterns.md +77 -0
  301. package/assets/techne/skills/delivery/reference/git-workflow.md +64 -0
  302. package/assets/techne/skills/delivery/reference/github-ops.md +67 -0
  303. package/assets/techne/skills/delivery/reference/jira-integration.md +53 -0
  304. package/assets/techne/skills/delivery/reference/kubernetes-patterns.md +67 -0
  305. package/assets/techne/skills/dotnet/SKILL.md +27 -0
  306. package/assets/techne/skills/dotnet/reference/dotnet-core.md +131 -0
  307. package/assets/techne/skills/flutter/SKILL.md +29 -0
  308. package/assets/techne/skills/flutter/reference/code-review.md +76 -0
  309. package/assets/techne/skills/flutter/reference/patterns.md +201 -0
  310. package/assets/techne/skills/go/SKILL.md +28 -0
  311. package/assets/techne/skills/go/reference/patterns.md +87 -0
  312. package/assets/techne/skills/go/reference/testing.md +142 -0
  313. package/assets/techne/skills/java/SKILL.md +29 -0
  314. package/assets/techne/skills/java/reference/java-standards.md +117 -0
  315. package/assets/techne/skills/java/reference/springboot.md +108 -0
  316. package/assets/techne/skills/kotlin/SKILL.md +35 -0
  317. package/assets/techne/skills/kotlin/reference/android-clean-architecture.md +115 -0
  318. package/assets/techne/skills/kotlin/reference/compose-multiplatform-patterns.md +113 -0
  319. package/assets/techne/skills/kotlin/reference/kotlin-coroutines-flows.md +93 -0
  320. package/assets/techne/skills/kotlin/reference/kotlin-patterns.md +74 -0
  321. package/assets/techne/skills/kotlin/reference/kotlin-testing.md +115 -0
  322. package/assets/techne/skills/ml/SKILL.md +34 -0
  323. package/assets/techne/skills/ml/reference/ai-regression-testing.md +99 -0
  324. package/assets/techne/skills/ml/reference/cost-aware-llm-pipeline.md +133 -0
  325. package/assets/techne/skills/ml/reference/eval-harness.md +94 -0
  326. package/assets/techne/skills/ml/reference/mle-workflow.md +177 -0
  327. package/assets/techne/skills/ml/reference/prompt-optimizer.md +107 -0
  328. package/assets/techne/skills/ml/reference/pytorch-patterns.md +164 -0
  329. package/assets/techne/skills/php/SKILL.md +27 -0
  330. package/assets/techne/skills/php/reference/laravel.md +142 -0
  331. package/assets/techne/skills/python/SKILL.md +33 -0
  332. package/assets/techne/skills/python/reference/django.md +104 -0
  333. package/assets/techne/skills/python/reference/fastapi.md +118 -0
  334. package/assets/techne/skills/python/reference/python-core.md +88 -0
  335. package/assets/techne/skills/python/reference/python-testing.md +105 -0
  336. package/assets/techne/skills/quality/SKILL.md +34 -0
  337. package/assets/techne/skills/quality/reference/benchmark.md +55 -0
  338. package/assets/techne/skills/quality/reference/browser-qa.md +60 -0
  339. package/assets/techne/skills/quality/reference/coding-standards.md +88 -0
  340. package/assets/techne/skills/quality/reference/e2e-testing.md +99 -0
  341. package/assets/techne/skills/quality/reference/tdd-workflow.md +89 -0
  342. package/assets/techne/skills/quality/reference/verification-loop.md +80 -0
  343. package/assets/techne/skills/react/SKILL.md +30 -0
  344. package/assets/techne/skills/react/reference/nextjs-turbopack.md +42 -0
  345. package/assets/techne/skills/react/reference/react-patterns.md +139 -0
  346. package/assets/techne/skills/react/reference/react-performance.md +101 -0
  347. package/assets/techne/skills/react/reference/react-testing.md +139 -0
  348. package/assets/techne/skills/react-native/SKILL.md +28 -0
  349. package/assets/techne/skills/react-native/reference/expo-patterns.md +196 -0
  350. package/assets/techne/skills/research/SKILL.md +35 -0
  351. package/assets/techne/skills/research/reference/architecture-decision-records.md +65 -0
  352. package/assets/techne/skills/research/reference/codebase-onboarding.md +44 -0
  353. package/assets/techne/skills/research/reference/deep-research.md +50 -0
  354. package/assets/techne/skills/research/reference/iterative-retrieval.md +62 -0
  355. package/assets/techne/skills/research/reference/product-lens.md +38 -0
  356. package/assets/techne/skills/research/reference/search-first.md +50 -0
  357. package/assets/techne/skills/rust/SKILL.md +28 -0
  358. package/assets/techne/skills/rust/reference/patterns.md +108 -0
  359. package/assets/techne/skills/rust/reference/testing.md +142 -0
  360. package/assets/techne/skills/services/SKILL.md +32 -0
  361. package/assets/techne/skills/services/reference/api-contracts.md +139 -0
  362. package/assets/techne/skills/services/reference/backend-layers.md +95 -0
  363. package/assets/techne/skills/services/reference/errors-and-resilience.md +146 -0
  364. package/assets/techne/skills/services/reference/hexagonal-boundaries.md +93 -0
  365. package/assets/techne/skills/services/reference/mcp-servers.md +50 -0
  366. package/assets/techne/skills/services/reference/nestjs.md +96 -0
  367. package/assets/techne/skills/swift/SKILL.md +29 -0
  368. package/assets/techne/skills/swift/reference/concurrency.md +83 -0
  369. package/assets/techne/skills/swift/reference/swiftui.md +139 -0
  370. package/assets/techne/skills/vue/SKILL.md +29 -0
  371. package/assets/techne/skills/vue/reference/nuxt4-patterns.md +90 -0
  372. package/assets/techne/skills/vue/reference/ui-to-vue.md +90 -0
  373. package/assets/techne/skills/vue/reference/vue-patterns.md +151 -0
  374. package/assets/techne/skills/web/SKILL.md +30 -0
  375. package/assets/techne/skills/web/reference/bun-runtime.md +55 -0
  376. package/assets/techne/skills/web/reference/frontend-patterns.md +54 -0
  377. package/assets/techne/skills/web/reference/seo.md +77 -0
  378. package/assets/techne/skills/web/reference/vite-patterns.md +96 -0
  379. package/bin/native.cjs +30 -0
  380. package/native/aarch64-apple-darwin/exonous +0 -0
  381. package/native/aarch64-unknown-linux-gnu/exonous +0 -0
  382. package/native/x86_64-apple-darwin/exonous +0 -0
  383. package/native/x86_64-pc-windows-msvc/exonous.exe +0 -0
  384. package/native/x86_64-unknown-linux-gnu/exonous +0 -0
  385. package/package.json +1 -6
@@ -0,0 +1,277 @@
1
+ #!/usr/bin/env node
2
+ // Localiza documentação, handoffs e referências de código para o repositório.
3
+
4
+ import { execFileSync } from 'node:child_process'
5
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
6
+ import { basename, dirname, join, relative, resolve, sep } from 'node:path'
7
+ const SKIP_DIRS = new Set(['node_modules', 'dist', 'build', 'bin', 'obj', 'vendor', 'coverage', 'target', 'venv', '__pycache__', 'Pods'])
8
+ const MAX_DEPTH = 6
9
+ const MAX_FILE_BYTES = 5 * 1024 * 1024
10
+ const EXIT_NO_REPO = 2
11
+ const EXIT_NO_VAULT = 3
12
+ // Qualquer `algo:12` ou `algo:12-30` entre crases; o resolvedor decide se é arquivo.
13
+ const REF = /`([^`\s:]+):(\d+)(?:-(\d+))?`/gu
14
+ const HOST_LIKE = /^(\d{1,3}(\.\d{1,3}){3}|localhost|[\w.-]+\.(com|net|org|io|uk|br|dev|app|cloud|internal|local))$/i
15
+
16
+ function fail(message, code = 1) {
17
+ process.stderr.write(`${message}\n`)
18
+ process.exit(code)
19
+ }
20
+
21
+ function git(cwd, args) {
22
+ // quotePath=false: sem isso o git devolve caminhos com acento escapados ("a\303\247").
23
+ return execFileSync('git', ['-c', 'core.quotePath=false', '-C', cwd, ...args], {
24
+ encoding: 'utf8',
25
+ maxBuffer: 256 * 1024 * 1024,
26
+ stdio: ['ignore', 'pipe', 'pipe'],
27
+ }).trim()
28
+ }
29
+
30
+ function lines(output) {
31
+ return output.split('\n').map((s) => s.trim()).filter(Boolean)
32
+ }
33
+
34
+ function posix(path) {
35
+ return path.split(sep).join('/')
36
+ }
37
+
38
+ function parseArgs(argv) {
39
+ const flags = {}
40
+ const positional = []
41
+ for (let i = 0; i < argv.length; i++) {
42
+ const arg = argv[i]
43
+ if (!arg.startsWith('--')) {
44
+ positional.push(arg)
45
+ continue
46
+ }
47
+ const eq = arg.indexOf('=')
48
+ const key = eq === -1 ? arg.slice(2) : arg.slice(2, eq)
49
+ if (eq !== -1) flags[key] = arg.slice(eq + 1)
50
+ else if (argv[i + 1] && !argv[i + 1].startsWith('--')) flags[key] = argv[++i]
51
+ else flags[key] = true
52
+ }
53
+ return { flags, positional }
54
+ }
55
+
56
+ function repoInfo(start) {
57
+ let root
58
+ try {
59
+ root = git(start, ['rev-parse', '--show-toplevel'])
60
+ } catch {
61
+ fail(`Não é um repositório git: ${start}`, EXIT_NO_REPO)
62
+ }
63
+ // Em worktree, o nome do repo é o do checkout principal (primeira linha do worktree list).
64
+ const main = git(root, ['worktree', 'list', '--porcelain']).split('\n')[0].replace(/^worktree /, '')
65
+ return {
66
+ root: posix(resolve(root)),
67
+ name: basename(main).replace(/\.git$/, ''),
68
+ mainCheckout: posix(resolve(main)),
69
+ }
70
+ }
71
+
72
+ function hasHead(root) {
73
+ try {
74
+ git(root, ['rev-parse', '--verify', 'HEAD'])
75
+ return true
76
+ } catch {
77
+ return false
78
+ }
79
+ }
80
+
81
+ function walkVaults(dir, depth, found) {
82
+ if (depth > MAX_DEPTH) return found
83
+ let entries
84
+ try {
85
+ entries = readdirSync(dir, { withFileTypes: true })
86
+ } catch {
87
+ return found
88
+ }
89
+ if (entries.some((e) => e.isDirectory() && e.name === '.obsidian')) found.push(dir)
90
+ for (const e of entries) {
91
+ if (e.isDirectory() && !SKIP_DIRS.has(e.name) && !e.name.startsWith('.')) walkVaults(join(dir, e.name), depth + 1, found)
92
+ }
93
+ return found
94
+ }
95
+
96
+ // Prefere o que o git conhece (respeita .gitignore e não entra em clone aninhado);
97
+ // cai para varrer o disco quando o .obsidian não está versionado.
98
+ function findVaults(root) {
99
+ const fromGit = new Set()
100
+ for (const f of lines(git(root, ['ls-files', '--cached', '--others', '--exclude-standard']))) {
101
+ const at = f.indexOf('.obsidian/')
102
+ if (at !== -1 && (at === 0 || f[at - 1] === '/')) fromGit.add(join(root, f.slice(0, at)))
103
+ }
104
+ return fromGit.size ? [...fromGit] : walkVaults(root, 0, [])
105
+ }
106
+
107
+ function markdownFiles(dir, out = []) {
108
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
109
+ if (e.name.startsWith('.')) continue
110
+ const full = join(dir, e.name)
111
+ if (e.isDirectory()) markdownFiles(full, out)
112
+ else if (e.name.endsWith('.md')) out.push(full)
113
+ }
114
+ return out
115
+ }
116
+
117
+ // Nota de entrada: nome começando por _contexto, _índice ou README; a mais rasa primeiro.
118
+ function entryNote(vault, notes) {
119
+ const score = (p) => {
120
+ const name = basename(p).normalize('NFC').toLowerCase()
121
+ if (/^_?(contexto|context)\b/u.test(name)) return 0
122
+ if (/^_?(índice|indice|index)\b/u.test(name)) return 1
123
+ if (name === 'readme.md') return 2
124
+ return 9
125
+ }
126
+ const ranked = notes.filter((p) => score(p) < 9).sort((a, b) => score(a) - score(b) || a.split(sep).length - b.split(sep).length)
127
+ return ranked[0] ? posix(relative(vault, ranked[0])) : null
128
+ }
129
+
130
+ function latestSessionNote(repoRoot) {
131
+ try {
132
+ const env = { ...process.env, EXONOUS_HANDOFF_CWD: repoRoot }
133
+ const command = process.platform === 'win32' ? 'cmd.exe' : 'exonous'
134
+ const args = process.platform === 'win32' ? ['/d', '/s', '/c', 'exonous handoff latest --json'] : ['handoff', 'latest', '--json']
135
+ const cwd = process.platform === 'win32' ? dirname(process.execPath) : repoRoot
136
+ const result = JSON.parse(execFileSync(command, args, { cwd, env, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }))
137
+ if (result.status === 'found') return { sessionsVault: result.vault, note: posix(result.path), reason: null }
138
+ return { sessionsVault: result.vault || null, note: null, reason: result.status === 'unsupported-version' ? `handoff versão ${result.version} não suportada` : 'nenhuma nota: rode `exonous vault detect`' }
139
+ } catch (err) {
140
+ let reason = 'exonous handoff indisponível: confira a instalação do exonous'
141
+ try { reason = JSON.parse(String(err.stdout)).reason || reason } catch {}
142
+ return { sessionsVault: null, note: null, reason }
143
+ }
144
+ }
145
+
146
+ function cmdLocate(flags) {
147
+ const repo = repoInfo(resolve(flags.repo || process.cwd()))
148
+ const describe = (base) =>
149
+ findVaults(base).map((v) => {
150
+ const notes = markdownFiles(v)
151
+ return { path: posix(relative(base, v)) || '.', notes: notes.length, entry: entryNote(v, notes) }
152
+ })
153
+ const vaults = describe(repo.root)
154
+ // Worktree criado antes do vault existir: o vault está no checkout principal, não falta no projeto.
155
+ const vaultsInMainCheckout = !vaults.length && repo.mainCheckout !== repo.root ? describe(repo.mainCheckout) : []
156
+ const session = latestSessionNote(repo.root)
157
+ console.log(JSON.stringify({ repo, vaults, vaultsInMainCheckout, session }, null, 2))
158
+ if (!vaults.length) process.exitCode = EXIT_NO_VAULT
159
+ }
160
+
161
+ // Commits desde `since` + mudanças ainda não commitadas + arquivos novos não rastreados.
162
+ function changedFiles(root, since) {
163
+ // Valor começando com "-" viraria opção do git (ex.: --output=arquivo).
164
+ if (since.startsWith('-')) fail(`--since inválido ("${since}"): use uma data AAAA-MM-DD ou um git ref existente.`)
165
+ const files = new Set(lines(git(root, ['ls-files', '--others', '--exclude-standard'])))
166
+ if (!hasHead(root)) {
167
+ for (const f of lines(git(root, ['ls-files', '--cached']))) files.add(f)
168
+ return files
169
+ }
170
+ for (const f of lines(git(root, ['diff', '--name-only', 'HEAD']))) files.add(f)
171
+ let committed
172
+ try {
173
+ committed = /^\d{4}-\d{2}-\d{2}$/.test(since)
174
+ ? git(root, ['log', `--since=${since} 00:00:00`, '--name-only', '--format='])
175
+ : git(root, ['diff', '--name-only', `${since}...HEAD`])
176
+ } catch (err) {
177
+ fail(`--since inválido ("${since}"): use uma data AAAA-MM-DD ou um git ref existente. ${String(err.stderr || '').trim()}`)
178
+ }
179
+ for (const f of lines(committed)) files.add(f)
180
+ return files
181
+ }
182
+
183
+ function lineCount(path) {
184
+ let stat
185
+ try {
186
+ stat = statSync(path)
187
+ } catch {
188
+ return null
189
+ }
190
+ if (!stat.isFile() || stat.size > MAX_FILE_BYTES) return null
191
+ const buf = readFileSync(path)
192
+ if (buf.length === 0) return 0
193
+ let count = 0
194
+ for (const byte of buf) if (byte === 10) count++
195
+ return buf[buf.length - 1] === 10 ? count : count + 1
196
+ }
197
+
198
+ // Notas citam o caminho completo, um caminho parcial (`oms/state.ts`) ou só o nome (`money.ts`).
199
+ function makeResolver(root) {
200
+ const known = lines(git(root, ['ls-files', '--cached', '--others', '--exclude-standard']))
201
+ const exact = new Set(known)
202
+ const byName = new Map()
203
+ for (const f of known) {
204
+ const name = f.slice(f.lastIndexOf('/') + 1)
205
+ byName.set(name, [...(byName.get(name) || []), f])
206
+ }
207
+ return (raw) => {
208
+ const ref = raw.replace(/\\/g, '/').replace(/^\.\//, '')
209
+ if (exact.has(ref)) return [ref]
210
+ const name = ref.slice(ref.lastIndexOf('/') + 1)
211
+ return (byName.get(name) || []).filter((f) => f.endsWith(`/${ref}`))
212
+ }
213
+ }
214
+
215
+ function cmdRefs(flags, positional) {
216
+ const repo = repoInfo(resolve(flags.repo || process.cwd()))
217
+ const vault = resolve(repo.root, positional[0] || '')
218
+ if (!positional[0] || !existsSync(join(vault, '.obsidian'))) fail('Uso: refs "<caminho do vault>" [--since <git-ref|AAAA-MM-DD>]', EXIT_NO_VAULT)
219
+ const changed = flags.since ? changedFiles(repo.root, flags.since) : null
220
+ const resolveRef = makeResolver(repo.root)
221
+ const sizes = new Map()
222
+ const broken = []
223
+ const ambiguous = []
224
+ const hostLike = new Set()
225
+ const touched = new Map()
226
+ let total = 0
227
+
228
+ for (const note of markdownFiles(vault)) {
229
+ const text = readFileSync(note, 'utf8')
230
+ const noteRel = posix(relative(repo.root, note))
231
+ for (const m of text.matchAll(REF)) {
232
+ const target = m[1]
233
+ if (HOST_LIKE.test(target)) {
234
+ hostLike.add(m[0])
235
+ continue
236
+ }
237
+ const candidates = resolveRef(target)
238
+ // Sem ponto nem barra e sem arquivo com esse nome, não é arquivo (ex.: `status:200`).
239
+ if (!candidates.length && !/[./]/.test(target)) continue
240
+ total++
241
+ if (changed && candidates.some((f) => changed.has(f))) {
242
+ touched.set(noteRel, (touched.get(noteRel) || new Set()).add(m[0]))
243
+ }
244
+ if (candidates.length > 1) {
245
+ ambiguous.push({ note: noteRel, ref: m[0], candidatos: candidates.slice(0, 5) })
246
+ continue
247
+ }
248
+ if (!candidates.length) {
249
+ broken.push({ note: noteRel, ref: m[0], problem: 'arquivo não existe neste repo' })
250
+ continue
251
+ }
252
+ const file = candidates[0]
253
+ if (!sizes.has(file)) sizes.set(file, lineCount(join(repo.root, file)))
254
+ const line = Number(m[3] || m[2])
255
+ if (sizes.get(file) !== null && line > sizes.get(file)) {
256
+ broken.push({ note: noteRel, ref: m[0], problem: `${file} tem ${sizes.get(file)} linhas` })
257
+ }
258
+ }
259
+ }
260
+
261
+ console.log(JSON.stringify({
262
+ vault: posix(relative(repo.root, vault)),
263
+ referencias: total,
264
+ quebradas: broken,
265
+ ambiguas: ambiguous,
266
+ ignoradasPorParecerHost: [...hostLike],
267
+ notasQueCitamArquivosAlterados: changed
268
+ ? [...touched].map(([note, refs]) => ({ note, refs: [...refs] }))
269
+ : 'passe --since para cruzar com arquivos alterados',
270
+ }, null, 2))
271
+ }
272
+
273
+ const { flags, positional } = parseArgs(process.argv.slice(2))
274
+ const command = positional.shift()
275
+ if (command === 'locate') cmdLocate(flags)
276
+ else if (command === 'refs') cmdRefs(flags, positional)
277
+ else fail('Uso: node doc.mjs <locate | refs "<vault>"> [--repo caminho] [--since git-ref|AAAA-MM-DD]')
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: issue-board
3
+ description: Mostra no terminal, em tabelas, as issues abertas que o dev tem para fazer em qualquer GitHub Project (v2), separadas por tipo, prioridade, dificuldade, status, repo ou um campo do board. O agente classifica o que o board não classifica. Use quando o usuário pedir "minhas issues", "o que tenho pra fazer", "mostra o board", "rankeia as issues", "separa as issues por dificuldade/tipo".
4
+ ---
5
+
6
+ # Issue Board
7
+
8
+ Use `exonous issue-board`: CLI nativa em Rust, com `gh` autenticado para buscar o board. O renderizador e a classificação funcionam offline sobre o cache.
9
+
10
+ A skill não conhece nenhum projeto. O board (owner e número), os nomes dos campos e a lista de tipos moram em `config.json`, que é por pessoa e nunca vai versionado. Sem `types` no config, valem os tipos neutros embutidos: bug, feature, interface, dados, performance, segurança, infra, outros.
11
+
12
+ ## 1. Pré-requisitos
13
+
14
+ O `fetch` checa a auth antes de tudo e depois o board. Trate pelo código de saída:
15
+
16
+ 1. **Código 4: sem `gh`.** Peça para instalar o GitHub CLI (https://cli.github.com) e pare.
17
+ 2. **Código 2: sem auth.** Pare e mande o usuário rodar no prompt:
18
+ ```
19
+ ! gh auth login -s read:project
20
+ ```
21
+ Se a mensagem citar escopo, é `! gh auth refresh -s read:project`. Não contorne, não use token de outra pessoa, não continue sem auth.
22
+ 3. **Código 3: board não definido ou inválido.**
23
+ - descubra o owner pelo remote do repo atual (`gh repo view --json owner -q .owner.login`), ou pergunte;
24
+ - liste os boards com `gh project list --owner <owner>`;
25
+ - pergunte qual usar com AskUserQuestion;
26
+ - copie `config.example.json` para `config.json` e preencha `owner` e `projectNumber`.
27
+
28
+ Para olhar outro board sem mexer no config, passe `--owner x --project-number n` em qualquer comando.
29
+ 4. **Campos do board (opcional).** Rode `gh project field-list <n> --owner <owner>` e ajuste `fields` no config se os nomes forem outros:
30
+ - `status`, `priority` e `size` são os nomes dos campos no board;
31
+ - `group` é um campo single-select extra que vira coluna e agrupamento (ex.: "Área", "Squad").
32
+
33
+ Só campos **single-select** são lidos; campo de texto, número ou iteration é ignorado.
34
+
35
+ Quando os valores de prioridade ou tamanho não forem P0–P3 / High / Low ou XS–XL / Small / Large, mapeie em `priorityMap` (valor → `P0..P3`) e `sizeMap` (valor → `1..3`). Valor sem mapa aparece cru na coluna.
36
+ 5. **Tipos (opcional).** Se o usuário quiser outras categorias, grave em `types` uma lista de `{ id, name, hint }`.
37
+
38
+ ## 2. Fluxo
39
+
40
+ ```bash
41
+ exonous issue-board fetch
42
+ exonous issue-board pending
43
+ # classifique (seção 3), grave num arquivo temporário FORA do repo (ex.: $TMPDIR) e aplique:
44
+ exonous issue-board classify <arquivo.json>
45
+ exonous issue-board render
46
+ exonous issue-board render --json
47
+ ```
48
+
49
+ Flags de escopo e filtro (valem para `pending` e `render`):
50
+
51
+ | Flag | Efeito |
52
+ |---|---|
53
+ | `--all` | board inteiro, não só as suas |
54
+ | `--user login` | issues de outra pessoa |
55
+ | `--por tipo\|prioridade\|dificuldade\|campo\|status\|repo` | agrupamento (padrão `tipo`); `campo` usa `fields.group` |
56
+ | `--prioridade P0,P1` · `--dificuldade facil` · `--tipo bug` · `--campo valor` · `--repo nome` · `--status ready` | filtros: vários valores separados por vírgula; casam por trecho, sem diferenciar maiúscula nem acento (`--status ready` também pega "Not ready"); `--tipo` aceita id ou nome |
57
+
58
+ O cache fica em `data/<owner>-<número>/` dentro da skill compartilhada em `~/.agents/skills/issue-board`; instalações antigas em `~/.claude/skills/issue-board` continuam legíveis. `--skill-dir <pasta>` seleciona outra cópia explicitamente.
59
+
60
+ A saída do Bash nem sempre aparece para o usuário. Para colar na resposta, rode `exonous issue-board render --width 100` e cole a tabela em um bloco `text`, exatamente como saiu. Preserve bordas, colunas, cabeçalho e legenda.
61
+
62
+ ## 3. Como classificar
63
+
64
+ Cada issue do `pending` vira `{ "key", "type", "priority", "difficulty", "note" }`:
65
+
66
+ - `type`: um `id` da lista `types` que o `pending` devolve. Use o `hint` de cada tipo. Não invente tipo; se nada encaixa, use o mais genérico da lista.
67
+ - `priority`:
68
+ - **P0**: quebra dado ou fluxo principal do usuário agora, ou bloqueia receita/entrega;
69
+ - **P1**: bug visível ou risco sério (segurança, vazamento de dados);
70
+ - **P2**: melhoria importante, sem dano em curso;
71
+ - **P3**: pode esperar.
72
+ - `difficulty`: **1** até um dia · **2** poucos dias · **3** uma semana ou mais, ou depende de decisão.
73
+ - `note` (opcional, até ~40 caracteres): o que ajuda a ordenar ("duplica #123", "decisão de produto", "só print, confirmar").
74
+
75
+ Leia título **e** corpo antes de classificar. Issue com título vago e só imagem: classifique pelo título e anote "só print, confirmar".
76
+
77
+ **O board vence.** Se `Priority` ou `Size` já estão preenchidos no board, o `render` usa esse valor. A sugestão do agente só aparece onde o campo está vazio, marcada com `~`. Não altere campos do board sem o usuário pedir.
78
+
79
+ A classificação é gravada por `owner/repo#número` e reaproveitada nas próximas vezes: rode `pending` de novo e classifique só o que vier. Issue transferida muda de chave e volta ao `pending`.
80
+
81
+ ## 4. Resposta ao usuário
82
+
83
+ 1. A tabela, começando pelo cabeçalho do `render` (total, contagem por prioridade e legenda). Não escreva outra linha de total antes dela: repete o cabeçalho.
84
+ 2. Uma linha dizendo o que pegar primeiro: a issue de maior prioridade e, entre elas, a de menor dificuldade.