@takuma-hirai/hirai-method 0.1.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 (822) hide show
  1. package/.claude/.stale-harness-state/last-check +0 -0
  2. package/.claude/CommonRules.md +121 -0
  3. package/.claude/agents/01-core-development/api-designer.md +237 -0
  4. package/.claude/agents/01-core-development/backend-developer.md +222 -0
  5. package/.claude/agents/01-core-development/design-bridge.md +127 -0
  6. package/.claude/agents/01-core-development/electron-pro.md +240 -0
  7. package/.claude/agents/01-core-development/frontend-developer.md +133 -0
  8. package/.claude/agents/01-core-development/fullstack-developer.md +235 -0
  9. package/.claude/agents/01-core-development/graphql-architect.md +238 -0
  10. package/.claude/agents/01-core-development/microservices-architect.md +239 -0
  11. package/.claude/agents/01-core-development/mobile-developer.md +283 -0
  12. package/.claude/agents/01-core-development/ui-designer.md +174 -0
  13. package/.claude/agents/01-core-development/websocket-engineer.md +150 -0
  14. package/.claude/agents/03-infrastructure/azure-infra-engineer.md +53 -0
  15. package/.claude/agents/03-infrastructure/cloud-architect.md +277 -0
  16. package/.claude/agents/03-infrastructure/database-administrator.md +287 -0
  17. package/.claude/agents/03-infrastructure/deployment-engineer.md +287 -0
  18. package/.claude/agents/03-infrastructure/devops-engineer.md +287 -0
  19. package/.claude/agents/03-infrastructure/devops-incident-responder.md +287 -0
  20. package/.claude/agents/03-infrastructure/docker-expert.md +278 -0
  21. package/.claude/agents/03-infrastructure/incident-responder.md +287 -0
  22. package/.claude/agents/03-infrastructure/kubernetes-specialist.md +287 -0
  23. package/.claude/agents/03-infrastructure/network-engineer.md +287 -0
  24. package/.claude/agents/03-infrastructure/platform-engineer.md +287 -0
  25. package/.claude/agents/03-infrastructure/security-engineer.md +277 -0
  26. package/.claude/agents/03-infrastructure/sre-engineer.md +287 -0
  27. package/.claude/agents/03-infrastructure/terraform-engineer.md +287 -0
  28. package/.claude/agents/03-infrastructure/terragrunt-expert.md +307 -0
  29. package/.claude/agents/03-infrastructure/windows-infra-admin.md +52 -0
  30. package/.claude/agents/04-quality-security/accessibility-tester.md +277 -0
  31. package/.claude/agents/04-quality-security/ad-security-reviewer.md +56 -0
  32. package/.claude/agents/04-quality-security/ai-writing-auditor.md +77 -0
  33. package/.claude/agents/04-quality-security/architect-reviewer.md +287 -0
  34. package/.claude/agents/04-quality-security/chaos-engineer.md +277 -0
  35. package/.claude/agents/04-quality-security/code-reviewer.md +287 -0
  36. package/.claude/agents/04-quality-security/compliance-auditor.md +277 -0
  37. package/.claude/agents/04-quality-security/debugger.md +287 -0
  38. package/.claude/agents/04-quality-security/error-detective.md +287 -0
  39. package/.claude/agents/04-quality-security/penetration-tester.md +287 -0
  40. package/.claude/agents/04-quality-security/performance-engineer.md +287 -0
  41. package/.claude/agents/04-quality-security/powershell-security-hardening.md +54 -0
  42. package/.claude/agents/04-quality-security/qa-expert.md +287 -0
  43. package/.claude/agents/04-quality-security/security-auditor.md +287 -0
  44. package/.claude/agents/04-quality-security/test-automator.md +287 -0
  45. package/.claude/agents/04-quality-security/ui-ux-tester.md +234 -0
  46. package/.claude/agents/06-developer-experience/build-engineer.md +286 -0
  47. package/.claude/agents/06-developer-experience/cli-developer.md +286 -0
  48. package/.claude/agents/06-developer-experience/dependency-manager.md +286 -0
  49. package/.claude/agents/06-developer-experience/documentation-engineer.md +276 -0
  50. package/.claude/agents/06-developer-experience/dx-optimizer.md +286 -0
  51. package/.claude/agents/06-developer-experience/git-workflow-manager.md +286 -0
  52. package/.claude/agents/06-developer-experience/legacy-modernizer.md +286 -0
  53. package/.claude/agents/06-developer-experience/mcp-developer.md +275 -0
  54. package/.claude/agents/06-developer-experience/powershell-module-architect.md +58 -0
  55. package/.claude/agents/06-developer-experience/powershell-ui-architect.md +135 -0
  56. package/.claude/agents/06-developer-experience/readme-generator.md +238 -0
  57. package/.claude/agents/06-developer-experience/refactoring-specialist.md +286 -0
  58. package/.claude/agents/06-developer-experience/slack-expert.md +232 -0
  59. package/.claude/agents/06-developer-experience/tooling-engineer.md +286 -0
  60. package/.claude/agents/09-meta-orchestration/agent-installer.md +97 -0
  61. package/.claude/agents/09-meta-orchestration/agent-organizer.md +287 -0
  62. package/.claude/agents/09-meta-orchestration/codebase-orchestrator.md +249 -0
  63. package/.claude/agents/09-meta-orchestration/context-manager.md +287 -0
  64. package/.claude/agents/09-meta-orchestration/error-coordinator.md +287 -0
  65. package/.claude/agents/09-meta-orchestration/it-ops-orchestrator.md +60 -0
  66. package/.claude/agents/09-meta-orchestration/knowledge-synthesizer.md +287 -0
  67. package/.claude/agents/09-meta-orchestration/multi-agent-coordinator.md +287 -0
  68. package/.claude/agents/09-meta-orchestration/performance-monitor.md +287 -0
  69. package/.claude/agents/09-meta-orchestration/task-distributor.md +287 -0
  70. package/.claude/agents/09-meta-orchestration/workflow-orchestrator.md +287 -0
  71. package/.claude/agents/10-research-analysis/competitive-analyst.md +287 -0
  72. package/.claude/agents/10-research-analysis/data-researcher.md +287 -0
  73. package/.claude/agents/10-research-analysis/market-researcher.md +287 -0
  74. package/.claude/agents/10-research-analysis/project-idea-validator.md +269 -0
  75. package/.claude/agents/10-research-analysis/research-analyst.md +287 -0
  76. package/.claude/agents/10-research-analysis/scientific-literature-researcher.md +151 -0
  77. package/.claude/agents/10-research-analysis/search-specialist.md +287 -0
  78. package/.claude/agents/10-research-analysis/trend-analyst.md +287 -0
  79. package/.claude/archive/README.md +47 -0
  80. package/.claude/archive/agents/02-language-specialists/angular-architect.md +287 -0
  81. package/.claude/archive/agents/02-language-specialists/cpp-pro.md +277 -0
  82. package/.claude/archive/agents/02-language-specialists/csharp-developer.md +287 -0
  83. package/.claude/archive/agents/02-language-specialists/django-developer.md +287 -0
  84. package/.claude/archive/agents/02-language-specialists/dotnet-core-expert.md +287 -0
  85. package/.claude/archive/agents/02-language-specialists/dotnet-framework-4.8-expert.md +306 -0
  86. package/.claude/archive/agents/02-language-specialists/elixir-expert.md +311 -0
  87. package/.claude/archive/agents/02-language-specialists/expo-react-native-expert.md +268 -0
  88. package/.claude/archive/agents/02-language-specialists/fastapi-developer.md +287 -0
  89. package/.claude/archive/agents/02-language-specialists/flutter-expert.md +287 -0
  90. package/.claude/archive/agents/02-language-specialists/golang-pro.md +277 -0
  91. package/.claude/archive/agents/02-language-specialists/java-architect.md +287 -0
  92. package/.claude/archive/agents/02-language-specialists/javascript-pro.md +277 -0
  93. package/.claude/archive/agents/02-language-specialists/kotlin-specialist.md +287 -0
  94. package/.claude/archive/agents/02-language-specialists/laravel-specialist.md +287 -0
  95. package/.claude/archive/agents/02-language-specialists/nextjs-developer.md +287 -0
  96. package/.claude/archive/agents/02-language-specialists/node-specialist.md +124 -0
  97. package/.claude/archive/agents/02-language-specialists/php-pro.md +287 -0
  98. package/.claude/archive/agents/02-language-specialists/powershell-5.1-expert.md +59 -0
  99. package/.claude/archive/agents/02-language-specialists/powershell-7-expert.md +57 -0
  100. package/.claude/archive/agents/02-language-specialists/python-pro.md +277 -0
  101. package/.claude/archive/agents/02-language-specialists/rails-expert.md +358 -0
  102. package/.claude/archive/agents/02-language-specialists/react-specialist.md +287 -0
  103. package/.claude/archive/agents/02-language-specialists/rust-engineer.md +287 -0
  104. package/.claude/archive/agents/02-language-specialists/spring-boot-engineer.md +287 -0
  105. package/.claude/archive/agents/02-language-specialists/sql-pro.md +287 -0
  106. package/.claude/archive/agents/02-language-specialists/swift-expert.md +287 -0
  107. package/.claude/archive/agents/02-language-specialists/symfony-specialist.md +354 -0
  108. package/.claude/archive/agents/02-language-specialists/typescript-pro.md +277 -0
  109. package/.claude/archive/agents/02-language-specialists/vue-expert.md +287 -0
  110. package/.claude/archive/agents/05-data-ai/ai-engineer.md +287 -0
  111. package/.claude/archive/agents/05-data-ai/data-analyst.md +277 -0
  112. package/.claude/archive/agents/05-data-ai/data-engineer.md +287 -0
  113. package/.claude/archive/agents/05-data-ai/data-scientist.md +287 -0
  114. package/.claude/archive/agents/05-data-ai/database-optimizer.md +287 -0
  115. package/.claude/archive/agents/05-data-ai/llm-architect.md +287 -0
  116. package/.claude/archive/agents/05-data-ai/machine-learning-engineer.md +277 -0
  117. package/.claude/archive/agents/05-data-ai/ml-engineer.md +287 -0
  118. package/.claude/archive/agents/05-data-ai/mlops-engineer.md +287 -0
  119. package/.claude/archive/agents/05-data-ai/nlp-engineer.md +287 -0
  120. package/.claude/archive/agents/05-data-ai/postgres-pro.md +287 -0
  121. package/.claude/archive/agents/05-data-ai/prompt-engineer.md +287 -0
  122. package/.claude/archive/agents/05-data-ai/reinforcement-learning-engineer.md +277 -0
  123. package/.claude/archive/agents/07-specialized-domains/api-documenter.md +277 -0
  124. package/.claude/archive/agents/07-specialized-domains/blockchain-developer.md +287 -0
  125. package/.claude/archive/agents/07-specialized-domains/embedded-systems.md +287 -0
  126. package/.claude/archive/agents/07-specialized-domains/fintech-engineer.md +287 -0
  127. package/.claude/archive/agents/07-specialized-domains/game-developer.md +287 -0
  128. package/.claude/archive/agents/07-specialized-domains/healthcare-admin.md +199 -0
  129. package/.claude/archive/agents/07-specialized-domains/iot-engineer.md +287 -0
  130. package/.claude/archive/agents/07-specialized-domains/m365-admin.md +48 -0
  131. package/.claude/archive/agents/07-specialized-domains/mobile-app-developer.md +287 -0
  132. package/.claude/archive/agents/07-specialized-domains/payment-integration.md +287 -0
  133. package/.claude/archive/agents/07-specialized-domains/quant-analyst.md +287 -0
  134. package/.claude/archive/agents/07-specialized-domains/risk-manager.md +287 -0
  135. package/.claude/archive/agents/07-specialized-domains/seo-specialist.md +184 -0
  136. package/.claude/archive/agents/08-business-product/business-analyst.md +287 -0
  137. package/.claude/archive/agents/08-business-product/content-marketer.md +287 -0
  138. package/.claude/archive/agents/08-business-product/customer-success-manager.md +287 -0
  139. package/.claude/archive/agents/08-business-product/legal-advisor.md +287 -0
  140. package/.claude/archive/agents/08-business-product/license-engineer.md +295 -0
  141. package/.claude/archive/agents/08-business-product/product-manager.md +287 -0
  142. package/.claude/archive/agents/08-business-product/project-manager.md +287 -0
  143. package/.claude/archive/agents/08-business-product/sales-engineer.md +287 -0
  144. package/.claude/archive/agents/08-business-product/scrum-master.md +287 -0
  145. package/.claude/archive/agents/08-business-product/technical-writer.md +287 -0
  146. package/.claude/archive/agents/08-business-product/ux-researcher.md +287 -0
  147. package/.claude/archive/agents/08-business-product/wordpress-master.md +316 -0
  148. package/.claude/archive/skills/competitive-ads-extractor/SKILL.md +293 -0
  149. package/.claude/archive/skills/developer-growth-analysis/SKILL.md +322 -0
  150. package/.claude/archive/skills/document-docx/LICENSE.txt +30 -0
  151. package/.claude/archive/skills/document-docx/SKILL.md +197 -0
  152. package/.claude/archive/skills/document-docx/docx-js.md +350 -0
  153. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  154. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  155. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  156. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  157. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  158. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  159. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  160. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  161. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  162. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  163. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  164. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  165. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  166. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  167. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  168. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  169. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  170. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  171. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  172. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  173. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  174. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  175. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  176. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  177. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  178. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  179. package/.claude/archive/skills/document-docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  180. package/.claude/archive/skills/document-docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  181. package/.claude/archive/skills/document-docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  182. package/.claude/archive/skills/document-docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  183. package/.claude/archive/skills/document-docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  184. package/.claude/archive/skills/document-docx/ooxml/schemas/mce/mc.xsd +75 -0
  185. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  186. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  187. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  188. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  189. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  190. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  191. package/.claude/archive/skills/document-docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  192. package/.claude/archive/skills/document-docx/ooxml/scripts/pack.py +159 -0
  193. package/.claude/archive/skills/document-docx/ooxml/scripts/unpack.py +29 -0
  194. package/.claude/archive/skills/document-docx/ooxml/scripts/validate.py +69 -0
  195. package/.claude/archive/skills/document-docx/ooxml/scripts/validation/__init__.py +15 -0
  196. package/.claude/archive/skills/document-docx/ooxml/scripts/validation/base.py +951 -0
  197. package/.claude/archive/skills/document-docx/ooxml/scripts/validation/docx.py +274 -0
  198. package/.claude/archive/skills/document-docx/ooxml/scripts/validation/pptx.py +315 -0
  199. package/.claude/archive/skills/document-docx/ooxml/scripts/validation/redlining.py +279 -0
  200. package/.claude/archive/skills/document-docx/ooxml.md +610 -0
  201. package/.claude/archive/skills/document-docx/scripts/__init__.py +1 -0
  202. package/.claude/archive/skills/document-docx/scripts/document.py +1276 -0
  203. package/.claude/archive/skills/document-docx/scripts/templates/comments.xml +3 -0
  204. package/.claude/archive/skills/document-docx/scripts/templates/commentsExtended.xml +3 -0
  205. package/.claude/archive/skills/document-docx/scripts/templates/commentsExtensible.xml +3 -0
  206. package/.claude/archive/skills/document-docx/scripts/templates/commentsIds.xml +3 -0
  207. package/.claude/archive/skills/document-docx/scripts/templates/people.xml +3 -0
  208. package/.claude/archive/skills/document-docx/scripts/utilities.py +374 -0
  209. package/.claude/archive/skills/document-pdf/LICENSE.txt +30 -0
  210. package/.claude/archive/skills/document-pdf/SKILL.md +294 -0
  211. package/.claude/archive/skills/document-pdf/forms.md +205 -0
  212. package/.claude/archive/skills/document-pdf/reference.md +612 -0
  213. package/.claude/archive/skills/document-pdf/scripts/check_bounding_boxes.py +70 -0
  214. package/.claude/archive/skills/document-pdf/scripts/check_bounding_boxes_test.py +226 -0
  215. package/.claude/archive/skills/document-pdf/scripts/check_fillable_fields.py +12 -0
  216. package/.claude/archive/skills/document-pdf/scripts/convert_pdf_to_images.py +35 -0
  217. package/.claude/archive/skills/document-pdf/scripts/create_validation_image.py +41 -0
  218. package/.claude/archive/skills/document-pdf/scripts/extract_form_field_info.py +152 -0
  219. package/.claude/archive/skills/document-pdf/scripts/fill_fillable_fields.py +114 -0
  220. package/.claude/archive/skills/document-pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  221. package/.claude/archive/skills/document-pptx/LICENSE.txt +30 -0
  222. package/.claude/archive/skills/document-pptx/SKILL.md +484 -0
  223. package/.claude/archive/skills/document-pptx/html2pptx.md +625 -0
  224. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  225. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  226. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  227. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  228. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  229. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  230. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  231. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  232. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  233. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  234. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  235. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  236. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  237. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  238. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  239. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  240. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  241. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  242. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  243. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  244. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  245. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  246. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  247. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  248. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  249. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  250. package/.claude/archive/skills/document-pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  251. package/.claude/archive/skills/document-pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  252. package/.claude/archive/skills/document-pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  253. package/.claude/archive/skills/document-pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  254. package/.claude/archive/skills/document-pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  255. package/.claude/archive/skills/document-pptx/ooxml/schemas/mce/mc.xsd +75 -0
  256. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  257. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  258. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  259. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  260. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  261. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  262. package/.claude/archive/skills/document-pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  263. package/.claude/archive/skills/document-pptx/ooxml/scripts/pack.py +159 -0
  264. package/.claude/archive/skills/document-pptx/ooxml/scripts/unpack.py +29 -0
  265. package/.claude/archive/skills/document-pptx/ooxml/scripts/validate.py +69 -0
  266. package/.claude/archive/skills/document-pptx/ooxml/scripts/validation/__init__.py +15 -0
  267. package/.claude/archive/skills/document-pptx/ooxml/scripts/validation/base.py +951 -0
  268. package/.claude/archive/skills/document-pptx/ooxml/scripts/validation/docx.py +274 -0
  269. package/.claude/archive/skills/document-pptx/ooxml/scripts/validation/pptx.py +315 -0
  270. package/.claude/archive/skills/document-pptx/ooxml/scripts/validation/redlining.py +279 -0
  271. package/.claude/archive/skills/document-pptx/ooxml.md +427 -0
  272. package/.claude/archive/skills/document-pptx/scripts/html2pptx.js +979 -0
  273. package/.claude/archive/skills/document-pptx/scripts/inventory.py +1020 -0
  274. package/.claude/archive/skills/document-pptx/scripts/rearrange.py +231 -0
  275. package/.claude/archive/skills/document-pptx/scripts/replace.py +385 -0
  276. package/.claude/archive/skills/document-pptx/scripts/thumbnail.py +450 -0
  277. package/.claude/archive/skills/document-xlsx/LICENSE.txt +30 -0
  278. package/.claude/archive/skills/document-xlsx/SKILL.md +289 -0
  279. package/.claude/archive/skills/document-xlsx/recalc.py +178 -0
  280. package/.claude/archive/skills/image-enhancer/SKILL.md +99 -0
  281. package/.claude/archive/skills/meeting-insights-analyzer/SKILL.md +327 -0
  282. package/.claude/archive/skills/slack-gif-creator/LICENSE.txt +202 -0
  283. package/.claude/archive/skills/slack-gif-creator/SKILL.md +646 -0
  284. package/.claude/archive/skills/slack-gif-creator/core/color_palettes.py +302 -0
  285. package/.claude/archive/skills/slack-gif-creator/core/easing.py +230 -0
  286. package/.claude/archive/skills/slack-gif-creator/core/frame_composer.py +469 -0
  287. package/.claude/archive/skills/slack-gif-creator/core/gif_builder.py +246 -0
  288. package/.claude/archive/skills/slack-gif-creator/core/typography.py +357 -0
  289. package/.claude/archive/skills/slack-gif-creator/core/validators.py +264 -0
  290. package/.claude/archive/skills/slack-gif-creator/core/visual_effects.py +494 -0
  291. package/.claude/archive/skills/slack-gif-creator/requirements.txt +4 -0
  292. package/.claude/archive/skills/slack-gif-creator/templates/bounce.py +106 -0
  293. package/.claude/archive/skills/slack-gif-creator/templates/explode.py +331 -0
  294. package/.claude/archive/skills/slack-gif-creator/templates/fade.py +329 -0
  295. package/.claude/archive/skills/slack-gif-creator/templates/flip.py +291 -0
  296. package/.claude/archive/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
  297. package/.claude/archive/skills/slack-gif-creator/templates/morph.py +329 -0
  298. package/.claude/archive/skills/slack-gif-creator/templates/move.py +293 -0
  299. package/.claude/archive/skills/slack-gif-creator/templates/pulse.py +268 -0
  300. package/.claude/archive/skills/slack-gif-creator/templates/shake.py +127 -0
  301. package/.claude/archive/skills/slack-gif-creator/templates/slide.py +291 -0
  302. package/.claude/archive/skills/slack-gif-creator/templates/spin.py +269 -0
  303. package/.claude/archive/skills/slack-gif-creator/templates/wiggle.py +300 -0
  304. package/.claude/archive/skills/slack-gif-creator/templates/zoom.py +312 -0
  305. package/.claude/archive/skills/twitter-algorithm-optimizer/SKILL.md +327 -0
  306. package/.claude/archive/skills/video-downloader/SKILL.md +99 -0
  307. package/.claude/archive/skills/video-downloader/scripts/download_video.py +145 -0
  308. package/.claude/bash-whitelist-requests/2026-05-28-grep-find-rg.md +68 -0
  309. package/.claude/bash-whitelist-requests/2026-06-01-readonly-filters.md +76 -0
  310. package/.claude/bash-whitelist.txt +124 -0
  311. package/.claude/commands/agent-introspect.md +89 -0
  312. package/.claude/commands/apply-rules.md +363 -0
  313. package/.claude/commands/approve-design.md +219 -0
  314. package/.claude/commands/approve-org-money.md +267 -0
  315. package/.claude/commands/build.md +234 -0
  316. package/.claude/commands/commit.md +97 -0
  317. package/.claude/commands/context-fetch.md +113 -0
  318. package/.claude/commands/create-tool.md +496 -0
  319. package/.claude/commands/design-review.md +138 -0
  320. package/.claude/commands/design.md +807 -0
  321. package/.claude/commands/discharge-byproduct.md +208 -0
  322. package/.claude/commands/doc-review.md +165 -0
  323. package/.claude/commands/document-pair.md +76 -0
  324. package/.claude/commands/error-triage.md +435 -0
  325. package/.claude/commands/eval.md +70 -0
  326. package/.claude/commands/evolve.md +49 -0
  327. package/.claude/commands/finish-task.md +105 -0
  328. package/.claude/commands/gan-build.md +91 -0
  329. package/.claude/commands/gan-design.md +82 -0
  330. package/.claude/commands/gate-bypass.md +77 -0
  331. package/.claude/commands/gate-clear.md +45 -0
  332. package/.claude/commands/gate-status.md +46 -0
  333. package/.claude/commands/harness-audit.md +151 -0
  334. package/.claude/commands/hearing.md +138 -0
  335. package/.claude/commands/impact-check.md +486 -0
  336. package/.claude/commands/init-tasks.md +49 -0
  337. package/.claude/commands/instinct-export.md +47 -0
  338. package/.claude/commands/instinct-import.md +41 -0
  339. package/.claude/commands/instinct-status.md +43 -0
  340. package/.claude/commands/investigate.md +547 -0
  341. package/.claude/commands/learn.md +55 -0
  342. package/.claude/commands/lint-rules.md +400 -0
  343. package/.claude/commands/mode.md +58 -0
  344. package/.claude/commands/modify-feature.md +209 -0
  345. package/.claude/commands/module-review.md +149 -0
  346. package/.claude/commands/move-section.md +67 -0
  347. package/.claude/commands/new-draft.md +67 -0
  348. package/.claude/commands/new-feature.md +286 -0
  349. package/.claude/commands/new-task.md +156 -0
  350. package/.claude/commands/notification.md +107 -0
  351. package/.claude/commands/pm-start.md +119 -0
  352. package/.claude/commands/projects.md +32 -0
  353. package/.claude/commands/promote.md +43 -0
  354. package/.claude/commands/rasis-report.md +1323 -0
  355. package/.claude/commands/release-note.md +130 -0
  356. package/.claude/commands/reply-watch.md +149 -0
  357. package/.claude/commands/requirement.md +352 -0
  358. package/.claude/commands/resume-state.md +187 -0
  359. package/.claude/commands/reviewpr.md +118 -0
  360. package/.claude/commands/save-state.md +100 -0
  361. package/.claude/commands/sentry-pr.md +157 -0
  362. package/.claude/commands/start-task.md +87 -0
  363. package/.claude/commands/system-review.md +147 -0
  364. package/.claude/commands/task-bypass.md +70 -0
  365. package/.claude/commands/task-estimate.md +100 -0
  366. package/.claude/commands/template-apply.md +89 -0
  367. package/.claude/commands/test-design.md +116 -0
  368. package/.claude/commands/transfer-mismatch.md +317 -0
  369. package/.claude/commands/verify.md +51 -0
  370. package/.claude/evals/grader-loop-mode-autonomy.sh +165 -0
  371. package/.claude/evals/grader-system-reminder-attention.sh +99 -0
  372. package/.claude/evals/loop-mode-autonomy.md +121 -0
  373. package/.claude/evals/loop-mode-autonomy.results.template.md +133 -0
  374. package/.claude/evals/system-reminder-attention.md +123 -0
  375. package/.claude/evals/system-reminder-attention.results.template.md +93 -0
  376. package/.claude/evals/system-reminder-attention.runner.md +353 -0
  377. package/.claude/harness-config.local.yml +48 -0
  378. package/.claude/harness-config.yml +534 -0
  379. package/.claude/hooks/agent-marker-clear.sh +43 -0
  380. package/.claude/hooks/agent-marker-set.sh +40 -0
  381. package/.claude/hooks/agent-router-suggest.sh +123 -0
  382. package/.claude/hooks/autonomous-action-guard.sh +242 -0
  383. package/.claude/hooks/byproduct-discharge-guard.sh +128 -0
  384. package/.claude/hooks/check-md-mermaid.sh +144 -0
  385. package/.claude/hooks/check-required-env.sh +95 -0
  386. package/.claude/hooks/check-serena-mcp.sh +123 -0
  387. package/.claude/hooks/confidence-gate.sh +139 -0
  388. package/.claude/hooks/context-budget.sh +233 -0
  389. package/.claude/hooks/delegation-guard.sh +99 -0
  390. package/.claude/hooks/dispatcher-manifest.tsv +38 -0
  391. package/.claude/hooks/draft-flow-guard.sh +304 -0
  392. package/.claude/hooks/failure-loop-detect.sh +139 -0
  393. package/.claude/hooks/gateguard.sh +209 -0
  394. package/.claude/hooks/improvement-proposal.sh +112 -0
  395. package/.claude/hooks/init-tasks-on-start.sh +34 -0
  396. package/.claude/hooks/lib/bypass-logger.sh +82 -0
  397. package/.claude/hooks/lib/confidence-gate/bypass.sh +48 -0
  398. package/.claude/hooks/lib/confidence-gate/extract.sh +99 -0
  399. package/.claude/hooks/lib/confidence-gate/major-agent-filter.sh +59 -0
  400. package/.claude/hooks/lib/confidence-gate/messages.sh +53 -0
  401. package/.claude/hooks/lib/config-loader.sh +784 -0
  402. package/.claude/hooks/lib/delegation-guard/bash-whitelist.sh +323 -0
  403. package/.claude/hooks/lib/delegation-guard/git-deny.sh +188 -0
  404. package/.claude/hooks/lib/delegation-guard/protected-paths.sh +105 -0
  405. package/.claude/hooks/lib/delegation-guard/subagent-detect.sh +40 -0
  406. package/.claude/hooks/lib/dispatcher-core.sh +454 -0
  407. package/.claude/hooks/lib/improvement-proposal/aggregate.py +466 -0
  408. package/.claude/hooks/lib/improvement-proposal/cache.sh +78 -0
  409. package/.claude/hooks/lib/mode-loader.sh +80 -0
  410. package/.claude/hooks/lib/next-actions-parser.sh +153 -0
  411. package/.claude/hooks/lib/project-root.sh +60 -0
  412. package/.claude/hooks/list-md-plan-first-reminder.sh +143 -0
  413. package/.claude/hooks/loop-auto-progress-reminder.sh +108 -0
  414. package/.claude/hooks/loop-confirmation-detector.sh +241 -0
  415. package/.claude/hooks/mode-asana-prompt.sh +61 -0
  416. package/.claude/hooks/mode-enforce.sh +57 -0
  417. package/.claude/hooks/mode-session-start.sh +93 -0
  418. package/.claude/hooks/next-actions-surface.sh +136 -0
  419. package/.claude/hooks/notification-dispatcher.sh +9 -0
  420. package/.claude/hooks/notify.sh +27 -0
  421. package/.claude/hooks/parallel-subagent-reminder.sh +469 -0
  422. package/.claude/hooks/post-tool-use-dispatcher.sh +9 -0
  423. package/.claude/hooks/pre-tool-use-dispatcher.sh +9 -0
  424. package/.claude/hooks/reviewer-count-guard.sh +313 -0
  425. package/.claude/hooks/session-help-surface.sh +192 -0
  426. package/.claude/hooks/session-start-dispatcher.sh +9 -0
  427. package/.claude/hooks/session-start-wrapper.sh +156 -0
  428. package/.claude/hooks/stale-harness-detect.sh +422 -0
  429. package/.claude/hooks/stop-dispatcher.sh +9 -0
  430. package/.claude/hooks/stop.sh +25 -0
  431. package/.claude/hooks/subagent-stop-dispatcher.sh +9 -0
  432. package/.claude/hooks/task-rule-guard.sh +317 -0
  433. package/.claude/hooks/tests/run-tests.sh +23 -0
  434. package/.claude/hooks/tests/test-agent-marker-warn.sh +86 -0
  435. package/.claude/hooks/tests/test-check-required-env.sh +138 -0
  436. package/.claude/hooks/tests/test-confidence-gate.sh +170 -0
  437. package/.claude/hooks/tests/test-config-env-override.sh +220 -0
  438. package/.claude/hooks/tests/test-gate-disable.sh +118 -0
  439. package/.claude/hooks/tests/test-improvement-proposal.sh +284 -0
  440. package/.claude/hooks/tool-call-slip-detector.sh +188 -0
  441. package/.claude/hooks/user-prompt-submit-dispatcher.sh +9 -0
  442. package/.claude/hooks/why-x5-reminder.sh +45 -0
  443. package/.claude/hooks/why-x5-violation-detect.sh +152 -0
  444. package/.claude/hooks/workflow-guard.sh +263 -0
  445. package/.claude/mode.yml +28 -0
  446. package/.claude/project-rules/development-process.md +8 -0
  447. package/.claude/project-rules/git-workflow.md +8 -0
  448. package/.claude/project-rules/modes.md +8 -0
  449. package/.claude/project-rules/self-improvement.md +8 -0
  450. package/.claude/project-rules/task-management.md +8 -0
  451. package/.claude/project-rules/why-x5-output.md +8 -0
  452. package/.claude/project-rules/workflow.md +8 -0
  453. package/.claude/rules/development-process.md +293 -0
  454. package/.claude/rules/git-workflow.md +71 -0
  455. package/.claude/rules/modes.md +189 -0
  456. package/.claude/rules/self-improvement.md +76 -0
  457. package/.claude/rules/task-management.md +261 -0
  458. package/.claude/rules/why-x5-output.md +97 -0
  459. package/.claude/rules/workflow.md +157 -0
  460. package/.claude/rules-details/README.md +67 -0
  461. package/.claude/rules-details/development-process/confidence-gate.md +22 -0
  462. package/.claude/rules-details/development-process/cross-repo-write.md +35 -0
  463. package/.claude/rules-details/development-process/delegation-requirements.md +158 -0
  464. package/.claude/rules-details/development-process/harness-sync.md +21 -0
  465. package/.claude/rules-details/development-process/origin.md +13 -0
  466. package/.claude/rules-details/development-process/parallelization-origin.md +22 -0
  467. package/.claude/rules-details/development-process/research-reuse.md +22 -0
  468. package/.claude/rules-details/development-process/staging-strategy.md +47 -0
  469. package/.claude/rules-details/modes/artifacts.md +34 -0
  470. package/.claude/rules-details/modes/compliance-items.md +120 -0
  471. package/.claude/rules-details/modes/five-layer-enforcement.md +46 -0
  472. package/.claude/rules-details/modes/mode-hooks.md +51 -0
  473. package/.claude/rules-details/modes/origin.md +17 -0
  474. package/.claude/rules-details/self-improvement/l4-mechanics.md +36 -0
  475. package/.claude/rules-details/self-improvement/origin.md +8 -0
  476. package/.claude/rules-details/self-improvement/related-skills.md +35 -0
  477. package/.claude/rules-details/self-improvement/when-to-use-layers.md +39 -0
  478. package/.claude/rules-details/task-management/hook-enforcement.md +25 -0
  479. package/.claude/rules-details/task-management/mandatory-reading.md +20 -0
  480. package/.claude/rules-details/task-management/origin.md +12 -0
  481. package/.claude/rules-details/task-management/parking-lot.md +26 -0
  482. package/.claude/rules-details/task-management/plan-first.md +44 -0
  483. package/.claude/rules-details/task-management/six-articles.md +68 -0
  484. package/.claude/rules-details/task-management/task-migration.md +16 -0
  485. package/.claude/rules-details/task-management/ui-detection.md +11 -0
  486. package/.claude/rules-details/why-x5-output/examples.md +41 -0
  487. package/.claude/rules-details/why-x5-output/feedback-memory.md +14 -0
  488. package/.claude/rules-details/why-x5-output/origin.md +10 -0
  489. package/.claude/rules-details/why-x5-output/v1-v10-history.md +19 -0
  490. package/.claude/rules-details/workflow/10-stage.md +43 -0
  491. package/.claude/rules-details/workflow/14-stage.md +52 -0
  492. package/.claude/rules-details/workflow/byproduct-discharge.md +39 -0
  493. package/.claude/rules-details/workflow/draft-flow-guard.md +31 -0
  494. package/.claude/rules-details/workflow/fan-out.md +70 -0
  495. package/.claude/rules-details/workflow/mece-20.md +36 -0
  496. package/.claude/rules-details/workflow/origin.md +14 -0
  497. package/.claude/rules-details/workflow/refactoring.md +48 -0
  498. package/.claude/rules-details/workflow/related-skills.md +22 -0
  499. package/.claude/rules-details/workflow/reviewer-prompt.md +100 -0
  500. package/.claude/rules-details/workflow/session-persistence.md +46 -0
  501. package/.claude/rules-details/workflow/workflow-guard.md +36 -0
  502. package/.claude/scripts/__pycache__/harness-audit.cpython-313.pyc +0 -0
  503. package/.claude/scripts/agent-stocktake.py +421 -0
  504. package/.claude/scripts/check-md-mermaid.mjs +138 -0
  505. package/.claude/scripts/generate-settings.sh +0 -0
  506. package/.claude/scripts/harness-audit.py +1547 -0
  507. package/.claude/scripts/hc-config.sh +2265 -0
  508. package/.claude/scripts/init-tasks.sh +117 -0
  509. package/.claude/scripts/lib/enforcement-matrix-parse.sh +81 -0
  510. package/.claude/scripts/lib/hc-config-metadata.sh +190 -0
  511. package/.claude/scripts/lib/hc-config-web-server.js +1528 -0
  512. package/.claude/scripts/lib/hc-config-web-ui/app.js +1054 -0
  513. package/.claude/scripts/lib/hc-config-web-ui/index.html +130 -0
  514. package/.claude/scripts/lib/hc-config-web-ui/style.css +522 -0
  515. package/.claude/scripts/new-task-helper.sh +432 -0
  516. package/.claude/scripts/observe-repair.sh +437 -0
  517. package/.claude/scripts/observe-rotate.sh +311 -0
  518. package/.claude/scripts/statusline.sh +239 -0
  519. package/.claude/settings.generated.preview.json +211 -0
  520. package/.claude/settings.json +215 -0
  521. package/.claude/settings.local.example.json +20 -0
  522. package/.claude/settings.local.json +36 -0
  523. package/.claude/skills/agent-introspection-debugging/SKILL.md +123 -0
  524. package/.claude/skills/agent-router/README.md +137 -0
  525. package/.claude/skills/agent-router/SKILL.md +74 -0
  526. package/.claude/skills/agent-router/dispatch-table.yml +352 -0
  527. package/.claude/skills/agent-router/router.py +1086 -0
  528. package/.claude/skills/agent-router/samples/representative_prompts.txt +24 -0
  529. package/.claude/skills/agent-router/tests/__init__.py +0 -0
  530. package/.claude/skills/agent-router/tests/test_router.py +762 -0
  531. package/.claude/skills/artifacts-builder/LICENSE.txt +202 -0
  532. package/.claude/skills/artifacts-builder/SKILL.md +74 -0
  533. package/.claude/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  534. package/.claude/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
  535. package/.claude/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  536. package/.claude/skills/brand-guidelines/LICENSE.txt +202 -0
  537. package/.claude/skills/brand-guidelines/SKILL.md +73 -0
  538. package/.claude/skills/canvas-design/LICENSE.txt +202 -0
  539. package/.claude/skills/canvas-design/SKILL.md +130 -0
  540. package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  541. package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  542. package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  543. package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  544. package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  545. package/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  546. package/.claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  547. package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  548. package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  549. package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  550. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  551. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  552. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  553. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  554. package/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  555. package/.claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  556. package/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  557. package/.claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  558. package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  559. package/.claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  560. package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  561. package/.claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  562. package/.claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  563. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  564. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  565. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  566. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  567. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  568. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  569. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  570. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  571. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  572. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  573. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  574. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  575. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  576. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  577. package/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  578. package/.claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  579. package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  580. package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  581. package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  582. package/.claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  583. package/.claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  584. package/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  585. package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  586. package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  587. package/.claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  588. package/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  589. package/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  590. package/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  591. package/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  592. package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  593. package/.claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  594. package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  595. package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  596. package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  597. package/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  598. package/.claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  599. package/.claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  600. package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  601. package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  602. package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  603. package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  604. package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  605. package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  606. package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  607. package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  608. package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  609. package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  610. package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  611. package/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  612. package/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  613. package/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  614. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  615. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  616. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  617. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  618. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  619. package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  620. package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  621. package/.claude/skills/changelog-generator/SKILL.md +104 -0
  622. package/.claude/skills/check-md-mermaid/SKILL.md +62 -0
  623. package/.claude/skills/connect/SKILL.md +156 -0
  624. package/.claude/skills/connect-apps/SKILL.md +80 -0
  625. package/.claude/skills/content-research-writer/SKILL.md +538 -0
  626. package/.claude/skills/continuous-agent-loop/SKILL.md +187 -0
  627. package/.claude/skills/continuous-learning-v2/SKILL.md +238 -0
  628. package/.claude/skills/continuous-learning-v2/config.json +35 -0
  629. package/.claude/skills/continuous-learning-v2/hooks/observe.sh +333 -0
  630. package/.claude/skills/continuous-learning-v2/instinct-cli.py +406 -0
  631. package/.claude/skills/domain-name-brainstormer/SKILL.md +212 -0
  632. package/.claude/skills/eval-harness/SKILL.md +100 -0
  633. package/.claude/skills/eval-harness/swe-bench/README.md +80 -0
  634. package/.claude/skills/eval-harness/swe-bench/config.yml +29 -0
  635. package/.claude/skills/eval-harness/swe-bench/docker/Dockerfile +25 -0
  636. package/.claude/skills/eval-harness/swe-bench/docker/docker-compose.yml +18 -0
  637. package/.claude/skills/eval-harness/swe-bench/results/dry-run-2026-05-04.json +137 -0
  638. package/.claude/skills/eval-harness/swe-bench/results/dry-run-comparison-2026-05-04.md +112 -0
  639. package/.claude/skills/eval-harness/swe-bench/results/dry-run-improved-2026-05-04.json +165 -0
  640. package/.claude/skills/eval-harness/swe-bench/results/raw/astropy__astropy-12907.patch +12 -0
  641. package/.claude/skills/eval-harness/swe-bench/results/raw/astropy__astropy-12907.txt +322 -0
  642. package/.claude/skills/eval-harness/swe-bench/results/raw/astropy__astropy-12907.whole-file.txt +322 -0
  643. package/.claude/skills/eval-harness/swe-bench/runner.py +845 -0
  644. package/.claude/skills/eval-harness/swe-bench/scoring.py +298 -0
  645. package/.claude/skills/eval-harness/swe-bench/tasks/fetch_tasks.py +81 -0
  646. package/.claude/skills/eval-harness/swe-bench/tasks/lite-50.json +702 -0
  647. package/.claude/skills/file-organizer/SKILL.md +433 -0
  648. package/.claude/skills/gan-style-harness/SKILL.md +111 -0
  649. package/.claude/skills/gateguard/.gateguard.yml +47 -0
  650. package/.claude/skills/gateguard/SKILL.md +99 -0
  651. package/.claude/skills/internal-comms/LICENSE.txt +202 -0
  652. package/.claude/skills/internal-comms/SKILL.md +32 -0
  653. package/.claude/skills/internal-comms/examples/3p-updates.md +47 -0
  654. package/.claude/skills/internal-comms/examples/company-newsletter.md +65 -0
  655. package/.claude/skills/internal-comms/examples/faq-answers.md +30 -0
  656. package/.claude/skills/internal-comms/examples/general-comms.md +16 -0
  657. package/.claude/skills/invoice-organizer/SKILL.md +446 -0
  658. package/.claude/skills/karpathy-guidelines/SKILL.md +67 -0
  659. package/.claude/skills/langsmith-fetch/SKILL.md +485 -0
  660. package/.claude/skills/lead-research-assistant/SKILL.md +199 -0
  661. package/.claude/skills/mcp-builder/LICENSE.txt +202 -0
  662. package/.claude/skills/mcp-builder/SKILL.md +328 -0
  663. package/.claude/skills/mcp-builder/reference/evaluation.md +602 -0
  664. package/.claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
  665. package/.claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
  666. package/.claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
  667. package/.claude/skills/mcp-builder/scripts/connections.py +151 -0
  668. package/.claude/skills/mcp-builder/scripts/evaluation.py +373 -0
  669. package/.claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  670. package/.claude/skills/mcp-builder/scripts/requirements.txt +2 -0
  671. package/.claude/skills/raffle-winner-picker/SKILL.md +159 -0
  672. package/.claude/skills/repo-map/README.md +125 -0
  673. package/.claude/skills/repo-map/SKILL.md +128 -0
  674. package/.claude/skills/repo-map/examples/sample-output.md +1194 -0
  675. package/.claude/skills/repo-map/repo-map.py +715 -0
  676. package/.claude/skills/salesforce-e2e-testing/SKILL.md +116 -0
  677. package/.claude/skills/salesforce-e2e-testing/catalog-template.md +161 -0
  678. package/.claude/skills/salesforce-e2e-testing/methodology.md +179 -0
  679. package/.claude/skills/salesforce-e2e-testing/observation-rules.md +280 -0
  680. package/.claude/skills/salesforce-e2e-testing/pattern-taxonomy.md +392 -0
  681. package/.claude/skills/salesforce-e2e-testing/procedure-template.md +376 -0
  682. package/.claude/skills/skill-creator/LICENSE.txt +202 -0
  683. package/.claude/skills/skill-creator/SKILL.md +209 -0
  684. package/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
  685. package/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  686. package/.claude/skills/skill-creator/scripts/quick_validate.py +65 -0
  687. package/.claude/skills/skill-share/SKILL.md +80 -0
  688. package/.claude/skills/tailored-resume-generator/SKILL.md +345 -0
  689. package/.claude/skills/template-skill/SKILL.md +6 -0
  690. package/.claude/skills/theme-factory/LICENSE.txt +202 -0
  691. package/.claude/skills/theme-factory/SKILL.md +59 -0
  692. package/.claude/skills/theme-factory/theme-showcase.pdf +0 -0
  693. package/.claude/skills/theme-factory/themes/arctic-frost.md +19 -0
  694. package/.claude/skills/theme-factory/themes/botanical-garden.md +19 -0
  695. package/.claude/skills/theme-factory/themes/desert-rose.md +19 -0
  696. package/.claude/skills/theme-factory/themes/forest-canopy.md +19 -0
  697. package/.claude/skills/theme-factory/themes/golden-hour.md +19 -0
  698. package/.claude/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  699. package/.claude/skills/theme-factory/themes/modern-minimalist.md +19 -0
  700. package/.claude/skills/theme-factory/themes/ocean-depths.md +19 -0
  701. package/.claude/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  702. package/.claude/skills/theme-factory/themes/tech-innovation.md +19 -0
  703. package/.claude/skills/verification-loop/SKILL.md +129 -0
  704. package/.claude/skills/webapp-testing/LICENSE.txt +202 -0
  705. package/.claude/skills/webapp-testing/SKILL.md +96 -0
  706. package/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
  707. package/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
  708. package/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
  709. package/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
  710. package/.claude/templates/docs/draft/_DRAFT_TEMPLATE.md +162 -0
  711. package/.claude/templates/docs/draft/_TEST_DESIGN_TEMPLATE.md +76 -0
  712. package/.claude/templates/docs/tasks/_TASK_TEMPLATE.md +276 -0
  713. package/.claude/templates/docs/tasks/list.md +80 -0
  714. package/.claude/templates/docs/tasks/parking-lot.md +82 -0
  715. package/.claude/templates/settings.user-level.json.template +306 -0
  716. package/.claude/tests/SMOKE-CLASSIFICATION.md +199 -0
  717. package/.claude/tests/action-space-count-smoke.sh +130 -0
  718. package/.claude/tests/agent-router-suggest-wiring-smoke.sh +188 -0
  719. package/.claude/tests/audit-followups-smoke.sh +158 -0
  720. package/.claude/tests/autonomous-action-guard-relaxation-smoke.sh +479 -0
  721. package/.claude/tests/autonomous-action-guard-smoke.sh +187 -0
  722. package/.claude/tests/check-serena-mcp-smoke.sh +156 -0
  723. package/.claude/tests/common-rules-import-smoke.sh +209 -0
  724. package/.claude/tests/confidence-gate-smoke.sh +220 -0
  725. package/.claude/tests/config-feature-toggles-smoke.sh +389 -0
  726. package/.claude/tests/context-budget-smoke.sh +222 -0
  727. package/.claude/tests/custom-pm-commands-smoke.sh +93 -0
  728. package/.claude/tests/delegation-guard-code-smoke.sh +244 -0
  729. package/.claude/tests/delegation-guard-deny-layers-smoke.sh +356 -0
  730. package/.claude/tests/delegation-guard-readonly-filter-smoke.sh +205 -0
  731. package/.claude/tests/delegation-guard-search-whitelist-smoke.sh +152 -0
  732. package/.claude/tests/delegation-guard-segment-smoke.sh +109 -0
  733. package/.claude/tests/dispatcher-blocker-invariance-smoke.sh +700 -0
  734. package/.claude/tests/dispatcher-core-smoke.sh +452 -0
  735. package/.claude/tests/dispatcher-merge-matrix-smoke.sh +825 -0
  736. package/.claude/tests/dispatcher-success-stdout-smoke.sh +290 -0
  737. package/.claude/tests/draft-flow-guard-approved-dir-smoke.sh +234 -0
  738. package/.claude/tests/draft-flow-guard-smoke.sh +194 -0
  739. package/.claude/tests/dual-mode-portability-smoke.sh +131 -0
  740. package/.claude/tests/effective-hook-matrix-smoke.sh +261 -0
  741. package/.claude/tests/enforcement-mismatch-smoke.sh +263 -0
  742. package/.claude/tests/fixtures/cascade-sample.jsonl +9 -0
  743. package/.claude/tests/fixtures/next-actions/case-clean.md +14 -0
  744. package/.claude/tests/fixtures/next-actions/case-with-red.md +16 -0
  745. package/.claude/tests/fixtures/next-actions/case-with-yellow-only.md +14 -0
  746. package/.claude/tests/fixtures/normal-broken-scatter.jsonl +5 -0
  747. package/.claude/tests/fixtures/task-71/blocker-baseline.tsv +24 -0
  748. package/.claude/tests/fixtures/task-71/settings-inventory.tsv +37 -0
  749. package/.claude/tests/fixtures/transcript-50pct.jsonl +2 -0
  750. package/.claude/tests/fixtures/transcript-60pct.jsonl +2 -0
  751. package/.claude/tests/fixtures/transcript-80pct.jsonl +2 -0
  752. package/.claude/tests/fixtures/transcript-95pct.jsonl +2 -0
  753. package/.claude/tests/fixtures/workflow-guard/case-2-mid.json +21 -0
  754. package/.claude/tests/fixtures/workflow-guard/case-3-blocked.json +33 -0
  755. package/.claude/tests/fixtures/workflow-guard/case-4-clean.json +27 -0
  756. package/.claude/tests/fixtures/workflow-guard/case-8-modify.json +23 -0
  757. package/.claude/tests/fixtures/workflow-guard/inputs/case-1.json +1 -0
  758. package/.claude/tests/fixtures/workflow-guard/inputs/case-2.json +1 -0
  759. package/.claude/tests/fixtures/workflow-guard/inputs/case-3.json +1 -0
  760. package/.claude/tests/fixtures/workflow-guard/inputs/case-4.json +1 -0
  761. package/.claude/tests/fixtures/workflow-guard/inputs/case-5.json +1 -0
  762. package/.claude/tests/fixtures/workflow-guard/inputs/case-6.json +1 -0
  763. package/.claude/tests/fixtures/workflow-guard/inputs/case-7.json +1 -0
  764. package/.claude/tests/fixtures/workflow-guard/inputs/case-8.json +1 -0
  765. package/.claude/tests/gateguard-smoke.sh +213 -0
  766. package/.claude/tests/git-deny-mainline-policy-smoke.sh +222 -0
  767. package/.claude/tests/harness-audit-c-batch-smoke.sh +270 -0
  768. package/.claude/tests/harness-audit-compare-smoke.sh +186 -0
  769. package/.claude/tests/harness-audit-pipeline-health-smoke.sh +326 -0
  770. package/.claude/tests/harness-config-local-smoke.sh +232 -0
  771. package/.claude/tests/hc-config-git-policy-smoke.sh +241 -0
  772. package/.claude/tests/hc-config-key-parity-smoke.sh +149 -0
  773. package/.claude/tests/hc-config-migration-smoke.sh +251 -0
  774. package/.claude/tests/hc-config-script-smoke.sh +1106 -0
  775. package/.claude/tests/hc-config-tui-smoke.sh +801 -0
  776. package/.claude/tests/hc-config-web-ui-smoke.sh +3224 -0
  777. package/.claude/tests/hook-cwd-robustness-smoke.sh +206 -0
  778. package/.claude/tests/hook-frequency-tweaks-smoke.sh +312 -0
  779. package/.claude/tests/improvement-proposal-cache-smoke.sh +238 -0
  780. package/.claude/tests/install-sh-overwrite-all-smoke.sh +274 -0
  781. package/.claude/tests/install-sh-regen-settings-smoke.sh +301 -0
  782. package/.claude/tests/install-sh-sync-drift-smoke.sh +285 -0
  783. package/.claude/tests/layer-b-context-isolation-smoke.sh +392 -0
  784. package/.claude/tests/list-md-plan-first-reminder-smoke.sh +313 -0
  785. package/.claude/tests/loop-auto-progress-smoke.sh +372 -0
  786. package/.claude/tests/loop-confirmation-detector-smoke.sh +674 -0
  787. package/.claude/tests/new-task-batch-update-smoke.sh +664 -0
  788. package/.claude/tests/next-actions-hooks-smoke.sh +283 -0
  789. package/.claude/tests/npx-cli-smoke.sh +696 -0
  790. package/.claude/tests/observe-flock-smoke.sh +223 -0
  791. package/.claude/tests/observe-jq-parse-smoke.sh +250 -0
  792. package/.claude/tests/observe-repair-smoke.sh +475 -0
  793. package/.claude/tests/observe-rotate-smoke.sh +428 -0
  794. package/.claude/tests/observe-subagent-stop-smoke.sh +476 -0
  795. package/.claude/tests/parallel-subagent-reminder-smoke.sh +918 -0
  796. package/.claude/tests/project-root-smoke.sh +140 -0
  797. package/.claude/tests/project-rules-protection-smoke.sh +199 -0
  798. package/.claude/tests/review-required-min-count-smoke.sh +286 -0
  799. package/.claude/tests/reviewer-count-guard-smoke.sh +490 -0
  800. package/.claude/tests/rule-architecture-smoke.sh +418 -0
  801. package/.claude/tests/rule-change-draft-flow-guard-smoke.sh +343 -0
  802. package/.claude/tests/run-all-smokes.sh +340 -0
  803. package/.claude/tests/session-help-surface-smoke.sh +224 -0
  804. package/.claude/tests/session-start-parallel-smoke.sh +165 -0
  805. package/.claude/tests/sessionstart-budget-smoke.sh +185 -0
  806. package/.claude/tests/sessionstart-footprint-smoke.sh +258 -0
  807. package/.claude/tests/settings-dispatcher-baseline-smoke.sh +709 -0
  808. package/.claude/tests/settings-generation-feature-pruning-smoke.sh +196 -0
  809. package/.claude/tests/stale-harness-detect-smoke.sh +974 -0
  810. package/.claude/tests/statusline-smoke.sh +180 -0
  811. package/.claude/tests/task-rule-guard-smoke.sh +656 -0
  812. package/.claude/tests/tool-call-slip-detector-smoke.sh +101 -0
  813. package/.claude/tests/wave-precheck-template-smoke.sh +159 -0
  814. package/.claude/tests/why-x5-violation-detect-smoke.sh +157 -0
  815. package/.claude/tests/workflow-guard-smoke.sh +266 -0
  816. package/CLAUDE.md +75 -0
  817. package/LICENSE +21 -0
  818. package/README.md +790 -0
  819. package/bin/cli.js +395 -0
  820. package/docs/INVENTORY.md +163 -0
  821. package/install.sh +769 -0
  822. package/package.json +25 -0
