showdar-skills 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +322 -0
  3. package/bin/showdar.js +118 -0
  4. package/bundles/bugfix.yaml +4 -0
  5. package/bundles/design.yaml +4 -0
  6. package/bundles/feature.yaml +4 -0
  7. package/bundles/release.yaml +4 -0
  8. package/bundles/upgrade.yaml +4 -0
  9. package/commands/opencode/showdar/build.md +6 -0
  10. package/commands/opencode/showdar/debug.md +6 -0
  11. package/commands/opencode/showdar/design.md +6 -0
  12. package/commands/opencode/showdar/git.md +6 -0
  13. package/commands/opencode/showdar/ops.md +7 -0
  14. package/commands/opencode/showdar/plan.md +6 -0
  15. package/commands/opencode/showdar/quality.md +7 -0
  16. package/commands/opencode/showdar/recover.md +6 -0
  17. package/commands/opencode/showdar/requirements.md +7 -0
  18. package/commands/opencode/showdar/review.md +6 -0
  19. package/commands/opencode/showdar/security.md +7 -0
  20. package/commands/opencode/showdar/ship.md +6 -0
  21. package/commands/opencode/showdar/skill.md +6 -0
  22. package/commands/opencode/showdar/test.md +6 -0
  23. package/commands/opencode/showdar/understand.md +6 -0
  24. package/commands/opencode/showdar/upgrade.md +6 -0
  25. package/engine/csv.mjs +45 -0
  26. package/engine/detect-stack.mjs +48 -0
  27. package/engine/rank.mjs +40 -0
  28. package/engine/search.mjs +20 -0
  29. package/package.json +28 -0
  30. package/profiles/backend.json +1 -0
  31. package/profiles/developer.json +1 -0
  32. package/profiles/full.json +1 -0
  33. package/profiles/minimal.json +1 -0
  34. package/profiles/product.json +1 -0
  35. package/profiles/qa.json +1 -0
  36. package/router/conflicts.yaml +50 -0
  37. package/router/skill-map.yaml +54 -0
  38. package/router/triggers.yaml +30 -0
  39. package/skills/showdar-build/SKILL.md +154 -0
  40. package/skills/showdar-build/data/change-smells.csv +24 -0
  41. package/skills/showdar-build/data/index.json +14 -0
  42. package/skills/showdar-build/examples/change-surface.md +18 -0
  43. package/skills/showdar-build/references/architecture-boundaries.md +3 -0
  44. package/skills/showdar-build/references/error-handling.md +3 -0
  45. package/skills/showdar-build/references/feature-flags.md +3 -0
  46. package/skills/showdar-build/references/minimal-change.md +3 -0
  47. package/skills/showdar-build/scripts/change-surface.mjs +5 -0
  48. package/skills/showdar-build/stacks/dart.md +3 -0
  49. package/skills/showdar-build/stacks/flutter.md +3 -0
  50. package/skills/showdar-build/stacks/kotlin.md +3 -0
  51. package/skills/showdar-build/stacks/nextjs.md +3 -0
  52. package/skills/showdar-build/stacks/node-fastify.md +3 -0
  53. package/skills/showdar-build/stacks/node-nestjs.md +3 -0
  54. package/skills/showdar-build/stacks/react-native.md +3 -0
  55. package/skills/showdar-build/stacks/react.md +3 -0
  56. package/skills/showdar-build/stacks/rust-tauri.md +3 -0
  57. package/skills/showdar-build/stacks/swift.md +3 -0
  58. package/skills/showdar-build/stacks/typescript.md +3 -0
  59. package/skills/showdar-debug/SKILL.md +179 -0
  60. package/skills/showdar-debug/data/failure-patterns.csv +34 -0
  61. package/skills/showdar-debug/data/index.json +14 -0
  62. package/skills/showdar-debug/examples/evidence-log.md +19 -0
  63. package/skills/showdar-debug/references/async-races.md +3 -0
  64. package/skills/showdar-debug/references/build-failures.md +3 -0
  65. package/skills/showdar-debug/references/hypothesis-driven-debugging.md +3 -0
  66. package/skills/showdar-debug/references/memory.md +3 -0
  67. package/skills/showdar-debug/references/networking.md +3 -0
  68. package/skills/showdar-debug/references/performance.md +3 -0
  69. package/skills/showdar-debug/scripts/collect-context.mjs +8 -0
  70. package/skills/showdar-debug/scripts/lib/detect-stack.mjs +48 -0
  71. package/skills/showdar-debug/stacks/android.md +21 -0
  72. package/skills/showdar-debug/stacks/docker.md +21 -0
  73. package/skills/showdar-debug/stacks/flutter.md +21 -0
  74. package/skills/showdar-debug/stacks/ios.md +21 -0
  75. package/skills/showdar-debug/stacks/nextjs.md +21 -0
  76. package/skills/showdar-debug/stacks/node.md +21 -0
  77. package/skills/showdar-debug/stacks/react-native.md +21 -0
  78. package/skills/showdar-debug/stacks/react.md +21 -0
  79. package/skills/showdar-debug/stacks/tauri.md +21 -0
  80. package/skills/showdar-design/SKILL.md +179 -0
  81. package/skills/showdar-design/data/accessibility.csv +16 -0
  82. package/skills/showdar-design/data/colors.csv +13 -0
  83. package/skills/showdar-design/data/components.csv +20 -0
  84. package/skills/showdar-design/data/index.json +25 -0
  85. package/skills/showdar-design/data/motion.csv +13 -0
  86. package/skills/showdar-design/data/products.csv +19 -0
  87. package/skills/showdar-design/data/stacks/compose.csv +9 -0
  88. package/skills/showdar-design/data/stacks/flutter.csv +9 -0
  89. package/skills/showdar-design/data/stacks/html-tailwind.csv +9 -0
  90. package/skills/showdar-design/data/stacks/nextjs.csv +9 -0
  91. package/skills/showdar-design/data/stacks/nuxt.csv +9 -0
  92. package/skills/showdar-design/data/stacks/react-native.csv +9 -0
  93. package/skills/showdar-design/data/stacks/react.csv +9 -0
  94. package/skills/showdar-design/data/stacks/svelte.csv +9 -0
  95. package/skills/showdar-design/data/stacks/swiftui.csv +9 -0
  96. package/skills/showdar-design/data/stacks/tauri.csv +9 -0
  97. package/skills/showdar-design/data/stacks/vue.csv +9 -0
  98. package/skills/showdar-design/data/styles.csv +13 -0
  99. package/skills/showdar-design/data/typography.csv +13 -0
  100. package/skills/showdar-design/data/ui-patterns.csv +19 -0
  101. package/skills/showdar-design/examples/design-brief.md +19 -0
  102. package/skills/showdar-design/references/accessibility.md +5 -0
  103. package/skills/showdar-design/references/anti-ai-ui.md +5 -0
  104. package/skills/showdar-design/references/architecture.md +12 -0
  105. package/skills/showdar-design/references/interaction.md +5 -0
  106. package/skills/showdar-design/references/layout.md +5 -0
  107. package/skills/showdar-design/references/release-readiness.md +12 -0
  108. package/skills/showdar-design/references/responsive.md +5 -0
  109. package/skills/showdar-design/references/security.md +12 -0
  110. package/skills/showdar-design/references/visual-hierarchy.md +7 -0
  111. package/skills/showdar-design/scripts/lib/csv.mjs +40 -0
  112. package/skills/showdar-design/scripts/lib/rank.mjs +35 -0
  113. package/skills/showdar-design/scripts/lib/search.mjs +20 -0
  114. package/skills/showdar-design/scripts/search.mjs +38 -0
  115. package/skills/showdar-design/stacks/flutter.md +13 -0
  116. package/skills/showdar-design/stacks/html-tailwind.md +12 -0
  117. package/skills/showdar-design/stacks/jetpack-compose.md +13 -0
  118. package/skills/showdar-design/stacks/nextjs.md +12 -0
  119. package/skills/showdar-design/stacks/nuxt.md +11 -0
  120. package/skills/showdar-design/stacks/react-native.md +13 -0
  121. package/skills/showdar-design/stacks/react.md +12 -0
  122. package/skills/showdar-design/stacks/svelte.md +11 -0
  123. package/skills/showdar-design/stacks/swiftui.md +12 -0
  124. package/skills/showdar-design/stacks/tauri.md +12 -0
  125. package/skills/showdar-design/stacks/vue.md +12 -0
  126. package/skills/showdar-git/SKILL.md +291 -0
  127. package/skills/showdar-git/data/git-workflows.csv +7 -0
  128. package/skills/showdar-git/data/index.json +14 -0
  129. package/skills/showdar-git/examples/commit-task-only.md +15 -0
  130. package/skills/showdar-git/examples/conflict-stop.md +7 -0
  131. package/skills/showdar-git/examples/explicit-push.md +7 -0
  132. package/skills/showdar-git/examples/feature-merge-no-push.md +13 -0
  133. package/skills/showdar-git/references/operation-safety.md +34 -0
  134. package/skills/showdar-git/scripts/inspect-git-state.mjs +53 -0
  135. package/skills/showdar-ops/SKILL.md +160 -0
  136. package/skills/showdar-ops/data/index.json +14 -0
  137. package/skills/showdar-ops/data/ops-patterns.csv +12 -0
  138. package/skills/showdar-ops/examples/explicit-deployment.md +5 -0
  139. package/skills/showdar-ops/examples/fix-existing-ci.md +5 -0
  140. package/skills/showdar-ops/examples/inspect-ci-readonly.md +7 -0
  141. package/skills/showdar-ops/examples/rollback-plan.md +5 -0
  142. package/skills/showdar-ops/examples/staging-plan.md +5 -0
  143. package/skills/showdar-ops/references/ci-cd.md +5 -0
  144. package/skills/showdar-ops/references/containers.md +5 -0
  145. package/skills/showdar-ops/references/deployment.md +5 -0
  146. package/skills/showdar-ops/references/desktop-release.md +3 -0
  147. package/skills/showdar-ops/references/environments.md +5 -0
  148. package/skills/showdar-ops/references/mobile-release.md +3 -0
  149. package/skills/showdar-ops/references/observability.md +5 -0
  150. package/skills/showdar-ops/references/rollback.md +5 -0
  151. package/skills/showdar-ops/scripts/inspect-ops-state.mjs +54 -0
  152. package/skills/showdar-plan/SKILL.md +159 -0
  153. package/skills/showdar-plan/data/index.json +14 -0
  154. package/skills/showdar-plan/data/planning-checklists.csv +25 -0
  155. package/skills/showdar-plan/examples/feature-plan.md +19 -0
  156. package/skills/showdar-plan/references/architecture.md +5 -0
  157. package/skills/showdar-plan/references/requirements.md +5 -0
  158. package/skills/showdar-plan/references/risk-analysis.md +5 -0
  159. package/skills/showdar-plan/references/scope.md +5 -0
  160. package/skills/showdar-plan/references/task-decomposition.md +5 -0
  161. package/skills/showdar-plan/scripts/collect-planning-context.mjs +9 -0
  162. package/skills/showdar-plan/scripts/lib/detect-stack.mjs +48 -0
  163. package/skills/showdar-plan/stacks/backend.md +3 -0
  164. package/skills/showdar-plan/stacks/mobile.md +3 -0
  165. package/skills/showdar-plan/stacks/web.md +3 -0
  166. package/skills/showdar-quality/SKILL.md +166 -0
  167. package/skills/showdar-quality/data/index.json +14 -0
  168. package/skills/showdar-quality/data/quality-patterns.csv +11 -0
  169. package/skills/showdar-quality/references/qa-guide.md +20 -0
  170. package/skills/showdar-recover/SKILL.md +164 -0
  171. package/skills/showdar-recover/data/index.json +14 -0
  172. package/skills/showdar-recover/data/recovery-signals.csv +23 -0
  173. package/skills/showdar-recover/examples/recovery-report.md +18 -0
  174. package/skills/showdar-recover/references/failed-runs.md +3 -0
  175. package/skills/showdar-recover/references/interrupted-session.md +3 -0
  176. package/skills/showdar-recover/references/merge-conflicts.md +3 -0
  177. package/skills/showdar-recover/references/partial-implementation.md +3 -0
  178. package/skills/showdar-recover/scripts/inspect-state.mjs +5 -0
  179. package/skills/showdar-requirements/SKILL.md +172 -0
  180. package/skills/showdar-requirements/data/index.json +14 -0
  181. package/skills/showdar-requirements/data/requirements-patterns.csv +11 -0
  182. package/skills/showdar-requirements/references/analysis-guide.md +30 -0
  183. package/skills/showdar-review/SKILL.md +155 -0
  184. package/skills/showdar-review/data/index.json +14 -0
  185. package/skills/showdar-review/data/review-patterns.csv +27 -0
  186. package/skills/showdar-review/examples/finding.md +16 -0
  187. package/skills/showdar-review/references/architecture.md +3 -0
  188. package/skills/showdar-review/references/correctness.md +3 -0
  189. package/skills/showdar-review/references/maintainability.md +3 -0
  190. package/skills/showdar-review/references/performance.md +3 -0
  191. package/skills/showdar-review/references/security.md +3 -0
  192. package/skills/showdar-review/references/testing.md +3 -0
  193. package/skills/showdar-review/scripts/collect-diff.mjs +5 -0
  194. package/skills/showdar-review/stacks/android.md +3 -0
  195. package/skills/showdar-review/stacks/flutter.md +3 -0
  196. package/skills/showdar-review/stacks/ios.md +3 -0
  197. package/skills/showdar-review/stacks/nextjs.md +3 -0
  198. package/skills/showdar-review/stacks/node-backend.md +3 -0
  199. package/skills/showdar-review/stacks/react-native.md +3 -0
  200. package/skills/showdar-review/stacks/react.md +3 -0
  201. package/skills/showdar-review/stacks/swift-kotlin.md +3 -0
  202. package/skills/showdar-review/stacks/typescript.md +3 -0
  203. package/skills/showdar-security/SKILL.md +169 -0
  204. package/skills/showdar-security/data/index.json +14 -0
  205. package/skills/showdar-security/data/security-patterns.csv +13 -0
  206. package/skills/showdar-security/examples/api-authorization-review.md +9 -0
  207. package/skills/showdar-security/examples/mobile-deeplink-review.md +7 -0
  208. package/skills/showdar-security/examples/secret-exposure-review.md +5 -0
  209. package/skills/showdar-security/examples/threat-model-open-assumptions.md +11 -0
  210. package/skills/showdar-security/references/authz-secrets.md +7 -0
  211. package/skills/showdar-security/references/mobile-security.md +7 -0
  212. package/skills/showdar-security/references/supply-chain.md +5 -0
  213. package/skills/showdar-security/references/threat-modeling.md +12 -0
  214. package/skills/showdar-security/scripts/inspect-security-surface.mjs +47 -0
  215. package/skills/showdar-ship/SKILL.md +234 -0
  216. package/skills/showdar-ship/data/index.json +14 -0
  217. package/skills/showdar-ship/data/release-checks.csv +28 -0
  218. package/skills/showdar-ship/examples/release-report.md +25 -0
  219. package/skills/showdar-ship/references/migrations.md +12 -0
  220. package/skills/showdar-ship/references/post-deploy.md +12 -0
  221. package/skills/showdar-ship/references/release-readiness.md +13 -0
  222. package/skills/showdar-ship/references/rollback.md +12 -0
  223. package/skills/showdar-ship/references/secrets.md +3 -0
  224. package/skills/showdar-ship/scripts/detect-targets.mjs +5 -0
  225. package/skills/showdar-ship/scripts/lib/detect-stack.mjs +48 -0
  226. package/skills/showdar-ship/scripts/release-check.mjs +6 -0
  227. package/skills/showdar-ship/stacks/android.md +33 -0
  228. package/skills/showdar-ship/stacks/docker.md +30 -0
  229. package/skills/showdar-ship/stacks/electron.md +7 -0
  230. package/skills/showdar-ship/stacks/ios.md +34 -0
  231. package/skills/showdar-ship/stacks/nextjs.md +30 -0
  232. package/skills/showdar-ship/stacks/node-backend.md +37 -0
  233. package/skills/showdar-ship/stacks/orchestration.md +12 -0
  234. package/skills/showdar-ship/stacks/tauri.md +35 -0
  235. package/skills/showdar-ship/stacks/web.md +35 -0
  236. package/skills/showdar-test/SKILL.md +164 -0
  237. package/skills/showdar-test/data/index.json +14 -0
  238. package/skills/showdar-test/data/test-strategy.csv +22 -0
  239. package/skills/showdar-test/examples/regression.md +14 -0
  240. package/skills/showdar-test/references/e2e.md +3 -0
  241. package/skills/showdar-test/references/integration.md +3 -0
  242. package/skills/showdar-test/references/regression.md +3 -0
  243. package/skills/showdar-test/references/test-smells.md +3 -0
  244. package/skills/showdar-test/references/unit.md +3 -0
  245. package/skills/showdar-test/scripts/detect-test-tools.mjs +6 -0
  246. package/skills/showdar-test/stacks/android-testing.md +13 -0
  247. package/skills/showdar-test/stacks/detox.md +13 -0
  248. package/skills/showdar-test/stacks/flutter-test.md +13 -0
  249. package/skills/showdar-test/stacks/integration-test.md +13 -0
  250. package/skills/showdar-test/stacks/jest.md +13 -0
  251. package/skills/showdar-test/stacks/playwright.md +13 -0
  252. package/skills/showdar-test/stacks/react-native-testing.md +17 -0
  253. package/skills/showdar-test/stacks/react-testing-library.md +13 -0
  254. package/skills/showdar-test/stacks/vitest.md +13 -0
  255. package/skills/showdar-test/stacks/xctest.md +13 -0
  256. package/skills/showdar-understand/SKILL.md +159 -0
  257. package/skills/showdar-understand/data/architecture-signals.csv +28 -0
  258. package/skills/showdar-understand/data/index.json +14 -0
  259. package/skills/showdar-understand/examples/repository-audit.md +17 -0
  260. package/skills/showdar-understand/references/architecture-signals.md +25 -0
  261. package/skills/showdar-understand/references/dependency-analysis.md +9 -0
  262. package/skills/showdar-understand/references/repository-analysis.md +24 -0
  263. package/skills/showdar-understand/scripts/inspect-repo.mjs +16 -0
  264. package/skills/showdar-understand/scripts/lib/detect-stack.mjs +48 -0
  265. package/skills/showdar-understand/stacks/android.md +3 -0
  266. package/skills/showdar-understand/stacks/backend.md +5 -0
  267. package/skills/showdar-understand/stacks/electron.md +3 -0
  268. package/skills/showdar-understand/stacks/fastify.md +3 -0
  269. package/skills/showdar-understand/stacks/flutter.md +3 -0
  270. package/skills/showdar-understand/stacks/ios.md +3 -0
  271. package/skills/showdar-understand/stacks/mobile.md +5 -0
  272. package/skills/showdar-understand/stacks/nestjs.md +3 -0
  273. package/skills/showdar-understand/stacks/nextjs.md +3 -0
  274. package/skills/showdar-understand/stacks/node.md +3 -0
  275. package/skills/showdar-understand/stacks/react-native.md +3 -0
  276. package/skills/showdar-understand/stacks/react.md +3 -0
  277. package/skills/showdar-understand/stacks/tauri.md +3 -0
  278. package/skills/showdar-upgrade/SKILL.md +162 -0
  279. package/skills/showdar-upgrade/data/compatibility-checklist.csv +24 -0
  280. package/skills/showdar-upgrade/data/index.json +14 -0
  281. package/skills/showdar-upgrade/examples/upgrade-report.md +18 -0
  282. package/skills/showdar-upgrade/references/breaking-changes.md +3 -0
  283. package/skills/showdar-upgrade/references/compatibility.md +3 -0
  284. package/skills/showdar-upgrade/references/dependency-resolution.md +3 -0
  285. package/skills/showdar-upgrade/references/migration-strategy.md +3 -0
  286. package/skills/showdar-upgrade/references/rollback.md +3 -0
  287. package/skills/showdar-upgrade/scripts/inspect-dependencies.mjs +6 -0
  288. package/skills/showdar-upgrade/scripts/lib/detect-stack.mjs +48 -0
  289. package/skills/showdar-upgrade/stacks/android.md +15 -0
  290. package/skills/showdar-upgrade/stacks/cocoapods-spm.md +17 -0
  291. package/skills/showdar-upgrade/stacks/expo.md +17 -0
  292. package/skills/showdar-upgrade/stacks/flutter.md +17 -0
  293. package/skills/showdar-upgrade/stacks/gradle.md +13 -0
  294. package/skills/showdar-upgrade/stacks/ios.md +15 -0
  295. package/skills/showdar-upgrade/stacks/nextjs.md +17 -0
  296. package/skills/showdar-upgrade/stacks/node.md +17 -0
  297. package/skills/showdar-upgrade/stacks/react-native.md +17 -0
  298. package/skills/showdar-upgrade/stacks/react.md +17 -0
  299. package/skills/showdar-upgrade/stacks/tauri-rust.md +15 -0
  300. package/src/adapters.js +44 -0
  301. package/src/catalog.js +57 -0
  302. package/src/project.js +287 -0
  303. package/src/runtime.js +9 -0
  304. package/src/validate.js +310 -0
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Showdar Skills contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,322 @@
1
+ # Showdar Skills
2
+
3
+ [![Node >=20](https://img.shields.io/badge/node-%3E%3D20-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
4
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue?logo=opensourceinitiative&logoColor=white)](./LICENSE)
5
+ [![15 skills](https://img.shields.io/badge/skills-15-6f42c1)](#skill-catalog)
6
+
7
+ Production-grade software engineering skills for coding agents. Showdar covers
8
+ requirements, planning, design, implementation, debugging, QA, security,
9
+ operations, release readiness, and Git workflows with lightweight intent
10
+ routing and progressive knowledge loading.
11
+
12
+ > npm publication: prepared for the first release; `showdar-skills@0.2.0` is
13
+ > not published yet.
14
+
15
+ ## Quick start
16
+
17
+ After the first npm publication, install the CLI globally and add project
18
+ skills explicitly:
19
+
20
+ ```bash
21
+ npm install -g showdar-skills
22
+ cd my-project
23
+ showdar init --ai codex --profile developer
24
+ showdar doctor
25
+ ```
26
+
27
+ The current source-install alternative is:
28
+
29
+ ```bash
30
+ git clone https://github.com/caongocquy/showdar-skills.git
31
+ cd showdar-skills
32
+ npm install -g .
33
+ ```
34
+
35
+ CLI installation and skill installation are separate. Installing the CLI
36
+ globally does not install skills globally; `showdar init` controls the project
37
+ or user scope where skills are copied.
38
+
39
+ ## Why Showdar?
40
+
41
+ - 15 focused skills for the software lifecycle, instead of one oversized prompt.
42
+ - Native discovery for Codex, OpenCode, and Claude Code.
43
+ - Evidence-first workflows with bounded safety and verification contracts.
44
+ - Searchable data, references, scripts, stack guidance, and examples loaded only
45
+ when the selected task needs them.
46
+
47
+ ## How it works
48
+
49
+ ```text
50
+ User request
51
+ |
52
+ v
53
+ Lightweight discovery metadata
54
+ |
55
+ v
56
+ Selected Showdar skill
57
+ |
58
+ v
59
+ SKILL.md
60
+ |
61
+ +--> data/
62
+ +--> references/
63
+ +--> scripts/
64
+ +--> examples/
65
+ only when needed
66
+ ```
67
+
68
+ The 15 skills are not eagerly loaded as full prompts. Lightweight descriptions
69
+ help the agent choose a skill, then that skill loads its workflow and deeper
70
+ knowledge progressively.
71
+
72
+ ## Supported agents and destinations
73
+
74
+ | Agent target | Project scope | Global scope |
75
+ | --- | --- | --- |
76
+ | Codex | `.agents/skills/` | `~/.agents/skills/` |
77
+ | Universal | `.agents/skills/` | `~/.agents/skills/` |
78
+ | OpenCode | `.opencode/skills/` + `.opencode/commands/showdar/` | `~/.config/opencode/skills/` + `~/.config/opencode/commands/showdar/` |
79
+ | Claude Code | `.claude/skills/` | `~/.claude/skills/` |
80
+
81
+ Codex and Universal intentionally share `.agents/skills/`; `--ai all` avoids
82
+ duplicating that physical destination. OpenCode receives both skills and
83
+ native `/showdar/...` command files.
84
+
85
+ ### Project and global installation
86
+
87
+ Project scope is the default and writes to the current project:
88
+
89
+ ```bash
90
+ cd my-project
91
+ showdar init --scope project --ai codex --profile developer
92
+ showdar status
93
+ showdar doctor
94
+ ```
95
+
96
+ Global scope does not require a Git repository:
97
+
98
+ ```bash
99
+ showdar init --scope global --ai codex --profile developer
100
+ showdar status --scope global
101
+ showdar doctor --scope global
102
+ ```
103
+
104
+ Global CLI installation is not global skill installation. Project ownership is
105
+ stored in `.showdar.json`; global ownership is stored in `~/.showdar/global.json`.
106
+ Only Showdar-owned paths are refreshed or removed.
107
+
108
+ ## Profiles
109
+
110
+ Choose a role-specific profile for more precise discovery, or use `full` when
111
+ all capabilities are useful. `full` exposes all 15 skills but still does not
112
+ eagerly load all skill bodies.
113
+
114
+ | Profile | Skills |
115
+ | --- | ---: |
116
+ | `minimal` | 8 |
117
+ | `developer` | 12 |
118
+ | `backend` | 14 |
119
+ | `qa` | 9 |
120
+ | `product` | 6 |
121
+ | `full` | 15 |
122
+
123
+ Legacy aliases remain compatible:
124
+
125
+ ```text
126
+ mobile -> developer
127
+ web -> developer
128
+ ```
129
+
130
+ New manifests store the canonical `developer` profile.
131
+
132
+ ## Skill catalog
133
+
134
+ All 15 entries remain first-class Showdar skills.
135
+
136
+ ### Analysis and planning
137
+
138
+ | Skill | Use when |
139
+ | --- | --- |
140
+ | `showdar-understand` | Mapping an unfamiliar repository, architecture, dependencies, or impact before deciding what to change. |
141
+ | `showdar-requirements` | Product or business input needs explicit behavior, rules, acceptance criteria, assumptions, or open decisions. |
142
+ | `showdar-plan` | Agreed behavior needs a bounded implementation plan, change surface, task order, risks, or verification steps. |
143
+
144
+ ### Engineering
145
+
146
+ | Skill | Use when |
147
+ | --- | --- |
148
+ | `showdar-design` | Product UI needs design direction, UX decisions, responsive layout, accessibility, or visual polish. |
149
+ | `showdar-build` | Implementing or refactoring an agreed application change within existing architecture and contracts. |
150
+ | `showdar-debug` | Observed behavior fails through crashes, regressions, build failures, races, networking, memory, or performance issues. |
151
+ | `showdar-upgrade` | Upgrading dependencies, frameworks, runtimes, or native platforms where compatibility or rollback risk matters. |
152
+
153
+ ### Quality
154
+
155
+ | Skill | Use when |
156
+ | --- | --- |
157
+ | `showdar-test` | Choosing or implementing automated tests for behavior, regressions, integration, E2E, or coverage. |
158
+ | `showdar-quality` | Planning QA/QC scenarios, risk coverage, regression scope, compatibility checks, or bug-report evidence. |
159
+ | `showdar-review` | Reviewing code or diffs for general correctness, architecture, performance, maintainability, or tests. |
160
+
161
+ ### Security and operations
162
+
163
+ | Skill | Use when |
164
+ | --- | --- |
165
+ | `showdar-security` | Assessing threat models, attack surfaces, trust boundaries, auth/authz, secrets, exposure, or exploitability. |
166
+ | `showdar-ops` | Inspecting or changing CI/CD, containers, environments, deployment, observability, rollback, or runtime operations. |
167
+
168
+ ### Delivery and recovery
169
+
170
+ | Skill | Use when |
171
+ | --- | --- |
172
+ | `showdar-ship` | Checking whether a change, artifact, or release is ready for handoff or external release. |
173
+ | `showdar-recover` | Interrupted or partial engineering work must be reconstructed from repository evidence before continuing. |
174
+ | `showdar-git` | Performing local Git inspection, staging, commits, branch integration, conflicts, cleanup, or explicitly requested remote Git actions. |
175
+
176
+ ## Typical software workflow
177
+
178
+ ```text
179
+ Requirements
180
+ |
181
+ v
182
+ Plan
183
+ |
184
+ +--> Design
185
+ |
186
+ v
187
+ Build
188
+ |
189
+ +--> Debug
190
+ +--> Test
191
+ |
192
+ v
193
+ Quality
194
+ |
195
+ v
196
+ Review / Security
197
+ |
198
+ v
199
+ Ship readiness
200
+ |
201
+ +--> Ops
202
+ |
203
+ v
204
+ Git completion
205
+ ```
206
+
207
+ This is a composition guide, not a mandatory sequence. Choose the skill that
208
+ matches the current intent.
209
+
210
+ ## Usage examples
211
+
212
+ Codex discovers installed native skills from natural requests or explicit names:
213
+
214
+ ```text
215
+ $showdar-requirements review this ticket for missing rules
216
+ $showdar-plan plan the implementation
217
+ $showdar-debug find the root cause of this crash
218
+ $showdar-quality create regression scenarios
219
+ $showdar-security threat model this auth flow
220
+ $showdar-ops inspect the deployment setup
221
+ $showdar-git commit only the current task changes
222
+ ```
223
+
224
+ OpenCode uses native commands when initialized with `--ai opencode` or
225
+ `--ai all`:
226
+
227
+ ```text
228
+ /showdar/requirements review this ticket for missing rules
229
+ /showdar/debug find the root cause of this crash
230
+ /showdar/security threat model this auth flow
231
+ /showdar/ops inspect the deployment setup
232
+ /showdar/git commit only the current task changes
233
+ ```
234
+
235
+ ## Safety boundaries
236
+
237
+ - `showdar-ship` verifies readiness; it does not automatically deploy or create
238
+ CI/CD.
239
+ - `showdar-ops` performs operational work when requested. Remote or production
240
+ mutation requires explicit intent, target, and authorization.
241
+ - `showdar-git` preserves unrelated work and does not imply push, force-push, or
242
+ destructive cleanup.
243
+ - `showdar-security` performs defensive, evidence-based analysis and never
244
+ exposes secret values.
245
+ - `showdar-requirements` records assumptions and open decisions instead of
246
+ inventing stakeholder or business choices.
247
+
248
+ ## CLI reference
249
+
250
+ ```bash
251
+ showdar init [--scope <project|global>] --ai <target> --profile <profile>
252
+ showdar list
253
+ showdar status [--scope <project|global>]
254
+ showdar doctor [--scope <project|global>]
255
+ showdar validate
256
+ showdar remove [--scope <project|global>]
257
+ ```
258
+
259
+ `--ai` accepts `codex`, `opencode`, `claude`, `universal`, or `all`.
260
+ `--scope` defaults to `project`; `--profile` accepts the six canonical profiles
261
+ and the `mobile`/`web` aliases. Run `showdar --help` or a command's `--help`
262
+ for the current options.
263
+
264
+ `showdar validate` validates the installed Showdar package, not the target
265
+ application. `showdar doctor` checks managed files against ownership hashes;
266
+ `showdar remove` removes only those managed paths and preserves unrelated files.
267
+
268
+ ## Refreshing skills
269
+
270
+ There is no separate `showdar update` command. Reinstall the CLI, then rerun
271
+ `showdar init` with the same scope, target, and profile:
272
+
273
+ ```bash
274
+ # Future npm install
275
+ npm install -g showdar-skills@latest
276
+
277
+ # Source development
278
+ npm install -g .
279
+
280
+ showdar init --scope project --ai codex --profile developer
281
+ ```
282
+
283
+ Initialization is idempotent and refreshes Showdar-owned files. Use
284
+ `showdar remove` for project scope or `showdar remove --scope global` for the
285
+ user installation.
286
+
287
+ ## Maintainer release notes
288
+
289
+ The first release is manual because the package does not exist on npm yet:
290
+
291
+ ```bash
292
+ npm pack
293
+ npm publish ./showdar-skills-0.2.0.tgz
294
+ ```
295
+
296
+ After the package exists, configure npm Trusted Publishing for the
297
+ `caongocquy/showdar-skills` GitHub Actions workflow named `publish.yml`. The
298
+ workflow runs only for `v*` tags, verifies the tag/package version, uses OIDC
299
+ with provenance, and contains no npm token. It skips an already-published
300
+ version and fails on registry errors other than a real E404. Trusted
301
+ Publishing is not configured yet. The repository's `RELEASING.md` contains
302
+ the maintainer runbook.
303
+
304
+ ## Development
305
+
306
+ ```bash
307
+ npm test
308
+ npm run validate
309
+ npm run check
310
+ npm run smoke
311
+ npm run eval
312
+ npm pack --dry-run
313
+ ```
314
+
315
+ Showdar stays dependency-light and uses Node.js built-ins for its CLI,
316
+ validator, search engine, installer, and tests. Supporting knowledge remains
317
+ in each skill's `data/`, `references/`, `scripts/`, `stacks/`, and `examples/`
318
+ directories so the selected workflow can load it progressively.
319
+
320
+ ## License
321
+
322
+ MIT
package/bin/showdar.js ADDED
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ import path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { AI_TARGETS, PROFILE_ALIASES, PROFILES, SKILLS, canonicalProfile, isDeprecatedProfile, resolveProfile } from '../src/catalog.js';
7
+ import { globalManifestPath, initGlobal, initProject, inspectGlobal, inspectProject, removeGlobal, removeProject } from '../src/project.js';
8
+ import { validateRepository } from '../src/validate.js';
9
+
10
+ const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
11
+ const COMMANDS = ['understand', 'plan', 'design', 'build', 'debug', 'test', 'review', 'upgrade', 'ship', 'recover', 'git', 'requirements', 'quality', 'security', 'ops', 'skill'];
12
+ const SCOPES = ['project', 'global'];
13
+
14
+ function valueAfter(args, flag, fallback) {
15
+ const i = args.indexOf(flag);
16
+ if (i === -1) return fallback;
17
+ if (!args[i + 1] || args[i + 1].startsWith('--')) throw new Error(`${flag} requires a value`);
18
+ return args[i + 1];
19
+ }
20
+
21
+ async function packageVersion() {
22
+ const pkg = JSON.parse(await readFile(path.join(packageRoot, 'package.json'), 'utf8'));
23
+ return pkg.version;
24
+ }
25
+
26
+ function scopeAfter(args) {
27
+ const scope = valueAfter(args, '--scope', 'project');
28
+ if (!SCOPES.includes(scope)) throw new Error(`Unknown scope "${scope}". Expected project or global.`);
29
+ return scope;
30
+ }
31
+
32
+ function printHelp(version, command = null) {
33
+ const scopeUsage = '[--scope <project|global>]';
34
+ if (command === 'init') {
35
+ console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <codex|opencode|claude|universal|all>]\n\nDefaults: scope project, profile full, AI target universal.\nProject scope writes native skills and project .showdar.json. Global scope writes verified user skill directories and ~/.showdar/global.json without project files. Codex and universal use .agents/skills in project scope and ~/.agents/skills in global scope; --ai all writes each shared destination once.\n\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
36
+ return;
37
+ }
38
+ if (['status', 'doctor', 'remove'].includes(command)) {
39
+ console.log(`Showdar Skills ${version}\n\nUsage:\n showdar ${command} ${scopeUsage}\n\nDefault scope: project. Use --scope global for the user installation.`);
40
+ return;
41
+ }
42
+ console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <codex|opencode|claude|universal|all>]\n showdar status ${scopeUsage}\n showdar doctor ${scopeUsage}\n showdar validate\n showdar list\n showdar remove ${scopeUsage}\n\nDefaults: scope project, profile full, AI target universal.\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
43
+ }
44
+
45
+ async function main() {
46
+ const args = process.argv.slice(2);
47
+ const command = args[0] ?? 'help';
48
+ const projectRoot = process.cwd();
49
+ const version = await packageVersion();
50
+
51
+ if (command === 'help' || command === '--help' || command === '-h') return printHelp(version);
52
+ if (args.includes('--help') || args.includes('-h')) return printHelp(version, command);
53
+
54
+ const scope = ['init', 'status', 'doctor', 'remove'].includes(command) ? scopeAfter(args) : null;
55
+
56
+ if (command === 'list') {
57
+ console.log(`Profiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\n\nSkills:`);
58
+ for (const skill of SKILLS) console.log(` ${skill.id} [${skill.domain}] ${skill.description}`);
59
+ return;
60
+ }
61
+
62
+ if (command === 'validate') {
63
+ const result = await validateRepository(packageRoot);
64
+ if (result.ok) console.log(`Showdar validation OK (${SKILLS.length} skills).`);
65
+ else {
66
+ console.log(`Showdar validation FAILED (${result.errors.length} errors).`);
67
+ for (const error of result.errors) console.log(`- ${error}`);
68
+ process.exitCode = 1;
69
+ }
70
+ for (const warning of result.warnings) console.log(`warning: ${warning}`);
71
+ return;
72
+ }
73
+
74
+ if (command === 'init') {
75
+ if (args.includes('--agent')) throw new Error('--agent is no longer supported in V0.2. Use --ai <codex|opencode|claude|universal|all>.');
76
+ const requestedProfile = valueAfter(args, '--profile', 'full');
77
+ const profile = canonicalProfile(requestedProfile);
78
+ const ai = valueAfter(args, '--ai', 'universal');
79
+ const skillIds = resolveProfile(requestedProfile);
80
+ if (isDeprecatedProfile(requestedProfile)) console.warn(`Warning: profile "${requestedProfile}" is deprecated; use "${profile}".`);
81
+ const commandNames = ai === 'opencode' || ai === 'all' ? COMMANDS : [];
82
+ const result = scope === 'global'
83
+ ? await initGlobal({ homeRoot: homedir(), packageRoot, profile, ai, skillIds, commandNames, packageVersion: version })
84
+ : await initProject({ projectRoot, packageRoot, profile, ai, skillIds, commandNames, packageVersion: version });
85
+ console.log(`Showdar Skills installed.\nScope: ${scope}\nProfile: ${profile}\nAI: ${ai}\nTargets: ${result.targets.join(', ')}\nSkills: ${result.skills}\nOpenCode commands: ${result.commands}`);
86
+ if (scope === 'global') console.log(`Manifest: ${globalManifestPath()}`);
87
+ if (result.targets.includes('codex')) console.log('Codex: invoke skills directly with $showdar-<name> or let native skill discovery route by description.');
88
+ if (result.targets.includes('opencode')) console.log('OpenCode: use native skill discovery or /showdar/<command>.');
89
+ return;
90
+ }
91
+
92
+ if (command === 'status' || command === 'doctor') {
93
+ const result = scope === 'global' ? await inspectGlobal() : await inspectProject(projectRoot);
94
+ if (!result.installed) {
95
+ console.log(`Showdar Skills is not installed in the ${scope} scope.`);
96
+ if (command === 'doctor') process.exitCode = 1;
97
+ return;
98
+ }
99
+ console.log(`Showdar Skills\nScope: ${result.scope}\nProfile: ${result.profile}\nAI: ${result.ai}\nTargets: ${result.targets.join(', ')}\nSkills: ${result.skills}\nCommands: ${result.commands}\nHealth: ${result.healthy ? 'OK' : 'BROKEN'}`);
100
+ for (const issue of result.issues) console.log(`- ${issue}`);
101
+ if (command === 'doctor' && !result.healthy) process.exitCode = 1;
102
+ return;
103
+ }
104
+
105
+ if (command === 'remove') {
106
+ if (scope === 'global') await removeGlobal();
107
+ else await removeProject(projectRoot);
108
+ console.log(`Showdar Skills removed from the ${scope} scope.`);
109
+ return;
110
+ }
111
+
112
+ throw new Error(`Unknown command "${command}". Run "showdar --help".`);
113
+ }
114
+
115
+ main().catch((error) => {
116
+ console.error(`showdar: ${error.message}`);
117
+ process.exitCode = 1;
118
+ });
@@ -0,0 +1,4 @@
1
+ version: 2
2
+ name: bugfix
3
+ skills: [showdar-understand, showdar-debug, showdar-test, showdar-review]
4
+ flow: "understand only as needed -> debug root cause -> regression proof -> review changed behavior"
@@ -0,0 +1,4 @@
1
+ version: 2
2
+ name: design
3
+ skills: [showdar-design, showdar-build, showdar-test, showdar-review]
4
+ flow: "design direction/system -> stack implementation -> UI verification -> review"
@@ -0,0 +1,4 @@
1
+ version: 2
2
+ name: feature
3
+ skills: [showdar-understand, showdar-plan, showdar-build, showdar-test, showdar-review]
4
+ flow: "understand -> plan -> build -> test -> review"
@@ -0,0 +1,4 @@
1
+ version: 2
2
+ name: release
3
+ skills: [showdar-review, showdar-ship]
4
+ flow: "pre-release review -> delivery verification -> handoff decision -> optional explicitly requested release execution"
@@ -0,0 +1,4 @@
1
+ version: 2
2
+ name: upgrade
3
+ skills: [showdar-understand, showdar-upgrade, showdar-test, showdar-review, showdar-ship]
4
+ flow: "inventory -> compatibility/migration -> verify -> review -> release readiness"
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Implement the smallest coherent production change with Showdar
3
+ ---
4
+ Load and follow `showdar-build`. Preserve repository architecture and contracts, keep the change surface bounded, and verify before claiming completion.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Debug a failure through evidence-first root-cause analysis with Showdar
3
+ ---
4
+ Load and follow `showdar-debug`. Gather evidence and test falsifiable hypotheses before modifying production behavior.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Design, implement, review, or polish UI using Showdar design intelligence
3
+ ---
4
+ Load and follow `showdar-design`. Detect whether the request is new design, implementation guidance, review, or polish, then use the skill's local data/search and stack guidance selectively.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Complete a local Git workflow safely without inferring push, GitHub, CI/CD, deployment, or release actions
3
+ ---
4
+ Load and follow `showdar-git`. Inspect the repository before mutation, separate task-owned and unrelated changes, stage explicit paths, and verify the final Git state. Remote mutations require explicit user intent.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Handle CI/CD, deployment, containers, observability, and rollback operations
3
+ ---
4
+
5
+ Load and follow `showdar-ops` for the request below. Inspect operational state read-only by default; modify local operational config or execute remote/production actions only when explicitly requested and authorized.
6
+
7
+ $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Create a bounded executable engineering plan with Showdar
3
+ ---
4
+ Load and follow `showdar-plan`. Ground the plan in the current repository, keep non-goals explicit, and include concrete verification.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Plan QA scenarios, risk coverage, regression scope, and evidence
3
+ ---
4
+
5
+ Load and follow `showdar-quality` for the request below. Plan what should be verified, distinguish planned from executed evidence, and hand automated test implementation to `showdar-test`. Do not claim acceptance without evidence.
6
+
7
+ $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Recover interrupted work from repository evidence with Showdar
3
+ ---
4
+ Load and follow `showdar-recover`. Reconstruct the goal and durable state before editing, preserve unrelated user changes, and identify the safest next action.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Analyze requirements, ambiguity, business rules, and acceptance criteria
3
+ ---
4
+
5
+ Load and follow `showdar-requirements` for the request below. Separate supplied facts, repository observations, assumptions, and open decisions. Do not invent stakeholder intent or modify application code by default.
6
+
7
+ $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Review code for general correctness, architecture, performance, maintainability, and tests
3
+ ---
4
+ Load and follow `showdar-review`. Focus on general correctness, architecture, performance, maintainability, and tests; use `showdar-security` for security-specific threats, auth, secrets, exposure, or exploitability.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Analyze security posture, threats, auth, secrets, and data exposure
3
+ ---
4
+
5
+ Load and follow `showdar-security` for the request below. Use repository evidence, distinguish confirmed issues from suspected risks, redact sensitive values, and do not perform offensive or destructive actions by default.
6
+
7
+ $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Verify delivery readiness with Showdar without creating CI or taking unapproved external actions
3
+ ---
4
+ Load and follow `showdar-ship` in delivery verification mode. Inspect the diff, run relevant local checks, and report readiness. Existing CI is read-only; do not create or modify `.github/workflows/**`, deploy, publish, submit to a store, or mutate production unless the user explicitly requests that execution scope.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Invoke a specific Showdar flagship skill explicitly
3
+ ---
4
+ Select exactly one requested Showdar skill and follow it: `showdar-understand`, `showdar-plan`, `showdar-design`, `showdar-build`, `showdar-debug`, `showdar-test`, `showdar-review`, `showdar-upgrade`, `showdar-ship`, `showdar-recover`, `showdar-git`, `showdar-requirements`, `showdar-quality`, `showdar-security`, or `showdar-ops`. If the requested name is ambiguous, choose the smallest matching skill from this list and say which one was selected.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Choose and implement the lowest effective test strategy with Showdar
3
+ ---
4
+ Load and follow `showdar-test`. Prove behavior at the lowest effective level and avoid fragile mock-heavy coverage.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Understand repository architecture and task-relevant change surface with Showdar
3
+ ---
4
+ Load and follow `showdar-understand`. Analyze the repository or subsystem relevant to this request without implementing changes unless the user explicitly asks to switch workflows.
5
+
6
+ Request: $ARGUMENTS
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: Upgrade frameworks, dependencies, runtimes, or platforms safely with Showdar
3
+ ---
4
+ Load and follow `showdar-upgrade`. Establish compatibility, breaking changes, migration order, rollback, and affected-platform verification before claiming success.
5
+
6
+ Request: $ARGUMENTS
package/engine/csv.mjs ADDED
@@ -0,0 +1,45 @@
1
+ export function parseCsv(text, { strict = true } = {}) {
2
+ const rows = [];
3
+ let row = [];
4
+ let field = '';
5
+ let quoted = false;
6
+ const pushRow = () => {
7
+ row.push(field);
8
+ rows.push(row);
9
+ row = [];
10
+ field = '';
11
+ };
12
+ for (let i = 0; i < text.length; i += 1) {
13
+ const ch = text[i];
14
+ if (quoted) {
15
+ if (ch === '"' && text[i + 1] === '"') { field += '"'; i += 1; }
16
+ else if (ch === '"') quoted = false;
17
+ else field += ch;
18
+ continue;
19
+ }
20
+ if (ch === '"') quoted = true;
21
+ else if (ch === ',') { row.push(field); field = ''; }
22
+ else if (ch === '\n') pushRow();
23
+ else if (ch !== '\r') field += ch;
24
+ }
25
+ if (quoted && strict) throw new Error('unterminated quoted field');
26
+ if (field.length || row.length) pushRow();
27
+ const clean = rows.filter((r) => r.some((value) => value.trim() !== ''));
28
+ if (!clean.length) return [];
29
+ const headers = clean[0].map((value) => value.trim());
30
+ if (strict && headers.some((header) => !header)) throw new Error('blank CSV header');
31
+ if (strict && new Set(headers.map((header) => header.toLowerCase())).size !== headers.length) throw new Error('duplicate CSV header');
32
+ return clean.slice(1).map((values) => {
33
+ if (strict && values.length !== headers.length) throw new Error(`CSV column count ${values.length} does not match header count ${headers.length}`);
34
+ return Object.fromEntries(headers.map((header, index) => [header, values[index] ?? '']));
35
+ });
36
+ }
37
+
38
+ export function stringifyCsv(rows, headers = rows.length ? Object.keys(rows[0]) : []) {
39
+ const escape = (value) => {
40
+ const raw = String(value ?? '');
41
+ if (!/[",\n\r]/.test(raw)) return raw;
42
+ return `"${raw.replaceAll('"', '""')}"`;
43
+ };
44
+ return [headers.map(escape).join(','), ...rows.map((row) => headers.map((header) => escape(row[header])).join(','))].join('\n') + '\n';
45
+ }