@g3nomaly/skills 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/LICENSE +95 -0
  2. package/dist/cli/adapter.d.ts +30 -0
  3. package/dist/cli/adapter.d.ts.map +1 -0
  4. package/dist/cli/adapter.js +86 -0
  5. package/dist/cli/adapter.js.map +1 -0
  6. package/dist/cli/commands/add.d.ts +17 -0
  7. package/dist/cli/commands/add.d.ts.map +1 -0
  8. package/dist/cli/commands/add.js +108 -0
  9. package/dist/cli/commands/add.js.map +1 -0
  10. package/dist/cli/commands/hook.d.ts +6 -0
  11. package/dist/cli/commands/hook.d.ts.map +1 -0
  12. package/dist/cli/commands/hook.js +18 -0
  13. package/dist/cli/commands/hook.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +22 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +119 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/commands/ls.d.ts +4 -0
  19. package/dist/cli/commands/ls.d.ts.map +1 -0
  20. package/dist/cli/commands/ls.js +8 -0
  21. package/dist/cli/commands/ls.js.map +1 -0
  22. package/dist/cli/commands/remove.d.ts +12 -0
  23. package/dist/cli/commands/remove.d.ts.map +1 -0
  24. package/dist/cli/commands/remove.js +60 -0
  25. package/dist/cli/commands/remove.js.map +1 -0
  26. package/dist/cli/commands/update.d.ts +13 -0
  27. package/dist/cli/commands/update.d.ts.map +1 -0
  28. package/dist/cli/commands/update.js +49 -0
  29. package/dist/cli/commands/update.js.map +1 -0
  30. package/dist/cli/index.d.ts +3 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +72 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/decisions/index.d.ts +6 -0
  35. package/dist/decisions/index.d.ts.map +1 -0
  36. package/dist/decisions/index.js +5 -0
  37. package/dist/decisions/index.js.map +1 -0
  38. package/dist/decisions/paths.d.ts +4 -0
  39. package/dist/decisions/paths.d.ts.map +1 -0
  40. package/dist/decisions/paths.js +12 -0
  41. package/dist/decisions/paths.js.map +1 -0
  42. package/dist/decisions/read.d.ts +18 -0
  43. package/dist/decisions/read.d.ts.map +1 -0
  44. package/dist/decisions/read.js +45 -0
  45. package/dist/decisions/read.js.map +1 -0
  46. package/dist/decisions/write.d.ts +20 -0
  47. package/dist/decisions/write.d.ts.map +1 -0
  48. package/dist/decisions/write.js +48 -0
  49. package/dist/decisions/write.js.map +1 -0
  50. package/dist/filetree/ensure.d.ts +7 -0
  51. package/dist/filetree/ensure.d.ts.map +1 -0
  52. package/dist/filetree/ensure.js +36 -0
  53. package/dist/filetree/ensure.js.map +1 -0
  54. package/dist/filetree/entries.d.ts +9 -0
  55. package/dist/filetree/entries.d.ts.map +1 -0
  56. package/dist/filetree/entries.js +49 -0
  57. package/dist/filetree/entries.js.map +1 -0
  58. package/dist/filetree/frontmatter.d.ts +16 -0
  59. package/dist/filetree/frontmatter.d.ts.map +1 -0
  60. package/dist/filetree/frontmatter.js +43 -0
  61. package/dist/filetree/frontmatter.js.map +1 -0
  62. package/dist/filetree/generate.d.ts +16 -0
  63. package/dist/filetree/generate.d.ts.map +1 -0
  64. package/dist/filetree/generate.js +62 -0
  65. package/dist/filetree/generate.js.map +1 -0
  66. package/dist/filetree/index.d.ts +17 -0
  67. package/dist/filetree/index.d.ts.map +1 -0
  68. package/dist/filetree/index.js +13 -0
  69. package/dist/filetree/index.js.map +1 -0
  70. package/dist/filetree/levels.d.ts +25 -0
  71. package/dist/filetree/levels.d.ts.map +1 -0
  72. package/dist/filetree/levels.js +45 -0
  73. package/dist/filetree/levels.js.map +1 -0
  74. package/dist/filetree/locate.d.ts +44 -0
  75. package/dist/filetree/locate.d.ts.map +1 -0
  76. package/dist/filetree/locate.js +76 -0
  77. package/dist/filetree/locate.js.map +1 -0
  78. package/dist/filetree/paths.d.ts +15 -0
  79. package/dist/filetree/paths.d.ts.map +1 -0
  80. package/dist/filetree/paths.js +38 -0
  81. package/dist/filetree/paths.js.map +1 -0
  82. package/dist/filetree/read.d.ts +23 -0
  83. package/dist/filetree/read.d.ts.map +1 -0
  84. package/dist/filetree/read.js +36 -0
  85. package/dist/filetree/read.js.map +1 -0
  86. package/dist/filetree/remove.d.ts +9 -0
  87. package/dist/filetree/remove.d.ts.map +1 -0
  88. package/dist/filetree/remove.js +17 -0
  89. package/dist/filetree/remove.js.map +1 -0
  90. package/dist/filetree/root.d.ts +9 -0
  91. package/dist/filetree/root.d.ts.map +1 -0
  92. package/dist/filetree/root.js +15 -0
  93. package/dist/filetree/root.js.map +1 -0
  94. package/dist/filetree/status.d.ts +21 -0
  95. package/dist/filetree/status.d.ts.map +1 -0
  96. package/dist/filetree/status.js +55 -0
  97. package/dist/filetree/status.js.map +1 -0
  98. package/dist/hooks/cli.d.ts +29 -0
  99. package/dist/hooks/cli.d.ts.map +1 -0
  100. package/dist/hooks/cli.js +65 -0
  101. package/dist/hooks/cli.js.map +1 -0
  102. package/dist/hooks/index.d.ts +3 -0
  103. package/dist/hooks/index.d.ts.map +1 -0
  104. package/dist/hooks/index.js +3 -0
  105. package/dist/hooks/index.js.map +1 -0
  106. package/dist/index.d.ts +10 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +11 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/plugins/grilling/.claude-plugin/plugin.json +7 -0
  111. package/dist/plugins/grilling/skills/domain-modeling/ADR-FORMAT.md +47 -0
  112. package/dist/plugins/grilling/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  113. package/dist/plugins/grilling/skills/domain-modeling/SKILL.md +74 -0
  114. package/dist/plugins/grilling/skills/domain-modeling/agents/openai.yaml +3 -0
  115. package/dist/plugins/grilling/skills/grill-me/SKILL.md +7 -0
  116. package/dist/plugins/grilling/skills/grill-me/agents/openai.yaml +5 -0
  117. package/dist/plugins/grilling/skills/grill-with-docs/SKILL.md +7 -0
  118. package/dist/plugins/grilling/skills/grill-with-docs/agents/openai.yaml +5 -0
  119. package/dist/plugins/grilling/skills/grilling/SKILL.md +12 -0
  120. package/dist/plugins/grilling/skills/grilling/agents/openai.yaml +3 -0
  121. package/dist/plugins/speech/.claude-plugin/plugin.json +7 -0
  122. package/dist/plugins/speech/skills/emphasise/SKILL.md +49 -0
  123. package/dist/plugins/speech/skills/emphasise/agents/openai.yaml +5 -0
  124. package/dist/plugins/speech/skills/unslop/SKILL.md +80 -0
  125. package/dist/plugins/task-manager/.claude-plugin/plugin.json +11 -0
  126. package/dist/plugins/task-manager/hooks/hooks.json +19 -0
  127. package/dist/plugins/task-manager/skills/decisions/SKILL.md +39 -0
  128. package/dist/plugins/task-manager/skills/decisions/agents/openai.yaml +5 -0
  129. package/dist/plugins/task-manager/skills/decisions/references/usage.md +26 -0
  130. package/dist/plugins/task-manager/skills/task-manager/SKILL.md +99 -0
  131. package/dist/plugins/task-manager/skills/vocabulary/SKILL.md +42 -0
  132. package/dist/plugins/task-manager/skills/vocabulary/agents/openai.yaml +5 -0
  133. package/dist/plugins/task-manager/skills/vocabulary/references/usage.md +26 -0
  134. package/dist/plugins/using-hooks/.claude-plugin/plugin.json +7 -0
  135. package/dist/plugins/using-hooks/skills/hook-post-tool-use/SKILL.md +79 -0
  136. package/dist/plugins/using-hooks/skills/hook-post-tool-use/agents/openai.yaml +5 -0
  137. package/dist/plugins/using-hooks/skills/hook-pre-tool-use/SKILL.md +84 -0
  138. package/dist/plugins/using-hooks/skills/hook-pre-tool-use/agents/openai.yaml +5 -0
  139. package/dist/plugins/using-hooks/skills/hook-stop/SKILL.md +69 -0
  140. package/dist/plugins/using-hooks/skills/hook-stop/agents/openai.yaml +5 -0
  141. package/dist/plugins/using-hooks/skills/hook-user-prompt-submit/SKILL.md +64 -0
  142. package/dist/plugins/using-hooks/skills/hook-user-prompt-submit/agents/openai.yaml +5 -0
  143. package/dist/plugins/workflow/.claude-plugin/plugin.json +16 -0
  144. package/dist/plugins/workflow/agents/reviewer.md +9 -0
  145. package/dist/plugins/workflow/skills/execute/SKILL.md +21 -0
  146. package/dist/plugins/workflow/skills/execute/agents/openai.yaml +5 -0
  147. package/dist/plugins/workflow/skills/orchestrator/SKILL.md +27 -0
  148. package/dist/plugins/workflow/skills/orchestrator/agents/openai.yaml +5 -0
  149. package/dist/plugins/workflow/skills/plan/SKILL.md +18 -0
  150. package/dist/plugins/workflow/skills/plan/agents/openai.yaml +5 -0
  151. package/dist/plugins/workflow/skills/plan/references/task-frontmatter.md +33 -0
  152. package/dist/plugins/workflow/skills/review/SKILL.md +25 -0
  153. package/dist/plugins/workflow/skills/review/agents/openai.yaml +5 -0
  154. package/dist/plugins/workflow/skills/run/SKILL.md +33 -0
  155. package/dist/plugins/workflow/skills/run/agents/openai.yaml +5 -0
  156. package/dist/plugins/workflow/skills/run/references/sub-agents.md +46 -0
  157. package/dist/plugins/workflow/skills/sync/SKILL.md +18 -0
  158. package/dist/plugins/workflow/skills/sync/agents/openai.yaml +5 -0
  159. package/dist/plugins/workflow/skills/worktree/SKILL.md +38 -0
  160. package/dist/plugins/workflow/skills/worktree/agents/openai.yaml +5 -0
  161. package/dist/plugins/workflow/skills/worktree/references/git-commands.md +27 -0
  162. package/dist/plugins/writing/.claude-plugin/plugin.json +7 -0
  163. package/dist/plugins/writing/skills/writing-great-hooks/SKILL.md +192 -0
  164. package/dist/plugins/writing/skills/writing-great-hooks/agents/openai.yaml +5 -0
  165. package/dist/plugins/writing/skills/writing-great-skills/GLOSSARY.md +201 -0
  166. package/dist/plugins/writing/skills/writing-great-skills/SKILL.md +92 -0
  167. package/dist/plugins/writing/skills/writing-great-skills/agents/openai.yaml +5 -0
  168. package/dist/plugins/writing/skills/writing-great-tasks/SKILL.md +136 -0
  169. package/dist/plugins/writing/skills/writing-great-tasks/agents/openai.yaml +5 -0
  170. package/dist/plugins/writing/skills/writing-great-tasks/templates/template_task.md +108 -0
  171. package/dist/registry/index.d.ts +5 -0
  172. package/dist/registry/index.d.ts.map +1 -0
  173. package/dist/registry/index.js +6 -0
  174. package/dist/registry/index.js.map +1 -0
  175. package/dist/registry/loadPackageRegistry.d.ts +14 -0
  176. package/dist/registry/loadPackageRegistry.d.ts.map +1 -0
  177. package/dist/registry/loadPackageRegistry.js +59 -0
  178. package/dist/registry/loadPackageRegistry.js.map +1 -0
  179. package/dist/registry/readSkillDir.d.ts +12 -0
  180. package/dist/registry/readSkillDir.d.ts.map +1 -0
  181. package/dist/registry/readSkillDir.js +59 -0
  182. package/dist/registry/readSkillDir.js.map +1 -0
  183. package/dist/registry/types.d.ts +53 -0
  184. package/dist/registry/types.d.ts.map +1 -0
  185. package/dist/registry/types.js +35 -0
  186. package/dist/registry/types.js.map +1 -0
  187. package/dist/registry/userManifest.d.ts +7 -0
  188. package/dist/registry/userManifest.d.ts.map +1 -0
  189. package/dist/registry/userManifest.js +21 -0
  190. package/dist/registry/userManifest.js.map +1 -0
  191. package/dist/remote/fetch.d.ts +16 -0
  192. package/dist/remote/fetch.d.ts.map +1 -0
  193. package/dist/remote/fetch.js +41 -0
  194. package/dist/remote/fetch.js.map +1 -0
  195. package/dist/remote/index.d.ts +7 -0
  196. package/dist/remote/index.d.ts.map +1 -0
  197. package/dist/remote/index.js +5 -0
  198. package/dist/remote/index.js.map +1 -0
  199. package/dist/remote/manifest.d.ts +23 -0
  200. package/dist/remote/manifest.d.ts.map +1 -0
  201. package/dist/remote/manifest.js +116 -0
  202. package/dist/remote/manifest.js.map +1 -0
  203. package/dist/remote/registry.d.ts +18 -0
  204. package/dist/remote/registry.d.ts.map +1 -0
  205. package/dist/remote/registry.js +58 -0
  206. package/dist/remote/registry.js.map +1 -0
  207. package/dist/schemas/config.d.ts +3 -0
  208. package/dist/schemas/config.d.ts.map +1 -0
  209. package/dist/schemas/config.js +3 -0
  210. package/dist/schemas/config.js.map +1 -0
  211. package/dist/schemas/decision.d.ts +43 -0
  212. package/dist/schemas/decision.d.ts.map +1 -0
  213. package/dist/schemas/decision.js +24 -0
  214. package/dist/schemas/decision.js.map +1 -0
  215. package/dist/schemas/index.d.ts +17 -0
  216. package/dist/schemas/index.d.ts.map +1 -0
  217. package/dist/schemas/index.js +10 -0
  218. package/dist/schemas/index.js.map +1 -0
  219. package/dist/schemas/phase.d.ts +46 -0
  220. package/dist/schemas/phase.d.ts.map +1 -0
  221. package/dist/schemas/phase.js +16 -0
  222. package/dist/schemas/phase.js.map +1 -0
  223. package/dist/schemas/plan.d.ts +44 -0
  224. package/dist/schemas/plan.d.ts.map +1 -0
  225. package/dist/schemas/plan.js +15 -0
  226. package/dist/schemas/plan.js.map +1 -0
  227. package/dist/schemas/primitives.d.ts +38 -0
  228. package/dist/schemas/primitives.d.ts.map +1 -0
  229. package/dist/schemas/primitives.js +33 -0
  230. package/dist/schemas/primitives.js.map +1 -0
  231. package/dist/schemas/task.d.ts +70 -0
  232. package/dist/schemas/task.d.ts.map +1 -0
  233. package/dist/schemas/task.js +19 -0
  234. package/dist/schemas/task.js.map +1 -0
  235. package/dist/schemas/term.d.ts +17 -0
  236. package/dist/schemas/term.d.ts.map +1 -0
  237. package/dist/schemas/term.js +22 -0
  238. package/dist/schemas/term.js.map +1 -0
  239. package/dist/schemas/validation.d.ts +24 -0
  240. package/dist/schemas/validation.d.ts.map +1 -0
  241. package/dist/schemas/validation.js +39 -0
  242. package/dist/schemas/validation.js.map +1 -0
  243. package/dist/task-manager/hooks/add-decision.d.ts +2 -0
  244. package/dist/task-manager/hooks/add-decision.d.ts.map +1 -0
  245. package/dist/task-manager/hooks/add-decision.js +19 -0
  246. package/dist/task-manager/hooks/add-decision.js.map +1 -0
  247. package/dist/task-manager/hooks/cleanup.d.ts +2 -0
  248. package/dist/task-manager/hooks/cleanup.d.ts.map +1 -0
  249. package/dist/task-manager/hooks/cleanup.js +27 -0
  250. package/dist/task-manager/hooks/cleanup.js.map +1 -0
  251. package/dist/task-manager/hooks/get-decision.d.ts +2 -0
  252. package/dist/task-manager/hooks/get-decision.d.ts.map +1 -0
  253. package/dist/task-manager/hooks/get-decision.js +11 -0
  254. package/dist/task-manager/hooks/get-decision.js.map +1 -0
  255. package/dist/task-manager/hooks/get-entry.d.ts +2 -0
  256. package/dist/task-manager/hooks/get-entry.d.ts.map +1 -0
  257. package/dist/task-manager/hooks/get-entry.js +20 -0
  258. package/dist/task-manager/hooks/get-entry.js.map +1 -0
  259. package/dist/task-manager/hooks/get-term.d.ts +2 -0
  260. package/dist/task-manager/hooks/get-term.d.ts.map +1 -0
  261. package/dist/task-manager/hooks/get-term.js +13 -0
  262. package/dist/task-manager/hooks/get-term.js.map +1 -0
  263. package/dist/task-manager/hooks/guard-tree.d.ts +2 -0
  264. package/dist/task-manager/hooks/guard-tree.d.ts.map +1 -0
  265. package/dist/task-manager/hooks/guard-tree.js +63 -0
  266. package/dist/task-manager/hooks/guard-tree.js.map +1 -0
  267. package/dist/task-manager/hooks/index.d.ts +4 -0
  268. package/dist/task-manager/hooks/index.d.ts.map +1 -0
  269. package/dist/task-manager/hooks/index.js +32 -0
  270. package/dist/task-manager/hooks/index.js.map +1 -0
  271. package/dist/task-manager/hooks/list-decisions.d.ts +2 -0
  272. package/dist/task-manager/hooks/list-decisions.d.ts.map +1 -0
  273. package/dist/task-manager/hooks/list-decisions.js +20 -0
  274. package/dist/task-manager/hooks/list-decisions.js.map +1 -0
  275. package/dist/task-manager/hooks/list-entries.d.ts +2 -0
  276. package/dist/task-manager/hooks/list-entries.d.ts.map +1 -0
  277. package/dist/task-manager/hooks/list-entries.js +19 -0
  278. package/dist/task-manager/hooks/list-entries.js.map +1 -0
  279. package/dist/task-manager/hooks/list-terms.d.ts +2 -0
  280. package/dist/task-manager/hooks/list-terms.d.ts.map +1 -0
  281. package/dist/task-manager/hooks/list-terms.js +8 -0
  282. package/dist/task-manager/hooks/list-terms.js.map +1 -0
  283. package/dist/task-manager/hooks/next-entry.d.ts +2 -0
  284. package/dist/task-manager/hooks/next-entry.d.ts.map +1 -0
  285. package/dist/task-manager/hooks/next-entry.js +23 -0
  286. package/dist/task-manager/hooks/next-entry.js.map +1 -0
  287. package/dist/task-manager/hooks/remove-term.d.ts +2 -0
  288. package/dist/task-manager/hooks/remove-term.d.ts.map +1 -0
  289. package/dist/task-manager/hooks/remove-term.js +15 -0
  290. package/dist/task-manager/hooks/remove-term.js.map +1 -0
  291. package/dist/task-manager/hooks/set-state.d.ts +2 -0
  292. package/dist/task-manager/hooks/set-state.d.ts.map +1 -0
  293. package/dist/task-manager/hooks/set-state.js +15 -0
  294. package/dist/task-manager/hooks/set-state.js.map +1 -0
  295. package/dist/task-manager/hooks/set-term.d.ts +2 -0
  296. package/dist/task-manager/hooks/set-term.d.ts.map +1 -0
  297. package/dist/task-manager/hooks/set-term.js +27 -0
  298. package/dist/task-manager/hooks/set-term.js.map +1 -0
  299. package/dist/task-manager/hooks/sync-tree.d.ts +2 -0
  300. package/dist/task-manager/hooks/sync-tree.d.ts.map +1 -0
  301. package/dist/task-manager/hooks/sync-tree.js +28 -0
  302. package/dist/task-manager/hooks/sync-tree.js.map +1 -0
  303. package/dist/task-manager/index.d.ts +2 -0
  304. package/dist/task-manager/index.d.ts.map +1 -0
  305. package/dist/task-manager/index.js +3 -0
  306. package/dist/task-manager/index.js.map +1 -0
  307. package/dist/vocabulary/file.d.ts +15 -0
  308. package/dist/vocabulary/file.d.ts.map +1 -0
  309. package/dist/vocabulary/file.js +80 -0
  310. package/dist/vocabulary/file.js.map +1 -0
  311. package/dist/vocabulary/index.d.ts +4 -0
  312. package/dist/vocabulary/index.d.ts.map +1 -0
  313. package/dist/vocabulary/index.js +4 -0
  314. package/dist/vocabulary/index.js.map +1 -0
  315. package/dist/vocabulary/match.d.ts +22 -0
  316. package/dist/vocabulary/match.d.ts.map +1 -0
  317. package/dist/vocabulary/match.js +31 -0
  318. package/dist/vocabulary/match.js.map +1 -0
  319. package/dist/workflow/gates.d.ts +24 -0
  320. package/dist/workflow/gates.d.ts.map +1 -0
  321. package/dist/workflow/gates.js +34 -0
  322. package/dist/workflow/gates.js.map +1 -0
  323. package/dist/workflow/hooks/advance-step.d.ts +2 -0
  324. package/dist/workflow/hooks/advance-step.d.ts.map +1 -0
  325. package/dist/workflow/hooks/advance-step.js +51 -0
  326. package/dist/workflow/hooks/advance-step.js.map +1 -0
  327. package/dist/workflow/hooks/current-step.d.ts +2 -0
  328. package/dist/workflow/hooks/current-step.d.ts.map +1 -0
  329. package/dist/workflow/hooks/current-step.js +24 -0
  330. package/dist/workflow/hooks/current-step.js.map +1 -0
  331. package/dist/workflow/hooks/index.d.ts +4 -0
  332. package/dist/workflow/hooks/index.d.ts.map +1 -0
  333. package/dist/workflow/hooks/index.js +10 -0
  334. package/dist/workflow/hooks/index.js.map +1 -0
  335. package/dist/workflow/hooks/ready-phases.d.ts +2 -0
  336. package/dist/workflow/hooks/ready-phases.d.ts.map +1 -0
  337. package/dist/workflow/hooks/ready-phases.js +15 -0
  338. package/dist/workflow/hooks/ready-phases.js.map +1 -0
  339. package/dist/workflow/index.d.ts +8 -0
  340. package/dist/workflow/index.d.ts.map +1 -0
  341. package/dist/workflow/index.js +6 -0
  342. package/dist/workflow/index.js.map +1 -0
  343. package/dist/workflow/phase.d.ts +16 -0
  344. package/dist/workflow/phase.d.ts.map +1 -0
  345. package/dist/workflow/phase.js +22 -0
  346. package/dist/workflow/phase.js.map +1 -0
  347. package/dist/workflow/steps.d.ts +15 -0
  348. package/dist/workflow/steps.d.ts.map +1 -0
  349. package/dist/workflow/steps.js +32 -0
  350. package/dist/workflow/steps.js.map +1 -0
  351. package/package.json +62 -3
  352. package/README.md +0 -3
