@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,1106 @@
1
+ #!/usr/bin/env bash
2
+ # .claude/tests/hc-config-script-smoke.sh — task-46 Step 1 → iter 2 → iter 3 → iter 4
3
+ #
4
+ # 目的:
5
+ # .claude/scripts/hc-config.sh の動作を 19 ケース (iter 4 で Case 19 を a/b/c/d の
6
+ # 4 subcase に拡張) で検証する。
7
+ #
8
+ # Original (RED → GREEN):
9
+ # - Case 1: --list で全 key 一覧表示 (34+ key 確認)
10
+ # - Case 2: --get <key> で値取得 (default + env override)
11
+ # - Case 3: --set で yml 編集 + backup 作成 + 同一秒衝突回避 (iter 2)
12
+ # - Case 4: 値型 validation (bool/int/float)
13
+ # - Case 5: 型 validation による write-prevention (iter 2 コメント訂正)
14
+ # - Case 6: --reset <key> で default 復元
15
+ # - Case 7: 対話 menu (stdin redirect 経由)
16
+ #
17
+ # iter 2 新規 (CRIT F-02 + HIGH 多数 + MED):
18
+ # - Case 8: _validate_string_sanity による pre-write reject (yml unchanged)
19
+ # ※ iter 3 訂正: 真の yaml.safe_load reject path は Case 16 で testable
20
+ # - Case 9: --feature <name>=<bool>
21
+ # - Case 10: --validate
22
+ # - Case 11: --diff
23
+ # - Case 12: --reset-all (key 数分の backup 作成)
24
+ # - Case 13: path traversal --config /etc/passwd → reject
25
+ # - Case 14: env override 優先順位 (env > yml > defaults)
26
+ # - Case 15: awk -v escape corruption 修正検証 (`foo\bar` をそのまま保持)
27
+ #
28
+ # iter 3 新規 (CRIT R-01 + HIGH 4 + MED M-NEW-01 closure):
29
+ # - Case 16: _atomic_write rollback (mid-value colon / 不完全 bracket)
30
+ # CRIT R-01 (tdd-guide) + HIGH (中間コロン) coverage、
31
+ # PyYAML 利用可能環境では yaml.safe_load reject、不在環境では
32
+ # fallback structural check reject の両方を validate。
33
+ # - Case 17: HC_BAK_RETENTION_COUNT validation (0 / 非数値 → default 10 fallback)
34
+ # MED M-NEW-01 (code-rev) + L-03 (security) coverage。
35
+ # - Case 18: UTF-8 multibyte path 受理 (`task_dir=docs/タスク/foo`)
36
+ # HIGH (code-rev UTF-8 false-reject) coverage、
37
+ # 旧 `tr -d '\11\40-\176'` が \x80-\xFF を reject していた regression 防止。
38
+ # - Case 19: mid-value `#` silent data loss 防止 (`docs_approved_dir=foo#bar` → reject)
39
+ # HIGH (pr-test mid-value # silent data loss) coverage、
40
+ # HC_ALLOW_HASH_IN_VALUE=1 で URL fragment 等 bypass 可。
41
+ # iter 4 拡張: a (reject 維持) / b (bypass round-trip 整合性) /
42
+ # c (yml file 内 double-quoted 形式) / d (stderr notice 1 行)
43
+ # の 4 subcase に分割、HIGH 3 件 (test-auto H3-01 / pr-test H-NEW-01 /
44
+ # tdd-guide H-NEW-01) 単一根原因 closure を担保。
45
+ #
46
+ # 設計:
47
+ # - subshell 関数 ( set -uo pipefail; ... ) で各 case を隔離
48
+ # - PASS/FAIL カウンタ + 結果出力 + 全 PASS で exit 0
49
+ #
50
+ # 重要制約:
51
+ # - file-top に set -euo pipefail を書かない (feedback_set_e_in_sourced_libs 規範)
52
+ # - BSD/GNU bash 両対応 (macOS bash 3.2 + Linux bash 5.x)
53
+ # - 一時 yml は /tmp/ に作成、EXIT trap で cleanup
54
+
55
+ set -uo pipefail
56
+
57
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
58
+ REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
59
+ HC_CONFIG_SCRIPT="${REPO_ROOT}/.claude/scripts/hc-config.sh"
60
+ HC_CONFIG_YML="${REPO_ROOT}/.claude/harness-config.yml"
61
+
62
+ # tmp dir (cleanup on exit)
63
+ TMP_DIR="$(mktemp -d "/tmp/hc-config-script-smoke.XXXXXX")"
64
+ trap 'rm -rf "$TMP_DIR"' EXIT
65
+
66
+ PASS=0
67
+ FAIL=0
68
+ FAILED_CASES=""
69
+
70
+ # --- helpers ---
71
+
72
+ _record() {
73
+ local result="$1"
74
+ local case_id="$2"
75
+ local desc="$3"
76
+ if [ "$result" = "PASS" ]; then
77
+ printf ' PASS Case %s: %s\n' "$case_id" "$desc"
78
+ PASS=$((PASS + 1))
79
+ else
80
+ printf ' FAIL Case %s: %s\n' "$case_id" "$desc"
81
+ FAIL=$((FAIL + 1))
82
+ FAILED_CASES="${FAILED_CASES} ${case_id}"
83
+ fi
84
+ }
85
+
86
+ # RED guard: hc-config.sh が未実装なら EXPECTED FAIL を出力して return 1
87
+ _red_guard() {
88
+ local case_id="$1"
89
+ if [ ! -x "${HC_CONFIG_SCRIPT}" ]; then
90
+ printf '[Case %s] EXPECTED FAIL: hc-config.sh not implemented yet (RED phase)\n' "$case_id" >&2
91
+ return 1
92
+ fi
93
+ return 0
94
+ }
95
+
96
+ # md5sum portable (Linux md5sum + macOS md5)
97
+ _md5_of() {
98
+ local f="$1"
99
+ if command -v md5sum >/dev/null 2>&1; then
100
+ md5sum "$f" | awk '{print $1}'
101
+ elif command -v md5 >/dev/null 2>&1; then
102
+ md5 -q "$f"
103
+ else
104
+ # last resort: shasum
105
+ shasum "$f" | awk '{print $1}'
106
+ fi
107
+ }
108
+
109
+ # timeout fallback (MED M-03 fix: process group kill)
110
+ # iter 3 fix (test-auto M-NEW-01): `kill -- -$guard_pid` は冗長 (`kill -9 $guard_pid` で十分)、
111
+ # pgid kill は本 use-case では不要なため削除して shellcheck noise を減らす。
112
+ if ! command -v timeout >/dev/null 2>&1; then
113
+ timeout() {
114
+ local sec="$1"; shift
115
+ "$@" &
116
+ local pid=$!
117
+ ( sleep "$sec" 2>/dev/null; kill -9 $pid 2>/dev/null ) &
118
+ local guard_pid=$!
119
+ wait $pid 2>/dev/null
120
+ local ec=$?
121
+ kill -9 $guard_pid 2>/dev/null || true
122
+ return $ec
123
+ }
124
+ fi
125
+
126
+ # ============================================================
127
+ # Case 1: --list で全 key 一覧表示 (34+ key 確認)
128
+ # ============================================================
129
+ _case_1() (
130
+ set -uo pipefail
131
+ _red_guard "1" || return 1
132
+
133
+ local output
134
+ output="$(bash "${HC_CONFIG_SCRIPT}" --list 2>/dev/null)"
135
+ local exit_code=$?
136
+
137
+ if [ $exit_code -ne 0 ]; then
138
+ printf 'Case 1: --list returned exit code %d\n' "$exit_code" >&2
139
+ return 1
140
+ fi
141
+
142
+ local keywords=(
143
+ "feature_loop_mode_enforcement_enabled"
144
+ "feature_draft_flow_guard_enabled"
145
+ "feature_task_rule_guard_enabled"
146
+ "confidence_threshold"
147
+ "review_required_test"
148
+ "review_min_count_test"
149
+ "review_iteration_max"
150
+ "context_budget_threshold"
151
+ "parallel_subagent_reminder_enabled"
152
+ "task_dir"
153
+ )
154
+
155
+ local missing=0
156
+ for kw in "${keywords[@]}"; do
157
+ if ! printf '%s' "$output" | grep -q "$kw"; then
158
+ printf 'Case 1: missing key in --list output: %s\n' "$kw" >&2
159
+ missing=$((missing + 1))
160
+ fi
161
+ done
162
+
163
+ local line_count
164
+ line_count="$(printf '%s\n' "$output" | grep -c '.' 2>/dev/null || echo 0)"
165
+ if [ "$line_count" -lt 34 ]; then
166
+ printf 'Case 1: --list output has only %d lines, expected 34+\n' "$line_count" >&2
167
+ missing=$((missing + 1))
168
+ fi
169
+
170
+ # pr MED-02: task-48 の新 --list format (説明列 header + category 区切り行) に感応させる。
171
+ # 既存の key keyword grep は format 進化 (列追加 / category グルーピング) を検出できないため、
172
+ # 「説明」header と `=== <category> (N keys) ===` 区切り行の存在を明示 assert する。
173
+ if ! printf '%s' "$output" | grep -q '説明'; then
174
+ printf 'Case 1: --list missing 説明 column header (task-48 format)\n' >&2
175
+ missing=$((missing + 1))
176
+ fi
177
+ if ! printf '%s' "$output" | grep -qE '^=== .* \([0-9]+ keys\) ===$'; then
178
+ printf 'Case 1: --list missing category separator row (=== <cat> (N keys) ===)\n' >&2
179
+ missing=$((missing + 1))
180
+ fi
181
+
182
+ [ $missing -eq 0 ]
183
+ )
184
+
185
+ # ============================================================
186
+ # Case 2: --get <key> で値取得 (default + env override)
187
+ # ============================================================
188
+ _case_2() (
189
+ set -uo pipefail
190
+ _red_guard "2" || return 1
191
+
192
+ # 2a: default 値取得
193
+ local default_val
194
+ default_val="$(bash "${HC_CONFIG_SCRIPT}" --get feature_loop_mode_enforcement_enabled 2>/dev/null)"
195
+ if [ "$default_val" != "true" ]; then
196
+ printf 'Case 2a: expected "true", got "%s"\n' "$default_val" >&2
197
+ return 1
198
+ fi
199
+
200
+ # 2b: env override
201
+ local override_val
202
+ override_val="$(HC_FEATURE_LOOP_MODE_ENFORCEMENT_ENABLED=false bash "${HC_CONFIG_SCRIPT}" --get feature_loop_mode_enforcement_enabled 2>/dev/null)"
203
+ if [ "$override_val" != "false" ]; then
204
+ printf 'Case 2b: env override expected "false", got "%s"\n' "$override_val" >&2
205
+ return 1
206
+ fi
207
+
208
+ return 0
209
+ )
210
+
211
+ # ============================================================
212
+ # Case 3: --set + backup + 同一秒衝突回避 (HIGH H-01 test-auto)
213
+ # ============================================================
214
+ _case_3() (
215
+ set -uo pipefail
216
+ _red_guard "3" || return 1
217
+
218
+ local tmp_yml="${TMP_DIR}/test-harness-config-case3.yml"
219
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
220
+
221
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=3 \
222
+ --config "${tmp_yml}" 2>/dev/null
223
+ local exit_code=$?
224
+
225
+ if [ $exit_code -ne 0 ]; then
226
+ printf 'Case 3: --set returned exit code %d\n' "$exit_code" >&2
227
+ return 1
228
+ fi
229
+
230
+ local bak_count
231
+ bak_count="$(ls "${TMP_DIR}"/test-harness-config-case3.yml.bak.* 2>/dev/null | wc -l | tr -d ' ')"
232
+ if [ "$bak_count" -lt 1 ]; then
233
+ printf 'Case 3: no backup file (.bak.<timestamp>) found\n' >&2
234
+ return 1
235
+ fi
236
+
237
+ if ! grep -q 'review_iteration_max:.*3' "${tmp_yml}" 2>/dev/null; then
238
+ printf 'Case 3: review_iteration_max not updated to 3 in yml\n' >&2
239
+ return 1
240
+ fi
241
+
242
+ # 3b: 同一秒内 3 回連続 --set → bak 3+1=4 件 (or 4 件以上、衝突回避済)
243
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=4 --config "${tmp_yml}" 2>/dev/null
244
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=5 --config "${tmp_yml}" 2>/dev/null
245
+ local bak_count_after
246
+ bak_count_after="$(ls "${TMP_DIR}"/test-harness-config-case3.yml.bak.* 2>/dev/null | wc -l | tr -d ' ')"
247
+ if [ "$bak_count_after" -lt 3 ]; then
248
+ printf 'Case 3b: rapid --set should create 3+ backups (no collision), got %d\n' "$bak_count_after" >&2
249
+ return 1
250
+ fi
251
+
252
+ return 0
253
+ )
254
+
255
+ # ============================================================
256
+ # Case 4: 値型 validation (bool/int/float)
257
+ # ============================================================
258
+ _case_4() (
259
+ set -uo pipefail
260
+ _red_guard "4" || return 1
261
+
262
+ local tmp_yml="${TMP_DIR}/test-harness-config-case4.yml"
263
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
264
+
265
+ if bash "${HC_CONFIG_SCRIPT}" --set feature_loop_mode_enforcement_enabled=notabool \
266
+ --config "${tmp_yml}" 2>/dev/null; then
267
+ printf 'Case 4a: expected error for invalid bool value, got exit 0\n' >&2
268
+ return 1
269
+ fi
270
+
271
+ if bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=abc \
272
+ --config "${tmp_yml}" 2>/dev/null; then
273
+ printf 'Case 4b: expected error for invalid int value, got exit 0\n' >&2
274
+ return 1
275
+ fi
276
+
277
+ if bash "${HC_CONFIG_SCRIPT}" --set confidence_threshold=2.5 \
278
+ --config "${tmp_yml}" 2>/dev/null; then
279
+ printf 'Case 4c: expected error for out-of-range float value, got exit 0\n' >&2
280
+ return 1
281
+ fi
282
+
283
+ return 0
284
+ )
285
+
286
+ # ============================================================
287
+ # Case 5: 型 validation による write-prevention (yml unchanged 確認)
288
+ # iter 2 訂正: これは _validate_value による pre-write block であり、
289
+ # _atomic_write の rollback path は Case 8 で別途検証する。
290
+ # ============================================================
291
+ _case_5() (
292
+ set -uo pipefail
293
+ _red_guard "5" || return 1
294
+
295
+ local tmp_yml="${TMP_DIR}/test-harness-config-case5.yml"
296
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
297
+
298
+ local original_checksum
299
+ original_checksum="$(_md5_of "${tmp_yml}")"
300
+
301
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=abc \
302
+ --config "${tmp_yml}" 2>/dev/null
303
+
304
+ local after_checksum
305
+ after_checksum="$(_md5_of "${tmp_yml}")"
306
+
307
+ if [ "$original_checksum" != "$after_checksum" ]; then
308
+ printf 'Case 5: yml was modified despite invalid value (validate write-prevention)\n' >&2
309
+ return 1
310
+ fi
311
+
312
+ return 0
313
+ )
314
+
315
+ # ============================================================
316
+ # Case 6: --reset <key> で default 復元
317
+ # ============================================================
318
+ _case_6() (
319
+ set -uo pipefail
320
+ _red_guard "6" || return 1
321
+
322
+ local tmp_yml="${TMP_DIR}/test-harness-config-case6.yml"
323
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
324
+
325
+ # まず review_iteration_max を 9 (1-10 range 内) に変更
326
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=9 \
327
+ --config "${tmp_yml}" 2>/dev/null
328
+
329
+ local changed_val
330
+ changed_val="$(bash "${HC_CONFIG_SCRIPT}" --get review_iteration_max \
331
+ --config "${tmp_yml}" 2>/dev/null)"
332
+ if [ "$changed_val" != "9" ]; then
333
+ printf 'Case 6: pre-reset value expected "9", got "%s"\n' "$changed_val" >&2
334
+ return 1
335
+ fi
336
+
337
+ bash "${HC_CONFIG_SCRIPT}" --reset review_iteration_max \
338
+ --config "${tmp_yml}" 2>/dev/null
339
+ local exit_code=$?
340
+
341
+ if [ $exit_code -ne 0 ]; then
342
+ printf 'Case 6: --reset returned exit code %d\n' "$exit_code" >&2
343
+ return 1
344
+ fi
345
+
346
+ local reset_val
347
+ reset_val="$(bash "${HC_CONFIG_SCRIPT}" --get review_iteration_max \
348
+ --config "${tmp_yml}" 2>/dev/null)"
349
+ if [ "$reset_val" != "5" ]; then
350
+ printf 'Case 6: expected default "5" after reset, got "%s"\n' "$reset_val" >&2
351
+ return 1
352
+ fi
353
+
354
+ return 0
355
+ )
356
+
357
+ # ============================================================
358
+ # Case 7: 対話 menu (stdin redirect 経由)
359
+ # ============================================================
360
+ _case_7() (
361
+ set -uo pipefail
362
+ _red_guard "7" || return 1
363
+
364
+ local exit_code=1
365
+
366
+ if printf 'q\n' | timeout 5 bash "${HC_CONFIG_SCRIPT}" 2>/dev/null; then
367
+ exit_code=0
368
+ fi
369
+
370
+ if [ $exit_code -ne 0 ]; then
371
+ if printf '5\n' | timeout 5 bash "${HC_CONFIG_SCRIPT}" 2>/dev/null; then
372
+ exit_code=0
373
+ fi
374
+ fi
375
+
376
+ if [ $exit_code -ne 0 ]; then
377
+ if printf '0\n' | timeout 5 bash "${HC_CONFIG_SCRIPT}" 2>/dev/null; then
378
+ exit_code=0
379
+ fi
380
+ fi
381
+
382
+ return $exit_code
383
+ )
384
+
385
+ # ============================================================
386
+ # Case 8 (iter 2 新規 CRIT F-02、iter 3 訂正):
387
+ # _validate_string_sanity による pre-write reject path (`: <text>` / `# comment` を
388
+ # sanity check で先に reject)。
389
+ #
390
+ # iter 3 訂正 (R-02 tdd-guide finding):
391
+ # 旧コメント「yaml.safe_load reject」は誤り。本 case の値は _validate_string_sanity
392
+ # を通過せず _atomic_write には到達しない。真の _atomic_write rollback path
393
+ # (mid-value colon / 不完全 bracket) は Case 16 で別途 testable。
394
+ # ============================================================
395
+ _case_8() (
396
+ set -uo pipefail
397
+ _red_guard "8" || return 1
398
+
399
+ local tmp_yml="${TMP_DIR}/test-harness-config-case8.yml"
400
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
401
+
402
+ local original_checksum
403
+ original_checksum="$(_md5_of "${tmp_yml}")"
404
+
405
+ # 8a: task_dir に ": unexpected" (yaml syntax confusion) を渡す → reject
406
+ bash "${HC_CONFIG_SCRIPT}" --set 'task_dir=: unexpected' \
407
+ --config "${tmp_yml}" 2>/dev/null
408
+ local after_checksum
409
+ after_checksum="$(_md5_of "${tmp_yml}")"
410
+ if [ "$original_checksum" != "$after_checksum" ]; then
411
+ printf 'Case 8a: yml modified after ": unexpected" value (rollback failed)\n' >&2
412
+ return 1
413
+ fi
414
+
415
+ # 8b: task_dir に "# comment" を渡す → reject (yaml comment confusion)
416
+ bash "${HC_CONFIG_SCRIPT}" --set 'task_dir=# comment' \
417
+ --config "${tmp_yml}" 2>/dev/null
418
+ local after_checksum2
419
+ after_checksum2="$(_md5_of "${tmp_yml}")"
420
+ if [ "$original_checksum" != "$after_checksum2" ]; then
421
+ printf 'Case 8b: yml modified after "# comment" value (rollback failed)\n' >&2
422
+ return 1
423
+ fi
424
+
425
+ # 8c: yml が yaml としてまだ parse 可能であること
426
+ if command -v python3 >/dev/null 2>&1 && python3 -c "import yaml" >/dev/null 2>&1; then
427
+ if ! python3 -c "import yaml, sys; yaml.safe_load(sys.stdin.read())" < "${tmp_yml}" 2>/dev/null; then
428
+ printf 'Case 8c: yml is no longer parseable after rejection attempts\n' >&2
429
+ return 1
430
+ fi
431
+ fi
432
+
433
+ return 0
434
+ )
435
+
436
+ # ============================================================
437
+ # Case 9 (iter 2 新規): --feature <name>=<bool>
438
+ # ============================================================
439
+ _case_9() (
440
+ set -uo pipefail
441
+ _red_guard "9" || return 1
442
+
443
+ local tmp_yml="${TMP_DIR}/test-harness-config-case9.yml"
444
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
445
+
446
+ bash "${HC_CONFIG_SCRIPT}" --feature loop_mode_enforcement=false \
447
+ --config "${tmp_yml}" 2>/dev/null
448
+ local exit_code=$?
449
+ if [ $exit_code -ne 0 ]; then
450
+ printf 'Case 9: --feature returned exit code %d\n' "$exit_code" >&2
451
+ return 1
452
+ fi
453
+
454
+ local val
455
+ val="$(bash "${HC_CONFIG_SCRIPT}" --get feature_loop_mode_enforcement_enabled \
456
+ --config "${tmp_yml}" 2>/dev/null)"
457
+ if [ "$val" != "false" ]; then
458
+ printf 'Case 9: expected "false" after --feature, got "%s"\n' "$val" >&2
459
+ return 1
460
+ fi
461
+
462
+ return 0
463
+ )
464
+
465
+ # ============================================================
466
+ # Case 10 (iter 2 新規): --validate
467
+ # ============================================================
468
+ _case_10() (
469
+ set -uo pipefail
470
+ _red_guard "10" || return 1
471
+
472
+ local output
473
+ output="$(bash "${HC_CONFIG_SCRIPT}" --validate 2>/dev/null)"
474
+ local exit_code=$?
475
+
476
+ if [ $exit_code -ne 0 ]; then
477
+ printf 'Case 10: --validate returned exit code %d (expected 0 for valid default yml)\n' "$exit_code" >&2
478
+ return 1
479
+ fi
480
+
481
+ if ! printf '%s' "$output" | grep -qiE 'OK|valid'; then
482
+ printf 'Case 10: --validate output missing OK/valid keyword: %s\n' "$output" >&2
483
+ return 1
484
+ fi
485
+
486
+ return 0
487
+ )
488
+
489
+ # ============================================================
490
+ # Case 11 (iter 2 新規): --diff
491
+ # ============================================================
492
+ _case_11() (
493
+ set -uo pipefail
494
+ _red_guard "11" || return 1
495
+
496
+ local tmp_yml="${TMP_DIR}/test-harness-config-case11.yml"
497
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
498
+
499
+ # まず review_iteration_max を 3 に変更
500
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=3 \
501
+ --config "${tmp_yml}" 2>/dev/null
502
+
503
+ # --diff で review_iteration_max が表示されることを確認
504
+ local output
505
+ output="$(bash "${HC_CONFIG_SCRIPT}" --diff --config "${tmp_yml}" 2>/dev/null)"
506
+
507
+ if ! printf '%s' "$output" | grep -q 'review_iteration_max'; then
508
+ printf 'Case 11: --diff output missing review_iteration_max (after --set)\n' >&2
509
+ printf 'output:\n%s\n' "$output" >&2
510
+ return 1
511
+ fi
512
+
513
+ return 0
514
+ )
515
+
516
+ # ============================================================
517
+ # Case 12 (iter 2 新規): --reset-all
518
+ # ============================================================
519
+ _case_12() (
520
+ set -uo pipefail
521
+ _red_guard "12" || return 1
522
+
523
+ local tmp_yml="${TMP_DIR}/test-harness-config-case12.yml"
524
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
525
+
526
+ # 3 つの key を非 default 値に変更
527
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=3 --config "${tmp_yml}" 2>/dev/null
528
+ bash "${HC_CONFIG_SCRIPT}" --set confidence_threshold=0.9 --config "${tmp_yml}" 2>/dev/null
529
+ bash "${HC_CONFIG_SCRIPT}" --set task_dir=docs/foo --config "${tmp_yml}" 2>/dev/null
530
+
531
+ # --reset-all
532
+ bash "${HC_CONFIG_SCRIPT}" --reset-all --config "${tmp_yml}" 2>/dev/null
533
+ local exit_code=$?
534
+
535
+ if [ $exit_code -ne 0 ]; then
536
+ printf 'Case 12: --reset-all returned exit code %d\n' "$exit_code" >&2
537
+ return 1
538
+ fi
539
+
540
+ # review_iteration_max が 5 (default) に戻っているか
541
+ local val
542
+ val="$(bash "${HC_CONFIG_SCRIPT}" --get review_iteration_max --config "${tmp_yml}" 2>/dev/null)"
543
+ if [ "$val" != "5" ]; then
544
+ printf 'Case 12: review_iteration_max should be 5 after --reset-all, got "%s"\n' "$val" >&2
545
+ return 1
546
+ fi
547
+
548
+ # task_dir が docs/tasks に戻っているか
549
+ local td
550
+ td="$(bash "${HC_CONFIG_SCRIPT}" --get task_dir --config "${tmp_yml}" 2>/dev/null)"
551
+ if [ "$td" != "docs/tasks" ]; then
552
+ printf 'Case 12: task_dir should be docs/tasks after --reset-all, got "%s"\n' "$td" >&2
553
+ return 1
554
+ fi
555
+
556
+ # backup が複数件作成されていること (set 3 + reset N、最低 4+)
557
+ local bak_count
558
+ bak_count="$(ls "${TMP_DIR}"/test-harness-config-case12.yml.bak.* 2>/dev/null | wc -l | tr -d ' ')"
559
+ if [ "$bak_count" -lt 4 ]; then
560
+ printf 'Case 12: expected 4+ backups, got %d\n' "$bak_count" >&2
561
+ return 1
562
+ fi
563
+
564
+ return 0
565
+ )
566
+
567
+ # ============================================================
568
+ # Case 13 (iter 2 新規 HIGH F-04): path traversal --config /etc/passwd → reject
569
+ # ============================================================
570
+ _case_13() (
571
+ set -uo pipefail
572
+ _red_guard "13" || return 1
573
+
574
+ # HC_ALLOW_EXTERNAL_CONFIG が unset の状態で /etc/hosts (REPO_ROOT 外、/tmp/ 外) を渡す
575
+ # /etc/passwd は file が壊れたら困るので /etc/hosts で代替 (read-only path 確認のみ)
576
+ unset HC_ALLOW_EXTERNAL_CONFIG
577
+ if bash "${HC_CONFIG_SCRIPT}" --list --config /etc/hosts 2>/dev/null; then
578
+ printf 'Case 13: expected reject for /etc/hosts (outside REPO_ROOT / /tmp/), got exit 0\n' >&2
579
+ return 1
580
+ fi
581
+
582
+ # HC_ALLOW_EXTERNAL_CONFIG=1 で bypass 可能なこと
583
+ # (実際に /etc/hosts を yml として parse すると失敗するので、stderr のみ確認)
584
+ local out
585
+ out=$(HC_ALLOW_EXTERNAL_CONFIG=1 bash "${HC_CONFIG_SCRIPT}" --list --config /etc/hosts 2>&1 || true)
586
+ # bypass された場合は path validation で reject されない (cmd_list の出力 or yml parse 結果)
587
+ if printf '%s' "$out" | grep -q 'config path outside'; then
588
+ printf 'Case 13b: HC_ALLOW_EXTERNAL_CONFIG=1 did not bypass path guard\n' >&2
589
+ return 1
590
+ fi
591
+
592
+ return 0
593
+ )
594
+
595
+ # ============================================================
596
+ # Case 14 (iter 2 新規 MED M-04): env priority (env > yml > defaults)
597
+ # yml=3, env=7 → env が勝つ
598
+ # ============================================================
599
+ _case_14() (
600
+ set -uo pipefail
601
+ _red_guard "14" || return 1
602
+
603
+ local tmp_yml="${TMP_DIR}/test-harness-config-case14.yml"
604
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
605
+
606
+ bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=3 --config "${tmp_yml}" 2>/dev/null
607
+
608
+ local val
609
+ val="$(HC_REVIEW_ITERATION_MAX=7 bash "${HC_CONFIG_SCRIPT}" --get review_iteration_max \
610
+ --config "${tmp_yml}" 2>/dev/null)"
611
+ if [ "$val" != "7" ]; then
612
+ printf 'Case 14: env override expected "7" (yml=3, env=7), got "%s"\n' "$val" >&2
613
+ return 1
614
+ fi
615
+
616
+ return 0
617
+ )
618
+
619
+ # ============================================================
620
+ # Case 15 (iter 2 新規 HIGH H-01 code-rev): awk -v escape corruption 修正検証
621
+ # `foo\bar` をそのまま保持 (旧 logic は `foo` に corrupt)
622
+ # ============================================================
623
+ _case_15() (
624
+ set -uo pipefail
625
+ _red_guard "15" || return 1
626
+
627
+ local tmp_yml="${TMP_DIR}/test-harness-config-case15.yml"
628
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
629
+
630
+ # docs_approved_dir に "foo\bar" (literal backslash + 'b') を渡す
631
+ # 旧 awk -v VAL="$val" では \b が解釈され "fooar" に corrupt するバグ
632
+ bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=foo\bar' \
633
+ --config "${tmp_yml}" 2>/dev/null
634
+ local exit_code=$?
635
+
636
+ if [ $exit_code -ne 0 ]; then
637
+ printf 'Case 15: --set with backslash returned exit code %d\n' "$exit_code" >&2
638
+ return 1
639
+ fi
640
+
641
+ # yml 中の値が "foo\bar" のままか確認 (awk -v escape 解釈バグなら "fooar" になる)
642
+ local stored
643
+ stored=$(grep '^docs_approved_dir:' "${tmp_yml}" | head -1)
644
+ if printf '%s' "$stored" | grep -q 'fooar'; then
645
+ printf 'Case 15: awk -v escape corruption detected: %s\n' "$stored" >&2
646
+ return 1
647
+ fi
648
+ if ! printf '%s' "$stored" | grep -qF 'foo\bar'; then
649
+ printf 'Case 15: backslash value not preserved: %s\n' "$stored" >&2
650
+ return 1
651
+ fi
652
+
653
+ return 0
654
+ )
655
+
656
+ # ============================================================
657
+ # Case 16 (iter 3 新規 CRIT R-01 + HIGH 中間コロン):
658
+ # _atomic_write rollback path (yaml.safe_load reject + fallback structural check)
659
+ #
660
+ # _validate_string_sanity は通過するが _atomic_write の yaml validation で
661
+ # reject される値 (mid-value colon / 不完全 [ / 不完全 {) を渡し、
662
+ # yml が unchanged で残ることを確認。PyYAML 利用可能環境では yaml.safe_load reject、
663
+ # 不在環境では fallback structural pattern reject の両方が動作対象。
664
+ #
665
+ # 注意: _validate_string_sanity が `: <text>` を先に reject するため、
666
+ # mid-value colon は値の途中 (`foo: bar`) として渡す必要がある。
667
+ # また bracket / brace は `[` / `{` 単独 (= sanity pass) として渡す。
668
+ # ============================================================
669
+ _case_16() (
670
+ set -uo pipefail
671
+ _red_guard "16" || return 1
672
+
673
+ local tmp_yml="${TMP_DIR}/test-harness-config-case16.yml"
674
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
675
+
676
+ local original_checksum
677
+ original_checksum="$(_md5_of "${tmp_yml}")"
678
+
679
+ # 16a: mid-value colon (path 型 key、空白 + 値 の中間に colon)
680
+ # task_dir=foo: bar → yaml では `task_dir: foo: bar` (flow scalar 構造破壊兆候)
681
+ # _validate_string_sanity は `:` 行頭のみ reject、mid-value は通過
682
+ bash "${HC_CONFIG_SCRIPT}" --set 'task_dir=foo: bar' \
683
+ --config "${tmp_yml}" 2>/dev/null
684
+ local cs1
685
+ cs1="$(_md5_of "${tmp_yml}")"
686
+ if [ "$original_checksum" != "$cs1" ]; then
687
+ printf 'Case 16a: yml modified after mid-value colon (rollback failed)\n' >&2
688
+ return 1
689
+ fi
690
+
691
+ # 16b: 不完全 array bracket (`[unclosed` には行末 `]` がない)
692
+ bash "${HC_CONFIG_SCRIPT}" --set 'task_dir=[unclosed' \
693
+ --config "${tmp_yml}" 2>/dev/null
694
+ local cs2
695
+ cs2="$(_md5_of "${tmp_yml}")"
696
+ if [ "$original_checksum" != "$cs2" ]; then
697
+ printf 'Case 16b: yml modified after unclosed bracket (rollback failed)\n' >&2
698
+ return 1
699
+ fi
700
+
701
+ # 16c: 不完全 object brace
702
+ bash "${HC_CONFIG_SCRIPT}" --set 'task_dir={unclosed' \
703
+ --config "${tmp_yml}" 2>/dev/null
704
+ local cs3
705
+ cs3="$(_md5_of "${tmp_yml}")"
706
+ if [ "$original_checksum" != "$cs3" ]; then
707
+ printf 'Case 16c: yml modified after unclosed brace (rollback failed)\n' >&2
708
+ return 1
709
+ fi
710
+
711
+ # 16d: yml が yaml としてまだ parse 可能であること (PyYAML 利用可能環境のみ)
712
+ local py_check
713
+ py_check=""
714
+ for py in python3.13 python3.12 python3.11 python3; do
715
+ if command -v "$py" >/dev/null 2>&1 && "$py" -c "import yaml" 2>/dev/null; then
716
+ py_check="$py"; break
717
+ fi
718
+ done
719
+ if [ -n "$py_check" ]; then
720
+ if ! "$py_check" -c "import yaml, sys; yaml.safe_load(sys.stdin.read())" < "${tmp_yml}" 2>/dev/null; then
721
+ printf 'Case 16d: yml is no longer yaml-parseable after rejection attempts\n' >&2
722
+ return 1
723
+ fi
724
+ fi
725
+
726
+ return 0
727
+ )
728
+
729
+ # ============================================================
730
+ # Case 17 (iter 3 新規 MED M-NEW-01 + L-03):
731
+ # HC_BAK_RETENTION_COUNT validation (0 / 非数値 → default 10 fallback)
732
+ #
733
+ # 不正値 (0 / 負値 / 非数値) では全 backup 削除 (rollback 不能) を起こさず、
734
+ # default 10 に fallback して --set が成功 + backup 残存することを確認。
735
+ # ============================================================
736
+ _case_17() (
737
+ set -uo pipefail
738
+ _red_guard "17" || return 1
739
+
740
+ # 17a: HC_BAK_RETENTION_COUNT=0 → default 10 fallback
741
+ local tmp_yml="${TMP_DIR}/test-harness-config-case17a.yml"
742
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
743
+ HC_BAK_RETENTION_COUNT=0 bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=3 \
744
+ --config "${tmp_yml}" 2>/dev/null
745
+ local exit_code=$?
746
+ if [ $exit_code -ne 0 ]; then
747
+ printf 'Case 17a: HC_BAK_RETENTION_COUNT=0 should fallback, exit code %d\n' "$exit_code" >&2
748
+ return 1
749
+ fi
750
+ local bak_count_a
751
+ bak_count_a="$(ls "${TMP_DIR}"/test-harness-config-case17a.yml.bak.* 2>/dev/null | wc -l | tr -d ' ')"
752
+ if [ "$bak_count_a" -lt 1 ]; then
753
+ printf 'Case 17a: backup deleted by HC_BAK_RETENTION_COUNT=0 (rollback unrecoverable)\n' >&2
754
+ return 1
755
+ fi
756
+
757
+ # 17b: HC_BAK_RETENTION_COUNT=abc → default 10 fallback
758
+ local tmp_yml_b="${TMP_DIR}/test-harness-config-case17b.yml"
759
+ cp "${HC_CONFIG_YML}" "${tmp_yml_b}"
760
+ HC_BAK_RETENTION_COUNT=abc bash "${HC_CONFIG_SCRIPT}" --set review_iteration_max=4 \
761
+ --config "${tmp_yml_b}" 2>/dev/null
762
+ exit_code=$?
763
+ if [ $exit_code -ne 0 ]; then
764
+ printf 'Case 17b: HC_BAK_RETENTION_COUNT=abc should fallback, exit code %d\n' "$exit_code" >&2
765
+ return 1
766
+ fi
767
+ local bak_count_b
768
+ bak_count_b="$(ls "${TMP_DIR}"/test-harness-config-case17b.yml.bak.* 2>/dev/null | wc -l | tr -d ' ')"
769
+ if [ "$bak_count_b" -lt 1 ]; then
770
+ printf 'Case 17b: backup deleted by HC_BAK_RETENTION_COUNT=abc (rollback unrecoverable)\n' >&2
771
+ return 1
772
+ fi
773
+
774
+ return 0
775
+ )
776
+
777
+ # ============================================================
778
+ # Case 18 (iter 3 新規 HIGH code-rev UTF-8 false-reject):
779
+ # UTF-8 multibyte path 受理 (`task_dir=docs/タスク/foo`)
780
+ #
781
+ # 旧 logic は `tr -d '\11\40-\176'` で \x80-\xFF (UTF-8 multibyte) を制御文字扱いで
782
+ # reject していた。bash pattern match で C0/DEL のみ pinpoint reject に修正後、
783
+ # 日本語 path が通ること、かつ yml への書き込みも成功することを確認。
784
+ # ============================================================
785
+ _case_18() (
786
+ set -uo pipefail
787
+ _red_guard "18" || return 1
788
+
789
+ local tmp_yml="${TMP_DIR}/test-harness-config-case18.yml"
790
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
791
+
792
+ # 日本語 path を --set
793
+ bash "${HC_CONFIG_SCRIPT}" --set 'task_dir=docs/タスク/foo' \
794
+ --config "${tmp_yml}" 2>/dev/null
795
+ local exit_code=$?
796
+ if [ $exit_code -ne 0 ]; then
797
+ printf 'Case 18: --set with UTF-8 multibyte path returned exit code %d\n' "$exit_code" >&2
798
+ return 1
799
+ fi
800
+
801
+ # yml 中の値が保持されているか
802
+ local stored
803
+ stored=$(grep '^task_dir:' "${tmp_yml}" | head -1)
804
+ if ! printf '%s' "$stored" | grep -qF 'docs/タスク/foo'; then
805
+ printf 'Case 18: UTF-8 path not preserved in yml: %s\n' "$stored" >&2
806
+ return 1
807
+ fi
808
+
809
+ return 0
810
+ )
811
+
812
+ # ============================================================
813
+ # Case 19 (iter 3 新規 → iter 4 で a/b/c/d 4 subcase 拡張):
814
+ # mid-value `#` reject + HC_ALLOW_HASH_IN_VALUE=1 bypass round-trip 整合性
815
+ #
816
+ # iter 3: `_yml_get_raw` の `${val%%#*}` が mid-value `#` を yml inline comment と
817
+ # 誤認し read-back 時 truncation → silent data loss。書き込み時点で reject、
818
+ # HC_ALLOW_HASH_IN_VALUE=1 で URL fragment 等 bypass 可とする最低限の対処。
819
+ # iter 4: HIGH 3 件 (test-auto H3-01 / pr-test H-NEW-01 / tdd-guide H-NEW-01) 共通指摘
820
+ # 「bypass で書き込み成功するが read-back で `foo` のみ復元 = silent data loss」
821
+ # を closure。
822
+ # a. mid-value `#` reject (HC_ALLOW_HASH_IN_VALUE unset 時) + yml unchanged
823
+ # b. HC_ALLOW_HASH_IN_VALUE=1 で書き込み + read-back で `foo#bar` round-trip 復元
824
+ # c. yml file 内に `docs_approved_dir: "foo#bar"` (double-quoted) 形式で保存
825
+ # d. bypass + write 時に stderr に "HC_ALLOW_HASH_IN_VALUE=1 で..." notice 1 行
826
+ # ============================================================
827
+ _case_19() (
828
+ set -uo pipefail
829
+ _red_guard "19" || return 1
830
+
831
+ local tmp_yml="${TMP_DIR}/test-harness-config-case19.yml"
832
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
833
+
834
+ local original_checksum
835
+ original_checksum="$(_md5_of "${tmp_yml}")"
836
+
837
+ # 19a: mid-value `#` (HC_ALLOW_HASH_IN_VALUE unset) → reject (default)
838
+ unset HC_ALLOW_HASH_IN_VALUE
839
+ if bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=foo#bar' \
840
+ --config "${tmp_yml}" 2>/dev/null; then
841
+ printf 'Case 19a: mid-value # was accepted (silent data loss risk)\n' >&2
842
+ return 1
843
+ fi
844
+ local after_checksum
845
+ after_checksum="$(_md5_of "${tmp_yml}")"
846
+ if [ "$original_checksum" != "$after_checksum" ]; then
847
+ printf 'Case 19a: yml modified after mid-value # (write-prevention failed)\n' >&2
848
+ return 1
849
+ fi
850
+
851
+ # 19b: HC_ALLOW_HASH_IN_VALUE=1 で bypass 書き込み + iter 4 round-trip 検証
852
+ # iter 4 fix (HIGH 3 件 closure): write 時 double-quote escape + read 時 quoted literal 解釈で
853
+ # round-trip 整合性を保証する (旧 iter 3 では bypass で書き込み成功するが
854
+ # `${val%%#*}` truncation で `foo` のみ復元 = silent data loss)。
855
+ HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=foo#bar' \
856
+ --config "${tmp_yml}" 2>/dev/null
857
+ local exit_code=$?
858
+ if [ $exit_code -ne 0 ]; then
859
+ printf 'Case 19b: HC_ALLOW_HASH_IN_VALUE=1 should bypass, exit code %d\n' "$exit_code" >&2
860
+ return 1
861
+ fi
862
+ local readback
863
+ readback="$(HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --get docs_approved_dir \
864
+ --config "${tmp_yml}" 2>/dev/null)"
865
+ if [ "$readback" != "foo#bar" ]; then
866
+ printf 'Case 19b: round-trip failed: expected "foo#bar", got "%s" (silent data loss)\n' "$readback" >&2
867
+ return 1
868
+ fi
869
+
870
+ # 19c: yml file 内に double-quoted 形式 (`docs_approved_dir: "foo#bar"`) で保存されること
871
+ # (write 時 quote escape の grep 確認、iter 4 fix の物理形式 verification)
872
+ if ! grep -qE '^docs_approved_dir: "foo#bar"$' "${tmp_yml}"; then
873
+ printf 'Case 19c: yml file does not contain double-quoted form (expected: docs_approved_dir: "foo#bar")\n' >&2
874
+ printf ' actual: %s\n' "$(grep -E '^docs_approved_dir:' "${tmp_yml}" || printf '(line not found)')" >&2
875
+ return 1
876
+ fi
877
+
878
+ # 19d: bypass + write 時 stderr に notice 1 行が出力されること
879
+ local notice_stderr
880
+ notice_stderr="$(HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=baz#qux' \
881
+ --config "${tmp_yml}" 2>&1 >/dev/null)"
882
+ if ! printf '%s' "$notice_stderr" | grep -q 'HC_ALLOW_HASH_IN_VALUE=1'; then
883
+ printf 'Case 19d: stderr notice missing (expected "HC_ALLOW_HASH_IN_VALUE=1 で # 含む..." line)\n' >&2
884
+ printf ' got stderr: %s\n' "$notice_stderr" >&2
885
+ return 1
886
+ fi
887
+
888
+ return 0
889
+ )
890
+
891
+ # ============================================================
892
+ # Case 19e (iter 5 新規 CRIT C-01 closure):
893
+ # 再書込 round-trip — quoted literal を再 --set すると awk comment-preservation 干渉で
894
+ # corrupt する旧 bug の repro + fix verification。
895
+ # 流れ:
896
+ # 1. --set 'docs_approved_dir=foo#bar' (bypass) → yml `"foo#bar"` 保存
897
+ # 2. --set 'docs_approved_dir=baz#qux' (bypass) → yml `"baz#qux"` 保存
898
+ # (旧 bug: `"baz#qux" #bar"` corrupt 状態)
899
+ # 3. --get docs_approved_dir (bypass) → `baz#qux` 返却
900
+ # ============================================================
901
+ _case_19e() (
902
+ set -uo pipefail
903
+ _red_guard "19e" || return 1
904
+
905
+ local tmp_yml="${TMP_DIR}/test-harness-config-case19e.yml"
906
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
907
+
908
+ # Step 1: 初回 set `foo#bar`
909
+ HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=foo#bar' \
910
+ --config "${tmp_yml}" 2>/dev/null
911
+ if [ $? -ne 0 ]; then
912
+ printf 'Case 19e step 1: initial --set failed\n' >&2
913
+ return 1
914
+ fi
915
+
916
+ # Step 2: 再 set `baz#qux` (CRIT C-01 真の repro 行)
917
+ HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=baz#qux' \
918
+ --config "${tmp_yml}" 2>/dev/null
919
+ if [ $? -ne 0 ]; then
920
+ printf 'Case 19e step 2: re-set failed\n' >&2
921
+ return 1
922
+ fi
923
+
924
+ # Step 3: yml file 内で `docs_approved_dir: "baz#qux"` (CORRUPT-FREE) であること
925
+ local actual_line
926
+ actual_line="$(grep -E '^docs_approved_dir:' "${tmp_yml}" || printf '(line not found)')"
927
+ if [ "$actual_line" != 'docs_approved_dir: "baz#qux"' ]; then
928
+ printf 'Case 19e: yml line corrupt after re-set\n' >&2
929
+ printf ' expected: docs_approved_dir: "baz#qux"\n' >&2
930
+ printf ' actual: %s\n' "$actual_line" >&2
931
+ return 1
932
+ fi
933
+
934
+ # Step 4: --get round-trip 確認
935
+ local readback
936
+ readback="$(HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --get docs_approved_dir \
937
+ --config "${tmp_yml}" 2>/dev/null)"
938
+ if [ "$readback" != "baz#qux" ]; then
939
+ printf 'Case 19e: round-trip failed: expected "baz#qux", got "%s"\n' "$readback" >&2
940
+ return 1
941
+ fi
942
+
943
+ return 0
944
+ )
945
+
946
+ # ============================================================
947
+ # Case 19f (iter 5 新規 HIGH H-01 + H-02 closure):
948
+ # backslash round-trip + non-bypass read — 2 corruption surface の同時検証。
949
+ # 流れ:
950
+ # 1. --set 'docs_approved_dir=a\b#c' (bypass) → yml `"a\\b#c"` 保存
951
+ # 2. --get docs_approved_dir (bypass) → `a\b#c` 返却 (NOT `a\\b#c` literal 二重 backslash)
952
+ # ← HIGH H-01 (`\\` unescape 欠落) 解消 verification
953
+ # 3. --get docs_approved_dir (bypass env unset) → `a\b#c` 返却 (NOT `"a\\b` partial)
954
+ # ← HIGH H-02 (read 時 env asymmetry) 解消 verification
955
+ # ============================================================
956
+ _case_19f() (
957
+ set -uo pipefail
958
+ _red_guard "19f" || return 1
959
+
960
+ local tmp_yml="${TMP_DIR}/test-harness-config-case19f.yml"
961
+ cp "${HC_CONFIG_YML}" "${tmp_yml}"
962
+
963
+ # Step 1: set `a\b#c` (bypass)
964
+ HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --set 'docs_approved_dir=a\b#c' \
965
+ --config "${tmp_yml}" 2>/dev/null
966
+ if [ $? -ne 0 ]; then
967
+ printf 'Case 19f step 1: --set failed\n' >&2
968
+ return 1
969
+ fi
970
+
971
+ # Step 2: yml file 内で `docs_approved_dir: "a\\b#c"` 形式で保存 (write 側 `\` → `\\` escape)
972
+ if ! grep -qE '^docs_approved_dir: "a\\\\b#c"$' "${tmp_yml}"; then
973
+ printf 'Case 19f step 2: yml line not in expected escaped form\n' >&2
974
+ printf ' expected: docs_approved_dir: "a\\\\b#c"\n' >&2
975
+ printf ' actual: %s\n' "$(grep -E '^docs_approved_dir:' "${tmp_yml}" || printf '(line not found)')" >&2
976
+ return 1
977
+ fi
978
+
979
+ # Step 3: bypass read → `a\b#c` (HIGH H-01 unescape 検証)
980
+ local readback_bypass
981
+ readback_bypass="$(HC_ALLOW_HASH_IN_VALUE=1 bash "${HC_CONFIG_SCRIPT}" --get docs_approved_dir \
982
+ --config "${tmp_yml}" 2>/dev/null)"
983
+ if [ "$readback_bypass" != 'a\b#c' ]; then
984
+ printf 'Case 19f step 3 (HIGH H-01): bypass read failed: expected "a\\b#c", got "%s"\n' "$readback_bypass" >&2
985
+ return 1
986
+ fi
987
+
988
+ # Step 4: non-bypass read → `a\b#c` (HIGH H-02 env asymmetry 解消検証)
989
+ local readback_nonbypass
990
+ readback_nonbypass="$(unset HC_ALLOW_HASH_IN_VALUE; bash "${HC_CONFIG_SCRIPT}" --get docs_approved_dir \
991
+ --config "${tmp_yml}" 2>/dev/null)"
992
+ if [ "$readback_nonbypass" != 'a\b#c' ]; then
993
+ printf 'Case 19f step 4 (HIGH H-02): non-bypass read failed: expected "a\\b#c", got "%s"\n' "$readback_nonbypass" >&2
994
+ return 1
995
+ fi
996
+
997
+ return 0
998
+ )
999
+
1000
+ # ============================================================
1001
+ # テスト実行
1002
+ # ============================================================
1003
+
1004
+ printf '\n=== hc-config-script-smoke (iter 5: 21 cases, Case 19 a/b/c/d/e/f) ===\n\n'
1005
+
1006
+ if _case_1 2>/dev/null; then _record PASS 1 "--list で全 key 一覧表示 (34+ key + 説明 header + category 区切り行、task-48 format)"
1007
+ else _record FAIL 1 "--list で全 key 一覧表示 (34+ key + 説明 header + category 区切り行、task-48 format)"
1008
+ fi
1009
+
1010
+ if _case_2 2>/dev/null; then _record PASS 2 "--get で値取得 (default + env override)"
1011
+ else _record FAIL 2 "--get で値取得 (default + env override)"
1012
+ fi
1013
+
1014
+ if _case_3 2>/dev/null; then _record PASS 3 "--set で yml 編集 + backup 作成 + 同一秒衝突回避"
1015
+ else _record FAIL 3 "--set で yml 編集 + backup 作成 + 同一秒衝突回避"
1016
+ fi
1017
+
1018
+ if _case_4 2>/dev/null; then _record PASS 4 "値型 validation (bool/int/float の不正値で exit != 0)"
1019
+ else _record FAIL 4 "値型 validation (bool/int/float の不正値で exit != 0)"
1020
+ fi
1021
+
1022
+ if _case_5 2>/dev/null; then _record PASS 5 "型 validation による write-prevention (yml unchanged)"
1023
+ else _record FAIL 5 "型 validation による write-prevention (yml unchanged)"
1024
+ fi
1025
+
1026
+ if _case_6 2>/dev/null; then _record PASS 6 "--reset <key> で default 復元 (review_iteration_max → 5)"
1027
+ else _record FAIL 6 "--reset <key> で default 復元 (review_iteration_max → 5)"
1028
+ fi
1029
+
1030
+ if _case_7 2>/dev/null; then _record PASS 7 "対話 menu (stdin redirect で即終了、exit 0)"
1031
+ else _record FAIL 7 "対話 menu (stdin redirect で即終了、exit 0)"
1032
+ fi
1033
+
1034
+ if _case_8 2>/dev/null; then _record PASS 8 "真の rollback path (string sanity check + yaml.safe_load reject)"
1035
+ else _record FAIL 8 "真の rollback path (string sanity check + yaml.safe_load reject)"
1036
+ fi
1037
+
1038
+ if _case_9 2>/dev/null; then _record PASS 9 "--feature <name>=<bool> shorthand"
1039
+ else _record FAIL 9 "--feature <name>=<bool> shorthand"
1040
+ fi
1041
+
1042
+ if _case_10 2>/dev/null; then _record PASS 10 "--validate (正常 yml は exit 0 + OK 出力)"
1043
+ else _record FAIL 10 "--validate (正常 yml は exit 0 + OK 出力)"
1044
+ fi
1045
+
1046
+ if _case_11 2>/dev/null; then _record PASS 11 "--diff (--set 後の差分表示)"
1047
+ else _record FAIL 11 "--diff (--set 後の差分表示)"
1048
+ fi
1049
+
1050
+ if _case_12 2>/dev/null; then _record PASS 12 "--reset-all (全 key default 化 + N backup)"
1051
+ else _record FAIL 12 "--reset-all (全 key default 化 + N backup)"
1052
+ fi
1053
+
1054
+ if _case_13 2>/dev/null; then _record PASS 13 "path traversal --config /etc/* reject + bypass env"
1055
+ else _record FAIL 13 "path traversal --config /etc/* reject + bypass env"
1056
+ fi
1057
+
1058
+ if _case_14 2>/dev/null; then _record PASS 14 "env priority (yml=3 + env=7 → 7)"
1059
+ else _record FAIL 14 "env priority (yml=3 + env=7 → 7)"
1060
+ fi
1061
+
1062
+ if _case_15 2>/dev/null; then _record PASS 15 "awk -v escape corruption 修正 (foo\\\\bar 保持)"
1063
+ else _record FAIL 15 "awk -v escape corruption 修正 (foo\\\\bar 保持)"
1064
+ fi
1065
+
1066
+ if _case_16 2>/dev/null; then _record PASS 16 "_atomic_write rollback (mid-value colon / 不完全 bracket / 不完全 brace)"
1067
+ else _record FAIL 16 "_atomic_write rollback (mid-value colon / 不完全 bracket / 不完全 brace)"
1068
+ fi
1069
+
1070
+ if _case_17 2>/dev/null; then _record PASS 17 "HC_BAK_RETENTION_COUNT validation (0 / abc → default 10 fallback)"
1071
+ else _record FAIL 17 "HC_BAK_RETENTION_COUNT validation (0 / abc → default 10 fallback)"
1072
+ fi
1073
+
1074
+ if _case_18 2>/dev/null; then _record PASS 18 "UTF-8 multibyte path 受理 (task_dir=docs/タスク/foo)"
1075
+ else _record FAIL 18 "UTF-8 multibyte path 受理 (task_dir=docs/タスク/foo)"
1076
+ fi
1077
+
1078
+ if _case_19 2>/dev/null; then _record PASS 19 "mid-value # reject + bypass round-trip 整合性 (a/b/c/d)"
1079
+ else _record FAIL 19 "mid-value # reject + bypass round-trip 整合性 (a/b/c/d)"
1080
+ fi
1081
+
1082
+ if _case_19e 2>/dev/null; then _record PASS "19e" "iter 5 CRIT C-01: 再書込 round-trip (awk comment-preservation 干渉解消)"
1083
+ else _record FAIL "19e" "iter 5 CRIT C-01: 再書込 round-trip (awk comment-preservation 干渉解消)"
1084
+ fi
1085
+
1086
+ if _case_19f 2>/dev/null; then _record PASS "19f" "iter 5 HIGH H-01+H-02: backslash unescape + non-bypass read"
1087
+ else _record FAIL "19f" "iter 5 HIGH H-01+H-02: backslash unescape + non-bypass read"
1088
+ fi
1089
+
1090
+ # ============================================================
1091
+ # 集計
1092
+ # ============================================================
1093
+
1094
+ TOTAL=$((PASS + FAIL))
1095
+ printf '\n--- Result: %d/%d PASS ---\n' "$PASS" "$TOTAL"
1096
+
1097
+ if [ "$FAIL" -gt 0 ]; then
1098
+ printf 'FAILED cases:%s\n' "$FAILED_CASES"
1099
+ if [ ! -x "${HC_CONFIG_SCRIPT}" ]; then
1100
+ printf '\nHINT: hc-config.sh not found: %s\n' "${HC_CONFIG_SCRIPT}"
1101
+ printf ' RED phase: task-46 Step 2 で hc-config.sh 実装後に GREEN になります。\n'
1102
+ fi
1103
+ exit 1
1104
+ fi
1105
+
1106
+ exit 0