minimal-vibe-coding-kit 0.5.0 → 0.5.2

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 (378) hide show
  1. package/.agents/skills/agentshield-security-review/SKILL.md +16 -8
  2. package/.agents/skills/agentshield-security-review/references/native-install.md +2 -2
  3. package/.agents/skills/agentshield-security-review/scripts/agentshield_repo_probe.py +19 -1
  4. package/.agents/skills/mermaid/SKILL.md +141 -0
  5. package/.agents/skills/mermaid/UPSTREAM-NOTICE.md +52 -0
  6. package/.agents/skills/mermaid/references/architecture.md +433 -0
  7. package/.agents/skills/mermaid/references/block.md +752 -0
  8. package/.agents/skills/mermaid/references/c4.md +618 -0
  9. package/.agents/skills/mermaid/references/classDiagram.md +1191 -0
  10. package/.agents/skills/mermaid/references/coding-level-charts.md +27 -0
  11. package/.agents/skills/mermaid/references/config-configuration.md +71 -0
  12. package/.agents/skills/mermaid/references/config-directives.md +341 -0
  13. package/.agents/skills/mermaid/references/config-layouts.md +39 -0
  14. package/.agents/skills/mermaid/references/config-math.md +95 -0
  15. package/.agents/skills/mermaid/references/config-theming.md +245 -0
  16. package/.agents/skills/mermaid/references/config-tidy-tree.md +88 -0
  17. package/.agents/skills/mermaid/references/cynefin.md +278 -0
  18. package/.agents/skills/mermaid/references/debug-heatmap.md +68 -0
  19. package/.agents/skills/mermaid/references/entityRelationshipDiagram.md +902 -0
  20. package/.agents/skills/mermaid/references/eventmodeling.md +474 -0
  21. package/.agents/skills/mermaid/references/examples.md +300 -0
  22. package/.agents/skills/mermaid/references/flowchart.md +2166 -0
  23. package/.agents/skills/mermaid/references/gantt.md +736 -0
  24. package/.agents/skills/mermaid/references/gitgraph.md +2137 -0
  25. package/.agents/skills/mermaid/references/ishikawa.md +65 -0
  26. package/.agents/skills/mermaid/references/kanban.md +160 -0
  27. package/.agents/skills/mermaid/references/kit-examples.md +210 -0
  28. package/.agents/skills/mermaid/references/mindmap.md +334 -0
  29. package/.agents/skills/mermaid/references/packet.md +152 -0
  30. package/.agents/skills/mermaid/references/pie.md +111 -0
  31. package/.agents/skills/mermaid/references/preview.html +1143 -0
  32. package/.agents/skills/mermaid/references/quadrantChart.md +266 -0
  33. package/.agents/skills/mermaid/references/radar.md +268 -0
  34. package/.agents/skills/mermaid/references/railroad.md +455 -0
  35. package/.agents/skills/mermaid/references/requirementDiagram.md +494 -0
  36. package/.agents/skills/mermaid/references/sankey.md +414 -0
  37. package/.agents/skills/mermaid/references/sequenceDiagram.md +1206 -0
  38. package/.agents/skills/mermaid/references/stateDiagram.md +669 -0
  39. package/.agents/skills/mermaid/references/styling-preset.md +620 -0
  40. package/.agents/skills/mermaid/references/swimlanes.md +523 -0
  41. package/.agents/skills/mermaid/references/timeline.md +570 -0
  42. package/.agents/skills/mermaid/references/treeView.md +432 -0
  43. package/.agents/skills/mermaid/references/treemap.md +352 -0
  44. package/.agents/skills/mermaid/references/userJourney.md +41 -0
  45. package/.agents/skills/mermaid/references/venn.md +156 -0
  46. package/.agents/skills/mermaid/references/wardley.md +731 -0
  47. package/.agents/skills/mermaid/references/xyChart.md +392 -0
  48. package/.agents/skills/mermaid/references/zenuml.md +473 -0
  49. package/.agents/skills/sequential-thinking/SKILL.md +97 -69
  50. package/.agents/skills/sequential-thinking/examples/adaptive-depth.md +15 -536
  51. package/.agents/skills/sequential-thinking/examples/branching-exploration.md +18 -468
  52. package/.agents/skills/sequential-thinking/examples/linear-reasoning.md +22 -203
  53. package/.agents/skills/sequential-thinking/examples/revision-pattern.md +17 -298
  54. package/.agents/skills/sequential-thinking/references/advanced-techniques.md +98 -0
  55. package/.agents/skills/sequential-thinking/references/output-schema.md +99 -458
  56. package/.agents/skills/sequential-thinking/references/parameters.md +73 -435
  57. package/.agents/skills/sequential-thinking/references/patterns.md +72 -639
  58. package/.agents/skills/tutien/SKILL.md +36 -13
  59. package/.agents/skills/tutien/references/adaptive-response.md +68 -0
  60. package/.agents/skills/tutien/references/lore-sources.md +28 -0
  61. package/.agents/skills/tutien/references/privacy.md +13 -1
  62. package/.agents/skills/tutien/references/schema.md +32 -1
  63. package/.agents/skills/tutien/references/story-system.md +176 -0
  64. package/.agents/skills/tutien/references/vi-style-guide.md +89 -0
  65. package/.agents/skills/tutien/references/voice-and-mode.md +23 -8
  66. package/.agents/skills/tutien/scripts/catalog.mjs +17 -17
  67. package/.agents/skills/tutien/scripts/classify.mjs +64 -37
  68. package/.agents/skills/tutien/scripts/command.mjs +40 -21
  69. package/.agents/skills/tutien/scripts/project-profile.mjs +202 -0
  70. package/.agents/skills/tutien/scripts/render-report.mjs +128 -72
  71. package/.agents/skills/tutien/scripts/response-brief.mjs +103 -0
  72. package/.agents/skills/tutien/scripts/run-tutien.mjs +141 -63
  73. package/.agents/skills/tutien/scripts/story-ledger.mjs +241 -0
  74. package/.agents/skills/tutien/scripts/villains.mjs +14 -14
  75. package/.claude/skills/agentshield-security-review/SKILL.md +16 -8
  76. package/.claude/skills/agentshield-security-review/references/native-install.md +2 -2
  77. package/.claude/skills/agentshield-security-review/scripts/agentshield_repo_probe.py +19 -1
  78. package/.claude/skills/mermaid/SKILL.md +141 -0
  79. package/.claude/skills/mermaid/UPSTREAM-NOTICE.md +52 -0
  80. package/.claude/skills/mermaid/references/architecture.md +433 -0
  81. package/.claude/skills/mermaid/references/block.md +752 -0
  82. package/.claude/skills/mermaid/references/c4.md +618 -0
  83. package/.claude/skills/mermaid/references/classDiagram.md +1191 -0
  84. package/.claude/skills/mermaid/references/coding-level-charts.md +27 -0
  85. package/.claude/skills/mermaid/references/config-configuration.md +71 -0
  86. package/.claude/skills/mermaid/references/config-directives.md +341 -0
  87. package/.claude/skills/mermaid/references/config-layouts.md +39 -0
  88. package/.claude/skills/mermaid/references/config-math.md +95 -0
  89. package/.claude/skills/mermaid/references/config-theming.md +245 -0
  90. package/.claude/skills/mermaid/references/config-tidy-tree.md +88 -0
  91. package/.claude/skills/mermaid/references/cynefin.md +278 -0
  92. package/.claude/skills/mermaid/references/debug-heatmap.md +68 -0
  93. package/.claude/skills/mermaid/references/entityRelationshipDiagram.md +902 -0
  94. package/.claude/skills/mermaid/references/eventmodeling.md +474 -0
  95. package/.claude/skills/mermaid/references/examples.md +300 -0
  96. package/.claude/skills/mermaid/references/flowchart.md +2166 -0
  97. package/.claude/skills/mermaid/references/gantt.md +736 -0
  98. package/.claude/skills/mermaid/references/gitgraph.md +2137 -0
  99. package/.claude/skills/mermaid/references/ishikawa.md +65 -0
  100. package/.claude/skills/mermaid/references/kanban.md +160 -0
  101. package/.claude/skills/mermaid/references/kit-examples.md +210 -0
  102. package/.claude/skills/mermaid/references/mindmap.md +334 -0
  103. package/.claude/skills/mermaid/references/packet.md +152 -0
  104. package/.claude/skills/mermaid/references/pie.md +111 -0
  105. package/.claude/skills/mermaid/references/preview.html +1143 -0
  106. package/.claude/skills/mermaid/references/quadrantChart.md +266 -0
  107. package/.claude/skills/mermaid/references/radar.md +268 -0
  108. package/.claude/skills/mermaid/references/railroad.md +455 -0
  109. package/.claude/skills/mermaid/references/requirementDiagram.md +494 -0
  110. package/.claude/skills/mermaid/references/sankey.md +414 -0
  111. package/.claude/skills/mermaid/references/sequenceDiagram.md +1206 -0
  112. package/.claude/skills/mermaid/references/stateDiagram.md +669 -0
  113. package/.claude/skills/mermaid/references/styling-preset.md +620 -0
  114. package/.claude/skills/mermaid/references/swimlanes.md +523 -0
  115. package/.claude/skills/mermaid/references/timeline.md +570 -0
  116. package/.claude/skills/mermaid/references/treeView.md +432 -0
  117. package/.claude/skills/mermaid/references/treemap.md +352 -0
  118. package/.claude/skills/mermaid/references/userJourney.md +41 -0
  119. package/.claude/skills/mermaid/references/venn.md +156 -0
  120. package/.claude/skills/mermaid/references/wardley.md +731 -0
  121. package/.claude/skills/mermaid/references/xyChart.md +392 -0
  122. package/.claude/skills/mermaid/references/zenuml.md +473 -0
  123. package/.claude/skills/sequential-thinking/SKILL.md +97 -69
  124. package/.claude/skills/sequential-thinking/examples/adaptive-depth.md +15 -536
  125. package/.claude/skills/sequential-thinking/examples/branching-exploration.md +18 -468
  126. package/.claude/skills/sequential-thinking/examples/linear-reasoning.md +22 -203
  127. package/.claude/skills/sequential-thinking/examples/revision-pattern.md +17 -298
  128. package/.claude/skills/sequential-thinking/references/advanced-techniques.md +98 -0
  129. package/.claude/skills/sequential-thinking/references/output-schema.md +99 -458
  130. package/.claude/skills/sequential-thinking/references/parameters.md +73 -435
  131. package/.claude/skills/sequential-thinking/references/patterns.md +72 -639
  132. package/.claude/skills/tutien/SKILL.md +36 -13
  133. package/.claude/skills/tutien/references/adaptive-response.md +68 -0
  134. package/.claude/skills/tutien/references/lore-sources.md +28 -0
  135. package/.claude/skills/tutien/references/privacy.md +13 -1
  136. package/.claude/skills/tutien/references/schema.md +32 -1
  137. package/.claude/skills/tutien/references/story-system.md +176 -0
  138. package/.claude/skills/tutien/references/vi-style-guide.md +89 -0
  139. package/.claude/skills/tutien/references/voice-and-mode.md +23 -8
  140. package/.claude/skills/tutien/scripts/catalog.mjs +17 -17
  141. package/.claude/skills/tutien/scripts/classify.mjs +64 -37
  142. package/.claude/skills/tutien/scripts/command.mjs +40 -21
  143. package/.claude/skills/tutien/scripts/project-profile.mjs +202 -0
  144. package/.claude/skills/tutien/scripts/render-report.mjs +128 -72
  145. package/.claude/skills/tutien/scripts/response-brief.mjs +103 -0
  146. package/.claude/skills/tutien/scripts/run-tutien.mjs +141 -63
  147. package/.claude/skills/tutien/scripts/story-ledger.mjs +241 -0
  148. package/.claude/skills/tutien/scripts/villains.mjs +14 -14
  149. package/.codex-plugin/plugin.json +1 -1
  150. package/.cursor/skills/mermaid/SKILL.md +141 -0
  151. package/.cursor/skills/mermaid/UPSTREAM-NOTICE.md +52 -0
  152. package/.cursor/skills/mermaid/references/architecture.md +433 -0
  153. package/.cursor/skills/mermaid/references/block.md +752 -0
  154. package/.cursor/skills/mermaid/references/c4.md +618 -0
  155. package/.cursor/skills/mermaid/references/classDiagram.md +1191 -0
  156. package/.cursor/skills/mermaid/references/coding-level-charts.md +27 -0
  157. package/.cursor/skills/mermaid/references/config-configuration.md +71 -0
  158. package/.cursor/skills/mermaid/references/config-directives.md +341 -0
  159. package/.cursor/skills/mermaid/references/config-layouts.md +39 -0
  160. package/.cursor/skills/mermaid/references/config-math.md +95 -0
  161. package/.cursor/skills/mermaid/references/config-theming.md +245 -0
  162. package/.cursor/skills/mermaid/references/config-tidy-tree.md +88 -0
  163. package/.cursor/skills/mermaid/references/cynefin.md +278 -0
  164. package/.cursor/skills/mermaid/references/debug-heatmap.md +68 -0
  165. package/.cursor/skills/mermaid/references/entityRelationshipDiagram.md +902 -0
  166. package/.cursor/skills/mermaid/references/eventmodeling.md +474 -0
  167. package/.cursor/skills/mermaid/references/examples.md +300 -0
  168. package/.cursor/skills/mermaid/references/flowchart.md +2166 -0
  169. package/.cursor/skills/mermaid/references/gantt.md +736 -0
  170. package/.cursor/skills/mermaid/references/gitgraph.md +2137 -0
  171. package/.cursor/skills/mermaid/references/ishikawa.md +65 -0
  172. package/.cursor/skills/mermaid/references/kanban.md +160 -0
  173. package/.cursor/skills/mermaid/references/kit-examples.md +210 -0
  174. package/.cursor/skills/mermaid/references/mindmap.md +334 -0
  175. package/.cursor/skills/mermaid/references/packet.md +152 -0
  176. package/.cursor/skills/mermaid/references/pie.md +111 -0
  177. package/.cursor/skills/mermaid/references/preview.html +1143 -0
  178. package/.cursor/skills/mermaid/references/quadrantChart.md +266 -0
  179. package/.cursor/skills/mermaid/references/radar.md +268 -0
  180. package/.cursor/skills/mermaid/references/railroad.md +455 -0
  181. package/.cursor/skills/mermaid/references/requirementDiagram.md +494 -0
  182. package/.cursor/skills/mermaid/references/sankey.md +414 -0
  183. package/.cursor/skills/mermaid/references/sequenceDiagram.md +1206 -0
  184. package/.cursor/skills/mermaid/references/stateDiagram.md +669 -0
  185. package/.cursor/skills/mermaid/references/styling-preset.md +620 -0
  186. package/.cursor/skills/mermaid/references/swimlanes.md +523 -0
  187. package/.cursor/skills/mermaid/references/timeline.md +570 -0
  188. package/.cursor/skills/mermaid/references/treeView.md +432 -0
  189. package/.cursor/skills/mermaid/references/treemap.md +352 -0
  190. package/.cursor/skills/mermaid/references/userJourney.md +41 -0
  191. package/.cursor/skills/mermaid/references/venn.md +156 -0
  192. package/.cursor/skills/mermaid/references/wardley.md +731 -0
  193. package/.cursor/skills/mermaid/references/xyChart.md +392 -0
  194. package/.cursor/skills/mermaid/references/zenuml.md +473 -0
  195. package/.cursor/skills/sequential-thinking/SKILL.md +97 -69
  196. package/.cursor/skills/sequential-thinking/examples/adaptive-depth.md +15 -536
  197. package/.cursor/skills/sequential-thinking/examples/branching-exploration.md +18 -468
  198. package/.cursor/skills/sequential-thinking/examples/linear-reasoning.md +22 -203
  199. package/.cursor/skills/sequential-thinking/examples/revision-pattern.md +17 -298
  200. package/.cursor/skills/sequential-thinking/references/advanced-techniques.md +98 -0
  201. package/.cursor/skills/sequential-thinking/references/output-schema.md +99 -458
  202. package/.cursor/skills/sequential-thinking/references/parameters.md +73 -435
  203. package/.cursor/skills/sequential-thinking/references/patterns.md +72 -639
  204. package/.cursor/skills/tutien/SKILL.md +36 -13
  205. package/.cursor/skills/tutien/references/adaptive-response.md +68 -0
  206. package/.cursor/skills/tutien/references/lore-sources.md +28 -0
  207. package/.cursor/skills/tutien/references/privacy.md +13 -1
  208. package/.cursor/skills/tutien/references/schema.md +32 -1
  209. package/.cursor/skills/tutien/references/story-system.md +176 -0
  210. package/.cursor/skills/tutien/references/vi-style-guide.md +89 -0
  211. package/.cursor/skills/tutien/references/voice-and-mode.md +23 -8
  212. package/.cursor/skills/tutien/scripts/catalog.mjs +17 -17
  213. package/.cursor/skills/tutien/scripts/classify.mjs +64 -37
  214. package/.cursor/skills/tutien/scripts/command.mjs +40 -21
  215. package/.cursor/skills/tutien/scripts/project-profile.mjs +202 -0
  216. package/.cursor/skills/tutien/scripts/render-report.mjs +128 -72
  217. package/.cursor/skills/tutien/scripts/response-brief.mjs +103 -0
  218. package/.cursor/skills/tutien/scripts/run-tutien.mjs +141 -63
  219. package/.cursor/skills/tutien/scripts/story-ledger.mjs +241 -0
  220. package/.cursor/skills/tutien/scripts/villains.mjs +14 -14
  221. package/.grok/skills/agentshield-security-review/SKILL.md +16 -8
  222. package/.grok/skills/agentshield-security-review/references/native-install.md +2 -2
  223. package/.grok/skills/agentshield-security-review/scripts/agentshield_repo_probe.py +19 -1
  224. package/.grok/skills/mermaid/SKILL.md +141 -0
  225. package/.grok/skills/mermaid/UPSTREAM-NOTICE.md +52 -0
  226. package/.grok/skills/mermaid/references/architecture.md +433 -0
  227. package/.grok/skills/mermaid/references/block.md +752 -0
  228. package/.grok/skills/mermaid/references/c4.md +618 -0
  229. package/.grok/skills/mermaid/references/classDiagram.md +1191 -0
  230. package/.grok/skills/mermaid/references/coding-level-charts.md +27 -0
  231. package/.grok/skills/mermaid/references/config-configuration.md +71 -0
  232. package/.grok/skills/mermaid/references/config-directives.md +341 -0
  233. package/.grok/skills/mermaid/references/config-layouts.md +39 -0
  234. package/.grok/skills/mermaid/references/config-math.md +95 -0
  235. package/.grok/skills/mermaid/references/config-theming.md +245 -0
  236. package/.grok/skills/mermaid/references/config-tidy-tree.md +88 -0
  237. package/.grok/skills/mermaid/references/cynefin.md +278 -0
  238. package/.grok/skills/mermaid/references/debug-heatmap.md +68 -0
  239. package/.grok/skills/mermaid/references/entityRelationshipDiagram.md +902 -0
  240. package/.grok/skills/mermaid/references/eventmodeling.md +474 -0
  241. package/.grok/skills/mermaid/references/examples.md +300 -0
  242. package/.grok/skills/mermaid/references/flowchart.md +2166 -0
  243. package/.grok/skills/mermaid/references/gantt.md +736 -0
  244. package/.grok/skills/mermaid/references/gitgraph.md +2137 -0
  245. package/.grok/skills/mermaid/references/ishikawa.md +65 -0
  246. package/.grok/skills/mermaid/references/kanban.md +160 -0
  247. package/.grok/skills/mermaid/references/kit-examples.md +210 -0
  248. package/.grok/skills/mermaid/references/mindmap.md +334 -0
  249. package/.grok/skills/mermaid/references/packet.md +152 -0
  250. package/.grok/skills/mermaid/references/pie.md +111 -0
  251. package/.grok/skills/mermaid/references/preview.html +1143 -0
  252. package/.grok/skills/mermaid/references/quadrantChart.md +266 -0
  253. package/.grok/skills/mermaid/references/radar.md +268 -0
  254. package/.grok/skills/mermaid/references/railroad.md +455 -0
  255. package/.grok/skills/mermaid/references/requirementDiagram.md +494 -0
  256. package/.grok/skills/mermaid/references/sankey.md +414 -0
  257. package/.grok/skills/mermaid/references/sequenceDiagram.md +1206 -0
  258. package/.grok/skills/mermaid/references/stateDiagram.md +669 -0
  259. package/.grok/skills/mermaid/references/styling-preset.md +620 -0
  260. package/.grok/skills/mermaid/references/swimlanes.md +523 -0
  261. package/.grok/skills/mermaid/references/timeline.md +570 -0
  262. package/.grok/skills/mermaid/references/treeView.md +432 -0
  263. package/.grok/skills/mermaid/references/treemap.md +352 -0
  264. package/.grok/skills/mermaid/references/userJourney.md +41 -0
  265. package/.grok/skills/mermaid/references/venn.md +156 -0
  266. package/.grok/skills/mermaid/references/wardley.md +731 -0
  267. package/.grok/skills/mermaid/references/xyChart.md +392 -0
  268. package/.grok/skills/mermaid/references/zenuml.md +473 -0
  269. package/.grok/skills/sequential-thinking/SKILL.md +97 -69
  270. package/.grok/skills/sequential-thinking/examples/adaptive-depth.md +15 -536
  271. package/.grok/skills/sequential-thinking/examples/branching-exploration.md +18 -468
  272. package/.grok/skills/sequential-thinking/examples/linear-reasoning.md +22 -203
  273. package/.grok/skills/sequential-thinking/examples/revision-pattern.md +17 -298
  274. package/.grok/skills/sequential-thinking/references/advanced-techniques.md +98 -0
  275. package/.grok/skills/sequential-thinking/references/output-schema.md +99 -458
  276. package/.grok/skills/sequential-thinking/references/parameters.md +73 -435
  277. package/.grok/skills/sequential-thinking/references/patterns.md +72 -639
  278. package/.grok/skills/tutien/SKILL.md +36 -13
  279. package/.grok/skills/tutien/references/adaptive-response.md +68 -0
  280. package/.grok/skills/tutien/references/lore-sources.md +28 -0
  281. package/.grok/skills/tutien/references/privacy.md +13 -1
  282. package/.grok/skills/tutien/references/schema.md +32 -1
  283. package/.grok/skills/tutien/references/story-system.md +176 -0
  284. package/.grok/skills/tutien/references/vi-style-guide.md +89 -0
  285. package/.grok/skills/tutien/references/voice-and-mode.md +23 -8
  286. package/.grok/skills/tutien/scripts/catalog.mjs +17 -17
  287. package/.grok/skills/tutien/scripts/classify.mjs +64 -37
  288. package/.grok/skills/tutien/scripts/command.mjs +40 -21
  289. package/.grok/skills/tutien/scripts/project-profile.mjs +202 -0
  290. package/.grok/skills/tutien/scripts/render-report.mjs +128 -72
  291. package/.grok/skills/tutien/scripts/response-brief.mjs +103 -0
  292. package/.grok/skills/tutien/scripts/run-tutien.mjs +141 -63
  293. package/.grok/skills/tutien/scripts/story-ledger.mjs +241 -0
  294. package/.grok/skills/tutien/scripts/villains.mjs +14 -14
  295. package/.vibekit/docs/INSTALL.md +2 -1
  296. package/.vibekit/docs/SECURITY_MODEL.md +4 -1
  297. package/.vibekit/scripts/init-backbone.mjs +1 -1
  298. package/.vibekit/scripts/validate-kit.mjs +179 -3
  299. package/.vibekit/skills/agentshield-security-review/SKILL.md +16 -8
  300. package/.vibekit/skills/agentshield-security-review/references/native-install.md +2 -2
  301. package/.vibekit/skills/agentshield-security-review/scripts/agentshield_repo_probe.py +19 -1
  302. package/.vibekit/skills/mermaid/SKILL.md +141 -0
  303. package/.vibekit/skills/mermaid/UPSTREAM-NOTICE.md +52 -0
  304. package/.vibekit/skills/mermaid/references/architecture.md +433 -0
  305. package/.vibekit/skills/mermaid/references/block.md +752 -0
  306. package/.vibekit/skills/mermaid/references/c4.md +618 -0
  307. package/.vibekit/skills/mermaid/references/classDiagram.md +1191 -0
  308. package/.vibekit/skills/mermaid/references/coding-level-charts.md +27 -0
  309. package/.vibekit/skills/mermaid/references/config-configuration.md +71 -0
  310. package/.vibekit/skills/mermaid/references/config-directives.md +341 -0
  311. package/.vibekit/skills/mermaid/references/config-layouts.md +39 -0
  312. package/.vibekit/skills/mermaid/references/config-math.md +95 -0
  313. package/.vibekit/skills/mermaid/references/config-theming.md +245 -0
  314. package/.vibekit/skills/mermaid/references/config-tidy-tree.md +88 -0
  315. package/.vibekit/skills/mermaid/references/cynefin.md +278 -0
  316. package/.vibekit/skills/mermaid/references/debug-heatmap.md +68 -0
  317. package/.vibekit/skills/mermaid/references/entityRelationshipDiagram.md +902 -0
  318. package/.vibekit/skills/mermaid/references/eventmodeling.md +474 -0
  319. package/.vibekit/skills/mermaid/references/examples.md +300 -0
  320. package/.vibekit/skills/mermaid/references/flowchart.md +2166 -0
  321. package/.vibekit/skills/mermaid/references/gantt.md +736 -0
  322. package/.vibekit/skills/mermaid/references/gitgraph.md +2137 -0
  323. package/.vibekit/skills/mermaid/references/ishikawa.md +65 -0
  324. package/.vibekit/skills/mermaid/references/kanban.md +160 -0
  325. package/.vibekit/skills/mermaid/references/kit-examples.md +210 -0
  326. package/.vibekit/skills/mermaid/references/mindmap.md +334 -0
  327. package/.vibekit/skills/mermaid/references/packet.md +152 -0
  328. package/.vibekit/skills/mermaid/references/pie.md +111 -0
  329. package/.vibekit/skills/mermaid/references/preview.html +1143 -0
  330. package/.vibekit/skills/mermaid/references/quadrantChart.md +266 -0
  331. package/.vibekit/skills/mermaid/references/radar.md +268 -0
  332. package/.vibekit/skills/mermaid/references/railroad.md +455 -0
  333. package/.vibekit/skills/mermaid/references/requirementDiagram.md +494 -0
  334. package/.vibekit/skills/mermaid/references/sankey.md +414 -0
  335. package/.vibekit/skills/mermaid/references/sequenceDiagram.md +1206 -0
  336. package/.vibekit/skills/mermaid/references/stateDiagram.md +669 -0
  337. package/.vibekit/skills/mermaid/references/styling-preset.md +620 -0
  338. package/.vibekit/skills/mermaid/references/swimlanes.md +523 -0
  339. package/.vibekit/skills/mermaid/references/timeline.md +570 -0
  340. package/.vibekit/skills/mermaid/references/treeView.md +432 -0
  341. package/.vibekit/skills/mermaid/references/treemap.md +352 -0
  342. package/.vibekit/skills/mermaid/references/userJourney.md +41 -0
  343. package/.vibekit/skills/mermaid/references/venn.md +156 -0
  344. package/.vibekit/skills/mermaid/references/wardley.md +731 -0
  345. package/.vibekit/skills/mermaid/references/xyChart.md +392 -0
  346. package/.vibekit/skills/mermaid/references/zenuml.md +473 -0
  347. package/.vibekit/skills/sequential-thinking/SKILL.md +97 -69
  348. package/.vibekit/skills/sequential-thinking/examples/adaptive-depth.md +15 -536
  349. package/.vibekit/skills/sequential-thinking/examples/branching-exploration.md +18 -468
  350. package/.vibekit/skills/sequential-thinking/examples/linear-reasoning.md +22 -203
  351. package/.vibekit/skills/sequential-thinking/examples/revision-pattern.md +17 -298
  352. package/.vibekit/skills/sequential-thinking/references/advanced-techniques.md +98 -0
  353. package/.vibekit/skills/sequential-thinking/references/output-schema.md +99 -458
  354. package/.vibekit/skills/sequential-thinking/references/parameters.md +73 -435
  355. package/.vibekit/skills/sequential-thinking/references/patterns.md +72 -639
  356. package/.vibekit/skills/skills-manifest.json +2 -1
  357. package/.vibekit/skills/tutien/SKILL.md +36 -13
  358. package/.vibekit/skills/tutien/references/adaptive-response.md +68 -0
  359. package/.vibekit/skills/tutien/references/lore-sources.md +28 -0
  360. package/.vibekit/skills/tutien/references/privacy.md +13 -1
  361. package/.vibekit/skills/tutien/references/schema.md +32 -1
  362. package/.vibekit/skills/tutien/references/story-system.md +176 -0
  363. package/.vibekit/skills/tutien/references/vi-style-guide.md +89 -0
  364. package/.vibekit/skills/tutien/references/voice-and-mode.md +23 -8
  365. package/.vibekit/skills/tutien/scripts/catalog.mjs +17 -17
  366. package/.vibekit/skills/tutien/scripts/classify.mjs +64 -37
  367. package/.vibekit/skills/tutien/scripts/command.mjs +40 -21
  368. package/.vibekit/skills/tutien/scripts/project-profile.mjs +202 -0
  369. package/.vibekit/skills/tutien/scripts/render-report.mjs +128 -72
  370. package/.vibekit/skills/tutien/scripts/response-brief.mjs +103 -0
  371. package/.vibekit/skills/tutien/scripts/run-tutien.mjs +141 -63
  372. package/.vibekit/skills/tutien/scripts/story-ledger.mjs +241 -0
  373. package/.vibekit/skills/tutien/scripts/villains.mjs +14 -14
  374. package/CHANGELOG.md +47 -1
  375. package/README.md +273 -15
  376. package/docs/README.vi.md +290 -32
  377. package/docs/README.zh-CN.md +273 -15
  378. package/package.json +4 -2
