@ngockhoale/ukit 1.1.6

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 (344) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/LICENSE +21 -0
  3. package/README.md +189 -0
  4. package/bin/ukit +30 -0
  5. package/manifests/platform.full.yaml +1194 -0
  6. package/package.json +71 -0
  7. package/scripts/bug/triage.mjs +37 -0
  8. package/scripts/index/build-index.mjs +35 -0
  9. package/scripts/index/query-index.mjs +92 -0
  10. package/scripts/index/refresh-index.mjs +85 -0
  11. package/scripts/release/verify-release.mjs +56 -0
  12. package/src/bug/triageBug.js +123 -0
  13. package/src/cli/adapters.js +148 -0
  14. package/src/cli/commands/diff.js +51 -0
  15. package/src/cli/commands/doctor.js +125 -0
  16. package/src/cli/commands/indexArgs.js +73 -0
  17. package/src/cli/commands/indexTools.js +509 -0
  18. package/src/cli/commands/install.js +293 -0
  19. package/src/cli/commands/memory.js +126 -0
  20. package/src/cli/commands/status.js +8 -0
  21. package/src/cli/commands/uninstall.js +51 -0
  22. package/src/cli/index.js +109 -0
  23. package/src/context/detectProjectContext.js +49 -0
  24. package/src/context/detectProviders.js +12 -0
  25. package/src/core/applyPlan.js +89 -0
  26. package/src/core/buildPlan.js +228 -0
  27. package/src/core/compact/index.js +294 -0
  28. package/src/core/compact/threshold.js +936 -0
  29. package/src/core/diffPlan.js +73 -0
  30. package/src/core/ensureGitignore.js +117 -0
  31. package/src/core/fileOps.js +188 -0
  32. package/src/core/memory/hygiene.js +160 -0
  33. package/src/core/memory/index.js +2 -0
  34. package/src/core/memory/retrieval.js +476 -0
  35. package/src/core/memory/store.js +202 -0
  36. package/src/core/metadata.js +132 -0
  37. package/src/core/migrateLegacy.js +139 -0
  38. package/src/core/output/index.js +1309 -0
  39. package/src/core/paths.js +13 -0
  40. package/src/core/report.js +17 -0
  41. package/src/core/router/advisor.js +42 -0
  42. package/src/core/router/index.js +2 -0
  43. package/src/core/router/router.js +164 -0
  44. package/src/core/runInstallPipeline.js +365 -0
  45. package/src/core/runtimeConfig.js +190 -0
  46. package/src/core/runtimePaths.js +24 -0
  47. package/src/core/status.js +186 -0
  48. package/src/core/token/index.js +328 -0
  49. package/src/core/uninstall.js +246 -0
  50. package/src/core/validation/confidence.js +89 -0
  51. package/src/core/validation/index.js +2 -0
  52. package/src/core/validation/validator.js +165 -0
  53. package/src/index/buildIndex.js +1392 -0
  54. package/src/index/gitHooks.js +109 -0
  55. package/src/index/importResolution.js +377 -0
  56. package/src/index/languageTools.js +127 -0
  57. package/src/index/paths.js +27 -0
  58. package/src/index/queryIndex.js +637 -0
  59. package/src/index/relatedTests.js +237 -0
  60. package/src/index/resolveContext.js +345 -0
  61. package/src/index/routeCatalog.js +258 -0
  62. package/src/index/taskRouting.js +677 -0
  63. package/src/index/verificationPlan.js +437 -0
  64. package/src/manifest/loadManifest.js +22 -0
  65. package/src/manifest/selectItems.js +78 -0
  66. package/src/manifest/validateManifest.js +115 -0
  67. package/src/render/buildVariables.js +39 -0
  68. package/src/render/renderTemplate.js +44 -0
  69. package/src/stack/detectStack.js +213 -0
  70. package/templates/.claude/agents/bug-debugger.md +57 -0
  71. package/templates/.claude/agents/feature-implementer.md +55 -0
  72. package/templates/.claude/config/providers.md +25 -0
  73. package/templates/.claude/hooks/auto-allow-bash.sh +155 -0
  74. package/templates/.claude/hooks/auto-prune-bash.sh +75 -0
  75. package/templates/.claude/hooks/block-dangerous.sh +54 -0
  76. package/templates/.claude/hooks/compress-output.sh +17 -0
  77. package/templates/.claude/hooks/protect-files.sh +37 -0
  78. package/templates/.claude/hooks/reinject-context.sh +28 -0
  79. package/templates/.claude/hooks/session-start.md +13 -0
  80. package/templates/.claude/hooks/skill-router.sh +1681 -0
  81. package/templates/.claude/hooks/verification-guard.sh +271 -0
  82. package/templates/.claude/settings.json +144 -0
  83. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  84. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  85. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  86. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  87. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  88. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  89. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  90. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  91. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  92. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  93. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  94. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  95. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  96. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  97. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  98. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  99. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  100. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  101. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  102. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  103. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  104. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  105. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  106. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  107. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  108. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  109. package/templates/.claude/skills/_shared/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  110. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  111. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  112. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  113. package/templates/.claude/skills/_shared/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  114. package/templates/.claude/skills/_shared/ooxml/schemas/mce/mc.xsd +75 -0
  115. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  116. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  117. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  118. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  119. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  120. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  121. package/templates/.claude/skills/_shared/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  122. package/templates/.claude/skills/_shared/ooxml/scripts/pack.py +159 -0
  123. package/templates/.claude/skills/_shared/ooxml/scripts/unpack.py +29 -0
  124. package/templates/.claude/skills/_shared/ooxml/scripts/validate.py +69 -0
  125. package/templates/.claude/skills/_shared/ooxml/scripts/validation/__init__.py +15 -0
  126. package/templates/.claude/skills/_shared/ooxml/scripts/validation/base.py +951 -0
  127. package/templates/.claude/skills/_shared/ooxml/scripts/validation/docx.py +274 -0
  128. package/templates/.claude/skills/_shared/ooxml/scripts/validation/pptx.py +315 -0
  129. package/templates/.claude/skills/_shared/ooxml/scripts/validation/redlining.py +279 -0
  130. package/templates/.claude/skills/backend-api/SKILL.md +26 -0
  131. package/templates/.claude/skills/canvas-design/LICENSE.txt +202 -0
  132. package/templates/.claude/skills/canvas-design/SKILL.md +130 -0
  133. package/templates/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  134. package/templates/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  135. package/templates/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  136. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  137. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  138. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  139. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  140. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  141. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  142. package/templates/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  143. package/templates/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  144. package/templates/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  145. package/templates/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  146. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  147. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  148. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  149. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  150. package/templates/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  151. package/templates/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  152. package/templates/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  153. package/templates/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  154. package/templates/.claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  155. package/templates/.claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  156. package/templates/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  157. package/templates/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  158. package/templates/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  159. package/templates/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  160. package/templates/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  161. package/templates/.claude/skills/code-review/SKILL.md +97 -0
  162. package/templates/.claude/skills/debugging-toolkit/SKILL.md +156 -0
  163. package/templates/.claude/skills/delivery/SKILL.md +92 -0
  164. package/templates/.claude/skills/discover-security/SKILL.md +86 -0
  165. package/templates/.claude/skills/docker-packaging/SKILL.md +60 -0
  166. package/templates/.claude/skills/docs-manager/SKILL.md +465 -0
  167. package/templates/.claude/skills/docs-manager/init-project-docs.sh +70 -0
  168. package/templates/.claude/skills/docs-manager/templates/README.md.template +50 -0
  169. package/templates/.claude/skills/docs-manager/templates/agent-roles.md.template +24 -0
  170. package/templates/.claude/skills/docs-manager/templates/coding-conventions.md.template +28 -0
  171. package/templates/.claude/skills/docs-manager/templates/memory.md.template +30 -0
  172. package/templates/.claude/skills/docs-manager/templates/onboarding.md.template +20 -0
  173. package/templates/.claude/skills/docs-manager/templates/project.md.template +26 -0
  174. package/templates/.claude/skills/docs-quality/SKILL.md +148 -0
  175. package/templates/.claude/skills/docx/LICENSE.txt +30 -0
  176. package/templates/.claude/skills/docx/SKILL.md +197 -0
  177. package/templates/.claude/skills/docx/docx-js.md +350 -0
  178. package/templates/.claude/skills/docx/ooxml.md +610 -0
  179. package/templates/.claude/skills/docx/scripts/__init__.py +1 -0
  180. package/templates/.claude/skills/docx/scripts/document.py +1276 -0
  181. package/templates/.claude/skills/docx/scripts/templates/comments.xml +3 -0
  182. package/templates/.claude/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  183. package/templates/.claude/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  184. package/templates/.claude/skills/docx/scripts/templates/commentsIds.xml +3 -0
  185. package/templates/.claude/skills/docx/scripts/templates/people.xml +3 -0
  186. package/templates/.claude/skills/docx/scripts/utilities.py +374 -0
  187. package/templates/.claude/skills/duraone/SKILL.md +204 -0
  188. package/templates/.claude/skills/duraone/references/backend.md +636 -0
  189. package/templates/.claude/skills/duraone/references/frontend.md +1506 -0
  190. package/templates/.claude/skills/duraone/references/sql.md +631 -0
  191. package/templates/.claude/skills/duraone/references/workflow.md +520 -0
  192. package/templates/.claude/skills/executing-plans/SKILL.md +76 -0
  193. package/templates/.claude/skills/file-organizer/SKILL.md +433 -0
  194. package/templates/.claude/skills/frontend/SKILL.md +26 -0
  195. package/templates/.claude/skills/frontend-design/LICENSE.txt +177 -0
  196. package/templates/.claude/skills/frontend-design/SKILL.md +42 -0
  197. package/templates/.claude/skills/frontend-vue/SKILL.md +127 -0
  198. package/templates/.claude/skills/frontend-vue/components/Control/Box.vue +137 -0
  199. package/templates/.claude/skills/frontend-vue/components/Control/Button.vue +93 -0
  200. package/templates/.claude/skills/frontend-vue/components/Control/ButtonBar.vue +29 -0
  201. package/templates/.claude/skills/frontend-vue/components/Control/ButtonFloat.vue +62 -0
  202. package/templates/.claude/skills/frontend-vue/components/Control/CheckButton.vue +75 -0
  203. package/templates/.claude/skills/frontend-vue/components/Control/Checkbox.vue +58 -0
  204. package/templates/.claude/skills/frontend-vue/components/Control/Datetime.vue +148 -0
  205. package/templates/.claude/skills/frontend-vue/components/Control/Dropdownlist.vue +156 -0
  206. package/templates/.claude/skills/frontend-vue/components/Control/Input.vue +106 -0
  207. package/templates/.claude/skills/frontend-vue/components/Control/Label.vue +38 -0
  208. package/templates/.claude/skills/frontend-vue/components/Control/Master/BoxColumn.vue +24 -0
  209. package/templates/.claude/skills/frontend-vue/components/Control/Popup/Confirm.vue +33 -0
  210. package/templates/.claude/skills/frontend-vue/components/Control/Popup/Info.vue +32 -0
  211. package/templates/.claude/skills/frontend-vue/components/Control/Popup/ModalInfo.vue +39 -0
  212. package/templates/.claude/skills/frontend-vue/components/Control/Popup/Reject.vue +64 -0
  213. package/templates/.claude/skills/frontend-vue/components/Control/Tag.vue +82 -0
  214. package/templates/.claude/skills/frontend-vue/components/Control/Upload.vue +61 -0
  215. package/templates/.claude/skills/frontend-vue/components/ControlMobile/Dropdownlist.vue +103 -0
  216. package/templates/.claude/skills/frontend-vue/components/ControlMobile/PagingBar.vue +108 -0
  217. package/templates/.claude/skills/frontend-vue/components/ControlMobile/UploadImage.vue +137 -0
  218. package/templates/.claude/skills/frontend-vue/components/Grid/AG.vue +806 -0
  219. package/templates/.claude/skills/frontend-vue/components/Grid/AntTable.vue +253 -0
  220. package/templates/.claude/skills/frontend-vue/components/Grid/CustomDropdownEditor.vue +43 -0
  221. package/templates/.claude/skills/frontend-vue/components/Grid/CustomDropdownEditorEnable.vue +55 -0
  222. package/templates/.claude/skills/frontend-vue/components/Grid/HtmlTable.vue +40 -0
  223. package/templates/.claude/skills/frontend-vue/components/PDFViewer.vue +25 -0
  224. package/templates/.claude/skills/frontend-vue/components/Panel/FormView.vue +309 -0
  225. package/templates/.claude/skills/frontend-vue/components/Partial/Footer.vue +23 -0
  226. package/templates/.claude/skills/frontend-vue/components/Partial/Header.vue +265 -0
  227. package/templates/.claude/skills/frontend-vue/components/Partial/Sidebar.vue +122 -0
  228. package/templates/.claude/skills/frontend-vue/components/Template.vue +16 -0
  229. package/templates/.claude/skills/frontend-vue/components/View/Form.vue +89 -0
  230. package/templates/.claude/skills/frontend-vue/composables/indexDBStore.js +140 -0
  231. package/templates/.claude/skills/frontend-vue/composables/masterApi.js +362 -0
  232. package/templates/.claude/skills/frontend-vue/composables/state.js +578 -0
  233. package/templates/.claude/skills/frontend-vue/composables/useRequest.js +221 -0
  234. package/templates/.claude/skills/frontend-vue/composables/useSession.js +179 -0
  235. package/templates/.claude/skills/frontend-vue/composables/useTranslation.js +54 -0
  236. package/templates/.claude/skills/frontend-vue/composables/useWebSocket.js +257 -0
  237. package/templates/.claude/skills/frontend-vue/composables/userObj.js +111 -0
  238. package/templates/.claude/skills/frontend-vue/composables/utils.js +322 -0
  239. package/templates/.claude/skills/frontend-vue/reference/composables-example.vue +320 -0
  240. package/templates/.claude/skills/frontend-vue/reference/form-example.vue +183 -0
  241. package/templates/.claude/skills/frontend-vue/reference/grid-example.vue +147 -0
  242. package/templates/.claude/skills/frontend-vue/reference/masterdata-example/[id].vue +106 -0
  243. package/templates/.claude/skills/frontend-vue/reference/masterdata-example/index.vue +58 -0
  244. package/templates/.claude/skills/frontend-vue/reference/popup-example.vue +159 -0
  245. package/templates/.claude/skills/pdf/LICENSE.txt +30 -0
  246. package/templates/.claude/skills/pdf/SKILL.md +294 -0
  247. package/templates/.claude/skills/pdf/forms.md +205 -0
  248. package/templates/.claude/skills/pdf/reference.md +612 -0
  249. package/templates/.claude/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  250. package/templates/.claude/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  251. package/templates/.claude/skills/pdf/scripts/check_fillable_fields.py +12 -0
  252. package/templates/.claude/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  253. package/templates/.claude/skills/pdf/scripts/create_validation_image.py +41 -0
  254. package/templates/.claude/skills/pdf/scripts/extract_form_field_info.py +152 -0
  255. package/templates/.claude/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  256. package/templates/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  257. package/templates/.claude/skills/pdf-processing/SKILL.md +107 -0
  258. package/templates/.claude/skills/pdf-processing-pro/FORMS.md +610 -0
  259. package/templates/.claude/skills/pdf-processing-pro/OCR.md +137 -0
  260. package/templates/.claude/skills/pdf-processing-pro/SKILL.md +296 -0
  261. package/templates/.claude/skills/pdf-processing-pro/TABLES.md +626 -0
  262. package/templates/.claude/skills/pdf-processing-pro/scripts/analyze_form.py +307 -0
  263. package/templates/.claude/skills/postgres/SKILL.md +69 -0
  264. package/templates/.claude/skills/postgres/reference/fn_get_examples.sql +208 -0
  265. package/templates/.claude/skills/postgres/reference/fn_rpt_examples.sql +239 -0
  266. package/templates/.claude/skills/postgres/reference/utility_functions.sql +94 -0
  267. package/templates/.claude/skills/pptx/LICENSE.txt +30 -0
  268. package/templates/.claude/skills/pptx/SKILL.md +484 -0
  269. package/templates/.claude/skills/pptx/html2pptx.md +625 -0
  270. package/templates/.claude/skills/pptx/ooxml.md +427 -0
  271. package/templates/.claude/skills/pptx/scripts/html2pptx.js +979 -0
  272. package/templates/.claude/skills/pptx/scripts/inventory.py +1020 -0
  273. package/templates/.claude/skills/pptx/scripts/rearrange.py +231 -0
  274. package/templates/.claude/skills/pptx/scripts/replace.py +385 -0
  275. package/templates/.claude/skills/pptx/scripts/thumbnail.py +450 -0
  276. package/templates/.claude/skills/repo-maintenance/SKILL.md +97 -0
  277. package/templates/.claude/skills/research/EXAMPLES.md +434 -0
  278. package/templates/.claude/skills/research/REFERENCE.md +399 -0
  279. package/templates/.claude/skills/research/SKILL.md +136 -0
  280. package/templates/.claude/skills/root-cause-tracing/SKILL.md +174 -0
  281. package/templates/.claude/skills/root-cause-tracing/find-polluter.sh +63 -0
  282. package/templates/.claude/skills/sharing-skills/SKILL.md +194 -0
  283. package/templates/.claude/skills/sql-optimization-patterns/SKILL.md +493 -0
  284. package/templates/.claude/skills/subagent-driven-development/SKILL.md +189 -0
  285. package/templates/.claude/skills/systematic-debugging/CREATION-LOG.md +119 -0
  286. package/templates/.claude/skills/systematic-debugging/SKILL.md +295 -0
  287. package/templates/.claude/skills/systematic-debugging/test-academic.md +14 -0
  288. package/templates/.claude/skills/systematic-debugging/test-pressure-1.md +58 -0
  289. package/templates/.claude/skills/systematic-debugging/test-pressure-2.md +68 -0
  290. package/templates/.claude/skills/systematic-debugging/test-pressure-3.md +69 -0
  291. package/templates/.claude/skills/test-driven-development/SKILL.md +364 -0
  292. package/templates/.claude/skills/testing-anti-patterns/SKILL.md +302 -0
  293. package/templates/.claude/skills/testing-quality/SKILL.md +97 -0
  294. package/templates/.claude/skills/verification-before-completion/SKILL.md +139 -0
  295. package/templates/.claude/skills/webapp-testing/LICENSE.txt +202 -0
  296. package/templates/.claude/skills/webapp-testing/SKILL.md +96 -0
  297. package/templates/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
  298. package/templates/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
  299. package/templates/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
  300. package/templates/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
  301. package/templates/.claude/ukit/index/build-index.mjs +28 -0
  302. package/templates/.claude/ukit/index/cache-utils.mjs +140 -0
  303. package/templates/.claude/ukit/index/lib/index-core.mjs +2800 -0
  304. package/templates/.claude/ukit/index/query-index.mjs +150 -0
  305. package/templates/.claude/ukit/index/refresh-index.mjs +57 -0
  306. package/templates/.claude/ukit/index/reset-auto-permissions.mjs +76 -0
  307. package/templates/.claude/ukit/index/resolve-context.mjs +279 -0
  308. package/templates/.claude/ukit/index/route-catalog.mjs +258 -0
  309. package/templates/.claude/ukit/index/route-task.mjs +1994 -0
  310. package/templates/.claude/ukit/index/triage.mjs +133 -0
  311. package/templates/.claude/ukit/index/verify-context.mjs +689 -0
  312. package/templates/.claude/ukit/runtime/compact-threshold.mjs +1013 -0
  313. package/templates/.claude/ukit/runtime/output-compression.mjs +1340 -0
  314. package/templates/.claude/ukit/runtime/reinject-context.mjs +874 -0
  315. package/templates/.claude/ukit/runtime/token-utils.mjs +500 -0
  316. package/templates/.codex/README.md +83 -0
  317. package/templates/.codex/settings.json +187 -0
  318. package/templates/.gitignore +75 -0
  319. package/templates/AGENTS.md +116 -0
  320. package/templates/CLAUDE.md +93 -0
  321. package/templates/adapter-presets/antigravity/README.md +22 -0
  322. package/templates/adapter-presets/antigravity/rules.md +49 -0
  323. package/templates/adapter-presets/claude/settings.local.json +42 -0
  324. package/templates/adapter-presets/codex/settings.local.json +6 -0
  325. package/templates/adapter-presets/opencode/opencode.template.json +1 -0
  326. package/templates/docs/BUGFIX.md +20 -0
  327. package/templates/docs/BUG_INDEX.md +12 -0
  328. package/templates/docs/BUG_METRICS.md +7 -0
  329. package/templates/docs/BUG_TEMPLATE.md +13 -0
  330. package/templates/docs/CODE_MAP.md +35 -0
  331. package/templates/docs/INSTALL.md +113 -0
  332. package/templates/docs/MEMORY.md +49 -0
  333. package/templates/docs/PROJECT.md +50 -0
  334. package/templates/docs/UKIT_USAGE_GUIDE.md +147 -0
  335. package/templates/docs/WORKLOG.md +10 -0
  336. package/templates/ukit/README.md +14 -0
  337. package/templates/ukit/storage/cache/compact-history.json +3 -0
  338. package/templates/ukit/storage/cache/compact-pressure.json +1 -0
  339. package/templates/ukit/storage/cache/output-history.json +3 -0
  340. package/templates/ukit/storage/cache/prompt-cache.json +3 -0
  341. package/templates/ukit/storage/config.json +37 -0
  342. package/templates/ukit/storage/memory/projects/.gitkeep +2 -0
  343. package/templates/ukit/storage/memory/sessions/.gitkeep +0 -0
  344. package/templates/ukit/storage/memory/user.json +5 -0
