@1aboveio/skills 0.0.0-stage → 1.0.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 (633) hide show
  1. package/README.md +30 -2
  2. package/bin/cli.mjs +14 -0
  3. package/bin/select-core.mjs +172 -0
  4. package/package.json +146 -4
  5. package/skills/app-dev/airflow/LICENSE +3 -0
  6. package/skills/app-dev/airflow/SKILL.md +199 -0
  7. package/skills/app-dev/airflow/release-check.mjs +93 -0
  8. package/skills/app-dev/android-foundation/LICENSE +3 -0
  9. package/skills/app-dev/android-foundation/SKILL.md +192 -0
  10. package/skills/app-dev/android-foundation/assets/android-ci-job.yml +217 -0
  11. package/skills/app-dev/android-foundation/references/ci.md +87 -0
  12. package/skills/app-dev/android-foundation/references/gotchas.md +221 -0
  13. package/skills/app-dev/android-foundation/references/setup.md +164 -0
  14. package/skills/app-dev/android-foundation/release-check.mjs +93 -0
  15. package/skills/app-dev/android-foundation/scripts/device-run.sh +176 -0
  16. package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +172 -0
  17. package/skills/app-dev/app-debug/LICENSE +3 -0
  18. package/skills/app-dev/app-debug/SKILL.md +110 -0
  19. package/skills/app-dev/app-debug/references/common-errors.md +128 -0
  20. package/skills/app-dev/app-debug/release-check.mjs +93 -0
  21. package/skills/app-dev/better-auth/LICENSE +3 -0
  22. package/skills/app-dev/better-auth/SKILL.md +598 -0
  23. package/skills/app-dev/better-auth/references/feishu-api.md +270 -0
  24. package/skills/app-dev/better-auth/release-check.mjs +93 -0
  25. package/skills/app-dev/data-catalog/LICENSE +3 -0
  26. package/skills/app-dev/data-catalog/SKILL.md +204 -0
  27. package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
  28. package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +75 -0
  29. package/skills/app-dev/data-catalog/references/field-definitions.md +116 -0
  30. package/skills/app-dev/data-catalog/references/format.md +121 -0
  31. package/skills/app-dev/data-catalog/release-check.mjs +93 -0
  32. package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +36 -0
  33. package/skills/app-dev/data-catalog/scripts/data_catalog.py +1392 -0
  34. package/skills/app-dev/data-catalog/scripts/persist-conventions-core.mjs +117 -0
  35. package/skills/app-dev/data-catalog/scripts/persist-conventions.mjs +17 -0
  36. package/skills/app-dev/data-catalog/scripts/test_data_catalog.py +571 -0
  37. package/skills/app-dev/ios-foundation/LICENSE +3 -0
  38. package/skills/app-dev/ios-foundation/SKILL.md +184 -0
  39. package/skills/app-dev/ios-foundation/references/setup.md +243 -0
  40. package/skills/app-dev/ios-foundation/release-check.mjs +93 -0
  41. package/skills/app-dev/monorepo/LICENSE +3 -0
  42. package/skills/app-dev/monorepo/SKILL.md +462 -0
  43. package/skills/app-dev/monorepo/release-check.mjs +93 -0
  44. package/skills/app-dev/nextjs-fullstack/LICENSE +3 -0
  45. package/skills/app-dev/nextjs-fullstack/SKILL.md +211 -0
  46. package/skills/app-dev/nextjs-fullstack/conventions.md +318 -0
  47. package/skills/app-dev/nextjs-fullstack/frontend-conventions.md +61 -0
  48. package/skills/app-dev/nextjs-fullstack/nextjs16.md +287 -0
  49. package/skills/app-dev/nextjs-fullstack/release-check.mjs +93 -0
  50. package/skills/app-dev/nextjs-fullstack/server-actions.md +409 -0
  51. package/skills/app-dev/prisma-setup/LICENSE +3 -0
  52. package/skills/app-dev/prisma-setup/SKILL.md +181 -0
  53. package/skills/app-dev/prisma-setup/nextjs.md +258 -0
  54. package/skills/app-dev/prisma-setup/release-check.mjs +93 -0
  55. package/skills/app-dev/prisma-setup/turborepo.md +301 -0
  56. package/skills/app-dev/pyspark/LICENSE +3 -0
  57. package/skills/app-dev/pyspark/SKILL.md +127 -0
  58. package/skills/app-dev/pyspark/assets/templates/etl.py +748 -0
  59. package/skills/app-dev/pyspark/assets/templates/utils/__init__.py +1 -0
  60. package/skills/app-dev/pyspark/assets/templates/utils/hudi_metadata.py +14 -0
  61. package/skills/app-dev/pyspark/references/diagnosis-and-profiling.md +169 -0
  62. package/skills/app-dev/pyspark/references/etl-contract.md +129 -0
  63. package/skills/app-dev/pyspark/references/production-validation.md +131 -0
  64. package/skills/app-dev/pyspark/references/reconciliation.md +38 -0
  65. package/skills/app-dev/pyspark/references/transformation-design.md +190 -0
  66. package/skills/app-dev/pyspark/references/velocity-feature-calculation.md +193 -0
  67. package/skills/app-dev/pyspark/release-check.mjs +93 -0
  68. package/skills/app-dev/pyspark/scripts/spark_eventlog_summary.py +223 -0
  69. package/skills/app-dev/python-backend/LICENSE +3 -0
  70. package/skills/app-dev/python-backend/SKILL.md +325 -0
  71. package/skills/app-dev/python-backend/assets/uv-install.sh +48 -0
  72. package/skills/app-dev/python-backend/references/uv-installs.md +83 -0
  73. package/skills/app-dev/python-backend/release-check.mjs +93 -0
  74. package/skills/app-dev/shadcn/LICENSE +3 -0
  75. package/skills/app-dev/shadcn/SKILL.md +120 -0
  76. package/skills/app-dev/shadcn/assets/shadcn-small.png +0 -0
  77. package/skills/app-dev/shadcn/assets/shadcn.png +0 -0
  78. package/skills/app-dev/shadcn/cli.md +411 -0
  79. package/skills/app-dev/shadcn/customization.md +224 -0
  80. package/skills/app-dev/shadcn/mcp.md +101 -0
  81. package/skills/app-dev/shadcn/release-check.mjs +93 -0
  82. package/skills/app-dev/shadcn/rules/base-vs-radix.md +323 -0
  83. package/skills/app-dev/shadcn/rules/component-selection.md +67 -0
  84. package/skills/app-dev/shadcn/rules/composition.md +195 -0
  85. package/skills/app-dev/shadcn/rules/data-table.md +201 -0
  86. package/skills/app-dev/shadcn/rules/forms.md +255 -0
  87. package/skills/app-dev/shadcn/rules/icons.md +103 -0
  88. package/skills/app-dev/shadcn/rules/styling.md +167 -0
  89. package/skills/app-dev/zod-v4/LICENSE +3 -0
  90. package/skills/app-dev/zod-v4/SKILL.md +286 -0
  91. package/skills/app-dev/zod-v4/release-check.mjs +93 -0
  92. package/skills/cicd/cloud-build/LICENSE +3 -0
  93. package/skills/cicd/cloud-build/SKILL.md +707 -0
  94. package/skills/cicd/cloud-build/release-check.mjs +93 -0
  95. package/skills/cicd/cloud-debug/LICENSE +3 -0
  96. package/skills/cicd/cloud-debug/SKILL.md +315 -0
  97. package/skills/cicd/cloud-debug/references/build-failures.md +238 -0
  98. package/skills/cicd/cloud-debug/references/deploy-failures.md +376 -0
  99. package/skills/cicd/cloud-debug/references/pipeline-failures.md +378 -0
  100. package/skills/cicd/cloud-debug/release-check.mjs +93 -0
  101. package/skills/cicd/cloud-deploy/LICENSE +3 -0
  102. package/skills/cicd/cloud-deploy/SKILL.md +230 -0
  103. package/skills/cicd/cloud-deploy/references/config-templates.md +257 -0
  104. package/skills/cicd/cloud-deploy/release-check.mjs +93 -0
  105. package/skills/cicd/docker/LICENSE +3 -0
  106. package/skills/cicd/docker/SKILL.md +151 -0
  107. package/skills/cicd/docker/release-check.mjs +93 -0
  108. package/skills/cicd/github-actions/LICENSE +3 -0
  109. package/skills/cicd/github-actions/SKILL.md +111 -0
  110. package/skills/cicd/github-actions/references/audit-profile-optimize.md +150 -0
  111. package/skills/cicd/github-actions/references/ci-case-studies.md +141 -0
  112. package/skills/cicd/github-actions/references/conditional-ci.md +214 -0
  113. package/skills/cicd/github-actions/references/debugging.md +13 -0
  114. package/skills/cicd/github-actions/references/pipeline.md +87 -0
  115. package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +33 -0
  116. package/skills/cicd/github-actions/references/runners.md +253 -0
  117. package/skills/cicd/github-actions/references/security.md +29 -0
  118. package/skills/cicd/github-actions/references/speed-and-audit.md +115 -0
  119. package/skills/cicd/github-actions/references/two-pass-reading.md +92 -0
  120. package/skills/cicd/github-actions/release-check.mjs +93 -0
  121. package/skills/cicd/github-actions/scripts/ci-run-audit-core.mjs +612 -0
  122. package/skills/cicd/github-actions/scripts/ci-run-audit.mjs +4 -0
  123. package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +637 -0
  124. package/skills/cicd/github-flow/LICENSE +3 -0
  125. package/skills/cicd/github-flow/SKILL.md +123 -0
  126. package/skills/cicd/github-flow/references/ci-conventions.md +14 -0
  127. package/skills/cicd/github-flow/release-check.mjs +93 -0
  128. package/skills/cicd/github-flow/scripts/flow-core.mjs +105 -0
  129. package/skills/cicd/github-flow/scripts/flow.mjs +81 -0
  130. package/skills/cicd/github-flow/scripts/flow.test.mjs +114 -0
  131. package/skills/cicd/github-flow/scripts/persist-conventions-core.mjs +117 -0
  132. package/skills/cicd/github-flow/scripts/persist-conventions.mjs +49 -0
  133. package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +108 -0
  134. package/skills/cicd/google-cloud/LICENSE +3 -0
  135. package/skills/cicd/google-cloud/SKILL.md +119 -0
  136. package/skills/cicd/google-cloud/references/gcs.md +469 -0
  137. package/skills/cicd/google-cloud/references/iam.md +451 -0
  138. package/skills/cicd/google-cloud/references/project.md +349 -0
  139. package/skills/cicd/google-cloud/references/secrets.md +336 -0
  140. package/skills/cicd/google-cloud/references/vpc.md +312 -0
  141. package/skills/cicd/google-cloud/release-check.mjs +93 -0
  142. package/skills/cicd/google-cloud/scripts/create-sa.sh +36 -0
  143. package/skills/cicd/google-cloud/scripts/gcp-config.sh +31 -0
  144. package/skills/cicd/google-cloud/scripts/grant-iap.sh +41 -0
  145. package/skills/cicd/google-cloud/scripts/setup-secrets.sh +48 -0
  146. package/skills/cicd/mergify/LICENSE +3 -0
  147. package/skills/cicd/mergify/SKILL.md +102 -0
  148. package/skills/cicd/mergify/assets/templates/mergify.yml +215 -0
  149. package/skills/cicd/mergify/assets/templates/ruleset.json +46 -0
  150. package/skills/cicd/mergify/references/branch-protection.md +282 -0
  151. package/skills/cicd/mergify/references/configuration.md +274 -0
  152. package/skills/cicd/mergify/references/diagnosis.md +109 -0
  153. package/skills/cicd/mergify/references/stacks.md +84 -0
  154. package/skills/cicd/mergify/references/traps.md +119 -0
  155. package/skills/cicd/mergify/references/watch-contract.md +274 -0
  156. package/skills/cicd/mergify/release-check.mjs +93 -0
  157. package/skills/cicd/mergify/scripts/audit-core.mjs +208 -0
  158. package/skills/cicd/mergify/scripts/audit.mjs +4 -0
  159. package/skills/cicd/mergify/scripts/audit.test.mjs +201 -0
  160. package/skills/cicd/mergify/scripts/entrypoints.test.mjs +106 -0
  161. package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +30 -0
  162. package/skills/cicd/mergify/scripts/stack-push-core.mjs +258 -0
  163. package/skills/cicd/mergify/scripts/stack-push.mjs +4 -0
  164. package/skills/cicd/mergify/scripts/stack-push.test.mjs +233 -0
  165. package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +1065 -0
  166. package/skills/cicd/mergify/scripts/watch-pr-delivery.mjs +4 -0
  167. package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +1826 -0
  168. package/skills/cicd/podman/LICENSE +3 -0
  169. package/skills/cicd/podman/SKILL.md +71 -0
  170. package/skills/cicd/podman/agents/openai.yaml +4 -0
  171. package/skills/cicd/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  172. package/skills/cicd/podman/assets/templates/podman-service-override.conf +3 -0
  173. package/skills/cicd/podman/references/compose-compatibility.md +70 -0
  174. package/skills/cicd/podman/references/networking-and-ports.md +74 -0
  175. package/skills/cicd/podman/references/rootless-services-and-sockets.md +156 -0
  176. package/skills/cicd/podman/references/troubleshooting.md +98 -0
  177. package/skills/cicd/podman/release-check.mjs +93 -0
  178. package/skills/content/article-review/LICENSE +3 -0
  179. package/skills/content/article-review/SKILL.md +66 -0
  180. package/skills/content/article-review/references/report-format.md +68 -0
  181. package/skills/content/article-review/references/template-guide.md +79 -0
  182. package/skills/content/article-review/references/template-wechat-payments.md +125 -0
  183. package/skills/content/article-review/release-check.mjs +93 -0
  184. package/skills/content/article-to-image/LICENSE +3 -0
  185. package/skills/content/article-to-image/SKILL.md +91 -0
  186. package/skills/content/article-to-image/references/formats.md +53 -0
  187. package/skills/content/article-to-image/release-check.mjs +93 -0
  188. package/skills/content/flowchart-svg/LICENSE +3 -0
  189. package/skills/content/flowchart-svg/SKILL.md +43 -0
  190. package/skills/content/flowchart-svg/release-check.mjs +93 -0
  191. package/skills/content/flowchart-svg/scripts/export_png.sh +8 -0
  192. package/skills/content/image-gen/LICENSE +3 -0
  193. package/skills/content/image-gen/SKILL.md +192 -0
  194. package/skills/content/image-gen/release-check.mjs +93 -0
  195. package/skills/content/image-gen/scripts/credentials.mjs +217 -0
  196. package/skills/content/image-gen/scripts/credentials.test.mjs +212 -0
  197. package/skills/content/image-gen/scripts/generate.mjs +240 -0
  198. package/skills/content/image-gen/scripts/options.mjs +293 -0
  199. package/skills/content/image-gen/scripts/options.test.mjs +245 -0
  200. package/skills/content/mermaid/LICENSE +3 -0
  201. package/skills/content/mermaid/SKILL.md +635 -0
  202. package/skills/content/mermaid/release-check.mjs +93 -0
  203. package/skills/content/wechat-article-writer/LICENSE +3 -0
  204. package/skills/content/wechat-article-writer/SKILL.md +92 -0
  205. package/skills/content/wechat-article-writer/references/style-selector.md +133 -0
  206. package/skills/content/wechat-article-writer/references/writing-rules.md +152 -0
  207. package/skills/content/wechat-article-writer/release-check.mjs +93 -0
  208. package/skills/content/wechat-article-writer/templates/wechat-comparison.md +52 -0
  209. package/skills/content/wechat-article-writer/templates/wechat-howto.md +51 -0
  210. package/skills/content/wechat-article-writer/templates/wechat-insight.md +50 -0
  211. package/skills/content/wechat-article-writer/templates/wechat-pitfall.md +52 -0
  212. package/skills/content/wechat-publisher/LICENSE +3 -0
  213. package/skills/content/wechat-publisher/SKILL.md +171 -0
  214. package/skills/content/wechat-publisher/references/api.md +105 -0
  215. package/skills/content/wechat-publisher/references/layout-rules.md +57 -0
  216. package/skills/content/wechat-publisher/references/wechat-safe-template.html +86 -0
  217. package/skills/content/wechat-publisher/release-check.mjs +93 -0
  218. package/skills/content/wechat-publisher/scripts/md_to_wechat_html.py +194 -0
  219. package/skills/content/wechat-publisher/scripts/publish.py +239 -0
  220. package/skills/content/wechat-search/LICENSE +3 -0
  221. package/skills/content/wechat-search/SKILL.md +211 -0
  222. package/skills/content/wechat-search/release-check.mjs +93 -0
  223. package/skills/content/wechat-search/scripts/start-chrome.sh +83 -0
  224. package/skills/content/xai-search/LICENSE +3 -0
  225. package/skills/content/xai-search/SKILL.md +79 -0
  226. package/skills/content/xai-search/release-check.mjs +93 -0
  227. package/skills/content/xai-search/scripts/xai_search.sh +187 -0
  228. package/skills/content/xai-search/tests/smoke_test.sh +36 -0
  229. package/skills/core/distill-writing/LICENSE +3 -0
  230. package/skills/core/distill-writing/SKILL.md +74 -0
  231. package/skills/core/distill-writing/references/extraction.md +95 -0
  232. package/skills/core/distill-writing/references/updating.md +46 -0
  233. package/skills/core/distill-writing/release-check.mjs +93 -0
  234. package/skills/core/doc-to-md/LICENSE +3 -0
  235. package/skills/core/doc-to-md/SKILL.md +78 -0
  236. package/skills/core/doc-to-md/release-check.mjs +93 -0
  237. package/skills/core/doc-to-md/scripts/convert.py +157 -0
  238. package/skills/core/editorial-review/LICENSE +3 -0
  239. package/skills/core/editorial-review/SKILL.md +79 -0
  240. package/skills/core/editorial-review/references/checklist.md +94 -0
  241. package/skills/core/editorial-review/release-check.mjs +93 -0
  242. package/skills/core/house-style/LICENSE +3 -0
  243. package/skills/core/house-style/SKILL.md +33 -0
  244. package/skills/core/house-style/references/defaults.md +66 -0
  245. package/skills/core/house-style/references/rules.md +267 -0
  246. package/skills/core/house-style/references/sources.md +27 -0
  247. package/skills/core/house-style/references/style-en.md +131 -0
  248. package/skills/core/house-style/references/style-zh.md +141 -0
  249. package/skills/core/house-style/references/terminology-zh.md +223 -0
  250. package/skills/core/house-style/release-check.mjs +93 -0
  251. package/skills/core/house-style/templates/brd.md +103 -0
  252. package/skills/core/house-style/templates/commercial-proposal.md +93 -0
  253. package/skills/core/house-style/templates/compliance-policy.md +109 -0
  254. package/skills/core/house-style/templates/gap-analysis.md +105 -0
  255. package/skills/core/house-style/templates/general.md +63 -0
  256. package/skills/core/house-style/templates/integration-guide.md +98 -0
  257. package/skills/core/house-style/templates/prd.md +81 -0
  258. package/skills/core/house-style/templates/risk-operations-procedure.md +94 -0
  259. package/skills/core/house-style/templates/technical-spec.md +96 -0
  260. package/skills/core/polish-cn/LICENSE +3 -0
  261. package/skills/core/polish-cn/SKILL.md +102 -0
  262. package/skills/core/polish-cn/references/brief.md +93 -0
  263. package/skills/core/polish-cn/references/models.md +76 -0
  264. package/skills/core/polish-cn/release-check.mjs +93 -0
  265. package/skills/core/polish-cn/scripts/polish-cn.test.mjs +244 -0
  266. package/skills/core/polish-cn/scripts/polish_blocks.py +489 -0
  267. package/skills/core/reg-parser/LICENSE +3 -0
  268. package/skills/core/reg-parser/SKILL.md +212 -0
  269. package/skills/core/reg-parser/references/checklist-schema.md +223 -0
  270. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.json +1306 -0
  271. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.md +469 -0
  272. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.json +634 -0
  273. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.md +233 -0
  274. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.json +2194 -0
  275. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.md +771 -0
  276. package/skills/core/reg-parser/references/checklists/kyc-aml-checklist.md +258 -0
  277. package/skills/core/reg-parser/references/checklists/visa-vars-checklist.md +1058 -0
  278. package/skills/core/reg-parser/references/mandates/hk-amlo-cap615.md +389 -0
  279. package/skills/core/reg-parser/references/mandates/visa-vars.md +205 -0
  280. package/skills/core/reg-parser/release-check.mjs +93 -0
  281. package/skills/core/reg-parser/scripts/compare_checklist.py +230 -0
  282. package/skills/core/reg-parser/scripts/dump_checklist.py +361 -0
  283. package/skills/core/reg-parser/scripts/preprocess-mandate.sh +187 -0
  284. package/skills/core/reg-parser/scripts/reg-parser.test.mjs +165 -0
  285. package/skills/core/reg-parser/scripts/test_quarantine.sh +105 -0
  286. package/skills/core/reg-parser/scripts/validate_checklist.py +563 -0
  287. package/skills/core/reg-parser/scripts/validate_mandate.py +273 -0
  288. package/skills/core/terminology/LICENSE +3 -0
  289. package/skills/core/terminology/SKILL.md +62 -0
  290. package/skills/core/terminology/references/format.md +50 -0
  291. package/skills/core/terminology/references/init.md +32 -0
  292. package/skills/core/terminology/release-check.mjs +93 -0
  293. package/skills/core/write-doc/LICENSE +3 -0
  294. package/skills/core/write-doc/SKILL.md +141 -0
  295. package/skills/core/write-doc/references/bilingual.md +60 -0
  296. package/skills/core/write-doc/release-check.mjs +93 -0
  297. package/skills/engineering/better-review/LICENSE +3 -0
  298. package/skills/engineering/better-review/SKILL.md +249 -0
  299. package/skills/engineering/better-review/agents/openai.yaml +9 -0
  300. package/skills/engineering/better-review/references/domain-hazards.md +53 -0
  301. package/skills/engineering/better-review/references/passes.md +147 -0
  302. package/skills/engineering/better-review/references/result.md +151 -0
  303. package/skills/engineering/better-review/release-check.mjs +93 -0
  304. package/skills/engineering/better-review/scripts/pr-context.mjs +212 -0
  305. package/skills/engineering/better-review/scripts/pr-context.test.mjs +168 -0
  306. package/skills/engineering/better-review/scripts/rereview-scope.mjs +503 -0
  307. package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +587 -0
  308. package/skills/engineering/better-review/scripts/scan-diff.mjs +365 -0
  309. package/skills/engineering/better-review/scripts/scan-diff.test.mjs +414 -0
  310. package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +96 -0
  311. package/skills/engineering/e2e-test/LICENSE +3 -0
  312. package/skills/engineering/e2e-test/SKILL.md +98 -0
  313. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +24 -0
  314. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  315. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +73 -0
  316. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +144 -0
  317. package/skills/engineering/e2e-test/references/ci-integration.md +25 -0
  318. package/skills/engineering/e2e-test/references/ci-playwright-container.md +290 -0
  319. package/skills/engineering/e2e-test/references/presentation-sweep.md +104 -0
  320. package/skills/engineering/e2e-test/references/reviewing.md +41 -0
  321. package/skills/engineering/e2e-test/references/route-manifest.md +51 -0
  322. package/skills/engineering/e2e-test/release-check.mjs +93 -0
  323. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  324. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  325. package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +106 -0
  326. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  327. package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +117 -0
  328. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  329. package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +69 -0
  330. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  331. package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +98 -0
  332. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +147 -0
  333. package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +71 -0
  334. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  335. package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +59 -0
  336. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +82 -0
  337. package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +76 -0
  338. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  339. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  340. package/skills/engineering/engineering-runtime/SKILL.md +11 -0
  341. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  342. package/skills/engineering/engineering-runtime/coherence/workflow.json +597 -0
  343. package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +68 -0
  344. package/skills/engineering/engineering-runtime/release-check.mjs +93 -0
  345. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  346. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  347. package/skills/engineering/engineering-runtime/scripts/invocation-policy.mjs +187 -0
  348. package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +95 -0
  349. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +79 -0
  350. package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +288 -0
  351. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  352. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  353. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  354. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  355. package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +96 -0
  356. package/skills/engineering/engineering-runtime/scripts/review-completion.mjs +56 -0
  357. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +595 -0
  358. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +189 -0
  359. package/skills/engineering/engineering-runtime/scripts/yaml-mapping.mjs +18 -0
  360. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  361. package/skills/engineering/ensure-coverage/SKILL.md +129 -0
  362. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +92 -0
  363. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +85 -0
  364. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  365. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  366. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  367. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +19 -0
  368. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  369. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +57 -0
  370. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +39 -0
  371. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +44 -0
  372. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +110 -0
  373. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +35 -0
  374. package/skills/engineering/ensure-coverage/references/presentation/axis.md +64 -0
  375. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +27 -0
  376. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  377. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +56 -0
  378. package/skills/engineering/ensure-coverage/release-check.mjs +93 -0
  379. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +67 -0
  380. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +140 -0
  381. package/skills/engineering/ensure-coverage/scripts/README.md +99 -0
  382. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +182 -0
  383. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +96 -0
  384. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +105 -0
  385. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +47 -0
  386. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +137 -0
  387. package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +86 -0
  388. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +674 -0
  389. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +447 -0
  390. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  391. package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +552 -0
  392. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +282 -0
  393. package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +289 -0
  394. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  395. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +119 -0
  396. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  397. package/skills/engineering/golden-path/LICENSE +3 -0
  398. package/skills/engineering/golden-path/SKILL.md +230 -0
  399. package/skills/engineering/golden-path/agents/openai.yaml +3 -0
  400. package/skills/engineering/golden-path/assets/golden-paths.example.json +57 -0
  401. package/skills/engineering/golden-path/references/contract.md +239 -0
  402. package/skills/engineering/golden-path/references/migration.md +111 -0
  403. package/skills/engineering/golden-path/release-check.mjs +93 -0
  404. package/skills/engineering/golden-path/scripts/golden-path-core.mjs +1779 -0
  405. package/skills/engineering/golden-path/scripts/golden-path.mjs +6 -0
  406. package/skills/engineering/golden-path/scripts/golden-path.test.mjs +1457 -0
  407. package/skills/engineering/harness-runtime/LICENSE +3 -0
  408. package/skills/engineering/harness-runtime/SKILL.md +19 -0
  409. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  410. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  411. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  412. package/skills/engineering/harness-runtime/contracts.md +15 -0
  413. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  414. package/skills/engineering/harness-runtime/discover-models.test.mjs +363 -0
  415. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  416. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  417. package/skills/engineering/harness-runtime/harness-runtime.test.mjs +967 -0
  418. package/skills/engineering/harness-runtime/index.mjs +767 -0
  419. package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +829 -0
  420. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  421. package/skills/engineering/harness-runtime/model-catalog.test.mjs +366 -0
  422. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  423. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +408 -0
  424. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  425. package/skills/engineering/harness-runtime/release-check.mjs +93 -0
  426. package/skills/engineering/resolve-issues/LICENSE +3 -0
  427. package/skills/engineering/resolve-issues/SKILL.md +250 -0
  428. package/skills/engineering/resolve-issues/agents/openai.yaml +9 -0
  429. package/skills/engineering/resolve-issues/plugin-hooks.json +17 -0
  430. package/skills/engineering/resolve-issues/references/canary.md +28 -0
  431. package/skills/engineering/resolve-issues/references/ci.md +105 -0
  432. package/skills/engineering/resolve-issues/references/done.md +25 -0
  433. package/skills/engineering/resolve-issues/references/dropbox.md +90 -0
  434. package/skills/engineering/resolve-issues/references/expire.md +318 -0
  435. package/skills/engineering/resolve-issues/references/exploration.md +202 -0
  436. package/skills/engineering/resolve-issues/references/implementation.md +303 -0
  437. package/skills/engineering/resolve-issues/references/preflight.md +445 -0
  438. package/skills/engineering/resolve-issues/references/review.md +228 -0
  439. package/skills/engineering/resolve-issues/references/shared-modules.md +44 -0
  440. package/skills/engineering/resolve-issues/references/task-plan.md +264 -0
  441. package/skills/engineering/resolve-issues/release-check.mjs +93 -0
  442. package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +364 -0
  443. package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +280 -0
  444. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  445. package/skills/engineering/resolve-issues/scripts/dropbox.mjs +473 -0
  446. package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +346 -0
  447. package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +98 -0
  448. package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +88 -0
  449. package/skills/engineering/resolve-issues/scripts/github-reviews.mjs +384 -0
  450. package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +264 -0
  451. package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +135 -0
  452. package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +79 -0
  453. package/skills/engineering/resolve-issues/scripts/issue-tree.mjs +162 -0
  454. package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +107 -0
  455. package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +14 -0
  456. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  457. package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +149 -0
  458. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +856 -0
  459. package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +915 -0
  460. package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +269 -0
  461. package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +156 -0
  462. package/skills/engineering/resolve-issues/scripts/preflight-models.mjs +736 -0
  463. package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +448 -0
  464. package/skills/engineering/resolve-issues/scripts/ready-check.mjs +185 -0
  465. package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +217 -0
  466. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +98 -0
  467. package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +91 -0
  468. package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +509 -0
  469. package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +1060 -0
  470. package/skills/engineering/resolve-issues/scripts/size-check.mjs +492 -0
  471. package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +458 -0
  472. package/skills/engineering/resolve-release/LICENSE +3 -0
  473. package/skills/engineering/resolve-release/SKILL.md +215 -0
  474. package/skills/engineering/resolve-release/agents/openai.yaml +8 -0
  475. package/skills/engineering/resolve-release/flows/cloud-run-canary.md +13 -0
  476. package/skills/engineering/resolve-release/flows/cloud-run.md +7 -0
  477. package/skills/engineering/resolve-release/flows/root-tag-npm.md +13 -0
  478. package/skills/engineering/resolve-release/flows/workspace-npm.md +22 -0
  479. package/skills/engineering/resolve-release/references/canary.md +51 -0
  480. package/skills/engineering/resolve-release/references/candidate.md +41 -0
  481. package/skills/engineering/resolve-release/references/cut.md +131 -0
  482. package/skills/engineering/resolve-release/references/dark-launch.md +66 -0
  483. package/skills/engineering/resolve-release/references/flows.md +150 -0
  484. package/skills/engineering/resolve-release/references/preflight.md +154 -0
  485. package/skills/engineering/resolve-release/references/prepared-metadata.md +260 -0
  486. package/skills/engineering/resolve-release/references/promotion.md +82 -0
  487. package/skills/engineering/resolve-release/references/publish.md +232 -0
  488. package/skills/engineering/resolve-release/references/workspace-npm.md +103 -0
  489. package/skills/engineering/resolve-release/release-check.mjs +93 -0
  490. package/skills/engineering/resolve-release/scripts/apply.mjs +212 -0
  491. package/skills/engineering/resolve-release/scripts/apply.test.mjs +99 -0
  492. package/skills/engineering/resolve-release/scripts/dark-flags.mjs +134 -0
  493. package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +100 -0
  494. package/skills/engineering/resolve-release/scripts/flow.mjs +500 -0
  495. package/skills/engineering/resolve-release/scripts/flow.test.mjs +340 -0
  496. package/skills/engineering/resolve-release/scripts/green-head.mjs +231 -0
  497. package/skills/engineering/resolve-release/scripts/green-head.test.mjs +101 -0
  498. package/skills/engineering/resolve-release/scripts/npm-version-absence.mjs +138 -0
  499. package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +426 -0
  500. package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +659 -0
  501. package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +317 -0
  502. package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +291 -0
  503. package/skills/engineering/resolve-release/scripts/plan.mjs +806 -0
  504. package/skills/engineering/resolve-release/scripts/plan.test.mjs +428 -0
  505. package/skills/engineering/rush-issues/LICENSE +3 -0
  506. package/skills/engineering/rush-issues/SKILL.md +58 -0
  507. package/skills/engineering/rush-issues/agents/openai.yaml +8 -0
  508. package/skills/engineering/rush-issues/rehydrate.mjs +10 -0
  509. package/skills/engineering/rush-issues/release-check.mjs +93 -0
  510. package/skills/engineering/rush-release/LICENSE +3 -0
  511. package/skills/engineering/rush-release/SKILL.md +35 -0
  512. package/skills/engineering/rush-release/agents/openai.yaml +8 -0
  513. package/skills/engineering/rush-release/release-check.mjs +93 -0
  514. package/skills/engineering/test-quality/LICENSE +3 -0
  515. package/skills/engineering/test-quality/SKILL.md +79 -0
  516. package/skills/engineering/test-quality/references/audit.md +80 -0
  517. package/skills/engineering/test-quality/references/lint.md +24 -0
  518. package/skills/engineering/test-quality/references/principles.md +143 -0
  519. package/skills/engineering/test-quality/references/testing-conventions.md +9 -0
  520. package/skills/engineering/test-quality/release-check.mjs +93 -0
  521. package/skills/engineering/test-quality/scripts/lint-tests.mjs +574 -0
  522. package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +591 -0
  523. package/skills/engineering/test-quality/scripts/mock-policy-config.mjs +176 -0
  524. package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +119 -0
  525. package/skills/engineering/test-quality/scripts/persist-conventions-core.mjs +117 -0
  526. package/skills/engineering/test-quality/scripts/persist-conventions.mjs +17 -0
  527. package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +104 -0
  528. package/skills/risk-compliance/compliance-audit/LICENSE +3 -0
  529. package/skills/risk-compliance/compliance-audit/SKILL.md +439 -0
  530. package/skills/risk-compliance/compliance-audit/references/findings-schema.md +293 -0
  531. package/skills/risk-compliance/compliance-audit/references/normalization-rules.md +45 -0
  532. package/skills/risk-compliance/compliance-audit/references/vars-checklist.md +1068 -0
  533. package/skills/risk-compliance/compliance-audit/references/vars-findings-schema.md +398 -0
  534. package/skills/risk-compliance/compliance-audit/release-check.mjs +93 -0
  535. package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +14 -0
  536. package/skills/risk-compliance/compliance-audit/scripts/export_tracker_xlsx.py +221 -0
  537. package/skills/risk-compliance/compliance-audit/scripts/reconcile_tracker.py +458 -0
  538. package/skills/risk-compliance/compliance-audit/scripts/test_export_tracker_xlsx.py +97 -0
  539. package/skills/risk-compliance/compliance-audit/scripts/test_validate_tracker.py +157 -0
  540. package/skills/risk-compliance/compliance-audit/scripts/validate_tracker.py +829 -0
  541. package/skills/risk-compliance/contract-compare/LICENSE +3 -0
  542. package/skills/risk-compliance/contract-compare/SKILL.md +199 -0
  543. package/skills/risk-compliance/contract-compare/references/comparison-dimensions.md +209 -0
  544. package/skills/risk-compliance/contract-compare/release-check.mjs +93 -0
  545. package/skills/risk-compliance/contract-review/LICENSE +3 -0
  546. package/skills/risk-compliance/contract-review/SKILL.md +240 -0
  547. package/skills/risk-compliance/contract-review/references/review-criteria.md +223 -0
  548. package/skills/risk-compliance/contract-review/release-check.mjs +93 -0
  549. package/skills/risk-compliance/doc-authenticity/LICENSE +3 -0
  550. package/skills/risk-compliance/doc-authenticity/SKILL.md +160 -0
  551. package/skills/risk-compliance/doc-authenticity/agents/openai.yaml +8 -0
  552. package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +12 -0
  553. package/skills/risk-compliance/doc-authenticity/references/agreement.md +66 -0
  554. package/skills/risk-compliance/doc-authenticity/references/bank-statement.md +150 -0
  555. package/skills/risk-compliance/doc-authenticity/references/forensic-signals.md +157 -0
  556. package/skills/risk-compliance/doc-authenticity/references/image-signals.md +114 -0
  557. package/skills/risk-compliance/doc-authenticity/references/invoice.md +66 -0
  558. package/skills/risk-compliance/doc-authenticity/references/issuer-profiles.md +86 -0
  559. package/skills/risk-compliance/doc-authenticity/references/verdict-and-report.md +95 -0
  560. package/skills/risk-compliance/doc-authenticity/references/verdict.schema.json +81 -0
  561. package/skills/risk-compliance/doc-authenticity/release-check.mjs +93 -0
  562. package/skills/risk-compliance/doc-authenticity/scripts/image_forensics.py +294 -0
  563. package/skills/risk-compliance/doc-authenticity/scripts/pdf_forensics.py +401 -0
  564. package/skills/risk-compliance/doc-authenticity/scripts/validate_codes.py +224 -0
  565. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.py +308 -0
  566. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +212 -0
  567. package/skills/risk-compliance/fraud-analysis/LICENSE +3 -0
  568. package/skills/risk-compliance/fraud-analysis/SKILL.md +114 -0
  569. package/skills/risk-compliance/fraud-analysis/references/archetypes/authorized-payment-scam.md +41 -0
  570. package/skills/risk-compliance/fraud-analysis/references/archetypes/first-party-fraud.md +44 -0
  571. package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +27 -0
  572. package/skills/risk-compliance/fraud-analysis/references/contexts/bank-transfer.md +24 -0
  573. package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +30 -0
  574. package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +20 -0
  575. package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +20 -0
  576. package/skills/risk-compliance/fraud-analysis/references/feature-engineering.md +158 -0
  577. package/skills/risk-compliance/fraud-analysis/references/mechanisms/account-takeover.md +36 -0
  578. package/skills/risk-compliance/fraud-analysis/references/report-rationale.md +45 -0
  579. package/skills/risk-compliance/fraud-analysis/references/report-template.md +190 -0
  580. package/skills/risk-compliance/fraud-analysis/references/review-checklist.md +175 -0
  581. package/skills/risk-compliance/fraud-analysis/references/taxonomy.md +79 -0
  582. package/skills/risk-compliance/fraud-analysis/references/terminology.md +108 -0
  583. package/skills/risk-compliance/fraud-analysis/references/workflow.md +175 -0
  584. package/skills/risk-compliance/fraud-analysis/release-check.mjs +93 -0
  585. package/skills/risk-compliance/payment-analysis/LICENSE +3 -0
  586. package/skills/risk-compliance/payment-analysis/SKILL.md +180 -0
  587. package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +30 -0
  588. package/skills/risk-compliance/payment-analysis/references/chargebacks.md +208 -0
  589. package/skills/risk-compliance/payment-analysis/references/chinese-polish.md +51 -0
  590. package/skills/risk-compliance/payment-analysis/references/event-layers.md +127 -0
  591. package/skills/risk-compliance/payment-analysis/references/fx.md +59 -0
  592. package/skills/risk-compliance/payment-analysis/references/journey.md +79 -0
  593. package/skills/risk-compliance/payment-analysis/references/metrics.md +67 -0
  594. package/skills/risk-compliance/payment-analysis/references/report-template.md +119 -0
  595. package/skills/risk-compliance/payment-analysis/references/terminology.md +95 -0
  596. package/skills/risk-compliance/payment-analysis/references/visualization.md +56 -0
  597. package/skills/risk-compliance/payment-analysis/release-check.mjs +93 -0
  598. package/skills/risk-compliance/report-writing/LICENSE +3 -0
  599. package/skills/risk-compliance/report-writing/SKILL.md +220 -0
  600. package/skills/risk-compliance/report-writing/references/audit-report-template.md +121 -0
  601. package/skills/risk-compliance/report-writing/references/external-assessment-template.md +167 -0
  602. package/skills/risk-compliance/report-writing/references/management-report-template.md +145 -0
  603. package/skills/risk-compliance/report-writing/references/vars-report-template.md +224 -0
  604. package/skills/risk-compliance/report-writing/release-check.mjs +93 -0
  605. package/skills/risk-compliance/similar-domain/LICENSE +3 -0
  606. package/skills/risk-compliance/similar-domain/SKILL.md +203 -0
  607. package/skills/risk-compliance/similar-domain/references/entities.md +67 -0
  608. package/skills/risk-compliance/similar-domain/references/fingerprints.md +134 -0
  609. package/skills/risk-compliance/similar-domain/references/pivots.md +82 -0
  610. package/skills/risk-compliance/similar-domain/references/report-template.md +93 -0
  611. package/skills/risk-compliance/similar-domain/references/scoring.md +130 -0
  612. package/skills/risk-compliance/similar-domain/references/terminology.md +41 -0
  613. package/skills/risk-compliance/similar-domain/references/workflow.md +85 -0
  614. package/skills/risk-compliance/similar-domain/release-check.mjs +93 -0
  615. package/skills/risk-compliance/tld-detection/LICENSE +3 -0
  616. package/skills/risk-compliance/tld-detection/SKILL.md +245 -0
  617. package/skills/risk-compliance/tld-detection/agents/openai.yaml +9 -0
  618. package/skills/risk-compliance/tld-detection/references/chinese-polish.md +55 -0
  619. package/skills/risk-compliance/tld-detection/references/clean.md +51 -0
  620. package/skills/risk-compliance/tld-detection/references/clustering.md +235 -0
  621. package/skills/risk-compliance/tld-detection/references/decision.md +189 -0
  622. package/skills/risk-compliance/tld-detection/references/fx-conversion.md +232 -0
  623. package/skills/risk-compliance/tld-detection/references/report-template.md +272 -0
  624. package/skills/risk-compliance/tld-detection/references/streams.md +141 -0
  625. package/skills/risk-compliance/tld-detection/references/terminology.md +95 -0
  626. package/skills/risk-compliance/tld-detection/references/workflow.md +95 -0
  627. package/skills/risk-compliance/tld-detection/release-check.mjs +93 -0
  628. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +390 -0
  629. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +14 -0
  630. package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +650 -0
  631. package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +14 -0
  632. package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +134 -0
  633. package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +520 -0