@@ -0,0 +1,55 @@
1
+ import { StatusSchema } from "../schemas/primitives";
2
+ import { FileValidationError } from "../schemas/validation";
3
+ const FENCE = "---";
4
+ const STATUS_LINE = /^(status:\s*)(\S+)(\s*)$/;
5
+ /** `setStatusLine` for a plan, phase or task file. */
6
+ export async function setEntryStatus(file, to) {
7
+ return setStatusLine(file, to, StatusSchema);
8
+ }
9
+ /**
10
+ * Rewrites the `status:` line in a file's frontmatter and leaves every other
11
+ * byte alone, so comments, key order and quoting survive the change. Regenerate
12
+ * the owning index afterwards — this touches the `.md` file only.
13
+ *
14
+ * @param schema the set of statuses the file may hold
15
+ * @throws FileValidationError when the frontmatter has no `status:` line, or
16
+ * holds a status outside `schema`
17
+ * @throws Error when the file already has status `to`
18
+ */
19
+ export async function setStatusLine(file, to, schema) {
20
+ const lines = (await Bun.file(file).text()).split("\n");
21
+ const closing = closingFenceAt(lines, file);
22
+ for (let index = 1; index < closing; index++) {
23
+ const match = STATUS_LINE.exec(lines[index] ?? "");
24
+ if (match === null)
25
+ continue;
26
+ const from = schema.safeParse(match[2]);
27
+ if (!from.success) {
28
+ throw new FileValidationError(file, [{ field: "status", message: `is "${match[2]}"` }]);
29
+ }
30
+ if (from.data === to) {
31
+ throw new Error(`${file} is already "${to}"`);
32
+ }
33
+ lines[index] = `${match[1]}${to}${match[3]}`;
34
+ await Bun.write(file, lines.join("\n"));
35
+ return { from: from.data, to };
36
+ }
37
+ throw new FileValidationError(file, [
38
+ { field: "status", message: "has no status: line in the frontmatter" },
39
+ ]);
40
+ }
41
+ function closingFenceAt(lines, file) {
42
+ if (lines[0]?.trimEnd() !== FENCE) {
43
+ throw new FileValidationError(file, [
44
+ { field: "(frontmatter)", message: `no ${FENCE} block at the top of the file` },
45
+ ]);
46
+ }
47
+ const closing = lines.findIndex((line, index) => index > 0 && line.trimEnd() === FENCE);
48
+ if (closing === -1) {
49
+ throw new FileValidationError(file, [
50
+ { field: "(frontmatter)", message: `the ${FENCE} block is never closed` },
51
+ ]);
52
+ }
53
+ return closing;
54
+ }
55
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/filetree/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** One hook as `g3n-skills hook <name>` runs it: the flags after the name, untouched. */
2
+ export type Hook = (argv: readonly string[]) => Promise<void>;
3
+ /** Value of `--flag <value>`, or `undefined` when the flag is absent. */
4
+ export declare function readFlag(argv: readonly string[], flag: string): string | undefined;
5
+ /** Value of `--flag <value>`, or a stated failure when it is missing. */
6
+ export declare function requireFlag(argv: readonly string[], flag: string, example: string): string;
7
+ export declare function hasFlag(argv: readonly string[], flag: string): boolean;
8
+ /**
9
+ * Narrows a flag value to one of a fixed set, naming the whole set when it is
10
+ * not one of them. A schema would report the same rejection as parser output,
11
+ * which is not what a caller reading stderr can act on.
12
+ */
13
+ export declare function oneOf<T extends string>(value: string, allowed: readonly T[], flag: string): T;
14
+ /**
15
+ * Tree root the script works on: `--root` verbatim, otherwise the folder named
16
+ * by `skills.settings.filetreeRoot` under `--project` (default: the working
17
+ * directory).
18
+ */
19
+ export declare function resolveRoot(argv: readonly string[]): Promise<string>;
20
+ /** Everything piped to the hook on stdin, or `""` when it was run from a terminal. */
21
+ export declare function readStdin(): Promise<string>;
22
+ /** The only thing a script writes to stdout. */
23
+ export declare function printJson(value: unknown, argv: readonly string[]): void;
24
+ /**
25
+ * Runs a script's `main` and turns anything thrown into a message on stderr and
26
+ * a non-zero exit, so no rejection escapes as a stack trace.
27
+ */
28
+ export declare function runHook(main: () => Promise<void>): void;
29
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/hooks/cli.ts"],"names":[],"mappings":"AAIA,yFAAyF;AACzF,MAAM,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUlF;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO1F;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAI7F;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E;AAED,sFAAsF;AACtF,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAEjD;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAEvE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAKvD"}
@@ -0,0 +1,65 @@
1
+ // packages/skills/src/hooks/cli.ts
2
+ import { resolve } from "node:path";
3
+ import { resolveFiletreeRoot } from "../filetree/root";
4
+ /** Value of `--flag <value>`, or `undefined` when the flag is absent. */
5
+ export function readFlag(argv, flag) {
6
+ const at = argv.indexOf(flag);
7
+ if (at === -1)
8
+ return undefined;
9
+ const value = argv[at + 1];
10
+ if (value === undefined || value.startsWith("--")) {
11
+ throw new Error(`${flag} requires a value`);
12
+ }
13
+ return value;
14
+ }
15
+ /** Value of `--flag <value>`, or a stated failure when it is missing. */
16
+ export function requireFlag(argv, flag, example) {
17
+ const value = readFlag(argv, flag);
18
+ if (value === undefined) {
19
+ throw new Error(`${flag} is required, e.g. ${flag} ${example}`);
20
+ }
21
+ return value;
22
+ }
23
+ export function hasFlag(argv, flag) {
24
+ return argv.includes(flag);
25
+ }
26
+ /**
27
+ * Narrows a flag value to one of a fixed set, naming the whole set when it is
28
+ * not one of them. A schema would report the same rejection as parser output,
29
+ * which is not what a caller reading stderr can act on.
30
+ */
31
+ export function oneOf(value, allowed, flag) {
32
+ if (allowed.includes(value))
33
+ return value;
34
+ throw new Error(`${flag} must be one of ${allowed.join(", ")}, got "${value}"`);
35
+ }
36
+ /**
37
+ * Tree root the script works on: `--root` verbatim, otherwise the folder named
38
+ * by `skills.settings.filetreeRoot` under `--project` (default: the working
39
+ * directory).
40
+ */
41
+ export async function resolveRoot(argv) {
42
+ const override = readFlag(argv, "--root");
43
+ if (override !== undefined)
44
+ return resolve(override);
45
+ return resolveFiletreeRoot(resolve(readFlag(argv, "--project") ?? process.cwd()));
46
+ }
47
+ /** Everything piped to the hook on stdin, or `""` when it was run from a terminal. */
48
+ export async function readStdin() {
49
+ return process.stdin.isTTY ? "" : Bun.stdin.text();
50
+ }
51
+ /** The only thing a script writes to stdout. */
52
+ export function printJson(value, argv) {
53
+ console.log(JSON.stringify(value, null, hasFlag(argv, "--pretty") ? 2 : 0));
54
+ }
55
+ /**
56
+ * Runs a script's `main` and turns anything thrown into a message on stderr and
57
+ * a non-zero exit, so no rejection escapes as a stack trace.
58
+ */
59
+ export function runHook(main) {
60
+ main().catch((error) => {
61
+ console.error(error instanceof Error ? error.message : String(error));
62
+ process.exit(1);
63
+ });
64
+ }
65
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/hooks/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { readFlag, requireFlag, hasFlag, oneOf, resolveRoot, readStdin, printJson, runHook } from "./cli";
2
+ export type { Hook } from "./cli";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC1G,YAAY,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ // packages/skills/src/hooks/index.ts
2
+ export { readFlag, requireFlag, hasFlag, oneOf, resolveRoot, readStdin, printJson, runHook } from "./cli";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from "./schemas";
2
+ export * from "./filetree";
3
+ export * from "./hooks";
4
+ export * from "./registry";
5
+ export * from "./remote";
6
+ export * from "./task-manager";
7
+ export * from "./vocabulary";
8
+ export * from "./decisions";
9
+ export * from "./workflow";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ // packages/skills/src/index.ts
2
+ export * from "./schemas";
3
+ export * from "./filetree";
4
+ export * from "./hooks";
5
+ export * from "./registry";
6
+ export * from "./remote";
7
+ export * from "./task-manager";
8
+ export * from "./vocabulary";
9
+ export * from "./decisions";
10
+ export * from "./workflow";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "grilling",
3
+ "description": "Relentless interviews that stress-test a plan, plus the domain model they feed.",
4
+ "version": "0.1.0",
5
+ "license": "UNLICENSED",
6
+ "skills": ["./skills/grilling", "./skills/grill-me", "./skills/grill-with-docs", "./skills/domain-modeling"]
7
+ }
@@ -0,0 +1,47 @@
1
+ # ADR Format
2
+
3
+ ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc.
4
+
5
+ Create the `docs/adr/` directory lazily — only when the first ADR is needed.
6
+
7
+ ## Template
8
+
9
+ ```md
10
+ # {Short title of the decision}
11
+
12
+ {1-3 sentences: what's the context, what did we decide, and why.}
13
+ ```
14
+
15
+ That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections.
16
+
17
+ ## Optional sections
18
+
19
+ Only include these when they add genuine value. Most ADRs won't need them.
20
+
21
+ - **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited
22
+ - **Considered Options** — only when the rejected alternatives are worth remembering
23
+ - **Consequences** — only when non-obvious downstream effects need to be called out
24
+
25
+ ## Numbering
26
+
27
+ Scan `docs/adr/` for the highest existing number and increment by one.
28
+
29
+ ## When to offer an ADR
30
+
31
+ All three of these must be true:
32
+
33
+ 1. **Hard to reverse** — the cost of changing your mind later is meaningful
34
+ 2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?"
35
+ 3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons
36
+
37
+ If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing."
38
+
39
+ ### What qualifies
40
+
41
+ - **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres."
42
+ - **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP."
43
+ - **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out.
44
+ - **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s.
45
+ - **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate.
46
+ - **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract."
47
+ - **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months.
@@ -0,0 +1,60 @@
1
+ # CONTEXT.md Format
2
+
3
+ ## Structure
4
+
5
+ ```md
6
+ # {Context Name}
7
+
8
+ {One or two sentence description of what this context is and why it exists.}
9
+
10
+ ## Language
11
+
12
+ **Order**:
13
+ {A one or two sentence description of the term}
14
+ _Avoid_: Purchase, transaction
15
+
16
+ **Invoice**:
17
+ A request for payment sent to a customer after delivery.
18
+ _Avoid_: Bill, payment request
19
+
20
+ **Customer**:
21
+ A person or organization that places orders.
22
+ _Avoid_: Client, buyer, account
23
+ ```
24
+
25
+ ## Rules
26
+
27
+ - **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others under `_Avoid_`.
28
+ - **Keep definitions tight.** One or two sentences max. Define what it IS, not what it does.
29
+ - **Only include terms specific to this project's context.** General programming concepts (timeouts, error types, utility patterns) don't belong even if the project uses them extensively. Before adding a term, ask: is this a concept unique to this context, or a general programming concept? Only the former belongs.
30
+ - **Group terms under subheadings** when natural clusters emerge. If all terms belong to a single cohesive area, a flat list is fine.
31
+
32
+ ## Single vs multi-context repos
33
+
34
+ **Single context (most repos):** One `CONTEXT.md` at the repo root.
35
+
36
+ **Multiple contexts:** A `CONTEXT-MAP.md` at the repo root lists the contexts, where they live, and how they relate to each other:
37
+
38
+ ```md
39
+ # Context Map
40
+
41
+ ## Contexts
42
+
43
+ - [Ordering](./src/ordering/CONTEXT.md) — receives and tracks customer orders
44
+ - [Billing](./src/billing/CONTEXT.md) — generates invoices and processes payments
45
+ - [Fulfillment](./src/fulfillment/CONTEXT.md) — manages warehouse picking and shipping
46
+
47
+ ## Relationships
48
+
49
+ - **Ordering → Fulfillment**: Ordering emits `OrderPlaced` events; Fulfillment consumes them to start picking
50
+ - **Fulfillment → Billing**: Fulfillment emits `ShipmentDispatched` events; Billing consumes them to generate invoices
51
+ - **Ordering ↔ Billing**: Shared types for `CustomerId` and `Money`
52
+ ```
53
+
54
+ The skill infers which structure applies:
55
+
56
+ - If `CONTEXT-MAP.md` exists, read it to find contexts
57
+ - If only a root `CONTEXT.md` exists, single context
58
+ - If neither exists, create a root `CONTEXT.md` lazily when the first term is resolved
59
+
60
+ When multiple contexts exist, infer which one the current topic relates to. If unclear, ask.
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: domain-modeling
3
+ description: Build and sharpen a project's domain model. Use when the user wants to pin down domain terminology or a ubiquitous language, record an architectural decision, or when another skill needs to maintain the domain model.
4
+ ---
5
+
6
+ # Domain Modeling
7
+
8
+ Actively build and sharpen the project's domain model as you design. This is the *active* discipline — challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `CONTEXT.md` for vocabulary is not this skill — that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.)
9
+
10
+ ## File structure
11
+
12
+ Most repos have a single context:
13
+
14
+ ```
15
+ /
16
+ ├── CONTEXT.md
17
+ ├── docs/
18
+ │ └── adr/
19
+ │ ├── 0001-event-sourced-orders.md
20
+ │ └── 0002-postgres-for-write-model.md
21
+ └── src/
22
+ ```
23
+
24
+ If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:
25
+
26
+ ```
27
+ /
28
+ ├── CONTEXT-MAP.md
29
+ ├── docs/
30
+ │ └── adr/ ← system-wide decisions
31
+ ├── src/
32
+ │ ├── ordering/
33
+ │ │ ├── CONTEXT.md
34
+ │ │ └── docs/adr/ ← context-specific decisions
35
+ │ └── billing/
36
+ │ ├── CONTEXT.md
37
+ │ └── docs/adr/
38
+ ```
39
+
40
+ Create files lazily — only when you have something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.
41
+
42
+ ## During the session
43
+
44
+ ### Challenge against the glossary
45
+
46
+ When the user uses a term that conflicts with the existing language in `CONTEXT.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"
47
+
48
+ ### Sharpen fuzzy language
49
+
50
+ When the user uses vague or overloaded terms, propose a precise canonical term. "You're saying 'account' — do you mean the Customer or the User? Those are different things."
51
+
52
+ ### Discuss concrete scenarios
53
+
54
+ When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts.
55
+
56
+ ### Cross-reference with code
57
+
58
+ When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?"
59
+
60
+ ### Update CONTEXT.md inline
61
+
62
+ When a term is resolved, update `CONTEXT.md` right there. Don't batch these up — capture them as they happen. Use the format in [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md).
63
+
64
+ `CONTEXT.md` should be totally devoid of implementation details. Do not treat `CONTEXT.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else.
65
+
66
+ ### Offer ADRs sparingly
67
+
68
+ Only offer to create an ADR when all three are true:
69
+
70
+ 1. **Hard to reverse** — the cost of changing your mind later is meaningful
71
+ 2. **Surprising without context** — a future reader will wonder "why did they do it this way?"
72
+ 3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons
73
+
74
+ If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](./ADR-FORMAT.md).
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Domain Modeling"
3
+ short_description: "Build and sharpen a domain model"
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: grill-me
3
+ description: A relentless interview to sharpen a plan or design.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ Run a `/grilling` session.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "Grill Me"
3
+ short_description: "Sharpen a plan through interview"
4
+ policy:
5
+ allow_implicit_invocation: false
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: grill-with-docs
3
+ description: A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ Run a `/grilling` session, using the `/domain-modeling` skill.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "Grill with Docs"
3
+ short_description: "Grill a design and write its docs"
4
+ policy:
5
+ allow_implicit_invocation: false
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: grilling
3
+ description: Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.
4
+ ---
5
+
6
+ Interview me relentlessly about every aspect of this until we reach a shared understanding. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
7
+
8
+ Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
9
+
10
+ If a *fact* can be found by exploring the environment (filesystem, tools, etc.), look it up rather than asking me. The *decisions*, though, are mine — put each one to me and wait for my answer.
11
+
12
+ Do not act on it until I confirm we have reached a shared understanding.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Grilling"
3
+ short_description: "Stress-test thinking one question at a time"
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "speech",
3
+ "description": "Conventions for how an agent writes — emphasis markup and cutting AI tells.",
4
+ "version": "0.1.0",
5
+ "license": "UNLICENSED",
6
+ "skills": ["./skills/emphasise", "./skills/unslop"]
7
+ }
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: emphasise
3
+ description: The bold, italic, and backtick conventions for agent-facing Markdown — what **bold**, _italics_, and `code` each mean, and how to use them to make text instantly scannable. Use when writing or editing a skill, prompt, or doc the agent reads, or when the user asks how to emphasise a term.
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ Emphasis is an **attention budget** designed to make text highly scannable on a first pass. A marker works by making one token stand out from its neighbours; spend it only where it helps the eye jump to the core meaning of a paragraph.
8
+
9
+ Three markers, three jobs: `_italics_` highlights _core concepts and themes_, **bold** anchors _hard entities and structures_, and `` `code` `` protects _literal syntax_.
10
+
11
+ ## `_italics_` — the scannability anchor
12
+
13
+ This is your primary tool for helping a reader (human or AI) skim a paragraph and instantly grasp its subject without reading every word. It does not mean the word is a strict variable; it means the word is the thematic core of the sentence.
14
+
15
+ 1. _Concept / Keyword_ — highlights architectural ideas, patterns, or focal points (e.g., _minimum viable product_, _god classes_, _domain segregation_). This draws the eye to the "what are we talking about" of the sentence.
16
+ 2. _Stress_ — the pivot the meaning turns on: "the same _way_ on every run, not the same output".
17
+ 3. _Mention_ — a word or phrase named rather than used: a coined leading word (_tight_), or prompt text quoted as an example (_be thorough_).
18
+ 4. _Label_ — a short tag classifying the block it opens: `_Failure mode._` Mark the tag text and nothing else.
19
+
20
+ ## `**bold**` — the structural pointer
21
+
22
+ Bold carries heavy weight. It is reserved for strict, defined entities, specific UI/document locations, and operative actions.
23
+
24
+ 1. **Entity / Location** — a defined concept with an authoritative definition, or a specific destination like a file, document, or section (e.g., an extension gets reported in **Findings**).
25
+ 2. **Action / Point** — the operative clause of a bullet or step, front-loaded so the list can be skimmed by its first few words. **One trigger per branch.** Bold the instruction; leave the explanation after it plain.
26
+
27
+ ## `` `code` `` — this is literal
28
+
29
+ Backticks are not emphasis. They mean "reproduce this exactly": paths, filenames, flags, field names, identifiers, commands. A concept that is also an identifier takes backticks in its identifier sense and italics in its concept sense — the `description` field is what you edit, but the _description_ is what makes a skill model-invoked.
30
+
31
+ ## Choosing
32
+
33
+ | Test | Marker |
34
+ |---|---|
35
+ | Is it a key concept, pattern, or keyword I want the eye to catch when skimming? | `_italics_` (concept) |
36
+ | Is it a defined strict entity, document name, or UI element? | `**bold**` (entity) |
37
+ | Is it the operative point of a bullet? | `**bold**` (action) |
38
+ | Would the sentence be misread without it? | `_italics_` (stress) |
39
+ | Is it a word or quoted phrase being named rather than used? | `_italics_` (mention) |
40
+ | Would you type it verbatim into a terminal or a file? | `` `backticks` `` |
41
+ | None of the above | plain text |
42
+
43
+ ## Failure modes
44
+
45
+ - _Emphasis inflation._ So much is marked that nothing reads as marked. The fix is subtraction: cut until what remains is exactly enough to allow a reader to skim and understand the paragraph.
46
+ - _Marker collision._ The same word bolded in one passage and italicised in another. Decide whether the word is a hard entity (**bold**) or a thematic concept (_italics_) and stick to it.
47
+ - _Double marking._ `**_both at once_**` spends two signals on one job and looks messy. Pick one.
48
+ - _Runaway italics._ Italics past a few words — a whole paragraph or a long quotation. Concepts are punchy; if you italicise a whole sentence, you destroy the scannability.
49
+ - _Bold as outline._ Bolded lead-ins carrying a hierarchy across paragraphs, where a heading (`##`) or list is the real answer.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "Emphasise"
3
+ short_description: "Bold and italic conventions for agent-facing Markdown"
4
+ policy:
5
+ allow_implicit_invocation: false
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: unslop
3
+ description: Cut AI tells from any writing. Must always apply.
4
+ ---
5
+
6
+ # Unslop
7
+
8
+ Edit text to remove AI patterns and add human voice.
9
+
10
+ ## Process
11
+
12
+ 1. Scan for the patterns below.
13
+ 2. Rewrite. Preserve meaning, match intended tone.
14
+ 3. Add soul (see next section).
15
+ 4. Self-audit: "What makes this obviously AI generated?" Fix remaining tells.
16
+
17
+ ## Adding soul
18
+
19
+ Removing patterns is half the job. Sterile, voiceless writing is just as obvious.
20
+
21
+ - **Have opinions.** React to facts instead of neutrally listing pros and cons.
22
+ - **Vary rhythm.** Short sentences. Then longer ones that take their time. Mix it up.
23
+ - **Acknowledge complexity.** "Impressive but also kind of unsettling" beats "impressive."
24
+ - **Use "I" when it fits.** First person isn't unprofessional.
25
+ - **Let some mess in.** Perfect structure looks machine-made.
26
+ - **Be specific.** Not "this is concerning" but "there's something unsettling about agents churning away at 3am."
27
+
28
+ ## Patterns to detect and fix
29
+
30
+ ### Content
31
+
32
+ 1. **Puffery.** "pivotal moment", "testament to", "evolving landscape", "setting the stage for", "indelible mark", "deeply rooted". Cut puffery, state what happened.
33
+ 2. **Name-dropping.** Listing media outlets without context. Pick one, say what was said.
34
+ 3. **Superficial -ing phrases.** "highlighting...", "ensuring...", "reflecting...", "showcasing...", "fostering...". Delete or expand with real sources.
35
+ 4. **Promotional language.** "nestled", "vibrant", "breathtaking", "groundbreaking", "renowned", "stunning", "must-visit". Use neutral descriptions.
36
+ 5. **Vague attributions.** "Experts believe", "Industry reports suggest", "Some critics argue". Name the source or delete.
37
+ 6. **Formulaic challenges.** "Despite challenges... continues to thrive." Replace with specific facts.
38
+
39
+ ### Language
40
+
41
+ 7. **AI vocabulary.** Additionally, crucial, delve, enduring, enhance, fostering, garner, interplay, intricate, landscape (abstract), pivotal, showcase, tapestry (abstract), testament, underscore, vibrant. Replace with plain words.
42
+ 8. **Fancy ways to say "is".** "serves as", "stands as", "boasts", "features". Just say "is" or "has".
43
+ 9. **"Not just X, but Y."** State the point directly instead.
44
+ 10. **Rule of three.** Forcing ideas into groups of three. Use the natural number.
45
+ 11. **Synonym cycling.** Protagonist, main character, central figure, hero all in one paragraph. Pick one, repeat it.
46
+ 12. **False ranges.** "from X to Y" where X and Y aren't on a meaningful scale. List topics directly.
47
+
48
+ ### Style
49
+
50
+ 13. **Em dash overuse.** Avoid em dashes entirely. Use periods or commas only (no parentheses, no en dashes, no hyphen-as-dash substitutes). Em dashes are an AI tell, and reaching for parentheses instead just trades one tell for another. If a thought needs separation, end the sentence or use a comma.
51
+ 14. **Colon overuse.** Colons are fine before a list or example. Not as mid-sentence connectors. "If you're coming from traditional automation: instead of registering event handlers, you describe conditions" adds nothing with the colon. Rewrite to let the point stand on its own without comparison framing. "Describing when the scheduler should fire works best as plain English." Same meaning, no crutch punctuation.
52
+ 15. **Boldface overuse.** Don't bold every proper noun or acronym.
53
+ 16. **Inline-header lists.** The tell is a bold label and colon that restates the line: "**Performance:** Performance improved...". Convert those to prose. A bold lead-in that ends in a period, names the item, and is followed by genuinely new detail ("**Schema in TypeScript.** Tables live in one file.") is fine, not a tell.
54
+ 17. **Title case headings.** Use sentence case.
55
+ 18. **Decorative emojis.** Remove from headings and bullets.
56
+ 19. **Curly quotes.** Replace with straight quotes.
57
+
58
+ ### Communication artifacts
59
+
60
+ 20. **Chatbot phrases.** "I hope this helps!", "Let me know if...", "Of course!", "Certainly!", "Found the smoking gun!" Remove.
61
+ 21. **Cutoff disclaimers.** "While specific details are limited..." Find sources or remove.
62
+ 22. **Sycophantic tone.** "Great question! You're absolutely right!" Respond directly.
63
+
64
+ ### Filler
65
+
66
+ 23. **Filler phrases.** "In order to" becomes "To". "Due to the fact that" becomes "Because". "It is important to note that" gets deleted.
67
+ 24. **Excessive hedging.** "could potentially possibly be argued that it might" becomes "may".
68
+ 25. **Generic conclusions.** "The future looks bright." State specific plans or facts.
69
+
70
+ ### Jargon
71
+
72
+ 26. **Abstract metaphor nouns.** Substrate, wedge, vector, locus, vantage, nexus, primitive (as noun), harness (as metaphor), surface (as in "API surface"), bedrock, scaffolding (as metaphor), modality, paradigm, gold-plating, ratchet (as metaphor), evacuate (for moving code), endgame, north star, flywheel. These read as technical but usually have a plainer concrete word. "Substrate" becomes "base". "Wedge in" becomes "add". "Vector" becomes "way" or "method". "Gold-plating" becomes "more than the job needs". "Ratchet" becomes the mechanism's real name or "a limit that only tightens". "Evacuate" becomes "move out". "Endgame" becomes "the last phase". Pick the concrete word.
73
+
74
+ ### Plain speech
75
+
76
+ 27. **Say what it does, not how it feels.** "the database stays close at hand", "SQL you can read", "types that follow your schema" name a feeling. The fix names the mechanism or a number: "`.toSQL()` returns the exact string sent to the database", "a column rename fails the build". Ask what the sentence tells the reader to do or know, then write that. If you can't restate it as a concrete instruction, fact, or number, cut it. One more check: if the sentence could appear unchanged in another project's docs, it says nothing about this one. Cut it.
77
+ 28. **Shorten or split dense sentences.** If the reader has to backtrack to parse a sentence, break it in two or drop clauses. One idea per sentence.
78
+ 29. **Active voice.** Prefer it. Catch "is/are/was/were + past participle" and name the actor: "queries are validated" becomes "the compiler validates queries", "the file is parsed by the loader" becomes "the loader parses the file". Passive is fine only when the actor is unknown or genuinely doesn't matter.
79
+ 30. **Cut adverbs, or use a stronger verb.** "runs quickly" becomes "is fast" or the number. "significantly improves" becomes the measured delta. An adverb propping up a weak verb means the verb is wrong.
80
+ 31. **Prefer the plain word.** "utilize" becomes "use", "leverage" becomes "use", "facilitate" becomes "help", "numerous" becomes "many", "in the event that" becomes "if". The fancier synonym is rarely clearer.
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "task-manager",
3
+ "description": "Query and drive a tree of plans, phases and tasks through hooks, with the plan's decisions and the project vocabulary kept beside them.",
4
+ "version": "0.1.0",
5
+ "license": "UNLICENSED",
6
+ "skills": [
7
+ "./skills/task-manager",
8
+ "./skills/vocabulary",
9
+ "./skills/decisions"
10
+ ]
11
+ }