@@ -0,0 +1,509 @@
1
+ import {
2
+ buildCodeIndex,
3
+ isIndexStale,
4
+ DEFAULT_INDEX_CACHE_MAX_AGE_MS,
5
+ getIndexArtifactGeneratedAt,
6
+ } from '../../index/buildIndex.js';
7
+ import { resolveContext } from '../../index/resolveContext.js';
8
+ import { deriveVerificationPlan } from '../../index/verificationPlan.js';
9
+ import { deriveTaskRoute } from '../../index/taskRouting.js';
10
+ import { queryCodeIndex } from '../../index/queryIndex.js';
11
+ import { triageBug } from '../../bug/triageBug.js';
12
+ import { installIndexRefreshHooks, removeIndexRefreshHooks } from '../../index/gitHooks.js';
13
+ import {
14
+ parseIndexArgs,
15
+ CONTEXT_FLAG_DEFINITIONS,
16
+ QUERY_FLAG_DEFINITIONS,
17
+ TRIAGE_FLAG_DEFINITIONS,
18
+ VERIFY_FLAG_DEFINITIONS,
19
+ ROUTE_FLAG_DEFINITIONS,
20
+ } from './indexArgs.js';
21
+
22
+ const HELP_FLAGS = new Set(['--help', '-h', 'help']);
23
+ const CONTEXT_DISPLAY_LIMIT = 2;
24
+ const CONTEXT_REASON_LIMIT = 2;
25
+ const VERIFY_COMMAND_DISPLAY_LIMIT = 2;
26
+ const VERIFY_REASON_DISPLAY_LIMIT = 2;
27
+ const VERIFY_NOTE_DISPLAY_LIMIT = 1;
28
+
29
+ export async function runIndexTools({ projectRoot, argv = [] }) {
30
+ const [subcommandRaw, ...rest] = argv;
31
+ const subcommand = (subcommandRaw ?? '').toLowerCase();
32
+
33
+ if (!subcommand || HELP_FLAGS.has(subcommand)) {
34
+ printIndexHelp();
35
+ return;
36
+ }
37
+
38
+ if (subcommand === 'build' || subcommand === 'refresh') {
39
+ const summary = await buildCodeIndex({ rootDir: projectRoot });
40
+ const label = subcommand === 'build' ? 'build' : 'refresh';
41
+ console.log(`[UKit] Index ${label} completed.`);
42
+ console.log(`[UKit] files=${summary.fileCount}, symbols=${summary.symbolCount}, imports=${summary.importCount}`);
43
+ console.log(`[UKit] tests-map=${summary.testsMapCount}, hotspots=${summary.hotspotCount}`);
44
+ console.log(`[UKit] parsed=${summary.parsedCodeFileCount}, reused=${summary.reusedCodeFileCount}`);
45
+ console.log(`[UKit] cache=${summary.indexDir}`);
46
+ return;
47
+ }
48
+
49
+ if (subcommand === 'query') {
50
+ const { tokens, flags } = parseIndexArgs(rest, QUERY_FLAG_DEFINITIONS);
51
+ const query = tokens.join(' ').trim();
52
+ if (!query) {
53
+ throw new Error('Missing query. Usage: ukit index query "<error|symbol|path>"');
54
+ }
55
+
56
+ await refreshIndexIfStale(projectRoot);
57
+
58
+ const limitArg = flags.get('--limit');
59
+ const limit = Number.parseInt(limitArg ?? '5', 10);
60
+ const results = await queryCodeIndex({
61
+ rootDir: projectRoot,
62
+ query,
63
+ limit: Number.isNaN(limit) ? 5 : limit,
64
+ });
65
+
66
+ if (results.length === 0) {
67
+ console.log('[UKit] No index matches found.');
68
+ return;
69
+ }
70
+
71
+ console.log(`[UKit] Index query top ${results.length} for: ${query}`);
72
+ for (const [idx, item] of results.entries()) {
73
+ console.log(`${idx + 1}. ${item.filePath} (score=${item.score})`);
74
+ if ((item.tests ?? []).length > 0) {
75
+ console.log(` tests: ${item.tests.slice(0, 2).join(', ')}`);
76
+ }
77
+ if ((item.reasons ?? []).length > 0) {
78
+ console.log(` reasons: ${item.reasons.join(', ')}`);
79
+ }
80
+ }
81
+ return;
82
+ }
83
+
84
+ if (subcommand === 'triage') {
85
+ const { tokens: signatureTokens } = parseIndexArgs(rest, TRIAGE_FLAG_DEFINITIONS);
86
+ const signature = signatureTokens.join(' ').trim();
87
+ if (!signature) {
88
+ throw new Error('Missing signature. Usage: ukit index triage "<error signature>"');
89
+ }
90
+
91
+ await refreshIndexIfStale(projectRoot);
92
+
93
+ const result = await triageBug({ rootDir: projectRoot, signature });
94
+ console.log('[UKit] Bug triage result:');
95
+ console.log(`lane: ${result.lane}`);
96
+ console.log(`confidence: ${result.confidence.toFixed(2)}`);
97
+ console.log(`suspects: ${result.suspectFiles.join(', ') || 'none'}`);
98
+ console.log(`test: ${result.recommendedTestCommand}`);
99
+ return;
100
+ }
101
+
102
+ if (subcommand === 'context') {
103
+ const { tokens, flags } = parseIndexArgs(rest, CONTEXT_FLAG_DEFINITIONS);
104
+ const intent = tokens.join(' ').trim();
105
+ const targetFile = flags.get('--target') ?? null;
106
+ const taskType = flags.get('--type') ?? null;
107
+
108
+ if (!intent && !targetFile) {
109
+ throw new Error('Missing intent or target. Usage: ukit index context "<intent>" [--target <file>] [--type trivial|simple|non-trivial]');
110
+ }
111
+
112
+ await refreshIndexIfStale(projectRoot);
113
+
114
+ const result = await resolveContext({
115
+ rootDir: projectRoot,
116
+ intent,
117
+ targetFile,
118
+ taskType,
119
+ });
120
+
121
+ console.log('[UKit] Suggested context:');
122
+ console.log(`taskType: ${result.taskType}`);
123
+ console.log(`budget: ${result.contextBudget.minFiles}-${result.contextBudget.maxFiles} files`);
124
+ printContextGroup('primaryTargets', result.primaryTargets, result.explanations?.primaryTargets);
125
+ printContextGroup('sharedAbstractions', result.sharedAbstractions, result.explanations?.sharedAbstractions);
126
+ printContextGroup('analogFiles', result.analogFiles, result.explanations?.analogFiles);
127
+ printContextGroup('relatedTests', result.relatedTests, result.explanations?.relatedTests);
128
+ printContextGroup('styleFiles', result.styleFiles, result.explanations?.styleFiles);
129
+ return;
130
+ }
131
+
132
+ if (subcommand === 'verify') {
133
+ const { tokens, flags } = parseIndexArgs(rest, VERIFY_FLAG_DEFINITIONS);
134
+ const intent = tokens.join(' ').trim();
135
+ const targetFile = flags.get('--target') ?? null;
136
+ const taskType = flags.get('--type') ?? null;
137
+
138
+ if (!intent && !targetFile) {
139
+ throw new Error('Missing intent or target. Usage: ukit index verify "<intent>" [--target <file>] [--type trivial|simple|non-trivial]');
140
+ }
141
+
142
+ await refreshIndexIfStale(projectRoot);
143
+
144
+ const result = await deriveVerificationPlan({
145
+ rootDir: projectRoot,
146
+ intent,
147
+ targetFile,
148
+ taskType,
149
+ });
150
+
151
+ console.log('[UKit] Suggested verification:');
152
+ console.log(`taskType: ${result.taskType}`);
153
+ console.log(`mode: ${result.mode}`);
154
+ console.log(`commands: ${formatCompactCommandDisplayList(result.commands, VERIFY_COMMAND_DISPLAY_LIMIT)}`);
155
+ console.log(`fallback: ${formatCompactCommandDisplayList(result.fallbackCommands, VERIFY_COMMAND_DISPLAY_LIMIT)}`);
156
+ console.log(`reasons: ${formatCompactDisplayList(result.reasons, VERIFY_REASON_DISPLAY_LIMIT)}`);
157
+ if (result.executionPolicy) {
158
+ console.log(`policy: ${result.executionPolicy.policyMode}`);
159
+ console.log(`autoRunPrimary: ${result.executionPolicy.shouldAutoRunPrimaryCommands ? 'yes' : 'no'}`);
160
+ console.log(`autoRunFallbacks: ${result.executionPolicy.shouldAutoRunFallbacks ? 'yes' : 'no'}`);
161
+ console.log(`confirmBroad: ${result.executionPolicy.requiresHumanConfirmationForBroadOrRisky ? 'yes' : 'no'}`);
162
+ }
163
+ if ((result.notes ?? []).length > 0) {
164
+ console.log(`notes: ${formatCompactNoteDisplayList(result.notes, VERIFY_NOTE_DISPLAY_LIMIT)}`);
165
+ }
166
+ return;
167
+ }
168
+
169
+ if (subcommand === 'route') {
170
+ const { tokens, flags } = parseIndexArgs(rest, ROUTE_FLAG_DEFINITIONS);
171
+ const promptText = tokens.join(' ').trim();
172
+ const targetFile = flags.get('--target') ?? null;
173
+ const taskType = flags.get('--type') ?? null;
174
+ const commandText = flags.get('--tool-command') ?? '';
175
+ const lastExplicitUserPromptText = flags.get('--last-prompt') ?? '';
176
+ const adapter = flags.get('--adapter') ?? 'claude';
177
+ const commandNamespace = adapter === 'codex' ? '.codex' : '.claude';
178
+
179
+ if (!promptText && !commandText && !targetFile) {
180
+ throw new Error('Missing prompt, tool command, or target. Usage: ukit index route "<prompt>" [--tool-command <cmd>] [--target <file>] [--type trivial|simple|non-trivial] [--adapter claude|codex]');
181
+ }
182
+
183
+ await refreshIndexIfStale(projectRoot);
184
+
185
+ const result = await deriveTaskRoute({
186
+ rootDir: projectRoot,
187
+ promptText,
188
+ commandText,
189
+ targetFile,
190
+ taskType,
191
+ lastExplicitUserPromptText,
192
+ commandNamespace,
193
+ });
194
+
195
+ const compactSummary = formatDisplayRouteSummary(result.routeSummary, result.routingContext);
196
+ const nextDisplay = formatDisplayNextAction(result.routeSummary);
197
+ console.log('[UKit] Suggested task route:');
198
+ console.log(`skills: ${result.activeSkills.map((item) => item.id).join(', ') || 'none'}`);
199
+ console.log(`summary: ${compactSummary}`);
200
+ if (nextDisplay) {
201
+ console.log(`next: ${nextDisplay}`);
202
+ }
203
+ if (result.routeSummary?.delegateHint) {
204
+ console.log(`delegate: ${result.routeSummary.delegateHint}`);
205
+ }
206
+ if (result.routeSummary?.helperHint && !result.routeSummary?.nextActionCommand) {
207
+ console.log(`helper: ${result.routeSummary.helperHint}`);
208
+ }
209
+ return;
210
+ }
211
+
212
+ if (subcommand === 'hooks') {
213
+ const action = (rest[0] ?? 'install').toLowerCase();
214
+ if (action === 'help' || action === '--help' || action === '-h') {
215
+ printIndexHooksHelp();
216
+ return;
217
+ }
218
+
219
+ if (action === 'install') {
220
+ const result = await installIndexRefreshHooks({ projectRoot });
221
+ console.log('[UKit] Installed index auto-refresh git hooks.');
222
+ console.log(`[UKit] installed=${result.installed}, unchanged=${result.unchanged}`);
223
+ return;
224
+ }
225
+
226
+ if (action === 'remove' || action === 'uninstall') {
227
+ const result = await removeIndexRefreshHooks({ projectRoot });
228
+ console.log('[UKit] Removed index auto-refresh git hooks.');
229
+ console.log(`[UKit] removed=${result.removed}, unchanged=${result.unchanged}`);
230
+ return;
231
+ }
232
+
233
+ throw new Error(`Unknown hooks action: ${action}. Use "ukit index hooks help".`);
234
+ }
235
+
236
+ throw new Error(`Unknown index subcommand: ${subcommand}. Run "ukit index help".`);
237
+ }
238
+
239
+ export function printIndexHelp() {
240
+ console.log('UKit Index Commands');
241
+ console.log('Usage: ukit index <build|refresh|query|triage|context|verify|route> [args]');
242
+ console.log('');
243
+ console.log('Subcommands:');
244
+ console.log(' build Build codebase index cache');
245
+ console.log(' refresh Refresh index cache (incremental hint accepted)');
246
+ console.log(' query "<query>" Search indexed files/symbols/imports');
247
+ console.log(' triage "<signature>" Suggest fast/deep lane + suspect files');
248
+ console.log(' context "<intent>" Suggest minimal file context with reasons');
249
+ console.log(' verify "<intent>" Suggest verification lane from indexed context');
250
+ console.log(' route "<prompt>" Suggest skill + context + verification next step');
251
+ console.log(' hooks [install|remove] Manage git-hook auto-refresh');
252
+ console.log('');
253
+ console.log('Aliases:');
254
+ console.log(' ukit build index Equivalent to "ukit index build"');
255
+ }
256
+
257
+ function printIndexHooksHelp() {
258
+ console.log('UKit Index Hook Commands');
259
+ console.log('Usage: ukit index hooks [install|remove]');
260
+ console.log('');
261
+ console.log('Examples:');
262
+ console.log(' ukit index hooks install');
263
+ console.log(' ukit index hooks remove');
264
+ }
265
+
266
+ async function refreshIndexIfStale(rootDir) {
267
+ const lastRefreshMs = await getIndexArtifactGeneratedAt({ rootDir });
268
+ const stale = await isIndexStale({
269
+ rootDir,
270
+ maxAgeMs: DEFAULT_INDEX_CACHE_MAX_AGE_MS,
271
+ generatedAtMs: lastRefreshMs,
272
+ });
273
+
274
+ if (!stale) {
275
+ return false;
276
+ }
277
+
278
+ await buildCodeIndex({ rootDir });
279
+
280
+ if (lastRefreshMs !== null) {
281
+ console.log(`[UKit] stale index refreshed (last=${new Date(lastRefreshMs).toISOString()})`);
282
+ } else {
283
+ console.log('[UKit] stale index refreshed (no previous cache timestamp)');
284
+ }
285
+
286
+ return true;
287
+ }
288
+
289
+ function printContextGroup(label, filePaths = [], explanations = []) {
290
+ console.log(`${label}: ${formatCompactDisplayList(filePaths)}`);
291
+
292
+ const normalizedExplanations = uniqueContextExplanations(explanations);
293
+ for (const item of normalizedExplanations.slice(0, CONTEXT_REASON_LIMIT)) {
294
+ console.log(` - ${item.filePath}: ${item.reason}`);
295
+ }
296
+
297
+ const remainingReasonCount = normalizedExplanations.length - Math.min(normalizedExplanations.length, CONTEXT_REASON_LIMIT);
298
+ if (remainingReasonCount > 0) {
299
+ console.log(` - +${remainingReasonCount} more reasons`);
300
+ }
301
+ }
302
+
303
+ function formatCompactDisplayList(values = [], limit = CONTEXT_DISPLAY_LIMIT, separator = ', ') {
304
+ const normalized = [...new Set((values ?? []).filter(Boolean))];
305
+ if (normalized.length === 0) {
306
+ return 'none';
307
+ }
308
+
309
+ const shown = normalized.slice(0, limit);
310
+ const remaining = normalized.length - shown.length;
311
+ return remaining > 0
312
+ ? `${shown.join(separator)}${separator}+${remaining} more`
313
+ : shown.join(separator);
314
+ }
315
+
316
+ function formatCompactNoteDisplayList(values = [], limit = VERIFY_NOTE_DISPLAY_LIMIT) {
317
+ const normalized = [...new Set((values ?? []).filter(Boolean))]
318
+ .map(compactVerificationDisplayNote)
319
+ .filter(Boolean);
320
+
321
+ return formatCompactDisplayList(normalized, limit, ' | ');
322
+ }
323
+
324
+ function formatCompactCommandDisplayList(values = [], limit = VERIFY_COMMAND_DISPLAY_LIMIT) {
325
+ const normalized = [...new Set((values ?? []).filter(Boolean))];
326
+ if (normalized.length === 0) {
327
+ return 'none';
328
+ }
329
+
330
+ const sharedTargetFamily = deriveSharedTargetCommandFamily(normalized);
331
+ if (!sharedTargetFamily) {
332
+ return formatCompactDisplayList(normalized, limit);
333
+ }
334
+
335
+ const [firstTarget, ...remainingTargets] = sharedTargetFamily.targets;
336
+ const firstCommand = `${sharedTargetFamily.prefix} ${firstTarget}`;
337
+ const shownSiblingCount = Math.max(0, Math.min(remainingTargets.length, limit - 1));
338
+ const shownSiblings = remainingTargets.slice(0, shownSiblingCount);
339
+ const hiddenSiblingCount = remainingTargets.length - shownSiblings.length;
340
+
341
+ if (shownSiblings.length === 0) {
342
+ return hiddenSiblingCount > 0
343
+ ? `${firstCommand} | same-command: +${hiddenSiblingCount} more`
344
+ : firstCommand;
345
+ }
346
+
347
+ const siblingSummary = shownSiblings.join(', ');
348
+ return hiddenSiblingCount > 0
349
+ ? `${firstCommand} | same-command: ${siblingSummary}, +${hiddenSiblingCount} more`
350
+ : `${firstCommand} | same-command: ${siblingSummary}`;
351
+ }
352
+
353
+ function deriveSharedTargetCommandFamily(commands = []) {
354
+ if (commands.length < 2) {
355
+ return null;
356
+ }
357
+
358
+ const parsed = commands.map(parseSharedTargetCommand);
359
+ if (parsed.some((entry) => !entry)) {
360
+ return null;
361
+ }
362
+
363
+ const prefix = parsed[0].prefix;
364
+ if (!prefix || parsed.some((entry) => entry.prefix !== prefix)) {
365
+ return null;
366
+ }
367
+
368
+ return {
369
+ prefix,
370
+ targets: parsed.map((entry) => entry.target),
371
+ };
372
+ }
373
+
374
+ function parseSharedTargetCommand(command) {
375
+ const normalized = String(command || '').trim();
376
+ if (!normalized) {
377
+ return null;
378
+ }
379
+
380
+ const parts = normalized.split(/\s+/);
381
+ if (parts.length < 3) {
382
+ return null;
383
+ }
384
+
385
+ const target = parts.at(-1);
386
+ if (!isLikelyCommandTarget(target)) {
387
+ return null;
388
+ }
389
+
390
+ const prefix = parts.slice(0, -1).join(' ').trim();
391
+ return prefix
392
+ ? { prefix, target }
393
+ : null;
394
+ }
395
+
396
+ function isLikelyCommandTarget(value) {
397
+ if (!value) {
398
+ return false;
399
+ }
400
+
401
+ return value.startsWith('./')
402
+ || value.startsWith('../')
403
+ || value.startsWith('/')
404
+ || value.includes('/')
405
+ || /\.[a-z0-9]+$/i.test(value);
406
+ }
407
+
408
+ function compactVerificationDisplayNote(note) {
409
+ const normalized = String(note || '').trim();
410
+ if (!normalized) {
411
+ return '';
412
+ }
413
+
414
+ if (normalized.startsWith('Run related tests first:')) {
415
+ return `related-tests-first: ${normalized.slice('Run related tests first:'.length).trim()}`;
416
+ }
417
+
418
+ if (normalized.startsWith('Docs-focused change:')) {
419
+ return 'docs-only: prefer docs syntax/format checks; broad tests not default';
420
+ }
421
+
422
+ if (normalized === 'Match verification effort to scope; no project test/lint/typecheck scripts were detected.') {
423
+ return 'no test/lint/typecheck scripts detected; match verification effort to scope';
424
+ }
425
+
426
+ return normalized;
427
+ }
428
+
429
+ function uniqueContextExplanations(explanations = []) {
430
+ const seen = new Set();
431
+ const unique = [];
432
+
433
+ for (const item of explanations ?? []) {
434
+ const filePath = String(item?.filePath ?? '').trim();
435
+ const reason = String(item?.reason ?? '').trim();
436
+ if (!filePath && !reason) {
437
+ continue;
438
+ }
439
+
440
+ const key = `${filePath}::${reason}`;
441
+ if (seen.has(key)) {
442
+ continue;
443
+ }
444
+
445
+ seen.add(key);
446
+ unique.push({ filePath, reason });
447
+ }
448
+
449
+ return unique;
450
+ }
451
+
452
+ function hasRouteSummaryField(routeSummary, field) {
453
+ return Boolean(
454
+ routeSummary
455
+ && typeof routeSummary === 'object'
456
+ && Object.prototype.hasOwnProperty.call(routeSummary, field),
457
+ );
458
+ }
459
+
460
+ function extractRouteLineSegment(line, label) {
461
+ if (typeof line !== 'string' || !line.trim()) {
462
+ return null;
463
+ }
464
+
465
+ const match = line.match(new RegExp(`(?:^|\\|\\s*)${label}=([^|]+)`, 'i'));
466
+ return match ? `${label}=${String(match[1] || '').trim()}` : null;
467
+ }
468
+
469
+ function formatDisplayRouteSummary(routeSummary = null, routingContext = {}) {
470
+ const line = String(routeSummary?.line ?? '').trim();
471
+ const taskSegment = routingContext?.taskType
472
+ ? `task=${routingContext.taskType}`
473
+ : extractRouteLineSegment(line, 'task');
474
+ const policySegment = routeSummary?.policyMode
475
+ ? `policy=${routeSummary.policyMode}`
476
+ : (
477
+ hasRouteSummaryField(routeSummary, 'policyMode')
478
+ ? null
479
+ : extractRouteLineSegment(line, 'policy')
480
+ );
481
+
482
+ const segments = [
483
+ taskSegment,
484
+ extractRouteLineSegment(line, 'targets'),
485
+ extractRouteLineSegment(line, 'tests'),
486
+ extractRouteLineSegment(line, 'styles'),
487
+ policySegment,
488
+ ].filter(Boolean);
489
+
490
+ return segments.join(' | ') || 'none';
491
+ }
492
+
493
+ function formatDisplayNextAction(routeSummary = null) {
494
+ if (!routeSummary || typeof routeSummary !== 'object') {
495
+ return '';
496
+ }
497
+
498
+ const nextActionCommand = String(routeSummary.nextActionCommand ?? '').trim();
499
+ if (nextActionCommand) {
500
+ return nextActionCommand;
501
+ }
502
+
503
+ const nextActionType = String(routeSummary.nextActionType ?? '').trim();
504
+ if (!nextActionType || nextActionType === 'read-skill-instructions') {
505
+ return '';
506
+ }
507
+
508
+ return nextActionType;
509
+ }