@@ -0,0 +1,428 @@
1
+ import { test } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
4
+ import { createHash } from 'node:crypto'
5
+ import { tmpdir } from 'node:os'
6
+ import { join } from 'node:path'
7
+ import { spawnSync } from 'node:child_process'
8
+ import {
9
+ bumpFor,
10
+ classifySubject,
11
+ latestReleaseTag,
12
+ nextReleaseCandidateTag,
13
+ nextVersion,
14
+ parseSemver,
15
+ planRelease,
16
+ renderChangelog,
17
+ } from './plan.mjs'
18
+
19
+ function git(cwd, args) {
20
+ const result = spawnSync('git', args, { cwd, encoding: 'utf8' })
21
+ assert.equal(result.status, 0, result.stderr)
22
+ return result.stdout
23
+ }
24
+
25
+ function repo() {
26
+ const cwd = mkdtempSync(join(tmpdir(), 'rush-release-plan-'))
27
+ git(cwd, ['init', '-b', 'main'])
28
+ git(cwd, ['config', 'user.email', 'dev@example.com'])
29
+ git(cwd, ['config', 'user.name', 'Dev'])
30
+ git(cwd, ['config', 'commit.gpgsign', 'false'])
31
+ writeFileSync(join(cwd, 'package.json'), `${JSON.stringify({ name: 'demo', version: '1.2.0' }, null, 2)}\n`)
32
+ git(cwd, ['add', 'package.json'])
33
+ git(cwd, ['commit', '-m', 'chore: init'])
34
+ git(cwd, ['tag', 'v1.2.0'])
35
+ return cwd
36
+ }
37
+
38
+ test('semver helpers', () => {
39
+ assert.deepEqual(parseSemver('v1.2.3'), { major: 1, minor: 2, patch: 3 })
40
+ assert.equal(parseSemver('v1.2.3-rc.1'), null)
41
+ assert.equal(latestReleaseTag(['v1.2.0', 'v1.10.0', 'v1.2.3-rc.1']).tag, 'v1.10.0')
42
+ assert.deepEqual(nextVersion({ major: 1, minor: 2, patch: 3 }, 'minor'), { major: 1, minor: 3, patch: 0 })
43
+ assert.equal(nextReleaseCandidateTag('v1.3.0', []), 'v1.3.0-rc.1')
44
+ assert.equal(nextReleaseCandidateTag('v1.3.0', ['v1.3.0-rc.1', 'v1.3.0-rc.3']), 'v1.3.0-rc.4')
45
+ })
46
+
47
+ test('conventional commits drive the bump, with 0.x breaking as minor', () => {
48
+ const feat = [classifySubject('feat(api): list invoices')]
49
+ const fix = [classifySubject('fix: null guard')]
50
+ const breaking = [classifySubject('feat!: drop v1')]
51
+ assert.equal(bumpFor(feat, { major: 1, minor: 2, patch: 0 }).bump, 'minor')
52
+ assert.equal(bumpFor(fix, { major: 1, minor: 2, patch: 0 }).bump, 'patch')
53
+ assert.equal(bumpFor(breaking, { major: 1, minor: 2, patch: 0 }).bump, 'major')
54
+ assert.equal(bumpFor(breaking, { major: 0, minor: 9, patch: 0 }).bump, 'minor')
55
+ assert.equal(bumpFor(breaking, { major: 0, minor: 9, patch: 0 }, { strict: true }).bump, 'major')
56
+ })
57
+
58
+ test('changelog groups notable commits and skips internals', () => {
59
+ const md = renderChangelog({
60
+ version: '1.3.0',
61
+ date: '2026-08-24',
62
+ changes: [
63
+ classifySubject('feat: add export'),
64
+ classifySubject('fix: timezone'),
65
+ classifySubject('chore: ignore me'),
66
+ ],
67
+ })
68
+ assert.match(md, /## \[1\.3\.0\] - 2026-08-24/)
69
+ assert.match(md, /### Added\n- add export/)
70
+ assert.match(md, /### Fixed\n- timezone/)
71
+ assert.doesNotMatch(md, /ignore me/)
72
+ })
73
+
74
+ test('planRelease reads git history from the frozen SHA', () => {
75
+ const cwd = repo()
76
+ writeFileSync(join(cwd, 'a.txt'), 'a\n')
77
+ git(cwd, ['add', 'a.txt'])
78
+ git(cwd, ['commit', '-m', 'feat: export csv'])
79
+ const sha = git(cwd, ['rev-parse', 'HEAD']).trim()
80
+ writeFileSync(join(cwd, 'package.json'), `${JSON.stringify({ name: 'demo', version: '9.0.0' }, null, 2)}\n`)
81
+ git(cwd, ['add', 'package.json'])
82
+ git(cwd, ['commit', '-m', 'feat!: should not count if SHA is frozen earlier'])
83
+ const plan = planRelease({ sha, cwd, now: new Date('2026-08-24T00:00:00Z') })
84
+ assert.equal(plan.baselineTag, 'v1.2.0')
85
+ assert.equal(plan.currentVersion, '1.2.0')
86
+ assert.equal(plan.bump, 'minor')
87
+ assert.equal(plan.nextVersion, '1.3.0')
88
+ assert.equal(plan.tag, 'v1.3.0')
89
+ assert.deepEqual(plan.versionFiles, ['package.json'])
90
+ assert.match(plan.changelogMarkdown, /export csv/)
91
+ assert.doesNotMatch(plan.changelogMarkdown, /should not count/)
92
+ })
93
+
94
+ test('Cloud Run plan reserves the next unused immutable candidate tag', () => {
95
+ const cwd = repo()
96
+ writeFileSync(join(cwd, 'a.txt'), 'a\n')
97
+ git(cwd, ['add', 'a.txt'])
98
+ git(cwd, ['commit', '-m', 'feat: export csv'])
99
+ const sha = git(cwd, ['rev-parse', 'HEAD']).trim()
100
+ git(cwd, ['tag', 'v1.3.0-rc.1'])
101
+ git(cwd, ['tag', 'v1.3.0-rc.2'])
102
+
103
+ const plan = planRelease({ sha, cloudRun: true, cwd, now: new Date('2026-08-24T00:00:00Z') })
104
+
105
+ assert.equal(plan.tag, 'v1.3.0')
106
+ assert.equal(plan.candidateTag, 'v1.3.0-rc.3')
107
+ })
108
+
109
+ test('planRelease ignores higher tags that are not reachable from the frozen SHA', () => {
110
+ const cwd = repo()
111
+ const candidate = git(cwd, ['rev-parse', 'HEAD']).trim()
112
+ git(cwd, ['switch', '-c', 'unrelated'])
113
+ writeFileSync(join(cwd, 'side.txt'), 'side\n')
114
+ git(cwd, ['add', 'side.txt'])
115
+ git(cwd, ['commit', '-m', 'feat: unrelated branch'])
116
+ git(cwd, ['tag', 'v9.0.0'])
117
+ git(cwd, ['switch', 'main'])
118
+
119
+ const plan = planRelease({ sha: candidate, cwd, now: new Date('2026-08-24T00:00:00Z') })
120
+ assert.equal(plan.baselineTag, 'v1.2.0')
121
+ assert.equal(plan.currentVersion, '1.2.0')
122
+ assert.equal(plan.nextVersion, '1.2.1')
123
+ })
124
+
125
+ test('planRelease uses the repository release identity when the private root package has no version', () => {
126
+ const cwd = mkdtempSync(join(tmpdir(), 'rush-release-distribution-plan-'))
127
+ git(cwd, ['init', '-b', 'main'])
128
+ git(cwd, ['config', 'user.email', 'dev@example.com'])
129
+ git(cwd, ['config', 'user.name', 'Dev'])
130
+ git(cwd, ['config', 'commit.gpgsign', 'false'])
131
+ mkdirSync(join(cwd, 'skills/distribution'), { recursive: true })
132
+ writeFileSync(join(cwd, 'package.json'), `${JSON.stringify({ name: 'private-root', private: true }, null, 2)}\n`)
133
+ writeFileSync(join(cwd, 'skills/distribution/manifest.json'), `${JSON.stringify({
134
+ releaseVersion: '0.19.0',
135
+ sources: [{
136
+ id: 'first-party',
137
+ renderTargets: [
138
+ { id: 'private-checkout', revision: 'main' },
139
+ ],
140
+ }],
141
+ }, null, 2)}\n`)
142
+ git(cwd, ['add', '.'])
143
+ git(cwd, ['commit', '-m', 'chore: release 0.19.0'])
144
+ git(cwd, ['tag', 'v0.19.0'])
145
+ writeFileSync(join(cwd, 'change.txt'), 'manual trigger only\n')
146
+ git(cwd, ['add', 'change.txt'])
147
+ git(cwd, ['commit', '-m', 'fix: make coverage skills manual only'])
148
+
149
+ const plan = planRelease({
150
+ sha: git(cwd, ['rev-parse', 'HEAD']).trim(),
151
+ cwd,
152
+ now: new Date('2026-08-30T00:00:00Z'),
153
+ })
154
+
155
+ assert.equal(plan.currentVersion, '0.19.0')
156
+ assert.equal(plan.nextVersion, '0.19.1')
157
+ assert.deepEqual(plan.versionFiles, ['skills/distribution/manifest.json'])
158
+ })
159
+
160
+ // rush-release never passes --dark-flags, so its plan must be exactly what it was before
161
+ // dark launch existed: no darkFlags key and an unchanged changelog.
162
+ test('a plan without dark flags carries no dark-launch trace', () => {
163
+ const cwd = repo()
164
+ git(cwd, ['commit', '--allow-empty', '-m', 'feat: export csv'])
165
+ const plan = planRelease({ sha: 'HEAD', cwd, now: new Date('2026-08-24T00:00:00Z') })
166
+ assert.equal('darkFlags' in plan, false)
167
+ assert.equal(plan.changelogMarkdown, '## [1.3.0] - 2026-08-24\n\n### Added\n- export csv\n')
168
+ })
169
+
170
+ test('dark flags add a Shipped dark changelog section and keep the bump', () => {
171
+ const cwd = repo()
172
+ git(cwd, ['commit', '--allow-empty', '-m', 'feat: bulk refunds'])
173
+ const darkFlags = [{ name: 'bulk-refunds', summary: 'Bulk refunds' }]
174
+ const plan = planRelease({ sha: 'HEAD', cwd, darkFlags, now: new Date('2026-08-24T00:00:00Z') })
175
+ assert.equal(plan.bump, 'minor')
176
+ assert.deepEqual(plan.darkFlags, darkFlags)
177
+ assert.equal(plan.changelogMarkdown,
178
+ '## [1.3.0] - 2026-08-24\n\n### Added\n- bulk refunds\n\n### Shipped dark\n- Bulk refunds (flag `bulk-refunds`, off)\n')
179
+ })
180
+
181
+ test('the CLI reads dark flags from a dark-flags.mjs list file and rejects malformed ones', () => {
182
+ const cwd = repo()
183
+ git(cwd, ['commit', '--allow-empty', '-m', 'fix: rounding'])
184
+ const good = join(cwd, 'flags.json')
185
+ writeFileSync(good, JSON.stringify({ flags: [{ name: 'new-checkout', summary: 'New checkout', default: false }], errors: [] }))
186
+ const script = join(import.meta.dirname, 'plan.mjs')
187
+ const ok = spawnSync('node', [script, '--sha', 'HEAD', '--json', '--dark-flags', good], { cwd, encoding: 'utf8' })
188
+ assert.equal(ok.status, 0, ok.stderr)
189
+ assert.deepEqual(JSON.parse(ok.stdout).darkFlags, [{ name: 'new-checkout', summary: 'New checkout' }])
190
+ const bad = join(cwd, 'bad.json')
191
+ writeFileSync(bad, JSON.stringify([{ name: 'no-summary' }]))
192
+ const refused = spawnSync('node', [script, '--sha', 'HEAD', '--dark-flags', bad], { cwd, encoding: 'utf8' })
193
+ assert.equal(refused.status, 2)
194
+ assert.match(refused.stderr, /name, summary/)
195
+ })
196
+
197
+ function preparedRepo(t, { productCut = false, badLockCut = false, python = false, badPackageCut = false } = {}) {
198
+ const cwd = repo()
199
+ const remote = mkdtempSync(join(tmpdir(), 'prepared-release-origin-'))
200
+ t.after(() => { rmSync(cwd, { recursive: true, force: true }); rmSync(remote, { recursive: true, force: true }) })
201
+ git(remote, ['init', '--bare'])
202
+ // Exercise git's real transport while keeping the canonical origin identity offline.
203
+ git(cwd, ['remote', 'add', 'origin', 'https://github.com/example/demo.git'])
204
+ git(cwd, ['config', `url.${remote}.insteadOf`, 'https://github.com/example/demo.git'])
205
+ const lock = (version) => ({ name: 'demo', version, lockfileVersion: 3, packages: { '': { name: 'demo', version } } })
206
+ writeFileSync(join(cwd, 'package-lock.json'), JSON.stringify(lock('1.2.0')))
207
+ writeFileSync(join(cwd, 'VERSION'), '1.2.0\n')
208
+ if (python) writeFileSync(join(cwd, 'pyproject.toml'), '[project]\nname = "demo"\nversion = "1.2.0"\n\n[tool.other]\nversion = "not-a-release"\n')
209
+ writeFileSync(join(cwd, 'CHANGELOG.md'), '# Changelog\n\n## [1.2.0] - 2026-08-01\n\n- Previous release.\n')
210
+ git(cwd, ['add', '.'])
211
+ git(cwd, ['commit', '-m', 'chore: existing identities'])
212
+ git(cwd, ['switch', '-c', 'old-metadata'])
213
+ writeFileSync(join(cwd, 'package.json'), JSON.stringify({ name: 'demo', version: '1.3.0', ...(badPackageCut ? { scripts: { build: 'execute-unreviewed-code' } } : {}) }))
214
+ const cutLock = lock('1.3.0')
215
+ if (badLockCut) cutLock.packages['node_modules/unsafe'] = { version: '9.0.0' }
216
+ writeFileSync(join(cwd, 'package-lock.json'), JSON.stringify(cutLock))
217
+ writeFileSync(join(cwd, 'VERSION'), '1.3.0\n')
218
+ if (python) writeFileSync(join(cwd, 'pyproject.toml'), '[project]\nname = "demo"\nversion = "1.3.0"\n\n[tool.other]\nversion = "not-a-release"\n')
219
+ const original = '## [1.3.0] - 2026-08-24\n\n### Added\n- Original notes.\n'
220
+ writeFileSync(join(cwd, 'CHANGELOG.md'), `# Changelog\n\n${original}\n## [1.2.0] - 2026-08-01\n\n- Previous release.\n`)
221
+ if (productCut) writeFileSync(join(cwd, 'product.js'), 'unreviewed code\n')
222
+ git(cwd, ['add', '.'])
223
+ git(cwd, ['commit', '-m', 'chore(release): 1.3.0'])
224
+ const cutSha = git(cwd, ['rev-parse', 'HEAD']).trim()
225
+ git(cwd, ['switch', 'main'])
226
+ git(cwd, ['merge', '--no-ff', 'old-metadata', '-m', 'Merge reviewed metadata'])
227
+ const mergeSha = git(cwd, ['rev-parse', 'HEAD']).trim()
228
+ git(cwd, ['tag', '-a', 'v1.3.0-rc.1', '-m', 'Failed candidate'])
229
+ git(cwd, ['push', 'origin', 'main', '--tags'])
230
+ const reviewed = '## [1.3.0] - 2026-08-24\n\n### Added\n- Reviewed corrected notes.\n\n### Fixed\n- Candidate failure.\n'
231
+ writeFileSync(join(cwd, 'CHANGELOG.md'), `# Changelog\n\n${reviewed}\n## [1.2.0] - 2026-08-01\n\n- Previous release.\n`)
232
+ writeFileSync(join(cwd, 'product.js'), 'reviewed fix\n')
233
+ git(cwd, ['add', '.'])
234
+ git(cwd, ['commit', '-m', 'fix: candidate failure and release notes'])
235
+ const sha = git(cwd, ['rev-parse', 'HEAD']).trim()
236
+ git(cwd, ['push', 'origin', 'main'])
237
+ const preparedMetadata = {
238
+ schema: 'prepared-release-metadata/v1', repository: 'example/demo', version: '1.3.0', metadataPr: 42,
239
+ cutSha, mergeSha,
240
+ previousAttempt: { receiptId: 'failed-attempt-1', receiptSha256: 'a'.repeat(64), candidateTag: 'v1.3.0-rc.1', candidateSha: mergeSha },
241
+ }
242
+ return { cwd, remote, sha, preparedMetadata, original, reviewed }
243
+ }
244
+
245
+ function preparedPlan(fixture, opts = {}) {
246
+ return planRelease({ ...fixture, cloudRun: true, now: new Date('2026-08-25T00:00:00Z'), ...opts })
247
+ }
248
+
249
+ const digest = (text) => createHash('sha256').update(text).digest('hex')
250
+
251
+ test('prepared reuse preserves version and binds reviewed target notes separately from historical metadata', (t) => {
252
+ const f = preparedRepo(t)
253
+ const oldReceipt = join(f.cwd, '.git', 'resolve-release-authorization.json')
254
+ writeFileSync(oldReceipt, 'historical receipt: must not be read or changed')
255
+ const before = git(f.cwd, ['status', '--porcelain'])
256
+ const plan = preparedPlan(f)
257
+ assert.equal(plan.nextVersion, '1.3.0')
258
+ assert.equal(plan.currentVersion, '1.3.0')
259
+ assert.equal(plan.bump, 'none')
260
+ assert.equal(plan.tag, 'v1.3.0')
261
+ assert.equal(plan.candidateTag, 'v1.3.0-rc.2')
262
+ assert.equal(plan.sha, f.sha)
263
+ assert.equal(plan.releaseSourceSha, f.sha)
264
+ assert.equal(plan.changelogMarkdown, f.reviewed)
265
+ assert.equal(plan.date, '2026-08-24')
266
+ assert.equal(plan.metadata.mode, 'reuse-prepared')
267
+ assert.equal(plan.metadata.cutSha, f.preparedMetadata.cutSha)
268
+ assert.equal(plan.metadata.mergeSha, f.preparedMetadata.mergeSha)
269
+ assert.equal(plan.metadata.preparedSectionSha256, digest(f.reviewed))
270
+ assert.equal(plan.metadata.originalSectionSha256, digest(f.original))
271
+ assert.deepEqual(plan.metadata.previousAttempt, f.preparedMetadata.previousAttempt)
272
+ assert.notEqual(plan.receiptId, f.preparedMetadata.previousAttempt.receiptId)
273
+ assert.notEqual(preparedPlan(f).receiptId, plan.receiptId)
274
+ assert.equal('permissions' in plan, false)
275
+ assert.equal(readFileSync(oldReceipt, 'utf8'), 'historical receipt: must not be read or changed')
276
+ assert.equal(git(f.cwd, ['status', '--porcelain']), before)
277
+ // Neither a dirty worktree nor a later commit can replace the frozen source or notes.
278
+ writeFileSync(join(f.cwd, 'VERSION'), '9.0.0\n')
279
+ git(f.cwd, ['add', 'VERSION'])
280
+ git(f.cwd, ['commit', '-m', 'feat!: unrelated later change'])
281
+ assert.equal(preparedPlan(f).metadata.preparedSectionSha256, digest(f.reviewed))
282
+ })
283
+
284
+ test('prepared reuse uses remote ordinals even with stale local tags and never recycles the historical ordinal', (t) => {
285
+ const f = preparedRepo(t)
286
+ git(f.cwd, ['tag', 'v1.3.0-rc.4'])
287
+ git(f.cwd, ['push', 'origin', 'refs/tags/v1.3.0-rc.4'])
288
+ git(f.cwd, ['tag', '-d', 'v1.3.0-rc.4', 'v1.3.0-rc.1'])
289
+ assert.equal(preparedPlan(f).candidateTag, 'v1.3.0-rc.5')
290
+ git(f.remote, ['update-ref', '-d', 'refs/tags/v1.3.0-rc.4'])
291
+ git(f.remote, ['update-ref', '-d', 'refs/tags/v1.3.0-rc.1'])
292
+ assert.equal(preparedPlan(f).candidateTag, 'v1.3.0-rc.2')
293
+ })
294
+
295
+ test('prepared reuse blocks a remote final tag, inspection errors and noncanonical or wrong repository identity', (t) => {
296
+ const f = preparedRepo(t)
297
+ git(f.cwd, ['tag', '-a', 'v1.3.0', '-m', 'Already used'])
298
+ git(f.cwd, ['push', 'origin', 'refs/tags/v1.3.0'])
299
+ git(f.cwd, ['tag', '-d', 'v1.3.0'])
300
+ assert.throws(() => preparedPlan(f), /final tag.*already exists/)
301
+ git(f.remote, ['update-ref', '-d', 'refs/tags/v1.3.0'])
302
+ git(f.cwd, ['config', '--unset', `url.${f.remote}.insteadOf`])
303
+ // Repoint only the transport rewrite; origin's canonical identity stays valid.
304
+ git(f.cwd, ['config', `url.${join(f.remote, 'missing')}.insteadOf`, 'https://github.com/example/demo.git'])
305
+ assert.throws(() => preparedPlan(f), /remote inspection failed/)
306
+ git(f.cwd, ['remote', 'set-url', 'origin', f.remote])
307
+ assert.throws(() => preparedPlan(f), /canonical GitHub origin/)
308
+ git(f.cwd, ['remote', 'set-url', 'origin', 'https://github.com/other/demo.git'])
309
+ assert.throws(() => preparedPlan(f), /repository.*does not match/)
310
+ })
311
+
312
+ test('prepared reuse refuses product changes hidden in the original metadata cut', (t) => {
313
+ for (const options of [{ productCut: true }, { badLockCut: true }, { badPackageCut: true }]) {
314
+ const f = preparedRepo(t, options)
315
+ assert.throws(() => preparedPlan(f), /metadata-only/)
316
+ }
317
+ })
318
+
319
+ test('prepared reuse validates schema, full identities, previous attempt binding and unchanged version identity', (t) => {
320
+ const f = preparedRepo(t)
321
+ const p = f.preparedMetadata
322
+ const cases = [
323
+ [{ ...p, schema: 'future/v2' }, /schema/],
324
+ [{ ...p, version: 'v1.3.0' }, /version/],
325
+ [{ ...p, version: '1.4.0', previousAttempt: { ...p.previousAttempt, candidateTag: 'v1.4.0-rc.1' } }, /version.*does not match/],
326
+ [{ ...p, metadataPr: 0 }, /metadataPr/],
327
+ [{ ...p, mergeSha: 'HEAD' }, /full.*SHA/],
328
+ [{ ...p, cutSha: p.cutSha.slice(0, 12) }, /full.*SHA/],
329
+ [{ ...p, extraPermission: true }, /unknown field/],
330
+ [{ ...p, previousAttempt: { ...p.previousAttempt, receiptSha256: '' } }, /receiptSha256/],
331
+ [{ ...p, previousAttempt: { ...p.previousAttempt, candidateSha: f.sha } }, /previous.*candidateSha/],
332
+ [{ ...p, previousAttempt: { ...p.previousAttempt, candidateTag: 'v1.4.0-rc.1' } }, /previous.*candidateTag/],
333
+ ]
334
+ for (const [preparedMetadata, error] of cases) assert.throws(() => preparedPlan(f, { preparedMetadata }), error)
335
+ assert.throws(() => preparedPlan(f, { sha: 'HEAD' }), /full.*SHA/)
336
+ assert.throws(() => preparedPlan(f, { trunk: 'release' }), /trunk.*main/)
337
+ assert.throws(() => preparedPlan(f, { darkFlags: [{ name: 'flag', summary: 'Unreviewed notes' }] }), /dark flags/)
338
+ })
339
+
340
+ test('prepared reuse rejects unequal merge trees, unrelated provenance and missing commit objects', (t) => {
341
+ const f = preparedRepo(t)
342
+ const p = f.preparedMetadata
343
+ const unequal = { ...p, mergeSha: f.sha, previousAttempt: { ...p.previousAttempt, candidateSha: f.sha } }
344
+ assert.throws(() => preparedPlan(f, { preparedMetadata: unequal }), /cut and merge trees/)
345
+ git(f.cwd, ['switch', '--orphan', 'unrelated'])
346
+ git(f.cwd, ['add', '.'])
347
+ git(f.cwd, ['commit', '--allow-empty', '-m', 'unrelated root'])
348
+ const unrelated = git(f.cwd, ['rev-parse', 'HEAD']).trim()
349
+ assert.throws(() => preparedPlan(f, { sha: unrelated }), /merge.*ancestor/)
350
+ assert.throws(() => preparedPlan(f, { sha: 'f'.repeat(40) }), /failed|object|revision/i)
351
+ })
352
+
353
+ test('prepared reuse rejects target identity drift, duplicate or absent release notes and a rebound old RC', (t) => {
354
+ const f = preparedRepo(t)
355
+ const checkChange = (file, text, error) => {
356
+ git(f.cwd, ['reset', '--hard', f.sha])
357
+ writeFileSync(join(f.cwd, file), text)
358
+ git(f.cwd, ['add', file])
359
+ git(f.cwd, ['commit', '-m', 'fix: invalid prepared identity'])
360
+ const sha = git(f.cwd, ['rev-parse', 'HEAD']).trim()
361
+ assert.throws(() => preparedPlan(f, { sha }), error)
362
+ }
363
+ checkChange('VERSION', '1.4.0\n', /version.*does not match/)
364
+ checkChange('package-lock.json', JSON.stringify({ name: 'demo', version: '1.3.0', packages: { '': { version: '1.2.0' } } }), /root lock.*version/)
365
+ checkChange('package-lock.json', JSON.stringify({ name: 'foreign', version: '1.3.0', packages: { '': { version: '1.3.0' } } }), /root lock.*name/)
366
+ checkChange('CHANGELOG.md', `${f.reviewed}\n${f.reviewed}`, /exactly one/)
367
+ checkChange('CHANGELOG.md', '# Changelog\n', /exactly one/)
368
+ git(f.remote, ['update-ref', 'refs/tags/v1.3.0-rc.1', f.sha])
369
+ assert.throws(() => preparedPlan(f), /previous.*remote.*SHA/)
370
+ })
371
+
372
+ test('prepared reuse validates Python project identity without confusing tool versions, and supports artifact-only plans', (t) => {
373
+ const f = preparedRepo(t, { python: true })
374
+ const plan = preparedPlan(f, { cloudRun: false })
375
+ assert.equal(plan.candidateTag, null)
376
+ assert.equal(plan.bump, 'none')
377
+ assert.deepEqual(plan.versionFiles, ['package.json', 'package-lock.json', 'pyproject.toml', 'VERSION'])
378
+ writeFileSync(join(f.cwd, 'pyproject.toml'), '[project]\nversion = "1.4.0"\n')
379
+ git(f.cwd, ['add', '.'])
380
+ git(f.cwd, ['commit', '-m', 'fix: mismatched python identity'])
381
+ assert.throws(() => preparedPlan(f, { sha: git(f.cwd, ['rev-parse', 'HEAD']).trim() }), /pyproject.toml version.*does not match/)
382
+ })
383
+
384
+ test('prepared reuse refuses distribution cuts instead of trusting a broad generated-file allowlist', (t) => {
385
+ const f = preparedRepo(t)
386
+ mkdirSync(join(f.cwd, 'skills/distribution'), { recursive: true })
387
+ writeFileSync(join(f.cwd, 'skills/distribution/manifest.json'), JSON.stringify({ releaseVersion: '1.3.0' }))
388
+ git(f.cwd, ['add', '.'])
389
+ git(f.cwd, ['commit', '-m', 'chore: distribution identity'])
390
+ const cutSha = git(f.cwd, ['rev-parse', 'HEAD']).trim()
391
+ const preparedMetadata = { ...f.preparedMetadata, cutSha, mergeSha: cutSha,
392
+ previousAttempt: { ...f.preparedMetadata.previousAttempt, candidateSha: cutSha } }
393
+ assert.throws(() => preparedPlan(f, { sha: cutSha, preparedMetadata }), /distribution-aware.*unsupported/)
394
+ })
395
+
396
+ test('prepared reuse blocks an RC collision introduced between remote discovery and the exact absence check', (t) => {
397
+ const f = preparedRepo(t)
398
+ const uploadPack = join(f.cwd, '.git', 'upload-pack.sh')
399
+ writeFileSync(uploadPack, `#!/bin/sh\ngit-upload-pack "$@"\nstatus=$?\ngit --git-dir='${f.remote}' update-ref refs/tags/v1.3.0-rc.2 ${f.sha}\nexit "$status"\n`, { mode: 0o755 })
400
+ git(f.cwd, ['config', 'remote.origin.uploadpack', uploadPack])
401
+ assert.throws(() => preparedPlan(f), /proposed candidate tag already exists remotely/)
402
+ })
403
+
404
+ test('prepared reuse blocks an exact remote inspection failure after successful discovery', (t) => {
405
+ const f = preparedRepo(t)
406
+ const uploadPack = join(f.cwd, '.git', 'upload-pack.sh')
407
+ const marker = join(f.cwd, '.git', 'inspected')
408
+ writeFileSync(uploadPack, `#!/bin/sh\nif test -e '${marker}'; then exit 1; fi\ntouch '${marker}'\nexec git-upload-pack "$@"\n`, { mode: 0o755 })
409
+ git(f.cwd, ['config', 'remote.origin.uploadpack', uploadPack])
410
+ assert.throws(() => preparedPlan(f), /remote inspection failed/)
411
+ })
412
+
413
+ test('CLI loads prepared metadata without applying it and rejects missing, malformed and unknown options', (t) => {
414
+ const f = preparedRepo(t)
415
+ const file = join(f.cwd, '.git', 'prepared.json')
416
+ writeFileSync(file, JSON.stringify(f.preparedMetadata))
417
+ const script = join(import.meta.dirname, 'plan.mjs')
418
+ const run = (...args) => spawnSync(process.execPath, [script, '--sha', f.sha, '--json', ...args], { cwd: f.cwd, encoding: 'utf8' })
419
+ const result = run('--prepared-metadata', file, '--cloud-run')
420
+ assert.equal(result.status, 0, result.stderr)
421
+ assert.equal(JSON.parse(result.stdout).sha, f.sha)
422
+ assert.equal(JSON.parse(result.stdout).bump, 'none')
423
+ assert.equal(JSON.parse(result.stdout).metadata.preparedSectionSha256, digest(f.reviewed))
424
+ assert.equal(run('--prepared-metadata').status, 2)
425
+ writeFileSync(file, '{')
426
+ assert.notEqual(run('--prepared-metadata', file).status, 0)
427
+ assert.equal(run('--version', '9.0.0').status, 2)
428
+ })
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: rush-issues
3
+ description: "Slash/explicit-only (/rush-issues). No-questions shortcut of /resolve-issues: drive an issue, epic, or feature spec to reviewed, green PRs, one per issue, and merge each (through the queue when there is one). Takes every preflight default (recommended implementer unless the invocation pins one, the default branch, autonomous merge with blocker fixes, full scheduler mode unless scheduler= says otherwise, the drafted plan) and asks nothing, even at preflight; invoking it is the authorization. Like resolve-issues, never blocks on the human: it takes the automatic answer (the recommendation, formed if none; filed splits) and defers what only a human can do (a looser required check, shared-environment changes, missing access) on its owning issue while the rest ships. Posts the dropbox, then completes the goal. Do not auto-select. NOT for choosing the implementer, target branch, supervised merge, or trimming a plan or moving units to later (resolve-issues), and NOT for release work (rush-release)."
4
+ disable-model-invocation: true
5
+ metadata:
6
+ workflow-role: coordinator
7
+ dependencies:
8
+ - resolve-issues
9
+ release-version: 0.36.0
10
+ ---
11
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
12
+ # Rush issues (shortcut of resolve-issues)
13
+
14
+ ## Goal
15
+
16
+ **Resolve the spec's issues autonomously, in the shortest wall-clock time,
17
+ at the bar the spec already sets: every PR reviewed and green on required
18
+ CI.** Make the decisions that get there. `resolve-issues`'
19
+ [Goal](../resolve-issues/SKILL.md#goal) and
20
+ [Principles](../resolve-issues/SKILL.md#principles) apply: the principles
21
+ are guidelines, and every rule serves the goal rather than restricting you.
22
+
23
+ `/rush-issues` runs the `resolve-issues` workflow in **shortcut mode**: the
24
+ recommended implementer (or the one `implementer=<id[@effort]>` pins; the run
25
+ stops if it is unavailable, never swapping in another), the repository's
26
+ default branch, `autonomous` merge, the `full` scheduler mode (or the one
27
+ `scheduler=narrow|off` names), and the drafted plan, with
28
+ no questions at any point. Invoking it is the
29
+ authorization for the whole run, including blocker fixes outside the plan; the board is shown as a record, never as a
30
+ question.
31
+
32
+ 1. Read `resolve-issues`'s `SKILL.md` in full: `<skill-base-dir>/../resolve-issues/SKILL.md`
33
+ in an installed skills directory, or `skills/engineering/resolve-issues/SKILL.md`
34
+ in the skills source checkout. If neither exists, stop and say
35
+ `resolve-issues` is not installed; do not improvise its workflow. After
36
+ every context compaction, read it and this file in full again before your
37
+ next step: the summary keeps the run's state, not the rules; its
38
+ constraints and "do not" lists are notes, and only the plan's
39
+ `standingOrders` bind.
40
+ 2. Follow it as the only workflow for this invocation, in shortcut mode
41
+ ([preflight.md](../resolve-issues/references/preflight.md#shortcut-mode)):
42
+ run every preflight step, record `skill: rush-issues` in the plan and its defaults as one `decisions` entry,
43
+ and never ask a question; wherever the run could ask or wait, take the
44
+ [automatic answer](../resolve-issues/references/preflight.md#never-block-on-the-human).
45
+ Rush adds only this:
46
+ - warn on the board about a missing compaction hook or `ready-for-agent`
47
+ label; never install the hook or add the label yourself;
48
+ - at the end, post the dropbox
49
+ ([dropbox.md](../resolve-issues/references/dropbox.md#post-at-the-end))
50
+ and complete the goal
51
+ ([done.md](../resolve-issues/references/done.md#close-the-run)).
52
+ 3. Everything else — run rules, stages, scripts, review, CI and merge, and the
53
+ done criteria — applies exactly as `resolve-issues` states it.
54
+ The shared [task-plan checkpoints](../resolve-issues/references/task-plan.md#checkpoints)
55
+ apply too: on Pi, bind or reload through `update_plan` with the absolute
56
+ workflow path and persisted revision (no event means read-only), then
57
+ save transitions through its `workflow` payload. The TUI refreshes
58
+ automatically; never edit the bound plan directly.
@@ -0,0 +1,8 @@
1
+ interface:
2
+ display_name: "Rush Issues"
3
+ short_description: "Slash/explicit-only no-questions shortcut of resolve-issues"
4
+
5
+ policy:
6
+ # Codex counterpart to SKILL.md disable-model-invocation: true.
7
+ # Keeps $rush-issues / explicit invoke while blocking description-based selection.
8
+ allow_implicit_invocation: false
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ // rush-issues runs the resolve-issues workflow, so its compaction re-read is resolve-issues':
3
+ // a harness that runs the owner skill's rehydrate.mjs after a compaction (Pi's workflow
4
+ // extension) gets the same message as the Claude Code and Codex hooks.
5
+ //
6
+ // rehydrate.mjs [--cwd <dir>] [--hook]
7
+
8
+ import { main } from '../resolve-issues/scripts/rehydrate.mjs'
9
+
10
+ main(process.argv.slice(2))
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process';
3
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { dirname, join } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ const DAY_MS = 24 * 60 * 60 * 1000;
9
+ const WEEK_MS = 7 * DAY_MS;
10
+ const here = dirname(fileURLToPath(import.meta.url));
11
+
12
+ function readJson(path, fallback = {}) {
13
+ try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return fallback; }
14
+ }
15
+
16
+ function frontmatterValue(text, key) {
17
+ const frontmatter = /^---\n([\s\S]*?)\n---/.exec(text)?.[1] ?? '';
18
+ const match = new RegExp('^' + key + ':\\s*([^\\n]+)$', 'm').exec(frontmatter);
19
+ return match?.[1].trim().replace(/^['"]|['"]$/g, '') ?? null;
20
+ }
21
+
22
+ function repositoryOf(source) {
23
+ const value = String(source ?? '').trim();
24
+ const match = /^(?:git@github\.com:|https:\/\/github\.com\/)?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:\.git)?$/.exec(value);
25
+ return match?.[1] ?? null;
26
+ }
27
+
28
+ function stableVersion(value) {
29
+ const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(String(value ?? '').trim());
30
+ return match ? match.slice(1).map(Number) : null;
31
+ }
32
+
33
+ function newer(left, right) {
34
+ for (let index = 0; index < 3; index += 1) {
35
+ if (left[index] !== right[index]) return left[index] > right[index];
36
+ }
37
+ return false;
38
+ }
39
+
40
+ function writeCache(path, value) {
41
+ try {
42
+ mkdirSync(dirname(path), { recursive: true });
43
+ writeFileSync(path, JSON.stringify(value));
44
+ } catch { /* A read-only cache must not block skill use. */ }
45
+ }
46
+
47
+ function main(now = Date.now()) {
48
+ if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
+ const name = frontmatterValue(skill, 'name');
51
+ const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
52
+ if (!name || !localVersion) return;
53
+
54
+ const lock = readJson(join(process.env.HOME || homedir(), '.agents', '.skill-lock.json'));
55
+ const entry = lock.skills?.[name];
56
+ const repository = repositoryOf(entry?.sourceUrl || entry?.source);
57
+ if (!repository) return;
58
+
59
+ const cacheRoot = process.env.XDG_CACHE_HOME || join(process.env.HOME || homedir(), '.cache');
60
+ const cachePath = join(cacheRoot, '1aboveio-skills', 'release-check.json');
61
+ const all = readJson(cachePath);
62
+ const cache = all[repository] && typeof all[repository] === 'object' ? all[repository] : {};
63
+
64
+ if (!cache.lastCheck || now - cache.lastCheck >= DAY_MS) {
65
+ const result = spawnSync('gh', ['api', 'repos/' + repository + '/releases/latest', '--jq', '.tag_name'], {
66
+ encoding: 'utf8',
67
+ stdio: ['ignore', 'pipe', 'ignore'],
68
+ timeout: 1500,
69
+ });
70
+ cache.lastCheck = now;
71
+ if (result.status === 0 && stableVersion(result.stdout)) cache.latestTag = result.stdout.trim();
72
+ else delete cache.latestTag;
73
+ all[repository] = cache;
74
+ writeCache(cachePath, all);
75
+ }
76
+
77
+ const latestVersion = stableVersion(cache.latestTag);
78
+ if (!latestVersion || !newer(latestVersion, localVersion)) return;
79
+ if (cache.notifiedTag === cache.latestTag && cache.notifiedAt && now - cache.notifiedAt < WEEK_MS) return;
80
+
81
+ cache.notifiedTag = cache.latestTag;
82
+ cache.notifiedAt = now;
83
+ all[repository] = cache;
84
+ writeCache(cachePath, all);
85
+ const command = `npx skills@1.5.23 add '${repository}#${cache.latestTag}' --global --agent universal claude-code --skill ${name} --yes`;
86
+ process.stdout.write(
87
+ `UPDATE_AVAILABLE: A newer 1AboveIO skills release (${cache.latestTag}) is available; this skill is `
88
+ + `v${localVersion.join('.')}. Ask once whether to refresh ${name}. On approval run \`${command}\`. `
89
+ + 'The refreshed instructions apply next session. Either way, continue the current task and do not ask again this session.\n',
90
+ );
91
+ }
92
+
93
+ try { main(); } catch { /* Update checks are advisory and always fail silent. */ }
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: rush-release
3
+ description: "Slash/explicit-only (/rush-release). The no-questions shortcut of /resolve-release: cut a GitHub Flow release from main — freeze the latest CI-green trunk SHA, write the changelog, choose SemVer, merge the metadata cut through a verified PR, publish npm artifacts, or validate a Cloud Run candidate at 0% before shifting it to 100%. Always full exposure, dark launch off. Invoking the skill is the authorization: the complete plan is shown as a record, never as a question. Do not auto-select. Use only on explicit user/orchestrator invoke. NOT for canary exposure or dark launch (resolve-release), GitFlow/release-branch promotion, or implementing a spec (resolve-issues)."
4
+ disable-model-invocation: true
5
+ metadata:
6
+ workflow-role: coordinator
7
+ dependencies:
8
+ - resolve-release
9
+ release-version: 0.36.0
10
+ ---
11
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
12
+ # Rush release (shortcut of resolve-release)
13
+
14
+ `/rush-release` runs the `resolve-release` workflow in **shortcut mode**:
15
+ exposure `full` (Cloud Run: validate at 0%, then shift to 100%), dark launch
16
+ `off`, and no questions at any point. Invoking it is the authorization for the
17
+ whole release; the plan is shown as a record, never as a question.
18
+
19
+ 1. Read `resolve-release`'s `SKILL.md` in full: `<skill-base-dir>/../resolve-release/SKILL.md`
20
+ in an installed skills directory, or `skills/engineering/resolve-release/SKILL.md`
21
+ in the skills source checkout. If neither exists, stop and say
22
+ `resolve-release` is not installed; do not improvise its workflow.
23
+ 2. Follow it as the only workflow for this invocation, in shortcut mode:
24
+ - resolve choices with `flow.mjs resolve --mode shortcut` (plus `--flow <name>`
25
+ when invoked with one); never ask a question, including a release flow's
26
+ `ask:` items (their defaults answer);
27
+ - if it refuses (an exposure/dark/canary option was passed, the release flow
28
+ requires canary or dark, or a flow question has no default), hand back and
29
+ point the user to `/resolve-release`; do not ask instead;
30
+ - write the normal cut receipt as `.git/rush-release-authorization.json`;
31
+ an explicitly human-approved prepared-metadata reuse follows the shared
32
+ workflow's distinct fresh receipt path instead, with no old permissions
33
+ or metadata writes. Do not infer reuse approval from shortcut defaults.
34
+ 3. Everything else — invariants, stages, scripts, rollback, and the done
35
+ criteria — applies exactly as `resolve-release` states it.