@@ -0,0 +1,241 @@
1
+ #!/usr/bin/env node
2
+ // Deterministic storage helpers for the agent-authored living chronicle.
3
+ // This module never generates story prose. It only builds an aggregate-only
4
+ // evidence packet and validates the plot/chapter ledger written by the agent.
5
+
6
+ import crypto from 'node:crypto';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import process from 'node:process';
10
+ import { fileURLToPath } from 'node:url';
11
+
12
+ export const STORY_SCHEMA = 1;
13
+ export const STORY_CONTEXT_SCHEMA = 'tutien-story-context-v1';
14
+ export const STORY_STATE_SCHEMA = 'tutien-story-state-v1';
15
+ export const STORY_CHAPTER_SCHEMA = 'tutien-story-chapter-v1';
16
+
17
+ const sha16 = (value) => crypto.createHash('sha256').update(String(value)).digest('hex').slice(0, 16);
18
+
19
+ export function storyPaths(root = process.cwd()) {
20
+ const base = path.join(path.resolve(root), '.vibekit', 'reports', 'tutien', 'story');
21
+ return {
22
+ base,
23
+ plot: path.join(base, 'plot.md'),
24
+ state: path.join(base, 'story-state.json'),
25
+ context: path.join(base, 'latest-context.json'),
26
+ chapters: path.join(base, 'chapters')
27
+ };
28
+ }
29
+
30
+ // Preserve letters from every language, including Han characters. Latin
31
+ // scripts are normalized so Vietnamese titles remain readable in filenames.
32
+ export function slugifyChapterTitle(title) {
33
+ const raw = String(title ?? '').trim();
34
+ if (!raw) throw new Error('chapter title is required');
35
+ const slug = raw
36
+ .normalize('NFD')
37
+ .replace(/\p{M}+/gu, '')
38
+ .toLocaleLowerCase('und')
39
+ .replace(/[^\p{L}\p{N}]+/gu, '-')
40
+ .replace(/^-+|-+$/g, '')
41
+ .slice(0, 80)
42
+ .replace(/-+$/g, '');
43
+ if (!slug || slug === '.' || slug === '..') throw new Error('chapter title does not produce a safe filename');
44
+ return slug;
45
+ }
46
+
47
+ export function chapterFilename(number, title) {
48
+ if (!Number.isInteger(number) || number < 1 || number > 9999) {
49
+ throw new Error('chapter number must be an integer from 1 to 9999');
50
+ }
51
+ return `${String(number).padStart(4, '0')}-${slugifyChapterTitle(title)}.md`;
52
+ }
53
+
54
+ export function listChapters(root = process.cwd()) {
55
+ const dir = storyPaths(root).chapters;
56
+ if (!fs.existsSync(dir)) return [];
57
+ return fs.readdirSync(dir)
58
+ .filter((file) => /^\d{4}-[\p{L}\p{N}][\p{L}\p{N}-]*\.md$/u.test(file))
59
+ .map((file) => ({ file, number: Number(file.slice(0, 4)), path: path.join(dir, file) }))
60
+ .sort((a, b) => a.number - b.number || a.file.localeCompare(b.file));
61
+ }
62
+
63
+ export function nextChapterNumber(root = process.cwd()) {
64
+ const chapters = listChapters(root);
65
+ return chapters.length ? chapters[chapters.length - 1].number + 1 : 1;
66
+ }
67
+
68
+ export function resolveStoryLanguage(requested = 'auto', invocationText = '', fallback = 'en') {
69
+ const explicit = String(requested).toLowerCase();
70
+ if (['vi', 'en', 'zh'].includes(explicit)) return explicit;
71
+ if (/\p{Script=Han}/u.test(invocationText)) return 'zh';
72
+ if (/[À-ỹĐđ]/u.test(invocationText) || /\b(hãy|giúp|của|và|không|chương|tu tiên)\b/iu.test(invocationText)) return 'vi';
73
+ return ['vi', 'en', 'zh'].includes(fallback) ? fallback : 'en';
74
+ }
75
+
76
+ function safeSlug(value, fallback = null) {
77
+ const text = String(value ?? '');
78
+ return /^[a-z0-9][a-z0-9_-]{0,63}$/i.test(text) ? text : fallback;
79
+ }
80
+
81
+ function safeValidationCommand(value) {
82
+ const text = String(value ?? '');
83
+ return /^(?:npm run|yarn|pnpm|bun run) [A-Za-z0-9][A-Za-z0-9:_-]{0,63}$/.test(text) ? text : null;
84
+ }
85
+
86
+ function storyFacts(model, profile = {}) {
87
+ const cultivation = model.cultivation ?? null;
88
+ const progression = cultivation?.progression ?? null;
89
+ return {
90
+ project: {
91
+ id: safeSlug(profile.projectId, 'repo'),
92
+ type: safeSlug(profile.projectType),
93
+ primaryLanguage: safeSlug(profile.primaryLanguage),
94
+ domains: (profile.domains ?? []).map((v) => safeSlug(v)).filter(Boolean).slice(0, 12),
95
+ stack: (profile.stack ?? []).map((v) => safeSlug(v)).filter(Boolean).slice(0, 12),
96
+ validationCommands: (profile.validationCommands ?? []).map((v) => safeValidationCommand(v)).filter(Boolean).slice(0, 3),
97
+ metadataSources: (profile.metadataSources ?? []).map((v) => safeSlug(String(v).replace(/\.[^.]+$/, ''))).filter(Boolean).slice(0, 12),
98
+ authorsCount: Number.isInteger(profile.authorsCount) && profile.authorsCount >= 0 ? profile.authorsCount : null
99
+ },
100
+ evidence: {
101
+ window: model.coverage?.window ?? { start: null, end: null },
102
+ sessions: model.coverage?.sessions ?? 0,
103
+ prompts: model.coverage?.userPrompts ?? 0,
104
+ commits: model.coverage?.commits ?? 0,
105
+ confidence: model.coverage?.confidence ?? 'low',
106
+ tokens: {
107
+ reported: model.tokens?.reportedTotal ?? 0,
108
+ estimated: model.tokens?.estimatedTotal ?? 0,
109
+ unknownTurns: model.tokens?.unknownTurns ?? 0
110
+ },
111
+ realm: model.realm ? { name: model.realm.name, score: model.score } : null,
112
+ problems: (model.problems ?? []).map((p) => ({
113
+ type: p.problemType,
114
+ confidence: p.confidence,
115
+ priority: p.priority
116
+ })),
117
+ classification: cultivation ? {
118
+ faction: cultivation.classification?.faction?.id ?? null,
119
+ affiliation: cultivation.classification?.affiliation?.id ?? null,
120
+ paths: (cultivation.classification?.paths ?? []).map((p) => p.id)
121
+ } : null,
122
+ progression: progression ? {
123
+ tuVi: progression.tuVi?.window ?? 0,
124
+ congDuc: progression.congDuc?.window ?? 0,
125
+ nghiepLuc: progression.nghiepLuc?.window ?? 0,
126
+ daoHanhWindows: progression.daoHanh?.windows ?? 0,
127
+ overlap: progression.overlap ?? 0
128
+ } : null
129
+ }
130
+ };
131
+ }
132
+
133
+ export function buildStoryContext(model, options = {}) {
134
+ const facts = storyFacts(model, options.profile ?? {});
135
+ const evidenceKey = sha16(JSON.stringify({
136
+ storySchema: STORY_SCHEMA,
137
+ project: facts.project.id,
138
+ range: options.range ?? 'all',
139
+ evidence: facts.evidence
140
+ }));
141
+ return {
142
+ schema: STORY_CONTEXT_SCHEMA,
143
+ storySchema: STORY_SCHEMA,
144
+ evidenceKey,
145
+ language: resolveStoryLanguage(options.language, options.invocationText, options.conversationLanguage),
146
+ style: safeSlug(options.style, 'auto'),
147
+ focus: safeSlug(options.focus, 'balanced'),
148
+ policyState: model.policyState ?? 'clear',
149
+ canWriteChapter: model.suppressGamification !== true,
150
+ ...facts
151
+ };
152
+ }
153
+
154
+ export function writeStoryContext(root, context) {
155
+ if (context?.schema !== STORY_CONTEXT_SCHEMA) throw new Error(`story context must use ${STORY_CONTEXT_SCHEMA}`);
156
+ const paths = storyPaths(root);
157
+ fs.mkdirSync(paths.base, { recursive: true });
158
+ fs.writeFileSync(paths.context, `${JSON.stringify(context, null, 2)}\n`);
159
+ return paths.context;
160
+ }
161
+
162
+ function chapterFrontmatter(text) {
163
+ const match = String(text).match(/^---\n([\s\S]*?)\n---\n/);
164
+ if (!match) return null;
165
+ const get = (key) => match[1].match(new RegExp(`^${key}:\\s*(.+)$`, 'm'))?.[1]?.trim().replace(/^['"]|['"]$/g, '') ?? null;
166
+ return {
167
+ schema: get('schema'),
168
+ chapter: Number(get('chapter')),
169
+ title: get('title'),
170
+ evidenceKey: get('evidence_key')
171
+ };
172
+ }
173
+
174
+ export function validateStoryTree(root = process.cwd()) {
175
+ const paths = storyPaths(root);
176
+ const chapters = listChapters(root);
177
+ const errors = [];
178
+ if (chapters.length && !fs.existsSync(paths.plot)) errors.push('plot.md is required when chapters exist');
179
+
180
+ let state = null;
181
+ if (fs.existsSync(paths.state)) {
182
+ try {
183
+ state = JSON.parse(fs.readFileSync(paths.state, 'utf8'));
184
+ if (state.schema !== STORY_STATE_SCHEMA) errors.push(`story-state.json must use ${STORY_STATE_SCHEMA}`);
185
+ } catch {
186
+ errors.push('story-state.json must contain valid JSON');
187
+ }
188
+ } else if (chapters.length) {
189
+ errors.push('story-state.json is required when chapters exist');
190
+ }
191
+
192
+ const evidenceKeys = new Set();
193
+ for (let i = 0; i < chapters.length; i += 1) {
194
+ const expected = i + 1;
195
+ const item = chapters[i];
196
+ if (item.number !== expected) errors.push(`chapter sequence must be contiguous: expected ${expected}, found ${item.number}`);
197
+ const fm = chapterFrontmatter(fs.readFileSync(item.path, 'utf8'));
198
+ if (!fm) {
199
+ errors.push(`${item.file} is missing YAML frontmatter`);
200
+ continue;
201
+ }
202
+ if (fm.schema !== STORY_CHAPTER_SCHEMA) errors.push(`${item.file} must use ${STORY_CHAPTER_SCHEMA}`);
203
+ if (fm.chapter !== item.number) errors.push(`${item.file} frontmatter chapter must equal ${item.number}`);
204
+ if (!fm.title) errors.push(`${item.file} requires a title`);
205
+ if (!fm.evidenceKey || !/^[0-9a-f]{16}$/.test(fm.evidenceKey)) errors.push(`${item.file} requires a 16-hex evidence_key`);
206
+ else if (evidenceKeys.has(fm.evidenceKey)) errors.push(`${item.file} repeats evidence_key ${fm.evidenceKey}`);
207
+ else evidenceKeys.add(fm.evidenceKey);
208
+ }
209
+
210
+ if (state) {
211
+ if (state.lastChapter !== chapters.length) errors.push(`story-state.json lastChapter must equal ${chapters.length}`);
212
+ const consumed = state.consumedEvidenceKeys ?? [];
213
+ if (!Array.isArray(consumed) || consumed.some((key) => !/^[0-9a-f]{16}$/.test(key))) {
214
+ errors.push('story-state.json consumedEvidenceKeys must be an array of 16-hex keys');
215
+ }
216
+ for (const key of evidenceKeys) {
217
+ if (!consumed.includes(key)) errors.push(`story-state.json is missing consumed evidence key ${key}`);
218
+ }
219
+ }
220
+
221
+ return {
222
+ ok: errors.length === 0,
223
+ errors,
224
+ chapters: chapters.length,
225
+ nextChapter: chapters.length + 1,
226
+ paths: Object.fromEntries(Object.entries(paths).map(([key, value]) => [key, path.relative(path.resolve(root), value)]))
227
+ };
228
+ }
229
+
230
+ const isMain = process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
231
+ if (isMain) {
232
+ const command = process.argv[2] ?? 'status';
233
+ const root = path.resolve(process.argv[3] ?? process.cwd());
234
+ if (!['status', 'validate'].includes(command)) {
235
+ console.error('usage: story-ledger.mjs [status|validate] [repo-root]');
236
+ process.exit(2);
237
+ }
238
+ const result = validateStoryTree(root);
239
+ console.log(JSON.stringify(result, null, 2));
240
+ if (command === 'validate' && !result.ok) process.exit(1);
241
+ }
@@ -60,22 +60,22 @@ export function sanitizeContext(ctx = {}) {
60
60
  const LINES = {
61
61
  'repeated-failure': {
62
62
  serene: [
63
- { vi: 'Giữa làn sương mỏng, Luân Hồi Lỗi Ma hiện bóng khi lỗi cũ quay thêm một vòng.', en: 'In the thin mountain mist, the Error-Cycle Wraith appears as the old error completes another circle.' },
64
- { vi: 'Một lần thử giống hệt khẽ lay chuông, gọi Luân Hồi Lỗi Ma trở lại đạo lộ.', en: 'One unchanged retry stirs the bell that calls the Error-Cycle Wraith back to the path.' }
63
+ { vi: 'Giữa làn sương mỏng, Luân Hồi Ma Ảnh hiện bóng khi lỗi cũ quay thêm một vòng.', en: 'In the thin mountain mist, the Error-Cycle Wraith appears as the old error completes another circle.' },
64
+ { vi: 'Một lần thử giống hệt khẽ lay chuông, gọi Luân Hồi Ma Ảnh trở lại đạo lộ.', en: 'One unchanged retry stirs the bell that calls the Error-Cycle Wraith back to the path.' }
65
65
  ],
66
66
  spirited: [
67
- { vi: 'Luân Hồi Lỗi Ma lại gõ chuông: “Không đổi giả thuyết, sao đổi được kết cục?”', en: 'The Error-Cycle Wraith rings its bell again: “Without a new hypothesis, what new ending could appear?”' },
68
- { vi: 'Vòng lặp cũ vừa khép, Luân Hồi Lỗi Ma đã bày sẵn bàn trà chờ vòng kế tiếp.', en: 'The old loop has barely closed, and the Error-Cycle Wraith has already set tea for the next.' }
67
+ { vi: 'Luân Hồi Ma Ảnh lại gõ chuông: “Không đổi giả thuyết, sao đổi được kết cục?”', en: 'The Error-Cycle Wraith rings its bell again: “Without a new hypothesis, what new ending could appear?”' },
68
+ { vi: 'Vòng lặp cũ vừa khép, Luân Hồi Ma Ảnh đã bày sẵn bàn trà chờ vòng kế tiếp.', en: 'The old loop has barely closed, and the Error-Cycle Wraith has already set tea for the next.' }
69
69
  ]
70
70
  },
71
71
  'too-many-prompts': {
72
72
  serene: [
73
- { vi: 'Cửu Hoàn Tâm Ma dệt một task thành nhiều vòng sương khi cột mốc chưa hiện rõ.', en: 'The Ninefold Loop Heart-Shadow weaves one task into rings of mist when its checkpoints remain unclear.' },
74
- { vi: 'Nơi ranh giới task nhạt dần, Cửu Hoàn Tâm Ma lặng lẽ nối thêm một vòng.', en: 'Where a task boundary fades, the Ninefold Loop Heart-Shadow quietly adds another circle.' }
73
+ { vi: 'Cửu Hoàn Tâm Ma dệt một nhiệm vụ thành nhiều vòng sương khi cột mốc chưa hiện rõ.', en: 'The Ninefold Loop Heart-Shadow weaves one task into rings of mist when its checkpoints remain unclear.' },
74
+ { vi: 'Nơi ranh giới nhiệm vụ nhạt dần, Cửu Hoàn Tâm Ma lặng lẽ nối thêm một vòng.', en: 'Where a task boundary fades, the Ninefold Loop Heart-Shadow quietly adds another circle.' }
75
75
  ],
76
76
  spirited: [
77
- { vi: 'Cửu Hoàn Tâm Ma đếm prompt thay cột mốc; đã đến lúc đổi chiếc vòng kế tiếp thành một tiêu chí “xong”.', en: 'The Ninefold Loop Heart-Shadow is counting prompts instead of checkpoints; turn the next circle into a done-criterion.' },
78
- { vi: 'Prompt càng tản như lá thu, Cửu Hoàn Tâm Ma càng dễ giấu mất lối ra.', en: 'The more prompts scatter like autumn leaves, the easier the Ninefold Loop Heart-Shadow hides the exit.' }
77
+ { vi: 'Cửu Hoàn Tâm Ma đếm lượt yêu cầu thay cột mốc; đã đến lúc đổi chiếc vòng kế tiếp thành một tiêu chí hoàn thành.', en: 'The Ninefold Loop Heart-Shadow is counting prompts instead of checkpoints; turn the next circle into a done-criterion.' },
78
+ { vi: 'Lượt yêu cầu càng tản như lá thu, Cửu Hoàn Tâm Ma càng dễ giấu mất lối ra.', en: 'The more prompts scatter like autumn leaves, the easier the Ninefold Loop Heart-Shadow hides the exit.' }
79
79
  ]
80
80
  },
81
81
  'conflicting-instructions': {
@@ -90,21 +90,21 @@ const LINES = {
90
90
  },
91
91
  'unrecovered-failure': {
92
92
  serene: [
93
- { vi: 'Vô Kiểm Ảnh Quân ẩn sau một thất bại chưa được soi lại bằng lần kiểm chứng mới.', en: 'The Unverified Trial Wraith rests behind a failure that has not yet met a fresh validation.' },
94
- { vi: 'Một lỗi bị bỏ lại làm bóng Vô Kiểm Ảnh Quân dài thêm trên bậc đá.', en: 'A failure left behind lengthens the Unverified Trial Wraith’s shadow across the stone steps.' }
93
+ { vi: 'Vô Nghiệm Ảnh Quân ẩn sau một thất bại chưa được soi lại bằng lần kiểm chứng mới.', en: 'The Unverified Trial Wraith rests behind a failure that has not yet met a fresh validation.' },
94
+ { vi: 'Một lỗi bị bỏ lại làm bóng Vô Nghiệm Ảnh Quân dài thêm trên bậc đá.', en: 'A failure left behind lengthens the Unverified Trial Wraith’s shadow across the stone steps.' }
95
95
  ],
96
96
  spirited: [
97
- { vi: 'Vô Kiểm Ảnh Quân phủi bụi trên ghế đá: một lần kiểm chứng thành công là đủ để mời nó rời đi.', en: 'The Unverified Trial Wraith dusts its stone seat; one passing validation is enough to send it on its way.' },
98
- { vi: 'Chưa có lần chạy lại, Vô Kiểm Ảnh Quân vẫn ung dung giữ chỗ bên cổng hoàn thành.', en: 'Without a rerun, the Unverified Trial Wraith calmly keeps its seat beside the completion gate.' }
97
+ { vi: 'Vô Nghiệm Ảnh Quân phủi bụi trên ghế đá: một lần kiểm chứng thành công là đủ để mời nó rời đi.', en: 'The Unverified Trial Wraith dusts its stone seat; one passing validation is enough to send it on its way.' },
98
+ { vi: 'Chưa có lần chạy lại, Vô Nghiệm Ảnh Quân vẫn ung dung giữ chỗ bên cổng hoàn thành.', en: 'Without a rerun, the Unverified Trial Wraith calmly keeps its seat beside the completion gate.' }
99
99
  ]
100
100
  },
101
101
  'work-without-proof': {
102
102
  serene: [
103
103
  { vi: 'Vô Chứng Đan Ảnh lảng vảng bên lò luyện khi lời tuyên bố hoàn thành chưa có bằng chứng đi cùng.', en: 'The Proofless Elixir Shade lingers by the furnace when a claim of completion carries no evidence.' },
104
- { vi: 'Một commit thiếu kết quả kiểm chứng để lại làn khói mỏng cho Vô Chứng Đan Ảnh nương thân.', en: 'A commit without validation leaves a thread of smoke where the Proofless Elixir Shade can dwell.' }
104
+ { vi: 'Một bản ghi Git thiếu kết quả kiểm chứng để lại làn khói mỏng cho Vô Chứng Đan Ảnh nương thân.', en: 'A commit without validation leaves a thread of smoke where the Proofless Elixir Shade can dwell.' }
105
105
  ],
106
106
  spirited: [
107
- { vi: 'Vô Chứng Đan Ảnh nâng chén trà bên viên đan chưa thử; một dòng validation sẽ làm màn khói tan ngay.', en: 'The Proofless Elixir Shade raises tea beside an untested pill; one validation line will clear the smoke.' },
107
+ { vi: 'Vô Chứng Đan Ảnh nâng chén trà bên viên đan chưa thử; một dòng kiểm chứng sẽ làm màn khói tan ngay.', en: 'The Proofless Elixir Shade raises tea beside an untested pill; one validation line will clear the smoke.' },
108
108
  { vi: 'Không có biên nhận kiểm chứng, Vô Chứng Đan Ảnh cứ ngỡ lò luyện thuộc về mình.', en: 'Without a validation receipt, the Proofless Elixir Shade starts to think the furnace is its own.' }
109
109
  ]
110
110
  }
@@ -127,10 +127,11 @@ The installer also includes `visual-design-loop` for Claude, Codex, and Grok sur
127
127
 
128
128
  ## User-invoked utility skills
129
129
 
130
- Five user-invoked skills install across Claude, Codex, Cursor, and Grok surfaces:
130
+ Six user-invoked skills install across Claude, Codex, Cursor, and Grok surfaces:
131
131
 
132
132
  - `memento`: write a `MEMENTO.md` working note before closing a multi-day task (`/memento`), then resume from it in the next session (`/memento resume`).
133
133
  - `coding-level`: set the explanation register from 0 (ELI5) to 5 (expert peer) with `/coding-level N`; stays active until reinvoked.
134
134
  - `prompt-sharpener`: sharpen a rough prompt into a precise one with `/prompt-sharpener <rough prompt>`, then execute the sharpened version immediately in the same turn.
135
135
  - `claim`: vet a request to bring something new into the repo with `/claim <request>` — validate URLs and references against official sources, check fit with existing rules and skills, confirm anything unclear, then integrate and document it.
136
136
  - `tutien`: turn Git history and explicitly supplied AI-chat exports into a private, funny xianxia "cultivation" report with `/tutien` (realm, token use, workflow habits, evidence-bound suggestions); read-only, aggregate-only by default, and `/tutien off` disables the mode.
137
+ - `mermaid`: generate styled diagrams across 31 Mermaid types, adapt density to `/coding-level`, and optionally visualize multi-step documentation or debugging flows.
@@ -21,9 +21,12 @@ node .vibekit/scripts/agentshield-probe.mjs .
21
21
  Full scanner when available:
22
22
 
23
23
  ```bash
24
- npx ecc-agentshield scan --path . --format text --min-severity medium
24
+ npx ecc-agentshield@1.4.0 scan --path . --format text --min-severity medium
25
25
  ```
26
26
 
27
+ If the package is not already installed, request approval before fetching and executing this
28
+ exact version. Otherwise use the repository probe plus the manual review checklist.
29
+
27
30
  ## Findings labels
28
31
 
29
32
  - `scanner-backed`: comes from AgentShield or deterministic probe output.
@@ -553,7 +553,7 @@ function detectContext() {
553
553
  function render(data) {
554
554
  const cmd = data.commands;
555
555
  const rules = data.conventions;
556
- return `# Minimal Vibe Coding Kit backbone. See .vibekit/docs/BACKBONE_REFERENCE.md for details.\nversion: 2\nmeta:\n template_status: initialized\n initialized_at: ${yamlString(data.initializedAt)}\n template_source: minimal-vibe-coding-kit\n schema_version: 3\n init_runbook: .vibekit/init/FIRST_TIME_INIT.md\n init_done_marker: .vibekit/INIT_DONE\n\nproject:\n name: ${yamlString(data.name)}\n description: ${yamlString(data.description)}\n type: ${data.type}\n primary_language: ${data.language}\n package_manager: ${data.packageManager}\n mode: ${data.mode}\n prd: ${yamlString(data.prd)}\n context: ${yamlString(data.context)}\n\npaths:\n root: .\n apps:${yamlList(data.appPaths, 4)}\n source: ${JSON.stringify(data.sourcePaths)}\n tests: ${JSON.stringify(data.testPaths)}\n docs: [README.md, .vibekit/docs/]\n generated: [node_modules/, dist/, build/, coverage/]\n\nconventions:\n review_required_before_write: true\n scope: ${yamlString(rules.scope)}\n naming:\n files: ${yamlString(rules.naming.files)}\n directories: ${yamlString(rules.naming.directories)}\n symbols: follow existing language and framework conventions in nearby code\n evidence:${yamlList(rules.naming.evidence, 6)}\n architecture:\n detected:${yamlList(rules.architecture.detected, 6)}\n rule: ${yamlString(rules.architecture.rule)}\n resources:\n detected_asset_roots:${yamlList(rules.resources.assetRoots, 6)}\n detected_registries:${yamlList(rules.resources.registries, 6)}\n rule: ${yamlString(rules.resources.rule)}\n localization:\n detected_catalogs:${yamlList(rules.localization.catalogs, 6)}\n detected_accessors:${yamlList(rules.localization.accessors, 6)}\n rule: ${yamlString(rules.localization.rule)}\n custom_rules:\n - Add team-specific rules here during init review; future agents must follow them.\n\ncommands:\n install: ${yamlString(cmd.install)}\n test: ${yamlString(cmd.test)}\n lint: ${yamlString(cmd.lint)}\n typecheck: ${yamlString(cmd.typecheck)}\n build: ${yamlString(cmd.build)}\n validate: ${yamlString(cmd.validate)}\n\npolicy:\n default_branch: main\n branch_naming: "feat/<short-topic>"\n commit_style: conventional\n editable_paths: [.]\n protected_paths:\n - .git/\n - .env*\n - "**/*secret*"\n - "**/*token*"\n - "**/migrations/**"\n - "**/node_modules/**"\n - "**/dist/**"\n - "**/build/**"\n - "**/coverage/**"\n - "**/*lock*"\n\nagent_surfaces:\n claude: .claude/\n cursor: .cursor/\n codex: .agents/\n codex_plugin: .codex-plugin/plugin.json\n shared_skills: .vibekit/skills/\n shared_commands: .vibekit/commands/\n\nautomation:\n autoresearch:\n results_file: results.tsv\n logs_dir: .autoresearch/logs\n default_budget: 3\n default_timeout_seconds: 600\n daily_enhance:\n report_dir: .vibekit/reports\n write_mode: propose_only\n finalize:\n cleanup_dir: _vibekit-cleanup\n marker: .vibekit/FINALIZE_DONE\n one_time_files: [.vibekit/init/FIRST_TIME_INIT.md, .vibekit/init/FIRST_PROMPT.md, .vibekit/init/PUSH_TO_GITHUB.md, .vibekit/init/CLAUDE-template.md]\n security:\n probe: node .vibekit/scripts/agentshield-probe.mjs .\n scan: npx ecc-agentshield scan --path . --format text --min-severity medium\n`;
556
+ return `# Minimal Vibe Coding Kit backbone. See .vibekit/docs/BACKBONE_REFERENCE.md for details.\nversion: 2\nmeta:\n template_status: initialized\n initialized_at: ${yamlString(data.initializedAt)}\n template_source: minimal-vibe-coding-kit\n schema_version: 3\n init_runbook: .vibekit/init/FIRST_TIME_INIT.md\n init_done_marker: .vibekit/INIT_DONE\n\nproject:\n name: ${yamlString(data.name)}\n description: ${yamlString(data.description)}\n type: ${data.type}\n primary_language: ${data.language}\n package_manager: ${data.packageManager}\n mode: ${data.mode}\n prd: ${yamlString(data.prd)}\n context: ${yamlString(data.context)}\n\npaths:\n root: .\n apps:${yamlList(data.appPaths, 4)}\n source: ${JSON.stringify(data.sourcePaths)}\n tests: ${JSON.stringify(data.testPaths)}\n docs: [README.md, .vibekit/docs/]\n generated: [node_modules/, dist/, build/, coverage/]\n\nconventions:\n review_required_before_write: true\n scope: ${yamlString(rules.scope)}\n naming:\n files: ${yamlString(rules.naming.files)}\n directories: ${yamlString(rules.naming.directories)}\n symbols: follow existing language and framework conventions in nearby code\n evidence:${yamlList(rules.naming.evidence, 6)}\n architecture:\n detected:${yamlList(rules.architecture.detected, 6)}\n rule: ${yamlString(rules.architecture.rule)}\n resources:\n detected_asset_roots:${yamlList(rules.resources.assetRoots, 6)}\n detected_registries:${yamlList(rules.resources.registries, 6)}\n rule: ${yamlString(rules.resources.rule)}\n localization:\n detected_catalogs:${yamlList(rules.localization.catalogs, 6)}\n detected_accessors:${yamlList(rules.localization.accessors, 6)}\n rule: ${yamlString(rules.localization.rule)}\n custom_rules:\n - Add team-specific rules here during init review; future agents must follow them.\n\ncommands:\n install: ${yamlString(cmd.install)}\n test: ${yamlString(cmd.test)}\n lint: ${yamlString(cmd.lint)}\n typecheck: ${yamlString(cmd.typecheck)}\n build: ${yamlString(cmd.build)}\n validate: ${yamlString(cmd.validate)}\n\npolicy:\n default_branch: main\n branch_naming: "feat/<short-topic>"\n commit_style: conventional\n editable_paths: [.]\n protected_paths:\n - .git/\n - .env*\n - "**/*secret*"\n - "**/*token*"\n - "**/migrations/**"\n - "**/node_modules/**"\n - "**/dist/**"\n - "**/build/**"\n - "**/coverage/**"\n - "**/*lock*"\n\nagent_surfaces:\n claude: .claude/\n cursor: .cursor/\n codex: .agents/\n codex_plugin: .codex-plugin/plugin.json\n shared_skills: .vibekit/skills/\n shared_commands: .vibekit/commands/\n\nautomation:\n autoresearch:\n results_file: results.tsv\n logs_dir: .autoresearch/logs\n default_budget: 3\n default_timeout_seconds: 600\n daily_enhance:\n report_dir: .vibekit/reports\n write_mode: propose_only\n finalize:\n cleanup_dir: _vibekit-cleanup\n marker: .vibekit/FINALIZE_DONE\n one_time_files: [.vibekit/init/FIRST_TIME_INIT.md, .vibekit/init/FIRST_PROMPT.md, .vibekit/init/PUSH_TO_GITHUB.md, .vibekit/init/CLAUDE-template.md]\n security:\n probe: node .vibekit/scripts/agentshield-probe.mjs .\n scan: npx ecc-agentshield@1.4.0 scan --path . --format text --min-severity medium\n`;
557
557
  }
558
558
 
559
559
  function inferPaths(files) {
@@ -32,6 +32,41 @@ function listFiles(rel) {
32
32
  try { inner(base); } catch {}
33
33
  return out.sort();
34
34
  }
35
+ function markdownTargets(text) {
36
+ const withoutCode = text
37
+ .replace(/```[\s\S]*?```/g, '')
38
+ .replace(/~~~[\s\S]*?~~~/g, '')
39
+ .replace(/`[^`\n]*`/g, '');
40
+ return [...withoutCode.matchAll(/!?\[[^\]\n]*\]\(([^)\n]+)\)/g)].map((match) => match[1].trim());
41
+ }
42
+ function markdownPathPart(rawTarget) {
43
+ const target = rawTarget.startsWith('<')
44
+ ? rawTarget.slice(1, rawTarget.indexOf('>'))
45
+ : rawTarget.split(/\s+["']/)[0];
46
+ return target.split(/[?#]/, 1)[0];
47
+ }
48
+ function validateCanonicalSkillLinks() {
49
+ const base = '.vibekit/skills';
50
+ let checked = 0;
51
+ let broken = 0;
52
+ for (const file of listFiles(base).filter((entry) => entry.endsWith('.md'))) {
53
+ const rel = `${base}/${file}`;
54
+ for (const rawTarget of markdownTargets(read(rel))) {
55
+ const target = markdownPathPart(rawTarget);
56
+ if (!target || target.startsWith('#') || target.startsWith('//') || /^[a-z][a-z0-9+.-]*:/i.test(target)) continue;
57
+ checked += 1;
58
+ let decoded = target;
59
+ try { decoded = decodeURIComponent(target); } catch {}
60
+ const resolved = target.startsWith('/')
61
+ ? path.join(root, target)
62
+ : path.resolve(path.dirname(path.join(root, rel)), decoded);
63
+ if (fs.existsSync(resolved)) continue;
64
+ broken += 1;
65
+ fail(`broken local Markdown link ${rel} -> ${rawTarget}`);
66
+ }
67
+ }
68
+ if (broken === 0) ok(`canonical skill Markdown links resolve (${checked} local targets)`);
69
+ }
35
70
 
36
71
  // Surface presence: end-user repos may install only some profiles, so
37
72
  // per-surface files are required only when that surface is installed.
@@ -109,6 +144,7 @@ const reasoningSkillResources = {
109
144
  'references/output-schema.md',
110
145
  'references/parameters.md',
111
146
  'references/patterns.md',
147
+ 'references/advanced-techniques.md',
112
148
  'examples/linear-reasoning.md',
113
149
  'examples/revision-pattern.md',
114
150
  'examples/branching-exploration.md',
@@ -119,6 +155,17 @@ const reasoningSkillResources = {
119
155
  ],
120
156
  'path-sensitive-shell-safety': [
121
157
  'references/workflow.md'
158
+ ],
159
+ 'mermaid': [
160
+ 'UPSTREAM-NOTICE.md',
161
+ 'references/kit-examples.md',
162
+ 'references/preview.html',
163
+ 'references/styling-preset.md',
164
+ 'references/coding-level-charts.md',
165
+ 'references/debug-heatmap.md',
166
+ 'references/flowchart.md',
167
+ 'references/sequenceDiagram.md',
168
+ 'references/config-theming.md'
122
169
  ]
123
170
  };
124
171
 
@@ -134,6 +181,7 @@ for (const surface of reasoningSurfaceDirs) {
134
181
  }
135
182
 
136
183
  for (const rel of required) exists(rel) ? ok(`required file ${rel}`) : fail(`missing required file ${rel}`);
184
+ validateCanonicalSkillLinks();
137
185
  if (exists('README.md')) ok('optional README.md present');
138
186
  else console.log('INFO optional README.md not present in target project');
139
187
 
@@ -150,6 +198,9 @@ requireText('.github/workflows/vibekit-validate.yml', 'npm run pack:dry-run', 'C
150
198
  requireText('.vibekit/docs/AUTORESEARCH_LEDGER.md', 'node .vibekit/scripts/validate-kit.mjs .', 'autoresearch ledger documents validation command');
151
199
  requireText('.cursor/rules/020-security-agentshield.mdc', 'node .vibekit/scripts/agentshield-probe.mjs .', 'Cursor security rule uses Node AgentShield probe wrapper');
152
200
  requireText('.vibekit/scripts/doctor.mjs', '.vibekit/scripts/agentshield-probe.mjs', 'doctor uses Node AgentShield probe wrapper');
201
+ requireText('.vibekit/skills/agentshield-security-review/SKILL.md', 'ecc-agentshield@1.4.0', 'AgentShield workflow pins the reviewed scanner version');
202
+ requireText('.vibekit/skills/agentshield-security-review/SKILL.md', 'npm ls ecc-agentshield --depth=0 --ignore-scripts', 'AgentShield workflow checks for a local scanner without lifecycle scripts');
203
+ requireText('.vibekit/scripts/init-backbone.mjs', 'npx ecc-agentshield@1.4.0 scan', 'generated backbone pins the AgentShield scanner version');
153
204
 
154
205
  if (exists('.vibekit/docs/AUTORESEARCH_LEDGER.md')) {
155
206
  const ledgerText = read('.vibekit/docs/AUTORESEARCH_LEDGER.md');
@@ -213,6 +264,119 @@ for (const [skill, mirrors] of Object.entries(skillMirrors)) {
213
264
  }
214
265
  }
215
266
 
267
+ function validateSequentialThinkingContract() {
268
+ const base = '.vibekit/skills/sequential-thinking';
269
+ if (!exists(`${base}/SKILL.md`)) return;
270
+ const skill = read(`${base}/SKILL.md`);
271
+ const markdown = listFiles(base)
272
+ .filter((file) => file.endsWith('.md'))
273
+ .map((file) => read(`${base}/${file}`))
274
+ .join('\n');
275
+
276
+ const markers = ['REVISION', 'BRANCH', 'HYPOTHESIS', 'VERIFICATION', 'CONVERGENCE', 'META', 'FINAL'];
277
+ const missingMarkers = markers.filter((marker) => !skill.includes(`[${marker}`));
278
+ missingMarkers.length
279
+ ? fail(`sequential-thinking marker allowlist missing: ${missingMarkers.join(', ')}`)
280
+ : ok(`sequential-thinking closed marker allowlist (${markers.length} markers)`);
281
+
282
+ if (skill.includes('Keep private chain-of-thought private.')
283
+ && skill.includes('Complexity alone does not authorize more detailed reasoning.')
284
+ && skill.includes('Implicit (default)')) {
285
+ ok('sequential-thinking uses public checkpoints with explicit-only visible reasoning');
286
+ } else {
287
+ fail('sequential-thinking public-checkpoint or explicit-mode contract drifted');
288
+ }
289
+
290
+ const banned = ['thoughtContent', 'recentThoughts', 'sessionContext', 'remainingThoughts', 'Unlike MCP', 'Zod Layer', 'Response Prefix', 'PREFIX_LABEL'];
291
+ const leaked = banned.filter((term) => markdown.includes(term));
292
+ leaked.length
293
+ ? fail(`sequential-thinking contains rejected pseudo-runtime/plugin terms: ${leaked.join(', ')}`)
294
+ : ok('sequential-thinking rejects pseudo-runtime and foreign-plugin contracts');
295
+
296
+ const jsonBlocks = [];
297
+ for (const pattern of [/```json\s*\n([\s\S]*?)\n```/g, /~~~json\s*\n([\s\S]*?)\n~~~/g]) {
298
+ let match;
299
+ while ((match = pattern.exec(markdown))) jsonBlocks.push(match[1]);
300
+ }
301
+ let invalidJson = 0;
302
+ for (const block of jsonBlocks) {
303
+ try { JSON.parse(block); } catch { invalidJson += 1; }
304
+ }
305
+ if (jsonBlocks.length > 0 && invalidJson === 0) ok(`sequential-thinking JSON examples parse (${jsonBlocks.length} blocks)`);
306
+ else fail(`sequential-thinking JSON examples invalid or missing (${invalidJson} invalid, ${jsonBlocks.length} total)`);
307
+ }
308
+
309
+ function validateMermaidContract() {
310
+ const base = '.vibekit/skills/mermaid';
311
+ if (!exists(`${base}/SKILL.md`)) return;
312
+ const skill = read(`${base}/SKILL.md`);
313
+ const examples = read(`${base}/references/kit-examples.md`);
314
+ const preview = read(`${base}/references/preview.html`);
315
+ const notice = read(`${base}/UPSTREAM-NOTICE.md`);
316
+ const debug = read(`${base}/references/debug-heatmap.md`);
317
+ const styling = read(`${base}/references/styling-preset.md`);
318
+ const imported = listFiles(`${base}/references`)
319
+ .filter((file) => file.endsWith('.md'))
320
+ .map((file) => read(`${base}/references/${file}`))
321
+ .join('\n');
322
+
323
+ const diagrams = [...examples.matchAll(/```mermaid\s*\n([\s\S]*?)\n```/g)].map((match) => match[1]);
324
+ const distinctCases = ['Safe configuration promotion', 'Repository safety evolution', 'Localization release board', 'Validation feedback time', 'Duplicate webhook investigation'];
325
+ if (diagrams.length === 5
326
+ && diagrams.every((diagram) => diagram.includes('securityLevel: strict'))
327
+ && distinctCases.every((name) => examples.toLowerCase().includes(name.toLowerCase()))) {
328
+ ok('Mermaid maintains five strict kit-native examples');
329
+ } else {
330
+ fail('Mermaid kit-native example set, strict security, or distinct cases drifted');
331
+ }
332
+
333
+ if (preview.includes('mermaid@11.16.0/dist/mermaid.esm.min.mjs')
334
+ && preview.includes('mermaid-zenuml@0.2.2/dist/mermaid-zenuml.esm.min.mjs')
335
+ && preview.includes("securityLevel: 'strict'")
336
+ && skill.includes('isolated profile with no secrets or user data')) {
337
+ ok('Mermaid executable preview is pinned, strict, and isolated by policy');
338
+ } else {
339
+ fail('Mermaid executable preview pin, strict mode, or isolation warning drifted');
340
+ }
341
+
342
+ if (notice.includes('Copyright (c) 2014 - 2022 Knut Sveidqvist')
343
+ && notice.includes('The MIT License (MIT)')
344
+ && notice.includes('unavailable')) {
345
+ ok('Mermaid upstream ownership, MIT license, and version boundary are preserved');
346
+ } else {
347
+ fail('Mermaid upstream notice or preserved license is incomplete');
348
+ }
349
+
350
+ const staleTokens = ['MERMAID_RELEASE_VERSION', '/blob/develop/', 'Please edit the corresponding file', 'THIS IS AN AUTOGENERATED FILE'];
351
+ const stale = staleTokens.filter((token) => imported.includes(token));
352
+ stale.length
353
+ ? fail(`Mermaid imported references contain stale or operational tokens: ${stale.join(', ')}`)
354
+ : ok('Mermaid references remove development placeholders and imported operational directives');
355
+
356
+ const unavailableCount = (imported.match(/unreleased upstream; unavailable in Mermaid 11\.16\.0/g) || []).length;
357
+ unavailableCount === 3
358
+ ? ok('Mermaid marks three development-only syntaxes unavailable for 11.16.0')
359
+ : fail(`Mermaid expected 3 development-only boundary warnings, found ${unavailableCount}`);
360
+
361
+ if (styling.includes('first Kanban column to `section-1`')
362
+ && styling.includes('maps `section-1` to `cScale2`')
363
+ && examples.includes('cScale2: "#339AF0"')
364
+ && examples.includes('cScale5: "#9775FA"')) {
365
+ ok('Mermaid 11.16 Kanban compatibility mapping is documented and exercised');
366
+ } else {
367
+ fail('Mermaid 11.16 Kanban compatibility mapping drifted');
368
+ }
369
+
370
+ if (debug.includes('fill:#FA5252,stroke:#444444,stroke-width:2px,color:#111111')) {
371
+ ok('Mermaid debug heat map uses accessible ink on strong red');
372
+ } else {
373
+ fail('Mermaid debug heat-map strong-red text contrast drifted');
374
+ }
375
+ }
376
+
377
+ validateSequentialThinkingContract();
378
+ validateMermaidContract();
379
+
216
380
  function parseFrontmatter(text) {
217
381
  const match = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
218
382
  if (!match) return null;
@@ -328,7 +492,7 @@ for (const [rel, settings] of [['.claude/settings.json', claudeSettings], ['.cur
328
492
  piped.length === 0
329
493
  ? ok(`${rel} deny rules avoid pipe-spanning patterns (subcommands are matched independently)`)
330
494
  : fail(`${rel} deny rules span a pipe and never match: ${piped.join(', ')}`);
331
- const yesFirst = deny.some((rule) => rule.startsWith('Bash(npx --yes') || rule.startsWith('Bash(npx -y'));
495
+ const yesFirst = deny.some((rule) => rule.startsWith('Bash(npx --yes') || rule.startsWith('Bash(npx ' + '-y'));
332
496
  yesFirst
333
497
  ? ok(`${rel} denies leading npx --yes/-y forms`)
334
498
  : fail(`${rel} missing deny for leading npx --yes/-y forms`);
@@ -491,14 +655,26 @@ function walk(item) {
491
655
  return out;
492
656
  }
493
657
 
494
- for (const file of scanDirs.flatMap(walk)) {
495
- if (!/\.(md|mdc|json|toml|yml|yaml|js|mjs|py|sh)$/i.test(file)) continue;
658
+ const agentSurfaceFiles = scanDirs.flatMap(walk);
659
+ for (const file of agentSurfaceFiles) {
660
+ if (!/\.(md|mdc|json|toml|yml|yaml|js|mjs|cjs|ts|tsx|py|sh|ps1|html|htm)$/i.test(file)) continue;
496
661
  const text = fs.readFileSync(file, 'utf8');
497
662
  for (const r of riskyPatterns) {
498
663
  if (text.includes(r.pattern)) warn(`${path.relative(root, file)} contains ${r.message}`);
499
664
  }
500
665
  }
501
666
 
667
+ const unpinnedScanner = 'npx' + ' ecc-agentshield ';
668
+ const unpinnedScannerFiles = agentSurfaceFiles
669
+ .filter((file) => /\.(md|mdc|json|toml|yml|yaml|js|mjs|py|sh|ps1|html)$/i.test(file))
670
+ .filter((file) => fs.readFileSync(file, 'utf8').includes(unpinnedScanner));
671
+ unpinnedScannerFiles.length === 0
672
+ ? ok('agent surfaces avoid unpinned ecc-agentshield npx execution')
673
+ : fail(`agent surfaces contain unpinned ecc-agentshield npx execution: ${unpinnedScannerFiles.map((file) => path.relative(root, file)).join(', ')}`);
674
+
675
+ requireText('.vibekit/skills/agentshield-security-review/scripts/agentshield_repo_probe.py', '".html"', 'AgentShield probe scans executable HTML surfaces');
676
+ requireText('.vibekit/skills/agentshield-security-review/scripts/agentshield_repo_probe.py', '"npx" + " ecc-agentshield "', 'AgentShield probe flags unpinned scanner execution');
677
+
502
678
  const probe = path.join(root, '.vibekit/scripts/agentshield-probe.mjs');
503
679
  if (fs.existsSync(probe)) {
504
680
  const result = spawnSync(process.execPath, [probe, root, '--json'], { encoding: 'utf8' });
@@ -15,20 +15,27 @@ Do not invent findings. Prefer deterministic scanner output when available, then
15
15
 
16
16
  1. Identify the repo root and active harness surfaces.
17
17
  2. Run `node .vibekit/scripts/agentshield-probe.mjs .` to inventory Claude, Codex, shared skills, hooks, MCP, commands, and repo instruction files.
18
- 3. If Node/npm is available, run AgentShield from the repo root:
18
+ 3. Check whether the scanner is already installed locally:
19
19
  ```bash
20
- npx ecc-agentshield scan --path . --format text
20
+ npm ls ecc-agentshield --depth=0 --ignore-scripts
21
21
  ```
22
- 4. If JSON is needed for CI or automation, run:
22
+ If it is unavailable, use the fallback manual review by default. Fetching and executing a
23
+ package is a separate trust decision; request approval before using the exact reviewed version.
24
+ 4. With a local install or explicit approval, run the version-pinned scanner from the repo root:
23
25
  ```bash
24
- npx ecc-agentshield scan --path . --format json
26
+ npx ecc-agentshield@1.4.0 scan --path . --format text
25
27
  ```
26
- 5. If safe auto-fixes are requested, first summarize the proposed edits, then run:
28
+ 5. If JSON is needed for CI or automation, run:
27
29
  ```bash
28
- npx ecc-agentshield scan --path . --fix
30
+ npx ecc-agentshield@1.4.0 scan --path . --format json
29
31
  ```
30
- 6. Re-run the scan after fixes and report before/after score, severity counts, and changed files.
31
- 7. If AgentShield is unavailable, perform the fallback manual review in `references/review-checklist.md`.
32
+ 6. If safe auto-fixes are requested, first summarize the proposed edits, then run:
33
+ ```bash
34
+ npx ecc-agentshield@1.4.0 scan --path . --fix
35
+ ```
36
+ 7. Re-run the scan after fixes and report before/after score, severity counts, and changed files.
37
+ 8. If AgentShield is unavailable or package execution is not approved, perform the fallback
38
+ manual review in `references/review-checklist.md`.
32
39
 
33
40
  ## Harness-native layout
34
41
 
@@ -71,5 +78,6 @@ Use `references/report-template.md` for the preferred report format.
71
78
 
72
79
  - Never print full secrets. Show only the file path and key name or a redacted prefix/suffix.
73
80
  - Do not run untrusted hook scripts, MCP server commands, package scripts, or installer scripts just to inspect them.
81
+ - Do not replace the pinned `ecc-agentshield@1.4.0` command with an unpinned `npx` invocation.
74
82
  - Do not apply `--fix` without first stating the planned edit types.
75
83
  - Treat wildcard shell permissions, unpinned `npx`, shell-running MCP servers, prompt-injection instructions, and silent hook failures as high-risk until proven otherwise.