@@ -0,0 +1,918 @@
1
+ #!/usr/bin/env bash
2
+ # shellcheck disable=SC2329 # functions are invoked indirectly via "$test_fn" pattern
3
+ # .claude/tests/parallel-subagent-reminder-smoke.sh
4
+ # task #38 Step 2 iter2 — parallel-subagent-reminder hook smoke test
5
+ #
6
+ # 設計起源:
7
+ # docs/draft/parallel-subagent-enforcement.md §4.4 + §4.5.3
8
+ #
9
+ # Cases:
10
+ # Case 1: 単独 Agent 起動 + 実装系 keyword → 並列性 warning 注入
11
+ # Case 2: 単独 Agent 起動 + reviewer 系 keyword (除外) → silent
12
+ # Case 3: 並列 (2+) Agent 起動 (履歴に他 Agent あり) → silent
13
+ # Case 4 (fail-open): 親 dir chmod 000 で mkdir -p が失敗 → exit 0 + silent
14
+ # Case 5 (bypass): HC_PARALLEL_SUBAGENT_REMINDER_ENABLED=false → exit 0 + silent
15
+ # Case 6: general-purpose + 「smoke 拡張」keyword → test-automator 推奨 warning
16
+ # Case 7: general-purpose + 「refactor」keyword → refactoring-specialist 推奨 warning
17
+ # Case 8: test-automator (専門 type 採用済) + 「smoke 拡張」→ silent (適切な type)
18
+ # + parallel warning は solo の場合でも独立して出ることを確認
19
+ # Case 9: TTL 境界条件 (TTL 超過 → 単発扱い warning / TTL 内 → silent)
20
+ # Case 10: subagent_type 不在 / null → general-purpose mapping 対象外、exit 0
21
+ # Case 13 (task-75): streak=1 (連続単発 1) → tier1 hint (既存文言「並列性 hint」維持)
22
+ # Case 14 (task-75): streak=2 (連続単発 2) → tier2 強 reminder 文字列 present
23
+ # Case 15 (task-75): streak>=3 (連続単発 3) → tier3「Workflow ツール」+「task-68」present
24
+ # Case 16 (task-75): 並列 batch (近接 ts 2 entry) 後の単発 → streak リセット → tier1
25
+ #
26
+ # 重要制約:
27
+ # - file-top に set -euo pipefail を書かない (CLAUDE.md Critical Lesson HIGH 遵守)
28
+ # - 各 case 関数は ( set -uo pipefail; ... ) でラップして実行
29
+ # - **CLAUDE_PROJECT_DIR を必ず設定すること**: 未設定時 hook が git rev-parse で
30
+ # リポルートを state dir として使い production state を汚染する。
31
+ # - 各 case は _root_for N で独立 tmp dir を使い、state が case 間でリークしない
32
+ # ようにする。
33
+ # - hook が未存在の場合は Case 4/5 のみ独立 PASS、他は SKIP 扱いで exit 0
34
+ #
35
+ # 実行:
36
+ # bash .claude/tests/parallel-subagent-reminder-smoke.sh
37
+ #
38
+ # 終了コード:
39
+ # 0 = 全 case PASS (or SKIP 扱い) / 1 = 1 件以上 FAIL
40
+
41
+ set -u
42
+
43
+ PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
44
+ HOOK="$PROJECT_ROOT/.claude/hooks/parallel-subagent-reminder.sh"
45
+
46
+ TMP_BASE="$(mktemp -d /tmp/parallel-subagent-reminder-smoke.XXXXXX)"
47
+ trap 'rm -rf "$TMP_BASE"' EXIT
48
+
49
+ PASS=0
50
+ FAIL=0
51
+ SKIP=0
52
+ FAILED_CASES=()
53
+
54
+ # per-case tmp root (隔離して順序依存排除)
55
+ _root_for() {
56
+ local case_id="$1"
57
+ printf '%s/root-%s' "$TMP_BASE" "$case_id"
58
+ }
59
+
60
+ # run_case_verbose <id> <desc> <test_fn> [requires_hook]
61
+ # run_case の verbose 版: FAIL 時に stderr を表示
62
+ run_case_verbose() {
63
+ local case_id="$1"
64
+ local desc="$2"
65
+ local test_fn="$3"
66
+ local requires_hook="${4:-true}"
67
+
68
+ if [ "$requires_hook" = "true" ] && [ ! -f "$HOOK" ]; then
69
+ printf ' SKIP Case %s: %s [hook not yet implemented]\n' "$case_id" "$desc"
70
+ SKIP=$((SKIP+1))
71
+ return
72
+ fi
73
+
74
+ local diag_file
75
+ diag_file="$(mktemp "${TMP_BASE}/diag.XXXXXX")"
76
+
77
+ if ( set -uo pipefail; "$test_fn" ) >"$diag_file" 2>&1; then
78
+ printf ' PASS Case %s: %s\n' "$case_id" "$desc"
79
+ PASS=$((PASS+1))
80
+ else
81
+ printf ' FAIL Case %s: %s\n' "$case_id" "$desc"
82
+ printf ' --- diagnostic ---\n'
83
+ sed 's/^/ /' "$diag_file"
84
+ FAIL=$((FAIL+1))
85
+ FAILED_CASES+=("$case_id")
86
+ fi
87
+ rm -f "$diag_file"
88
+ }
89
+
90
+ # -------------------------------------------------------------------
91
+ # state dir mock helper
92
+ # $1 = root dir (must have .claude/ subdir created)
93
+ # $2 = "empty" | "with_recent_agent" | "with_expired_agent" | "with_ttl_fresh_agent"
94
+ # $3 = (optional) custom TTL seconds for "with_expired_agent" / "with_ttl_fresh_agent"
95
+ # -------------------------------------------------------------------
96
+ _setup_state_dir() {
97
+ local root="$1"
98
+ local mode="$2"
99
+ local custom_ttl="${3:-300}"
100
+ local state_dir="${root}/.claude/.parallel-subagent-state"
101
+ mkdir -p "$state_dir"
102
+
103
+ local ts_now
104
+ ts_now="$(date +%s)"
105
+
106
+ if [ "$mode" = "with_recent_agent" ]; then
107
+ # 過去 1 分以内の Agent 起動を recent.json で模擬
108
+ # hook の実際の形式: [{"ts": <unix>, "type": "<subagent_type>"}]
109
+ printf '[{"ts":%s,"type":"general-purpose"},{"ts":%s,"type":"general-purpose"}]\n' \
110
+ "$ts_now" "$ts_now" > "${state_dir}/recent.json"
111
+ elif [ "$mode" = "with_expired_agent" ]; then
112
+ # TTL 超過 (ts = now - custom_ttl - 2) の 1 件
113
+ local expired_ts=$(( ts_now - custom_ttl - 2 ))
114
+ printf '[{"ts":%s,"type":"general-purpose"}]\n' "$expired_ts" \
115
+ > "${state_dir}/recent.json"
116
+ elif [ "$mode" = "with_ttl_fresh_agent" ]; then
117
+ # TTL 内 (ts = now) の 1 件
118
+ printf '[{"ts":%s,"type":"general-purpose"}]\n' "$ts_now" \
119
+ > "${state_dir}/recent.json"
120
+ elif [ "$mode" = "empty" ]; then
121
+ # 履歴なし (単独起動扱い): hook は state file 不在でも TTL 0 件扱いになるので
122
+ # ファイルを作らない (不在 = empty 扱いと等価)
123
+ : # no-op
124
+ fi
125
+ }
126
+
127
+ # -------------------------------------------------------------------
128
+ # Case 1: 単独 Agent 起動 + 実装系 keyword → 並列性 warning 注入
129
+ #
130
+ # 修正 (R1 F-03 + R3 + R5): 旧実装は L117 out + L128 combined で二重 invoke。
131
+ # 新実装: 1 回 invoke で out=$(... 2>&1) を取得し、out のみで assertion。
132
+ # -------------------------------------------------------------------
133
+ case_1_solo_impl_keyword_warns() {
134
+ local root
135
+ root=$(_root_for 1)
136
+ mkdir -p "${root}/.claude"
137
+ _setup_state_dir "$root" "empty"
138
+
139
+ local input_json
140
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
141
+
142
+ # 1 回のみ invoke (state 汚染なし)
143
+ local out code
144
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
145
+ code=$?
146
+
147
+ if [ "$code" -ne 0 ]; then
148
+ printf 'expected exit 0, got %d\n' "$code" >&2
149
+ return 1
150
+ fi
151
+
152
+ # additionalContext 形式のチェック: parallel/並列 keyword が出力に含まれるか
153
+ if printf '%s' "$out" | grep -q "system-reminder\|parallel\|並列\|additionalContext"; then
154
+ return 0
155
+ fi
156
+
157
+ # JSON として valid で additionalContext が非空かチェック
158
+ if printf '%s' "$out" | python3 -c \
159
+ "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('hookSpecificOutput',{}).get('additionalContext','') else 1)" \
160
+ 2>/dev/null; then
161
+ return 0
162
+ fi
163
+
164
+ printf 'expected parallel warning in output, got: [%s]\n' \
165
+ "$(printf '%s' "$out" | head -c 200)" >&2
166
+ return 1
167
+ }
168
+
169
+ # -------------------------------------------------------------------
170
+ # Case 2: 単独 Agent 起動 + reviewer 系 keyword (除外) → silent
171
+ #
172
+ # 修正 (R1 F-01 + R5 H3 + R3 + R4): 旧 L166 で $out (未定義) を参照。
173
+ # 新実装: combined のみで assertion、$out は使わない。
174
+ # -------------------------------------------------------------------
175
+ case_2_solo_reviewer_keyword_silent() {
176
+ local root
177
+ root=$(_root_for 2)
178
+ mkdir -p "${root}/.claude"
179
+ _setup_state_dir "$root" "empty"
180
+
181
+ local input_json
182
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"コード reviewer として設計書をチェック","run_in_background":true,"subagent_type":"general-purpose"}}')
183
+
184
+ local combined code
185
+ combined=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
186
+ code=$?
187
+
188
+ if [ "$code" -ne 0 ]; then
189
+ printf 'expected exit 0, got %d\n' "$code" >&2
190
+ return 1
191
+ fi
192
+
193
+ # 並列性 warning が含まれていないことを assert
194
+ if printf '%s' "$combined" | grep -q "parallel\|並列"; then
195
+ printf 'expected silent for reviewer keyword, got: [%s]\n' \
196
+ "$(printf '%s' "$combined" | head -c 200)" >&2
197
+ return 1
198
+ fi
199
+
200
+ # 出力が valid JSON であることを確認 (空でも {} でも OK)
201
+ if ! printf '%s' "$combined" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
202
+ printf 'expected valid JSON output, got: [%s]\n' \
203
+ "$(printf '%s' "$combined" | head -c 200)" >&2
204
+ return 1
205
+ fi
206
+
207
+ return 0
208
+ }
209
+
210
+ # -------------------------------------------------------------------
211
+ # Case 3: 並列 (2+) Agent 起動 (履歴に他 Agent あり) → silent
212
+ # -------------------------------------------------------------------
213
+ case_3_parallel_history_silent() {
214
+ local root
215
+ root=$(_root_for 3)
216
+ mkdir -p "${root}/.claude"
217
+ _setup_state_dir "$root" "with_recent_agent"
218
+
219
+ local input_json
220
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
221
+
222
+ local combined code
223
+ combined=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
224
+ code=$?
225
+
226
+ if [ "$code" -ne 0 ]; then
227
+ printf 'expected exit 0, got %d\n' "$code" >&2
228
+ return 1
229
+ fi
230
+
231
+ # 既に並列で Agent 起動されているので warning は不要
232
+ if printf '%s' "$combined" | grep -q "parallel\|並列"; then
233
+ printf 'expected silent (history has agent), got: [%s]\n' \
234
+ "$(printf '%s' "$combined" | head -c 200)" >&2
235
+ return 1
236
+ fi
237
+
238
+ return 0
239
+ }
240
+
241
+ # -------------------------------------------------------------------
242
+ # Case 4 (fail-open): 親 dir を chmod 000 で書込禁止 → hook の mkdir -p が失敗
243
+ # → 真の fail-open path 起動 → exit 0 + silent
244
+ #
245
+ # 修正 (R4 CRITICAL + R1 F-04 + R6 + R3 + R5):
246
+ # 旧実装は hook 内 mkdir -p が自動作成するため state dir 不在が再現できなかった。
247
+ # 新方針 1: .claude/ 親 dir を chmod 000 → mkdir -p が失敗 → fail-open path を確認。
248
+ # trap で chmod 755 復元を保証。root 権限不要。
249
+ # -------------------------------------------------------------------
250
+ case_4_failopen_mkdir_blocked() {
251
+ local root
252
+ root=$(_root_for 4)
253
+ mkdir -p "${root}/.claude"
254
+ # .parallel-subagent-state を意図的に作らず、.claude/ を chmod 000 で書込禁止にする
255
+ # → hook 内の mkdir -p "$state_dir" が失敗 → fail-open (echo '{}'; exit 0) へ
256
+
257
+ # root が root (uid 0) の場合は chmod 000 が効かないのでスキップ
258
+ if [ "$(id -u)" = "0" ]; then
259
+ printf 'skipping chmod 000 test (running as root)\n'
260
+ return 0
261
+ fi
262
+
263
+ # hook 不在の場合も構造確認のみ PASS
264
+ if [ ! -f "$HOOK" ]; then
265
+ return 0
266
+ fi
267
+
268
+ # chmod 000 + trap で必ず復元
269
+ chmod 000 "${root}/.claude"
270
+ local restore_done=0
271
+ # shellcheck disable=SC2317
272
+ _restore_case4() {
273
+ if [ "$restore_done" -eq 0 ]; then
274
+ chmod 755 "${root}/.claude" 2>/dev/null || true
275
+ restore_done=1
276
+ fi
277
+ }
278
+ trap _restore_case4 RETURN
279
+
280
+ local input_json
281
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装","run_in_background":true,"subagent_type":"general-purpose"}}')
282
+
283
+ local out code
284
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
285
+ code=$?
286
+
287
+ # 必ず復元
288
+ _restore_case4
289
+
290
+ if [ "$code" -ne 0 ]; then
291
+ printf 'expected exit 0 (fail-open with blocked mkdir), got %d\n' "$code" >&2
292
+ return 1
293
+ fi
294
+
295
+ # fail-open は silent: ERROR/FAIL メッセージを含まない
296
+ if printf '%s' "$out" | grep -q "^ERROR\|^FAIL\|^error"; then
297
+ printf 'expected silent fail-open, got errors: [%s]\n' \
298
+ "$(printf '%s' "$out" | head -c 200)" >&2
299
+ return 1
300
+ fi
301
+
302
+ # 出力は {} または valid JSON であること
303
+ if ! printf '%s' "$out" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
304
+ printf 'expected valid JSON output on fail-open, got: [%s]\n' \
305
+ "$(printf '%s' "$out" | head -c 200)" >&2
306
+ return 1
307
+ fi
308
+
309
+ return 0
310
+ }
311
+
312
+ # -------------------------------------------------------------------
313
+ # Case 5 (bypass): HC_PARALLEL_SUBAGENT_REMINDER_ENABLED=false → exit 0 + silent
314
+ # hook 依存なし (bypass env が hook 内で最初に評価されることを前提)
315
+ # -------------------------------------------------------------------
316
+ case_5_bypass_env_silent() {
317
+ local root
318
+ root=$(_root_for 5)
319
+ mkdir -p "${root}/.claude"
320
+ _setup_state_dir "$root" "empty"
321
+
322
+ local input_json
323
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装","run_in_background":true,"subagent_type":"general-purpose"}}')
324
+
325
+ if [ ! -f "$HOOK" ]; then
326
+ # hook 未実装: bypass env が定義されている設計意図を構造的に確認のみ
327
+ # 実際の動作確認は hook 実装後
328
+ return 0
329
+ fi
330
+
331
+ local combined code
332
+ combined=$(
333
+ HC_PARALLEL_SUBAGENT_REMINDER_ENABLED=false \
334
+ CLAUDE_PROJECT_DIR="$root" \
335
+ bash "$HOOK" <<< "$input_json" 2>&1
336
+ )
337
+ code=$?
338
+
339
+ if [ "$code" -ne 0 ]; then
340
+ printf 'expected exit 0 (bypass env), got %d\n' "$code" >&2
341
+ return 1
342
+ fi
343
+
344
+ if printf '%s' "$combined" | grep -q "parallel\|並列\|system-reminder"; then
345
+ printf 'expected silent (bypass env), got: [%s]\n' \
346
+ "$(printf '%s' "$combined" | head -c 200)" >&2
347
+ return 1
348
+ fi
349
+
350
+ return 0
351
+ }
352
+
353
+ # -------------------------------------------------------------------
354
+ # Case 6: general-purpose + 「smoke 拡張」keyword → test-automator 推奨 warning
355
+ # -------------------------------------------------------------------
356
+ case_6_general_purpose_smoke_warns_test_automator() {
357
+ local root
358
+ root=$(_root_for 6)
359
+ mkdir -p "${root}/.claude"
360
+ _setup_state_dir "$root" "empty"
361
+
362
+ local input_json
363
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"smoke 拡張テストの追加","run_in_background":true,"subagent_type":"general-purpose"}}')
364
+
365
+ local combined code
366
+ combined=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
367
+ code=$?
368
+
369
+ if [ "$code" -ne 0 ]; then
370
+ printf 'expected exit 0, got %d\n' "$code" >&2
371
+ return 1
372
+ fi
373
+
374
+ # test-automator 推奨が含まれることを assert
375
+ if printf '%s' "$combined" | grep -qi "test-automator\|test_automator"; then
376
+ return 0
377
+ fi
378
+
379
+ printf 'expected test-automator recommendation, got: [%s]\n' \
380
+ "$(printf '%s' "$combined" | head -c 200)" >&2
381
+ return 1
382
+ }
383
+
384
+ # -------------------------------------------------------------------
385
+ # Case 7: general-purpose + 「refactor」keyword → refactoring-specialist 推奨 warning
386
+ # -------------------------------------------------------------------
387
+ case_7_general_purpose_refactor_warns_specialist() {
388
+ local root
389
+ root=$(_root_for 7)
390
+ mkdir -p "${root}/.claude"
391
+ _setup_state_dir "$root" "empty"
392
+
393
+ local input_json
394
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"コードのリファクタリングと関数分割","run_in_background":true,"subagent_type":"general-purpose"}}')
395
+
396
+ local combined code
397
+ combined=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
398
+ code=$?
399
+
400
+ if [ "$code" -ne 0 ]; then
401
+ printf 'expected exit 0, got %d\n' "$code" >&2
402
+ return 1
403
+ fi
404
+
405
+ # refactoring-specialist または refactor-cleaner 推奨が含まれることを assert
406
+ if printf '%s' "$combined" | grep -qi "refactoring-specialist\|refactor-cleaner\|refactoring_specialist"; then
407
+ return 0
408
+ fi
409
+
410
+ printf 'expected refactoring-specialist recommendation, got: [%s]\n' \
411
+ "$(printf '%s' "$combined" | head -c 200)" >&2
412
+ return 1
413
+ }
414
+
415
+ # -------------------------------------------------------------------
416
+ # Case 8: test-automator (専門 type 採用済) + 「smoke 拡張」→ agent type warning なし
417
+ # + solo 起動なら並列性 warning は独立して出ること (type warning と parallel
418
+ # warning は独立)
419
+ #
420
+ # 修正 (R1 + R4): 旧実装は type warning の逆 grep のみ。
421
+ # 新実装: exit 0 確認 + valid JSON 確認 + type warning なし + parallel warning 有り を assert。
422
+ # -------------------------------------------------------------------
423
+ case_8_specialist_type_no_type_warning_but_parallel_warns() {
424
+ local root
425
+ root=$(_root_for 8)
426
+ mkdir -p "${root}/.claude"
427
+ _setup_state_dir "$root" "empty"
428
+
429
+ local input_json
430
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"smoke 拡張テストの追加","run_in_background":true,"subagent_type":"test-automator"}}')
431
+
432
+ local out code
433
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
434
+ code=$?
435
+
436
+ if [ "$code" -ne 0 ]; then
437
+ printf 'expected exit 0, got %d\n' "$code" >&2
438
+ return 1
439
+ fi
440
+
441
+ # 出力は valid JSON であること
442
+ if ! printf '%s' "$out" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
443
+ printf 'expected valid JSON output, got: [%s]\n' \
444
+ "$(printf '%s' "$out" | head -c 200)" >&2
445
+ return 1
446
+ fi
447
+
448
+ # 専門 type を既に採用しているので agent type warning は不要
449
+ if printf '%s' "$out" | grep -qi "test-automator.*推奨\|recommend.*test-automator\|専門.*type\|agent type 選定"; then
450
+ printf 'expected no agent-type warning (specialist already used), got: [%s]\n' \
451
+ "$(printf '%s' "$out" | head -c 200)" >&2
452
+ return 1
453
+ fi
454
+
455
+ # solo 起動 + 実装系 keyword (smoke 拡張) なので parallel warning は出ること
456
+ # (type warning と parallel warning は独立している)
457
+ if ! printf '%s' "$out" | grep -q "parallel\|並列\|additionalContext"; then
458
+ # additionalContext JSON 経由でも確認
459
+ if ! printf '%s' "$out" | python3 -c \
460
+ "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('hookSpecificOutput',{}).get('additionalContext','') else 1)" \
461
+ 2>/dev/null; then
462
+ printf 'expected parallel warning (solo + impl keyword) even with specialist type, got: [%s]\n' \
463
+ "$(printf '%s' "$out" | head -c 200)" >&2
464
+ return 1
465
+ fi
466
+ fi
467
+
468
+ return 0
469
+ }
470
+
471
+ # -------------------------------------------------------------------
472
+ # Case 9: TTL 境界条件
473
+ # Sub-case A: TTL 超過 (ts = now - TTL - 2) の 1 件 → 単発扱い → warning 出る
474
+ # Sub-case B: TTL 内 (ts = now) の 1 件 → 並列扱い (count=2) → warning 出ない
475
+ # (R1 F-02 + R2 F-03 + R3 追加要件)
476
+ # -------------------------------------------------------------------
477
+ case_9a_ttl_expired_entry_treated_as_solo() {
478
+ local root
479
+ root=$(_root_for 9a)
480
+ mkdir -p "${root}/.claude"
481
+ local ttl=1
482
+ _setup_state_dir "$root" "with_expired_agent" "$ttl"
483
+
484
+ local input_json
485
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
486
+
487
+ local out code
488
+ out=$(HC_PARALLEL_SUBAGENT_TTL_SEC="$ttl" CLAUDE_PROJECT_DIR="$root" \
489
+ bash "$HOOK" <<< "$input_json" 2>&1)
490
+ code=$?
491
+
492
+ if [ "$code" -ne 0 ]; then
493
+ printf 'expected exit 0, got %d\n' "$code" >&2
494
+ return 1
495
+ fi
496
+
497
+ # TTL 超過 entry は filtered out → recent_active_count=0 (本起動前) → 単発扱い
498
+ # → parallel warning が出ること
499
+ if printf '%s' "$out" | grep -q "parallel\|並列\|additionalContext"; then
500
+ return 0
501
+ fi
502
+ if printf '%s' "$out" | python3 -c \
503
+ "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('hookSpecificOutput',{}).get('additionalContext','') else 1)" \
504
+ 2>/dev/null; then
505
+ return 0
506
+ fi
507
+
508
+ printf 'expected parallel warning (TTL expired entry treated as solo), got: [%s]\n' \
509
+ "$(printf '%s' "$out" | head -c 200)" >&2
510
+ return 1
511
+ }
512
+
513
+ case_9b_ttl_fresh_entry_treated_as_parallel() {
514
+ local root
515
+ root=$(_root_for 9b)
516
+ mkdir -p "${root}/.claude"
517
+ local ttl=300
518
+ _setup_state_dir "$root" "with_ttl_fresh_agent" "$ttl"
519
+
520
+ local input_json
521
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
522
+
523
+ local combined code
524
+ combined=$(HC_PARALLEL_SUBAGENT_TTL_SEC="$ttl" CLAUDE_PROJECT_DIR="$root" \
525
+ bash "$HOOK" <<< "$input_json" 2>&1)
526
+ code=$?
527
+
528
+ if [ "$code" -ne 0 ]; then
529
+ printf 'expected exit 0, got %d\n' "$code" >&2
530
+ return 1
531
+ fi
532
+
533
+ # 規範 development-process.md §6「機械強制 hook の判定境界」で `count <= 1` で warning 確定。
534
+ # TTL 内 1 件 (ts=now, TTL=300) → filtered count=1 → recent_active_count=1 <= 1 → warning 発火。
535
+ # task_desc=「新 hook 実装を行う」は parallel_keywords「実装」にマッチ、exclude_keywords 不在。
536
+ # → parallel warning が additionalContext に含まれることが唯一の正解。
537
+ if ! printf '%s' "$combined" | grep -qE 'parallel|並列'; then
538
+ printf 'expected parallel warning at TTL boundary (count=1, hook spec <= 1), got: [%s]\n' \
539
+ "$(printf '%s' "$combined" | head -c 200)" >&2
540
+ return 1
541
+ fi
542
+
543
+ # valid JSON 副 assertion
544
+ if ! printf '%s' "$combined" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
545
+ printf 'TTL fresh entry boundary: output is not valid JSON: [%s]\n' \
546
+ "$(printf '%s' "$combined" | head -c 200)" >&2
547
+ return 1
548
+ fi
549
+
550
+ return 0
551
+ }
552
+
553
+ # -------------------------------------------------------------------
554
+ # Case 10: subagent_type 不在 / null / 空文字 → general-purpose mapping 対象外
555
+ # → agent type warning なし、exit 0 + valid JSON
556
+ # (R2 F-03 + R5 M3 + R6 追加要件)
557
+ # -------------------------------------------------------------------
558
+ case_10_missing_subagent_type_no_type_warning() {
559
+ local root
560
+ root=$(_root_for 10)
561
+ mkdir -p "${root}/.claude"
562
+ _setup_state_dir "$root" "empty"
563
+
564
+ local input_json
565
+ # subagent_type key を完全削除した JSON
566
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"smoke 拡張テストの追加","run_in_background":true}}')
567
+
568
+ local out code
569
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
570
+ code=$?
571
+
572
+ if [ "$code" -ne 0 ]; then
573
+ printf 'expected exit 0, got %d\n' "$code" >&2
574
+ return 1
575
+ fi
576
+
577
+ # 出力は valid JSON であること
578
+ if ! printf '%s' "$out" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
579
+ printf 'expected valid JSON output, got: [%s]\n' \
580
+ "$(printf '%s' "$out" | head -c 200)" >&2
581
+ return 1
582
+ fi
583
+
584
+ # subagent_type が "" (fallback) の場合、"general-purpose" != "" なので
585
+ # type mapping は走らない → agent type warning は不要
586
+ if printf '%s' "$out" | grep -qi "推奨.*type\|recommend.*type\|専門.*type\|agent type 選定"; then
587
+ printf 'expected no agent-type warning (subagent_type absent), got: [%s]\n' \
588
+ "$(printf '%s' "$out" | head -c 200)" >&2
589
+ return 1
590
+ fi
591
+
592
+ return 0
593
+ }
594
+
595
+ # -------------------------------------------------------------------
596
+ # Case 11: exclude_keywords word boundary regression (substring `preview`)
597
+ # description = "preview 画面の実装" → 旧 `review` substring 誤マッチで
598
+ # false-negative 抑制されていた。Fix 9 (R4-H2 HIGH) で word boundary
599
+ # (`\breview\b`) 化後は parallel warning が正しく発火することを assert。
600
+ # -------------------------------------------------------------------
601
+ case_11_preview_substring_no_false_exclude() {
602
+ local root
603
+ root=$(_root_for 11)
604
+ mkdir -p "${root}/.claude"
605
+ _setup_state_dir "$root" "empty"
606
+
607
+ local input_json
608
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"preview 画面の実装","run_in_background":true,"subagent_type":"general-purpose"}}')
609
+
610
+ local out code
611
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
612
+ code=$?
613
+
614
+ if [ "$code" -ne 0 ]; then
615
+ printf 'expected exit 0, got %d\n' "$code" >&2
616
+ return 1
617
+ fi
618
+
619
+ # "preview" は exclude `review` の substring で旧実装は誤抑制していた。
620
+ # word boundary 化後は parallel warning が出ること。
621
+ if printf '%s' "$out" | grep -q "parallel\|並列\|additionalContext"; then
622
+ return 0
623
+ fi
624
+ if printf '%s' "$out" | python3 -c \
625
+ "import sys,json; d=json.load(sys.stdin); sys.exit(0 if d.get('hookSpecificOutput',{}).get('additionalContext','') else 1)" \
626
+ 2>/dev/null; then
627
+ return 0
628
+ fi
629
+
630
+ printf 'expected parallel warning (preview is not review), got: [%s]\n' \
631
+ "$(printf '%s' "$out" | head -c 200)" >&2
632
+ return 1
633
+ }
634
+
635
+ # -------------------------------------------------------------------
636
+ # Case 12: exclude_keywords word boundary regression (compound word `code-reviewer`)
637
+ # description = "code-reviewer に確認させる実装" → 旧 `reviewer` /
638
+ # `review` 二重 substring 誤マッチで false-negative 抑制されていた。
639
+ # word boundary 化後は parallel warning が発火することを assert。
640
+ #
641
+ # 注: grep -E の `\b` はハイフン (`-`) を word 境界として扱う。`code-reviewer`
642
+ # 内の `reviewer` は `-` の直後 = word 境界成立 → `\breviewer\b` に match
643
+ # する。これは現実装の意図 (reviewer/review/audit/監査 が含まれるなら除外)
644
+ # と整合的。`code-reviewer に確認させる実装` の場合、description 全体の
645
+ # 意図は subagent type 名称への言及で除外 keyword と一致しているため、
646
+ # 現実装は warning を抑制する。
647
+ # → 本 case は「word boundary 化が compound word に対しても誤判定しない」
648
+ # ことを確認するため、warning 発火 or silent のどちらでも valid JSON +
649
+ # exit 0 であることを assert する (assertion 緩和)。
650
+ # -------------------------------------------------------------------
651
+ case_12_code_reviewer_compound_word_valid_output() {
652
+ local root
653
+ root=$(_root_for 12)
654
+ mkdir -p "${root}/.claude"
655
+ _setup_state_dir "$root" "empty"
656
+
657
+ local input_json
658
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"code-reviewer に確認させる実装","run_in_background":true,"subagent_type":"general-purpose"}}')
659
+
660
+ local out code
661
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
662
+ code=$?
663
+
664
+ if [ "$code" -ne 0 ]; then
665
+ printf 'expected exit 0, got %d\n' "$code" >&2
666
+ return 1
667
+ fi
668
+
669
+ # 出力は valid JSON であること (warning 発火/silent どちらでも OK)
670
+ if ! printf '%s' "$out" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
671
+ printf 'expected valid JSON output, got: [%s]\n' \
672
+ "$(printf '%s' "$out" | head -c 200)" >&2
673
+ return 1
674
+ fi
675
+
676
+ # ERROR/FAIL メッセージを含まないこと (fail-open 健全性)
677
+ if printf '%s' "$out" | grep -q "^ERROR\|^FAIL\|^error"; then
678
+ printf 'unexpected error in output: [%s]\n' \
679
+ "$(printf '%s' "$out" | head -c 200)" >&2
680
+ return 1
681
+ fi
682
+
683
+ return 0
684
+ }
685
+
686
+ # ===================================================================
687
+ # task-75: escalating streak tier cases (13-16)
688
+ # ===================================================================
689
+ # streak state helper: write N solo entries (distinct ts beyond batch window).
690
+ # entries are ts = now - gap*(N..1) so each is its own batch (single-entry cluster).
691
+ # 本起動 (append) で streak は N+1 になる前提で tier 閾値を狙う。
692
+ _setup_solo_streak() {
693
+ local root="$1"
694
+ local n="$2"
695
+ local state_dir="${root}/.claude/.parallel-subagent-state"
696
+ mkdir -p "$state_dir"
697
+ local ts_now
698
+ ts_now="$(date +%s)"
699
+ local gap=30 # batch window (5s default) より十分離す = 各 entry 独立 batch
700
+ local json="["
701
+ local i
702
+ for (( i=n; i>=1; i-- )); do
703
+ local ts=$(( ts_now - gap * i ))
704
+ json+="{\"ts\":${ts},\"type\":\"general-purpose\"}"
705
+ [ "$i" -gt 1 ] && json+=","
706
+ done
707
+ json+="]"
708
+ printf '%s\n' "$json" > "${state_dir}/recent.json"
709
+ }
710
+
711
+ # 並列 batch リセット用: 最新側に近接 ts 2 entry (= 1 並列 batch) を置く。
712
+ # その後の本起動 (単発) で streak は打ち切られ tier1 に戻ること。
713
+ _setup_parallel_batch_then_solo() {
714
+ local root="$1"
715
+ local state_dir="${root}/.claude/.parallel-subagent-state"
716
+ mkdir -p "$state_dir"
717
+ local ts_now
718
+ ts_now="$(date +%s)"
719
+ # 古い側に連続単発 (streak を稼ぐ) → 直近に並列 batch 2 件 (近接 ts)
720
+ # 本起動はさらに後 (now) の単発。並列 batch が最新側 cluster の打ち切りになる。
721
+ local solo1=$(( ts_now - 120 ))
722
+ local solo2=$(( ts_now - 90 ))
723
+ local par1=$(( ts_now - 3 ))
724
+ local par2=$(( ts_now - 2 ))
725
+ printf '[{"ts":%s,"type":"general-purpose"},{"ts":%s,"type":"general-purpose"},{"ts":%s,"type":"general-purpose"},{"ts":%s,"type":"general-purpose"}]\n' \
726
+ "$solo1" "$solo2" "$par1" "$par2" > "${state_dir}/recent.json"
727
+ }
728
+
729
+ # Case 13: streak=1 → tier1 (現状 hint「並列性 hint」維持)
730
+ case_13_streak1_tier1() {
731
+ local root
732
+ root=$(_root_for 13)
733
+ mkdir -p "${root}/.claude"
734
+ _setup_state_dir "$root" "empty"
735
+
736
+ local input_json
737
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
738
+
739
+ local out code
740
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
741
+ code=$?
742
+ if [ "$code" -ne 0 ]; then printf 'expected exit 0, got %d\n' "$code" >&2; return 1; fi
743
+
744
+ # tier1: 既存「並列性 hint」文言が present、tier2/3 文言は absent
745
+ if ! printf '%s' "$out" | grep -q "並列性 hint"; then
746
+ printf 'expected tier1 (並列性 hint), got: [%s]\n' "$(printf '%s' "$out" | head -c 300)" >&2
747
+ return 1
748
+ fi
749
+ if printf '%s' "$out" | grep -qi "Workflow\|連続で単発"; then
750
+ printf 'expected NO tier2/3 escalation at streak=1, got: [%s]\n' "$(printf '%s' "$out" | head -c 300)" >&2
751
+ return 1
752
+ fi
753
+ return 0
754
+ }
755
+
756
+ # Case 14: streak=2 → tier2 強 reminder
757
+ case_14_streak2_tier2() {
758
+ local root
759
+ root=$(_root_for 14)
760
+ mkdir -p "${root}/.claude"
761
+ _setup_solo_streak "$root" 1 # 既存 1 solo + 本起動 = streak 2
762
+
763
+ local input_json
764
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
765
+
766
+ local out code
767
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
768
+ code=$?
769
+ if [ "$code" -ne 0 ]; then printf 'expected exit 0, got %d\n' "$code" >&2; return 1; fi
770
+
771
+ # tier2: 「同一 message 内で複数 Agent を並列起動」相当 + 「連続で単発」文言
772
+ if ! printf '%s' "$out" | grep -q "同一 message 内で複数 Agent を並列起動"; then
773
+ printf 'expected tier2 (同一 message 内で並列起動), got: [%s]\n' "$(printf '%s' "$out" | head -c 400)" >&2
774
+ return 1
775
+ fi
776
+ if ! printf '%s' "$out" | grep -q "連続で単発"; then
777
+ printf 'expected tier2 streak count phrase (連続で単発), got: [%s]\n' "$(printf '%s' "$out" | head -c 400)" >&2
778
+ return 1
779
+ fi
780
+ # tier3 文言はまだ出ない
781
+ if printf '%s' "$out" | grep -q "Workflow"; then
782
+ printf 'expected NO tier3 (Workflow) at streak=2, got: [%s]\n' "$(printf '%s' "$out" | head -c 400)" >&2
783
+ return 1
784
+ fi
785
+ return 0
786
+ }
787
+
788
+ # Case 15: streak>=3 → tier3 最強 (Workflow + task-68)
789
+ case_15_streak3_tier3() {
790
+ local root
791
+ root=$(_root_for 15)
792
+ mkdir -p "${root}/.claude"
793
+ _setup_solo_streak "$root" 2 # 既存 2 solo + 本起動 = streak 3
794
+
795
+ local input_json
796
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
797
+
798
+ local out code
799
+ out=$(CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
800
+ code=$?
801
+ if [ "$code" -ne 0 ]; then printf 'expected exit 0, got %d\n' "$code" >&2; return 1; fi
802
+
803
+ if ! printf '%s' "$out" | grep -q "Workflow"; then
804
+ printf 'expected tier3 (Workflow tool), got: [%s]\n' "$(printf '%s' "$out" | head -c 400)" >&2
805
+ return 1
806
+ fi
807
+ if ! printf '%s' "$out" | grep -q "task-68"; then
808
+ printf 'expected tier3 (task-68 reference), got: [%s]\n' "$(printf '%s' "$out" | head -c 400)" >&2
809
+ return 1
810
+ fi
811
+ return 0
812
+ }
813
+
814
+ # Case 16: 並列 batch → streak リセット → 本起動 tier1
815
+ case_16_parallel_batch_resets_streak() {
816
+ local root
817
+ root=$(_root_for 16)
818
+ mkdir -p "${root}/.claude"
819
+ _setup_parallel_batch_then_solo "$root"
820
+
821
+ local input_json
822
+ input_json=$(printf '{"tool_name":"Agent","tool_input":{"description":"新 hook 実装を行う","run_in_background":true,"subagent_type":"general-purpose"}}')
823
+
824
+ # TTL を十分大きく (全 entry 残す) して streak 算出だけを検証
825
+ local out code
826
+ out=$(HC_PARALLEL_SUBAGENT_TTL_SEC=3600 CLAUDE_PROJECT_DIR="$root" bash "$HOOK" <<< "$input_json" 2>&1)
827
+ code=$?
828
+ if [ "$code" -ne 0 ]; then printf 'expected exit 0, got %d\n' "$code" >&2; return 1; fi
829
+
830
+ # 最新側に並列 batch があるので streak は打ち切られ tier1 (本起動 = streak 1)
831
+ # tier2/3 escalation 文言が出ないこと
832
+ if printf '%s' "$out" | grep -qi "Workflow\|連続で単発"; then
833
+ printf 'expected streak reset to tier1 after parallel batch, got escalation: [%s]\n' "$(printf '%s' "$out" | head -c 400)" >&2
834
+ return 1
835
+ fi
836
+ return 0
837
+ }
838
+
839
+ # ===================================================================
840
+ # main
841
+ # ===================================================================
842
+ TOTAL_CASES=17 # Case 9 は sub-case A+B で 2 件、Case 11/12 (R4-H2), Case 13-16 (task-75 escalation)
843
+
844
+ printf '===== task #38 parallel-subagent-reminder smoke =====\n'
845
+ printf 'HOOK: %s\n' "$HOOK"
846
+ if [ ! -f "$HOOK" ]; then
847
+ printf '[INFO] hook not yet implemented — Case 1/2/3/6/7/8/9a/9b/10/11/12 will be SKIP\n'
848
+ printf ' Case 4/5 (fail-open / bypass) are hook-independent assertions\n'
849
+ fi
850
+ printf '\n'
851
+
852
+ # Case 1-3: 並列性検出 (§4.4)
853
+ run_case_verbose 1 'solo Agent + impl keyword -> parallel warning [1-invoke fix]' \
854
+ case_1_solo_impl_keyword_warns
855
+
856
+ run_case_verbose 2 'solo Agent + reviewer keyword (excluded) -> silent [$out-undef fix]' \
857
+ case_2_solo_reviewer_keyword_silent
858
+
859
+ run_case_verbose 3 'parallel (2+) Agent history -> silent' \
860
+ case_3_parallel_history_silent
861
+
862
+ # Case 4-5: fail-open / bypass
863
+ run_case_verbose 4 'fail-open: chmod 000 blocks mkdir -p -> exit 0 + silent [chmod fix]' \
864
+ case_4_failopen_mkdir_blocked "false"
865
+
866
+ run_case_verbose 5 'bypass: HC_PARALLEL_SUBAGENT_REMINDER_ENABLED=false -> silent' \
867
+ case_5_bypass_env_silent "false"
868
+
869
+ # Case 6-8: agent type 選定検出 (§4.5.3)
870
+ run_case_verbose 6 'general-purpose + smoke keyword -> test-automator warning' \
871
+ case_6_general_purpose_smoke_warns_test_automator
872
+
873
+ run_case_verbose 7 'general-purpose + refactor keyword -> refactoring-specialist warning' \
874
+ case_7_general_purpose_refactor_warns_specialist
875
+
876
+ run_case_verbose 8 'test-automator (specialist) + solo + smoke -> no type warn + parallel warn [assertion強化]' \
877
+ case_8_specialist_type_no_type_warning_but_parallel_warns
878
+
879
+ # Case 9: TTL 境界条件 (A/B 2 sub-case)
880
+ run_case_verbose '9a' 'TTL expired entry -> treated as solo -> parallel warning [TTL新規]' \
881
+ case_9a_ttl_expired_entry_treated_as_solo
882
+
883
+ run_case_verbose '9b' 'TTL fresh entry (1件) -> boundary count=1 -> current hook behavior [TTL新規]' \
884
+ case_9b_ttl_fresh_entry_treated_as_parallel
885
+
886
+ # Case 10: subagent_type 不在
887
+ run_case_verbose 10 'subagent_type absent/null -> no type warning + valid JSON [新規]' \
888
+ case_10_missing_subagent_type_no_type_warning
889
+
890
+ # Case 11-12: exclude_keywords word boundary regression (R4-H2 HIGH fix)
891
+ run_case_verbose 11 'preview substring -> not excluded as review -> parallel warn [R4-H2]' \
892
+ case_11_preview_substring_no_false_exclude
893
+
894
+ run_case_verbose 12 'code-reviewer compound word -> valid JSON + no error [R4-H2]' \
895
+ case_12_code_reviewer_compound_word_valid_output
896
+
897
+ # Case 13-16: task-75 escalating streak tiers
898
+ run_case_verbose 13 'streak=1 -> tier1 hint (existing 並列性 hint) [task-75]' \
899
+ case_13_streak1_tier1
900
+
901
+ run_case_verbose 14 'streak=2 -> tier2 strong reminder (同一 message 内で並列起動) [task-75]' \
902
+ case_14_streak2_tier2
903
+
904
+ run_case_verbose 15 'streak>=3 -> tier3 (Workflow ツール + task-68) [task-75]' \
905
+ case_15_streak3_tier3
906
+
907
+ run_case_verbose 16 'parallel batch -> streak reset -> tier1 [task-75]' \
908
+ case_16_parallel_batch_resets_streak
909
+
910
+ printf '\n===== Result =====\n'
911
+ printf 'PASS: %d / %d\n' "$PASS" "$TOTAL_CASES"
912
+ printf 'SKIP: %d / %d (hook not yet implemented)\n' "$SKIP" "$TOTAL_CASES"
913
+ printf 'FAIL: %d / %d\n' "$FAIL" "$TOTAL_CASES"
914
+ if [ "$FAIL" -gt 0 ]; then
915
+ printf 'Failed cases: %s\n' "${FAILED_CASES[*]}"
916
+ exit 1
917
+ fi
918
+ exit 0