@oriro/orirocli 0.1.8 → 0.1.9

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 (350) hide show
  1. package/ATTRIBUTION.md +8 -0
  2. package/LICENSE +21 -0
  3. package/package.json +1 -1
  4. package/skills/21stdev/SKILL.md +64 -0
  5. package/skills/graphify/SKILL.md +619 -0
  6. package/skills/graphify/__init__.py +28 -0
  7. package/skills/graphify/__main__.py +4582 -0
  8. package/skills/graphify/affected.py +154 -0
  9. package/skills/graphify/always_on/agents-md.md +12 -0
  10. package/skills/graphify/always_on/antigravity-rules.md +14 -0
  11. package/skills/graphify/always_on/claude-md.md +9 -0
  12. package/skills/graphify/always_on/gemini-md.md +9 -0
  13. package/skills/graphify/always_on/kiro-steering.md +5 -0
  14. package/skills/graphify/always_on/vscode-instructions.md +17 -0
  15. package/skills/graphify/analyze.py +724 -0
  16. package/skills/graphify/benchmark.py +155 -0
  17. package/skills/graphify/build.py +487 -0
  18. package/skills/graphify/cache.py +417 -0
  19. package/skills/graphify/callflow_html.py +2020 -0
  20. package/skills/graphify/cluster.py +272 -0
  21. package/skills/graphify/command-kilo.md +15 -0
  22. package/skills/graphify/dedup.py +429 -0
  23. package/skills/graphify/detect.py +1379 -0
  24. package/skills/graphify/diagnostics.py +390 -0
  25. package/skills/graphify/export.py +1408 -0
  26. package/skills/graphify/extract.py +11570 -0
  27. package/skills/graphify/global_graph.py +159 -0
  28. package/skills/graphify/google_workspace.py +223 -0
  29. package/skills/graphify/hooks.py +457 -0
  30. package/skills/graphify/ingest.py +331 -0
  31. package/skills/graphify/llm.py +1896 -0
  32. package/skills/graphify/manifest.py +4 -0
  33. package/skills/graphify/mcp_ingest.py +392 -0
  34. package/skills/graphify/multigraph_compat.py +212 -0
  35. package/skills/graphify/pg_introspect.py +142 -0
  36. package/skills/graphify/prs.py +748 -0
  37. package/skills/graphify/querylog.py +70 -0
  38. package/skills/graphify/report.py +218 -0
  39. package/skills/graphify/scip_ingest.py +363 -0
  40. package/skills/graphify/security.py +336 -0
  41. package/skills/graphify/semantic_cleanup.py +319 -0
  42. package/skills/graphify/serve.py +1309 -0
  43. package/skills/graphify/skill-aider.md +1246 -0
  44. package/skills/graphify/skill-amp.md +613 -0
  45. package/skills/graphify/skill-claw.md +616 -0
  46. package/skills/graphify/skill-codex.md +613 -0
  47. package/skills/graphify/skill-copilot.md +616 -0
  48. package/skills/graphify/skill-devin.md +1372 -0
  49. package/skills/graphify/skill-droid.md +613 -0
  50. package/skills/graphify/skill-kilo.md +625 -0
  51. package/skills/graphify/skill-kiro.md +615 -0
  52. package/skills/graphify/skill-opencode.md +608 -0
  53. package/skills/graphify/skill-pi.md +615 -0
  54. package/skills/graphify/skill-trae.md +614 -0
  55. package/skills/graphify/skill-vscode.md +612 -0
  56. package/skills/graphify/skill-windows.md +651 -0
  57. package/skills/graphify/skills/amp/references/add-watch.md +56 -0
  58. package/skills/graphify/skills/amp/references/exports.md +71 -0
  59. package/skills/graphify/skills/amp/references/extraction-spec.md +68 -0
  60. package/skills/graphify/skills/amp/references/github-and-merge.md +46 -0
  61. package/skills/graphify/skills/amp/references/hooks.md +33 -0
  62. package/skills/graphify/skills/amp/references/query.md +249 -0
  63. package/skills/graphify/skills/amp/references/transcribe.md +48 -0
  64. package/skills/graphify/skills/amp/references/update.md +179 -0
  65. package/skills/graphify/skills/claude/references/add-watch.md +56 -0
  66. package/skills/graphify/skills/claude/references/exports.md +71 -0
  67. package/skills/graphify/skills/claude/references/extraction-spec.md +68 -0
  68. package/skills/graphify/skills/claude/references/github-and-merge.md +46 -0
  69. package/skills/graphify/skills/claude/references/hooks.md +33 -0
  70. package/skills/graphify/skills/claude/references/query.md +103 -0
  71. package/skills/graphify/skills/claude/references/transcribe.md +48 -0
  72. package/skills/graphify/skills/claude/references/update.md +179 -0
  73. package/skills/graphify/skills/claw/references/add-watch.md +56 -0
  74. package/skills/graphify/skills/claw/references/exports.md +71 -0
  75. package/skills/graphify/skills/claw/references/extraction-spec.md +29 -0
  76. package/skills/graphify/skills/claw/references/github-and-merge.md +46 -0
  77. package/skills/graphify/skills/claw/references/hooks.md +33 -0
  78. package/skills/graphify/skills/claw/references/query.md +249 -0
  79. package/skills/graphify/skills/claw/references/transcribe.md +48 -0
  80. package/skills/graphify/skills/claw/references/update.md +179 -0
  81. package/skills/graphify/skills/codex/references/add-watch.md +56 -0
  82. package/skills/graphify/skills/codex/references/exports.md +71 -0
  83. package/skills/graphify/skills/codex/references/extraction-spec.md +29 -0
  84. package/skills/graphify/skills/codex/references/github-and-merge.md +46 -0
  85. package/skills/graphify/skills/codex/references/hooks.md +33 -0
  86. package/skills/graphify/skills/codex/references/query.md +249 -0
  87. package/skills/graphify/skills/codex/references/transcribe.md +48 -0
  88. package/skills/graphify/skills/codex/references/update.md +179 -0
  89. package/skills/graphify/skills/copilot/references/add-watch.md +56 -0
  90. package/skills/graphify/skills/copilot/references/exports.md +71 -0
  91. package/skills/graphify/skills/copilot/references/extraction-spec.md +68 -0
  92. package/skills/graphify/skills/copilot/references/github-and-merge.md +46 -0
  93. package/skills/graphify/skills/copilot/references/hooks.md +33 -0
  94. package/skills/graphify/skills/copilot/references/query.md +249 -0
  95. package/skills/graphify/skills/copilot/references/transcribe.md +48 -0
  96. package/skills/graphify/skills/copilot/references/update.md +179 -0
  97. package/skills/graphify/skills/droid/references/add-watch.md +56 -0
  98. package/skills/graphify/skills/droid/references/exports.md +71 -0
  99. package/skills/graphify/skills/droid/references/extraction-spec.md +68 -0
  100. package/skills/graphify/skills/droid/references/github-and-merge.md +46 -0
  101. package/skills/graphify/skills/droid/references/hooks.md +33 -0
  102. package/skills/graphify/skills/droid/references/query.md +249 -0
  103. package/skills/graphify/skills/droid/references/transcribe.md +48 -0
  104. package/skills/graphify/skills/droid/references/update.md +179 -0
  105. package/skills/graphify/skills/kilo/references/add-watch.md +56 -0
  106. package/skills/graphify/skills/kilo/references/exports.md +71 -0
  107. package/skills/graphify/skills/kilo/references/extraction-spec.md +68 -0
  108. package/skills/graphify/skills/kilo/references/github-and-merge.md +46 -0
  109. package/skills/graphify/skills/kilo/references/hooks.md +33 -0
  110. package/skills/graphify/skills/kilo/references/query.md +249 -0
  111. package/skills/graphify/skills/kilo/references/transcribe.md +48 -0
  112. package/skills/graphify/skills/kilo/references/update.md +179 -0
  113. package/skills/graphify/skills/kiro/references/add-watch.md +56 -0
  114. package/skills/graphify/skills/kiro/references/exports.md +71 -0
  115. package/skills/graphify/skills/kiro/references/extraction-spec.md +29 -0
  116. package/skills/graphify/skills/kiro/references/github-and-merge.md +46 -0
  117. package/skills/graphify/skills/kiro/references/hooks.md +33 -0
  118. package/skills/graphify/skills/kiro/references/query.md +249 -0
  119. package/skills/graphify/skills/kiro/references/transcribe.md +48 -0
  120. package/skills/graphify/skills/kiro/references/update.md +179 -0
  121. package/skills/graphify/skills/opencode/references/add-watch.md +56 -0
  122. package/skills/graphify/skills/opencode/references/exports.md +71 -0
  123. package/skills/graphify/skills/opencode/references/extraction-spec.md +68 -0
  124. package/skills/graphify/skills/opencode/references/github-and-merge.md +46 -0
  125. package/skills/graphify/skills/opencode/references/hooks.md +33 -0
  126. package/skills/graphify/skills/opencode/references/query.md +249 -0
  127. package/skills/graphify/skills/opencode/references/transcribe.md +48 -0
  128. package/skills/graphify/skills/opencode/references/update.md +179 -0
  129. package/skills/graphify/skills/pi/references/add-watch.md +56 -0
  130. package/skills/graphify/skills/pi/references/exports.md +71 -0
  131. package/skills/graphify/skills/pi/references/extraction-spec.md +29 -0
  132. package/skills/graphify/skills/pi/references/github-and-merge.md +46 -0
  133. package/skills/graphify/skills/pi/references/hooks.md +33 -0
  134. package/skills/graphify/skills/pi/references/query.md +249 -0
  135. package/skills/graphify/skills/pi/references/transcribe.md +48 -0
  136. package/skills/graphify/skills/pi/references/update.md +179 -0
  137. package/skills/graphify/skills/trae/references/add-watch.md +56 -0
  138. package/skills/graphify/skills/trae/references/exports.md +71 -0
  139. package/skills/graphify/skills/trae/references/extraction-spec.md +68 -0
  140. package/skills/graphify/skills/trae/references/github-and-merge.md +46 -0
  141. package/skills/graphify/skills/trae/references/hooks.md +35 -0
  142. package/skills/graphify/skills/trae/references/query.md +249 -0
  143. package/skills/graphify/skills/trae/references/transcribe.md +48 -0
  144. package/skills/graphify/skills/trae/references/update.md +179 -0
  145. package/skills/graphify/skills/vscode/references/add-watch.md +56 -0
  146. package/skills/graphify/skills/vscode/references/exports.md +71 -0
  147. package/skills/graphify/skills/vscode/references/extraction-spec.md +68 -0
  148. package/skills/graphify/skills/vscode/references/github-and-merge.md +46 -0
  149. package/skills/graphify/skills/vscode/references/hooks.md +33 -0
  150. package/skills/graphify/skills/vscode/references/query.md +249 -0
  151. package/skills/graphify/skills/vscode/references/transcribe.md +48 -0
  152. package/skills/graphify/skills/vscode/references/update.md +179 -0
  153. package/skills/graphify/skills/windows/references/add-watch.md +56 -0
  154. package/skills/graphify/skills/windows/references/exports.md +71 -0
  155. package/skills/graphify/skills/windows/references/extraction-spec.md +68 -0
  156. package/skills/graphify/skills/windows/references/github-and-merge.md +46 -0
  157. package/skills/graphify/skills/windows/references/hooks.md +33 -0
  158. package/skills/graphify/skills/windows/references/query.md +249 -0
  159. package/skills/graphify/skills/windows/references/transcribe.md +48 -0
  160. package/skills/graphify/skills/windows/references/update.md +179 -0
  161. package/skills/graphify/symbol_resolution.py +538 -0
  162. package/skills/graphify/transcribe.py +184 -0
  163. package/skills/graphify/tree_html.py +582 -0
  164. package/skills/graphify/validate.py +72 -0
  165. package/skills/graphify/watch.py +898 -0
  166. package/skills/graphify/wiki.py +282 -0
  167. package/skills/impeccable/SKILL.md +186 -0
  168. package/skills/impeccable/agents/impeccable_asset_producer.toml +92 -0
  169. package/skills/impeccable/agents/impeccable_manual_edit_applier.toml +95 -0
  170. package/skills/impeccable/agents/openai.yaml +4 -0
  171. package/skills/impeccable/reference/adapt.md +311 -0
  172. package/skills/impeccable/reference/animate.md +201 -0
  173. package/skills/impeccable/reference/audit.md +133 -0
  174. package/skills/impeccable/reference/bolder.md +113 -0
  175. package/skills/impeccable/reference/brand.md +108 -0
  176. package/skills/impeccable/reference/clarify.md +288 -0
  177. package/skills/impeccable/reference/codex.md +105 -0
  178. package/skills/impeccable/reference/colorize.md +257 -0
  179. package/skills/impeccable/reference/craft.md +123 -0
  180. package/skills/impeccable/reference/critique.md +790 -0
  181. package/skills/impeccable/reference/delight.md +302 -0
  182. package/skills/impeccable/reference/distill.md +111 -0
  183. package/skills/impeccable/reference/document.md +429 -0
  184. package/skills/impeccable/reference/extract.md +69 -0
  185. package/skills/impeccable/reference/harden.md +347 -0
  186. package/skills/impeccable/reference/init.md +172 -0
  187. package/skills/impeccable/reference/interaction-design.md +189 -0
  188. package/skills/impeccable/reference/layout.md +161 -0
  189. package/skills/impeccable/reference/live.md +720 -0
  190. package/skills/impeccable/reference/onboard.md +234 -0
  191. package/skills/impeccable/reference/optimize.md +258 -0
  192. package/skills/impeccable/reference/overdrive.md +130 -0
  193. package/skills/impeccable/reference/polish.md +241 -0
  194. package/skills/impeccable/reference/product.md +60 -0
  195. package/skills/impeccable/reference/quieter.md +99 -0
  196. package/skills/impeccable/reference/shape.md +165 -0
  197. package/skills/impeccable/reference/typeset.md +279 -0
  198. package/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  199. package/skills/impeccable/scripts/command-metadata.json +94 -0
  200. package/skills/impeccable/scripts/context-signals.mjs +225 -0
  201. package/skills/impeccable/scripts/context.mjs +266 -0
  202. package/skills/impeccable/scripts/critique-storage.mjs +242 -0
  203. package/skills/impeccable/scripts/design-parser.mjs +835 -0
  204. package/skills/impeccable/scripts/detect-csp.mjs +198 -0
  205. package/skills/impeccable/scripts/detect.mjs +21 -0
  206. package/skills/impeccable/scripts/detector/browser/injected/index.mjs +1733 -0
  207. package/skills/impeccable/scripts/detector/cli/main.mjs +244 -0
  208. package/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +4618 -0
  209. package/skills/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
  210. package/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +252 -0
  211. package/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +535 -0
  212. package/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +986 -0
  213. package/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +208 -0
  214. package/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
  215. package/skills/impeccable/scripts/detector/findings.mjs +12 -0
  216. package/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
  217. package/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
  218. package/skills/impeccable/scripts/detector/registry/antipatterns.mjs +419 -0
  219. package/skills/impeccable/scripts/detector/rules/checks.mjs +2384 -0
  220. package/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
  221. package/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
  222. package/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
  223. package/skills/impeccable/scripts/impeccable-paths.mjs +126 -0
  224. package/skills/impeccable/scripts/is-generated.mjs +69 -0
  225. package/skills/impeccable/scripts/live-accept.mjs +812 -0
  226. package/skills/impeccable/scripts/live-browser-session.js +123 -0
  227. package/skills/impeccable/scripts/live-browser.js +10295 -0
  228. package/skills/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
  229. package/skills/impeccable/scripts/live-complete.mjs +75 -0
  230. package/skills/impeccable/scripts/live-completion.mjs +19 -0
  231. package/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
  232. package/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
  233. package/skills/impeccable/scripts/live-event-validation.mjs +137 -0
  234. package/skills/impeccable/scripts/live-inject.mjs +557 -0
  235. package/skills/impeccable/scripts/live-insert-ui.mjs +458 -0
  236. package/skills/impeccable/scripts/live-insert.mjs +272 -0
  237. package/skills/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
  238. package/skills/impeccable/scripts/live-manual-edits-buffer.mjs +152 -0
  239. package/skills/impeccable/scripts/live-poll.mjs +379 -0
  240. package/skills/impeccable/scripts/live-resume.mjs +94 -0
  241. package/skills/impeccable/scripts/live-server.mjs +2326 -0
  242. package/skills/impeccable/scripts/live-session-store.mjs +289 -0
  243. package/skills/impeccable/scripts/live-status.mjs +61 -0
  244. package/skills/impeccable/scripts/live-svelte-component.mjs +826 -0
  245. package/skills/impeccable/scripts/live-sveltekit-adapter.mjs +274 -0
  246. package/skills/impeccable/scripts/live-ui-core.mjs +179 -0
  247. package/skills/impeccable/scripts/live-vocabulary.mjs +36 -0
  248. package/skills/impeccable/scripts/live-wrap.mjs +894 -0
  249. package/skills/impeccable/scripts/live.mjs +246 -0
  250. package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  251. package/skills/impeccable/scripts/palette.mjs +633 -0
  252. package/skills/impeccable/scripts/pin.mjs +214 -0
  253. package/skills/uipm-ui-styling/LICENSE.txt +202 -0
  254. package/skills/uipm-ui-styling/SKILL.md +328 -0
  255. package/skills/uipm-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  256. package/skills/uipm-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  257. package/skills/uipm-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  258. package/skills/uipm-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
  259. package/skills/uipm-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  260. package/skills/uipm-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
  261. package/skills/uipm-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
  262. package/skills/uipm-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  263. package/skills/uipm-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  264. package/skills/uipm-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  265. package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  266. package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  267. package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  268. package/skills/uipm-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  269. package/skills/uipm-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
  270. package/skills/uipm-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
  271. package/skills/uipm-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
  272. package/skills/uipm-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
  273. package/skills/uipm-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
  274. package/skills/uipm-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
  275. package/skills/uipm-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
  276. package/skills/uipm-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
  277. package/skills/uipm-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
  278. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  279. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  280. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  281. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  282. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  283. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  284. package/skills/uipm-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  285. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  286. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  287. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  288. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  289. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  290. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  291. package/skills/uipm-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  292. package/skills/uipm-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
  293. package/skills/uipm-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
  294. package/skills/uipm-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  295. package/skills/uipm-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  296. package/skills/uipm-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  297. package/skills/uipm-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
  298. package/skills/uipm-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
  299. package/skills/uipm-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
  300. package/skills/uipm-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  301. package/skills/uipm-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  302. package/skills/uipm-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
  303. package/skills/uipm-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  304. package/skills/uipm-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
  305. package/skills/uipm-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
  306. package/skills/uipm-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
  307. package/skills/uipm-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
  308. package/skills/uipm-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
  309. package/skills/uipm-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
  310. package/skills/uipm-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  311. package/skills/uipm-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  312. package/skills/uipm-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
  313. package/skills/uipm-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
  314. package/skills/uipm-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
  315. package/skills/uipm-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  316. package/skills/uipm-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
  317. package/skills/uipm-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
  318. package/skills/uipm-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  319. package/skills/uipm-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  320. package/skills/uipm-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
  321. package/skills/uipm-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  322. package/skills/uipm-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
  323. package/skills/uipm-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  324. package/skills/uipm-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  325. package/skills/uipm-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
  326. package/skills/uipm-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
  327. package/skills/uipm-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
  328. package/skills/uipm-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
  329. package/skills/uipm-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
  330. package/skills/uipm-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  331. package/skills/uipm-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
  332. package/skills/uipm-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
  333. package/skills/uipm-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
  334. package/skills/uipm-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
  335. package/skills/uipm-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  336. package/skills/uipm-ui-styling/references/canvas-design-system.md +320 -0
  337. package/skills/uipm-ui-styling/references/shadcn-accessibility.md +471 -0
  338. package/skills/uipm-ui-styling/references/shadcn-components.md +424 -0
  339. package/skills/uipm-ui-styling/references/shadcn-theming.md +373 -0
  340. package/skills/uipm-ui-styling/references/tailwind-customization.md +483 -0
  341. package/skills/uipm-ui-styling/references/tailwind-responsive.md +382 -0
  342. package/skills/uipm-ui-styling/references/tailwind-utilities.md +455 -0
  343. package/skills/uipm-ui-styling/scripts/.coverage +0 -0
  344. package/skills/uipm-ui-styling/scripts/requirements.txt +17 -0
  345. package/skills/uipm-ui-styling/scripts/shadcn_add.py +292 -0
  346. package/skills/uipm-ui-styling/scripts/tailwind_config_gen.py +456 -0
  347. package/skills/uipm-ui-styling/scripts/tests/coverage-ui.json +1 -0
  348. package/skills/uipm-ui-styling/scripts/tests/requirements.txt +3 -0
  349. package/skills/uipm-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  350. package/skills/uipm-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
@@ -0,0 +1,179 @@
1
+ # graphify reference: incremental update and cluster-only
2
+
3
+ Load this only when the user passed `--update` or `--cluster-only`. A first-time full build never reads this file.
4
+
5
+ ## For --update (incremental re-extraction)
6
+
7
+ Use when you've added or modified files since the last run. Only re-extracts changed files - saves tokens and time.
8
+
9
+ ```bash
10
+ $(cat graphify-out/.graphify_python) -c "
11
+ import sys, json
12
+ from graphify.detect import detect_incremental, save_manifest
13
+ from pathlib import Path
14
+
15
+ result = detect_incremental(Path('INPUT_PATH'))
16
+ new_total = result.get('new_total', 0)
17
+ print(json.dumps(result, indent=2, ensure_ascii=False))
18
+ Path('graphify-out/.graphify_incremental.json').write_text(json.dumps(result, ensure_ascii=False), encoding=\"utf-8\")
19
+ deleted = list(result.get('deleted_files', []))
20
+ if new_total == 0 and not deleted:
21
+ print('No files changed since last run. Nothing to update.')
22
+ raise SystemExit(0)
23
+ if deleted:
24
+ print(f'{len(deleted)} deleted file(s) to prune.')
25
+ if new_total > 0:
26
+ print(f'{new_total} new/changed file(s) to re-extract.')
27
+ "
28
+ ```
29
+
30
+ Then populate `.graphify_detect.json` so Steps 3A–6 (which read it unconditionally) see the right state for an incremental run. `files` carries the changed subset (drives Step 3A AST + Step 3B0 cache check on only what changed); `all_files` carries the full corpus for any step that needs corpus-wide context:
31
+
32
+ ```bash
33
+ $(cat graphify-out/.graphify_python) -c "
34
+ import json
35
+ from pathlib import Path
36
+ r = json.loads(Path('graphify-out/.graphify_incremental.json').read_text(encoding=\"utf-8\"))
37
+ Path('graphify-out/.graphify_detect.json').write_text(json.dumps({
38
+ 'files': r.get('new_files', {}),
39
+ 'all_files': r.get('files', {}),
40
+ 'total_files': r.get('new_total', 0),
41
+ 'total_words': r.get('total_words', 0),
42
+ 'skipped_sensitive': r.get('skipped_sensitive', []),
43
+ 'needs_graph': True,
44
+ }, ensure_ascii=False), encoding=\"utf-8\")
45
+ "
46
+ ```
47
+
48
+ If new files exist, first check whether all changed files are code files:
49
+
50
+ ```bash
51
+ $(cat graphify-out/.graphify_python) -c "
52
+ import json
53
+ from pathlib import Path
54
+
55
+ result = json.loads(open('graphify-out/.graphify_incremental.json', encoding='utf-8').read()) if Path('graphify-out/.graphify_incremental.json').exists() else {}
56
+ code_exts = {'.py','.ts','.js','.go','.rs','.java','.cpp','.c','.rb','.swift','.kt','.cs','.scala','.php','.cc','.cxx','.hpp','.h','.kts','.lua','.toc','.f','.F','.f90','.F90','.f95','.F95','.f03','.F03','.f08','.F08'}
57
+ new_files = result.get('new_files', {})
58
+ all_changed = [f for files in new_files.values() for f in files]
59
+ code_only = all(Path(f).suffix.lower() in code_exts for f in all_changed)
60
+ print('code_only:', code_only)
61
+ "
62
+ ```
63
+
64
+ If `code_only` is True: print `[graphify update] Code-only changes detected - skipping semantic extraction (no LLM needed)`, run only Step 3A (AST) on the changed files, skip Step 3B entirely (no subagents), then go straight to merge and Steps 4–8.
65
+
66
+ If `code_only` is False (any changed file is a doc/paper/image): run the full Steps 3A–3C pipeline as normal.
67
+
68
+
69
+ If no new files exist (only deletions), create an empty extraction so the merge step can prune:
70
+
71
+ ```bash
72
+ if [ ! -f graphify-out/.graphify_extract.json ]; then
73
+ echo '[graphify update] Only deletions -- creating empty extraction for merge.'
74
+ $(cat graphify-out/.graphify_python) -c "
75
+ import json
76
+ from pathlib import Path
77
+ Path('graphify-out/.graphify_extract.json').write_text(json.dumps({'nodes':[],'edges':[],'hyperedges':[],'input_tokens':0,'output_tokens':0}), encoding='utf-8')
78
+ "
79
+ fi
80
+ ```
81
+
82
+
83
+ Then:
84
+
85
+ ```bash
86
+ $(cat graphify-out/.graphify_python) -c "
87
+ import json
88
+ from pathlib import Path
89
+ from graphify.build import build_merge
90
+ from graphify.detect import save_manifest
91
+
92
+ # Load new extraction and incremental state
93
+ new_extraction = json.loads(Path('graphify-out/.graphify_extract.json').read_text(encoding=\"utf-8\"))
94
+ incremental = json.loads(Path('graphify-out/.graphify_incremental.json').read_text(encoding=\"utf-8\"))
95
+ deleted = list(incremental.get('deleted_files', []))
96
+ # Also prune old nodes for re-extracted (changed) files before inserting fresh AST.
97
+ # Without this, build_merge's dedup pass tries to reconcile old and new versions of
98
+ # the same file's nodes and can collapse same-named symbols across files (#1178).
99
+ changed = [f for files in incremental.get('new_files', {}).values() for f in files]
100
+ prune = list(dict.fromkeys(deleted + changed)) or None
101
+
102
+ # Use build_merge() — reads graph.json directly without NetworkX round-trip
103
+ # so edge direction (calls, implements, imports) is always preserved (#801).
104
+ G = build_merge(
105
+ [new_extraction],
106
+ graph_path='graphify-out/graph.json',
107
+ prune_sources=prune,
108
+ )
109
+ print(f'[graphify update] Merged: {G.number_of_nodes()} nodes, {G.number_of_edges()} edges')
110
+
111
+ # Write merged result back to .graphify_extract.json so Step 4 sees the full graph
112
+ merged_out = {
113
+ 'nodes': [{'id': n, **d} for n, d in G.nodes(data=True)],
114
+ 'edges': [
115
+ # Explicit source/target last so they win over any stale attrs in d.
116
+ {**{k: val for k, val in d.items() if k not in ('_src', '_tgt', 'source', 'target')},
117
+ 'source': d.get('_src', u), 'target': d.get('_tgt', v)}
118
+ for u, v, d in G.edges(data=True)
119
+ ],
120
+ # G.graph["hyperedges"] holds hyperedges from both existing graph.json
121
+ # and new_extraction (build_merge combines them). Falling back to
122
+ # new_extraction only would silently drop prior-run hyperedges (#801).
123
+ 'hyperedges': list(G.graph.get('hyperedges', [])),
124
+ 'input_tokens': new_extraction.get('input_tokens', 0),
125
+ 'output_tokens': new_extraction.get('output_tokens', 0),
126
+ }
127
+ Path('graphify-out/.graphify_extract.json').write_text(json.dumps(merged_out, ensure_ascii=False), encoding=\"utf-8\")
128
+ print(f'[graphify update] Merged extraction written ({len(merged_out[\"nodes\"])} nodes, {len(merged_out[\"edges\"])} edges)')
129
+
130
+ # Save manifest so next --update diffs against today's state, not the
131
+ # prior run's baseline (prevents ghost-node reports on subsequent updates).
132
+ save_manifest(incremental['files'])
133
+ print('[graphify update] Manifest saved.')
134
+ "
135
+ ```
136
+
137
+ Then run Steps 4–8 on the merged graph as normal.
138
+
139
+ After Step 4, show the graph diff:
140
+
141
+ ```bash
142
+ $(cat graphify-out/.graphify_python) -c "
143
+ import json
144
+ from graphify.analyze import graph_diff
145
+ from graphify.build import build_from_json
146
+ from networkx.readwrite import json_graph
147
+ import networkx as nx
148
+ from pathlib import Path
149
+
150
+ # Load old graph (before update) from backup written before merge
151
+ old_data = json.loads(Path('graphify-out/.graphify_old.json').read_text(encoding=\"utf-8\")) if Path('graphify-out/.graphify_old.json').exists() else None
152
+ new_extract = json.loads(Path('graphify-out/.graphify_extract.json').read_text(encoding=\"utf-8\"))
153
+ G_new = build_from_json(new_extract)
154
+
155
+ if old_data:
156
+ G_old = json_graph.node_link_graph(old_data, edges='links')
157
+ diff = graph_diff(G_old, G_new)
158
+ print(diff['summary'])
159
+ if diff['new_nodes']:
160
+ print('New nodes:', ', '.join(n['label'] for n in diff['new_nodes'][:5]))
161
+ if diff['new_edges']:
162
+ print('New edges:', len(diff['new_edges']))
163
+ "
164
+ ```
165
+
166
+ Before the merge step, save the old graph: `cp graphify-out/graph.json graphify-out/.graphify_old.json`
167
+ Clean up after: `rm -f graphify-out/.graphify_old.json`
168
+
169
+ ---
170
+
171
+ ## For --cluster-only
172
+
173
+ Skip Steps 1–3. Re-run clustering on the existing graph:
174
+
175
+ ```bash
176
+ graphify cluster-only .
177
+ ```
178
+
179
+ Then run Steps 5–9 as normal (label communities, generate viz, benchmark, clean up, report).
@@ -0,0 +1,56 @@
1
+ # graphify reference: add a URL and watch a folder
2
+
3
+ Load this when the user ran `/graphify add <url>` or passed `--watch`. Neither is part of the default build.
4
+
5
+ ## For /graphify add
6
+
7
+ Fetch a URL and add it to the corpus, then update the graph.
8
+
9
+ ```bash
10
+ $(cat graphify-out/.graphify_python) -c "
11
+ import sys
12
+ from graphify.ingest import ingest
13
+ from pathlib import Path
14
+
15
+ try:
16
+ out = ingest('URL', Path('./raw'), author='AUTHOR', contributor='CONTRIBUTOR')
17
+ print(f'Saved to {out}')
18
+ except ValueError as e:
19
+ print(f'error: {e}', file=sys.stderr)
20
+ sys.exit(1)
21
+ except RuntimeError as e:
22
+ print(f'error: {e}', file=sys.stderr)
23
+ sys.exit(1)
24
+ "
25
+ ```
26
+
27
+ Replace `URL` with the actual URL, `AUTHOR` with the user's name if provided, `CONTRIBUTOR` likewise. If the command exits with an error, tell the user what went wrong - do not silently continue. After a successful save, automatically run the `--update` pipeline on `./raw` to merge the new file into the existing graph.
28
+
29
+ Supported URL types (auto-detected):
30
+ - YouTube / any video URL → audio downloaded via yt-dlp, transcribed to `.txt` on next run (requires `pip install 'graphifyy[video]'`)
31
+ - Twitter/X → fetched via oEmbed, saved as `.md` with tweet text and author
32
+ - arXiv → abstract + metadata saved as `.md`
33
+ - PDF → downloaded as `.pdf`
34
+ - Images (.png/.jpg/.webp) → downloaded, Claude vision extracts on next run
35
+ - Any webpage → converted to markdown via html2text
36
+
37
+ ---
38
+
39
+ ## For --watch
40
+
41
+ Start a background watcher that monitors a folder and auto-updates the graph when files change.
42
+
43
+ ```bash
44
+ python3 -m graphify.watch INPUT_PATH --debounce 3
45
+ ```
46
+
47
+ Replace INPUT_PATH with the folder to watch. Behavior depends on what changed:
48
+
49
+ - **Code files only (.py, .ts, .go, etc.):** re-runs AST extraction + rebuild + cluster immediately, no LLM needed. `graph.json` and `GRAPH_REPORT.md` are updated automatically.
50
+ - **Docs, papers, or images:** writes a `graphify-out/needs_update` flag and prints a notification to run `/graphify --update` (LLM semantic re-extraction required).
51
+
52
+ Debounce (default 3s): waits until file activity stops before triggering, so a wave of parallel agent writes doesn't trigger a rebuild per file.
53
+
54
+ Press Ctrl+C to stop.
55
+
56
+ For agentic workflows: run `--watch` in a background terminal. Code changes from agent waves are picked up automatically between waves. If agents are also writing docs or notes, you'll need a manual `/graphify --update` after those waves.
@@ -0,0 +1,71 @@
1
+ # graphify reference: extra exports and benchmark
2
+
3
+ Load this when the user passed one of the export flags (`--wiki`, `--neo4j`, `--neo4j-push`, `--svg`, `--graphml`, `--mcp`), or when the corpus is large enough for the token-reduction benchmark. Each step runs only for its own flag.
4
+
5
+ ### Step 6b - Wiki (only if --wiki flag)
6
+
7
+ **Only run this step if `--wiki` was explicitly given in the original command.**
8
+
9
+ Run this before Step 9 (cleanup) so `.graphify_labels.json` is still available.
10
+
11
+ ```bash
12
+ graphify export wiki
13
+ ```
14
+
15
+ ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag)
16
+
17
+ **If `--neo4j`** - generate a Cypher file for manual import:
18
+
19
+ ```bash
20
+ graphify export neo4j
21
+ ```
22
+
23
+ **If `--neo4j-push <uri>`** - push directly to a running Neo4j instance. Ask the user for credentials if not provided:
24
+
25
+ ```bash
26
+ graphify export neo4j --push bolt://localhost:7687 --user neo4j --password PASSWORD
27
+ ```
28
+
29
+ Default URI is `bolt://localhost:7687`, default user is `neo4j`. Uses MERGE - safe to re-run without creating duplicates.
30
+
31
+ ### Step 7b - SVG export (only if --svg flag)
32
+
33
+ ```bash
34
+ graphify export svg
35
+ ```
36
+
37
+ ### Step 7c - GraphML export (only if --graphml flag)
38
+
39
+ ```bash
40
+ graphify export graphml
41
+ ```
42
+
43
+ ### Step 7d - MCP server (only if --mcp flag)
44
+
45
+ ```bash
46
+ python3 -m graphify.serve graphify-out/graph.json
47
+ ```
48
+
49
+ This starts a stdio MCP server that exposes tools: `query_graph`, `get_node`, `get_neighbors`, `get_community`, `god_nodes`, `graph_stats`, `shortest_path`. Add to Claude Desktop or any MCP-compatible agent orchestrator so other agents can query the graph live.
50
+
51
+ To configure in Claude Desktop, add to `claude_desktop_config.json`:
52
+ ```json
53
+ {
54
+ "mcpServers": {
55
+ "graphify": {
56
+ "command": "python3",
57
+ "args": ["-m", "graphify.serve", "/absolute/path/to/graphify-out/graph.json"]
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ ### Step 8 - Token reduction benchmark (only if total_words > 5000)
64
+
65
+ If `total_words` from `graphify-out/.graphify_detect.json` is greater than 5,000, run:
66
+
67
+ ```bash
68
+ graphify benchmark
69
+ ```
70
+
71
+ Print the output directly in chat. If `total_words <= 5000`, skip silently - the graph value is structural clarity, not token compression, for small corpora.
@@ -0,0 +1,68 @@
1
+ # graphify reference: extraction subagent prompt
2
+
3
+ Load this in Step 3 Part B when the corpus has at least one doc, paper, or image chunk. A pure-code corpus skips Part B and never reads this file. Each semantic subagent receives the prompt below verbatim (substitute FILE_LIST, CHUNK_NUM, TOTAL_CHUNKS, DEEP_MODE, and CHUNK_PATH).
4
+
5
+ ```
6
+ You are a graphify extraction subagent. Read the files listed and extract a knowledge graph fragment.
7
+ Output ONLY valid JSON matching the schema below - no explanation, no markdown fences, no preamble.
8
+
9
+ Files (chunk CHUNK_NUM of TOTAL_CHUNKS):
10
+ FILE_LIST
11
+
12
+ Rules:
13
+ - EXTRACTED: relationship explicit in source (import, call, citation, "see §3.2")
14
+ - INFERRED: reasonable inference (shared data structure, implied dependency)
15
+ - AMBIGUOUS: uncertain - flag for review, do not omit
16
+
17
+ Code files: focus on semantic edges AST cannot find (call relationships, shared data, arch patterns).
18
+ Do not re-extract imports - AST already has those.
19
+ Doc/paper files: extract named concepts, entities, citations. For rationale (WHY decisions were made, trade-offs, design intent): store as a `rationale` attribute on the relevant concept node — do NOT create a separate rationale node or fragment node. Only create a node for something that is itself a named entity or concept. Use `file_type:"rationale"` for concept-like nodes (ideas, principles, mechanisms, design patterns). `file_type` MUST be one of exactly these six values: `code`, `document`, `paper`, `image`, `rationale`, `concept`. Any other value is invalid and will be rejected.
20
+ Code files: when adding `calls` edges, source MUST be the caller (the function/class doing the calling), target MUST be the callee. Never reverse this direction. `calls` edges MUST stay within one language: a Python function cannot `calls` a JS/TS/Go/Rust/Java symbol and vice versa — cross-language call edges are phantom artifacts, never emit them.
21
+ Image files: use vision to understand what the image IS - do not just OCR.
22
+ UI screenshot: layout patterns, design decisions, key elements, purpose.
23
+ Chart: metric, trend/insight, data source.
24
+ Tweet/post: claim as node, author, concepts mentioned.
25
+ Diagram: components and connections.
26
+ Research figure: what it demonstrates, method, result.
27
+ Handwritten/whiteboard: ideas and arrows, mark uncertain readings AMBIGUOUS.
28
+
29
+ DEEP_MODE (if --mode deep was given): be aggressive with INFERRED edges - indirect deps,
30
+ shared assumptions, latent couplings. Mark uncertain ones AMBIGUOUS instead of omitting.
31
+
32
+ Semantic similarity: if two concepts in this chunk solve the same problem or represent the same idea without any structural link (no import, no call, no citation), add a `semantically_similar_to` edge marked INFERRED with a confidence_score reflecting how similar they are (0.6-0.95). Examples:
33
+ - Two functions that both validate user input but never call each other
34
+ - A class in code and a concept in a paper that describe the same algorithm
35
+ - Two error types that handle the same failure mode differently
36
+ Only add these when the similarity is genuinely non-obvious and cross-cutting. Do not add them for trivially similar things.
37
+
38
+ Hyperedges: if 3 or more nodes clearly participate together in a shared concept, flow, or pattern that is not captured by pairwise edges alone, add a hyperedge to a top-level `hyperedges` array. Examples:
39
+ - All classes that implement a common protocol or interface
40
+ - All functions in an authentication flow (even if they don't all call each other)
41
+ - All concepts from a paper section that form one coherent idea
42
+ Use sparingly — only when the group relationship adds information beyond the pairwise edges. Maximum 3 hyperedges per chunk.
43
+
44
+ If a file has YAML frontmatter (--- ... ---), copy source_url, captured_at, author,
45
+ contributor onto every node from that file.
46
+
47
+ confidence_score is REQUIRED on every edge - never omit it, never use 0.5 as a default:
48
+ - EXTRACTED edges: confidence_score = 1.0 always
49
+ - INFERRED edges: pick exactly ONE value from this set — never 0.5:
50
+ 0.95 direct structural evidence (shared data structure, named cross-file reference).
51
+ 0.85 strong inference (clear functional alignment, no direct symbol link).
52
+ 0.75 reasonable inference (shared problem domain + similar shape, requires interpretation).
53
+ 0.65 weak inference (thematically related, no shape evidence).
54
+ 0.55 speculative but plausible (surface-level co-occurrence only).
55
+ Models follow discrete rubrics better than continuous ranges; the bimodal
56
+ distribution observed in production (>50% at 0.5, >40% at 0.85+) shows the
57
+ range guidance is being collapsed to a binary. If no value above fits, mark
58
+ the edge AMBIGUOUS rather than picking 0.4 or below.
59
+ - AMBIGUOUS edges: 0.1-0.3
60
+
61
+ Node ID format: lowercase, only `[a-z0-9_]`, no dots or slashes. Format: `{stem}_{entity}` where stem is `{parent_dir}_{filename_without_ext}` (the **immediate** parent directory name + the filename stem, both lowercased with non-alphanumeric chars replaced by `_`) and entity is the symbol name similarly normalized. Only one level of parent is used — not the full path. Examples: `src/auth/session.py` + `ValidateToken` → `auth_session_validatetoken`; `lib/utils/helpers.py` + `parse_url` → `utils_helpers_parse_url`; `tests/test_foo.py` + `_helper` → `tests_test_foo_helper`. Top-level files (no parent dir, e.g. `setup.py`) use just the filename stem: `setup_my_func`. This must match the ID the AST extractor generates — using just the filename (e.g., `session_validatetoken`) or the full path (e.g., `src_auth_session_validatetoken`) will create orphan ghost-duplicate nodes. If you are re-extracting a project that had ghost duplicates under the old format, the user should run `graphify extract --force` to rebuild cleanly. CRITICAL: never append chunk numbers, sequence numbers, or any suffix to an ID (no `_c1`, `_c2`, `_chunk2`, etc.). IDs must be deterministic from the label alone — the same entity must always produce the same ID regardless of which chunk processes it.
62
+
63
+ Generate the extraction JSON matching this schema exactly:
64
+ {"nodes":[{"id":"session_validatetoken","label":"Human Readable Name","file_type":"code|document|paper|image|rationale|concept","source_file":"relative/path","source_location":null,"source_url":null,"captured_at":null,"author":null,"contributor":null}],"edges":[{"source":"node_id","target":"node_id","relation":"calls|implements|references|cites|conceptually_related_to|shares_data_with|semantically_similar_to|rationale_for","confidence":"EXTRACTED|INFERRED|AMBIGUOUS","confidence_score":1.0,"source_file":"relative/path","source_location":null,"weight":1.0}],"hyperedges":[{"id":"snake_case_id","label":"Human Readable Label","nodes":["node_id1","node_id2","node_id3"],"relation":"participate_in|implement|form","confidence":"EXTRACTED|INFERRED","confidence_score":0.75,"source_file":"relative/path"}],"input_tokens":0,"output_tokens":0}
65
+
66
+ Then write the JSON to disk using the Write tool at this exact absolute path (no relative paths — Write resolves relative paths against an undefined cwd and the file will be silently lost):
67
+ CHUNK_PATH
68
+ ```
@@ -0,0 +1,46 @@
1
+ # graphify reference: GitHub clone and cross-repo merge
2
+
3
+ Load this when the user passed one or more `https://github.com/...` URLs, or named several local subfolders to merge into one graph.
4
+
5
+ ### Step 0 - Clone GitHub repo(s) (only if a GitHub URL was given)
6
+
7
+ **Single repo:**
8
+ ```bash
9
+ LOCAL_PATH=$(graphify clone <github-url> [--branch <branch>])
10
+ # Use LOCAL_PATH as the target for all subsequent steps
11
+ ```
12
+
13
+ **Multiple repos (cross-repo graph):**
14
+ ```bash
15
+ # Clone each repo, run the full pipeline on each, then merge
16
+ graphify clone <url1> # → ~/.graphify/repos/<owner1>/<repo1>
17
+ graphify clone <url2> # → ~/.graphify/repos/<owner2>/<repo2>
18
+ # Run /graphify on each local path to produce their graph.json files
19
+ # Then merge:
20
+ graphify merge-graphs \
21
+ ~/.graphify/repos/<owner1>/<repo1>/graphify-out/graph.json \
22
+ ~/.graphify/repos/<owner2>/<repo2>/graphify-out/graph.json \
23
+ --out graphify-out/cross-repo-graph.json
24
+ ```
25
+
26
+ Graphify clones into `~/.graphify/repos/<owner>/<repo>` and reuses existing clones on repeat runs. Each node in the merged graph carries a `repo` attribute so you can filter by origin.
27
+
28
+ **Multiple local subfolders (monorepo or multi-service layout):**
29
+
30
+ The skill pipeline writes all intermediate and final outputs to `graphify-out/` in the current working directory. Running the skill on each subfolder separately will clobber the same output dir. Instead, use the CLI directly for each subfolder — it places `graphify-out/` *inside* the scanned path:
31
+
32
+ ```bash
33
+ graphify extract ./core/ # → ./core/graphify-out/graph.json
34
+ graphify extract ./service/ # → ./service/graphify-out/graph.json
35
+ graphify extract ./platform/ # → ./platform/graphify-out/graph.json
36
+ # Add --backend gemini|kimi|openai|deepseek|claude-cli depending on which API key you have set
37
+
38
+ # Then merge at the project root:
39
+ graphify merge-graphs \
40
+ ./core/graphify-out/graph.json \
41
+ ./service/graphify-out/graph.json \
42
+ ./platform/graphify-out/graph.json \
43
+ --out graphify-out/graph.json
44
+ ```
45
+
46
+ Once `graphify-out/graph.json` exists, the fast path above takes over: any codebase question runs `graphify query` directly on the merged graph — no re-extraction, no size gate.
@@ -0,0 +1,33 @@
1
+ # graphify reference: commit hook and native CLAUDE.md integration
2
+
3
+ Load this when the user asked to install the post-commit hook or wire graphify into a project's CLAUDE.md.
4
+
5
+ ## For git commit hook
6
+
7
+ Install a post-commit hook that auto-rebuilds the graph after every commit. No background process needed - triggers once per commit, works with any editor.
8
+
9
+ ```bash
10
+ graphify hook install # install
11
+ graphify hook uninstall # remove
12
+ graphify hook status # check
13
+ ```
14
+
15
+ After every `git commit`, the hook detects which code files changed (via `git diff HEAD~1`), re-runs AST extraction on those files, and rebuilds `graph.json` and `GRAPH_REPORT.md`. Doc/image changes are ignored by the hook - run `/graphify --update` manually for those.
16
+
17
+ If a post-commit hook already exists, graphify appends to it rather than replacing it.
18
+
19
+ ---
20
+
21
+ ## For native CLAUDE.md integration
22
+
23
+ Run once per project to make graphify always-on in Claude Code sessions:
24
+
25
+ ```bash
26
+ graphify claude install
27
+ ```
28
+
29
+ This writes a `## graphify` section to the local `CLAUDE.md` that instructs Claude to check the graph before answering codebase questions and rebuild it after code changes. No manual `/graphify` needed in future sessions.
30
+
31
+ ```bash
32
+ graphify claude uninstall # remove the section
33
+ ```
@@ -0,0 +1,103 @@
1
+ # graphify reference: query, path, explain
2
+
3
+ Load this when the user asks a question against an existing graph, or runs `/graphify path` or `/graphify explain`. The core's query stub points here for the full traversal flow.
4
+
5
+ Two traversal modes - choose based on the question:
6
+
7
+ | Mode | Flag | Best for |
8
+ |------|------|----------|
9
+ | BFS (default) | _(none)_ | "What is X connected to?" - broad context, nearest neighbors first |
10
+ | DFS | `--dfs` | "How does X reach Y?" - trace a specific chain or dependency path |
11
+
12
+ ### Step 0 — Constrained query expansion (REQUIRED before traversal)
13
+
14
+ graphify's `query` CLI matches nodes via case-folded substring + IDF — there is **no stemming, no synonyms, no cross-language match** inside the binary. If the user's question uses different language or different domain vocabulary than the graph's labels (user says "обработчик" / graph says "handler"; user says "authentication" / graph says "Guardian"), the literal matcher returns 0 hits and the answer collapses to noise.
15
+
16
+ Fix this **without inventing tokens** by expanding the query against the actual graph vocabulary first:
17
+
18
+ 1. Extract the token vocabulary from node labels:
19
+ ```bash
20
+ $(cat graphify-out/.graphify_python) -c "
21
+ import json, re
22
+ from pathlib import Path
23
+ data = json.loads(Path('graphify-out/graph.json').read_text())
24
+ vocab = set()
25
+ for n in data['nodes']:
26
+ for c in re.findall(r'[^\W\d_]+', n.get('label','') or '', re.UNICODE):
27
+ parts = re.findall(r'[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+', c) or [c]
28
+ for p in parts:
29
+ t = p.lower()
30
+ if 3 <= len(t) <= 30:
31
+ vocab.add(t)
32
+ Path('graphify-out/.vocab.txt').write_text('\n'.join(sorted(vocab)))
33
+ print(f'vocab: {len(vocab)} tokens')
34
+ "
35
+ ```
36
+
37
+ 2. Read `graphify-out/.vocab.txt`. Then for the user's question, select **up to 12 tokens from this exact list** that semantically match the query intent. Hard constraints:
38
+ - You MUST pick only tokens present in the vocabulary file. Do NOT invent tokens.
39
+ - If a query concept has no plausible token in the vocab, skip it — do not substitute a near-synonym from training memory.
40
+ - If **no** vocab tokens match the query at all, output an empty list and tell the user the corpus has no relevant vocabulary for this question. Do not fabricate a search.
41
+ - Translate cross-language: Russian "аутентификация" → look for `auth`, `credential`, `token`, `security` IFF present in vocab.
42
+ - Morphology: "handlers" maps to `handler` IFF present; "todos" maps to `todo` IFF present.
43
+
44
+ 3. Print the selection explicitly to the user before running the query, so the expansion is auditable:
45
+ ```
46
+ Query expanded to (from graph vocab, N tokens): [token1, token2, ...]
47
+ ```
48
+ If the list is empty, say so plainly and stop — do not proceed to traversal.
49
+
50
+ ### Step 1 — Traversal
51
+
52
+ Build the **expanded query string** by joining the selected tokens with spaces. Use this string as `QUESTION` below — NOT the original user question. (The original question is preserved only for `save-result` at the end.)
53
+
54
+ ```bash
55
+ graphify query "QUESTION"
56
+ # or: graphify query "QUESTION" --dfs --budget 3000
57
+ ```
58
+
59
+ Answer using **only** what the graph output contains. Quote `source_location` when citing a specific fact. If the graph lacks enough information, say so - do not hallucinate edges.
60
+
61
+ After writing the answer, save it back into the graph so it improves future queries. Include the expanded tokens inside the `--answer` text (e.g. `"Expanded from original query via vocab: [tokens]. Then traversed..."`) so the next `--update` extracts the expansion history as a graph node:
62
+
63
+ ```bash
64
+ $(cat graphify-out/.graphify_python) -m graphify save-result --question "ORIGINAL_QUESTION" --answer "ANSWER" --type query --nodes NODE1 NODE2
65
+ ```
66
+
67
+ Replace `ORIGINAL_QUESTION` with the user's verbatim question, `ANSWER` with your full answer text (containing the expanded-token trace), `NODE1 NODE2` with the list of node labels you cited. This closes the feedback loop: the next `--update` will extract this Q&A as a node in the graph.
68
+
69
+ ---
70
+
71
+ ## For /graphify path
72
+
73
+ Find the shortest path between two named concepts in the graph.
74
+
75
+ ```bash
76
+ graphify path "NODE_A" "NODE_B"
77
+ ```
78
+
79
+ Replace `NODE_A` and `NODE_B` with the actual concept names. Then explain the path in plain language - what each hop means, why it's significant.
80
+
81
+ After writing the explanation, save it back:
82
+
83
+ ```bash
84
+ $(cat graphify-out/.graphify_python) -m graphify save-result --question "Path from NODE_A to NODE_B" --answer "ANSWER" --type path_query --nodes NODE_A NODE_B
85
+ ```
86
+
87
+ ---
88
+
89
+ ## For /graphify explain
90
+
91
+ Give a plain-language explanation of a single node - everything connected to it.
92
+
93
+ ```bash
94
+ graphify explain "NODE_NAME"
95
+ ```
96
+
97
+ Replace `NODE_NAME` with the concept the user asked about. Then write a 3-5 sentence explanation of what this node is, what it connects to, and why those connections are significant. Use the source locations as citations.
98
+
99
+ After writing the explanation, save it back:
100
+
101
+ ```bash
102
+ $(cat graphify-out/.graphify_python) -m graphify save-result --question "Explain NODE_NAME" --answer "ANSWER" --type explain --nodes NODE_NAME
103
+ ```
@@ -0,0 +1,48 @@
1
+ # graphify reference: transcribe video and audio
2
+
3
+ Load this only when `detect` reported one or more `video` files. A corpus with no video never reads this.
4
+
5
+ ### Step 2.5 - Transcribe video / audio files (only if video files detected)
6
+
7
+ Skip this step entirely if `detect` returned zero `video` files.
8
+
9
+ Video and audio files cannot be read directly. Transcribe them to text first, then treat the transcripts as doc files in Step 3.
10
+
11
+ **Strategy:** Read the god nodes from `graphify-out/.graphify_detect.json` (or the analysis file if it exists from a previous run). You are already a language model — write a one-sentence domain hint yourself from those labels. Then pass it to Whisper as the initial prompt. No separate API call needed.
12
+
13
+ **However**, if the corpus has *only* video files and no other docs/code, use the generic fallback prompt: `"Use proper punctuation and paragraph breaks."`
14
+
15
+ **Step 1 - Write the Whisper prompt yourself.**
16
+
17
+ Read the top god node labels from detect output or analysis, then compose a short domain hint sentence, for example:
18
+
19
+ - Labels: `transformer, attention, encoder, decoder` → `"Machine learning research on transformer architectures and attention mechanisms. Use proper punctuation and paragraph breaks."`
20
+ - Labels: `kubernetes, deployment, pod, helm` → `"DevOps discussion about Kubernetes deployments and Helm charts. Use proper punctuation and paragraph breaks."`
21
+
22
+ Set it as `WHISPER_PROMPT` to use in the next command.
23
+
24
+ **Step 2 - Transcribe:**
25
+
26
+ ```bash
27
+ GRAPHIFY_WHISPER_MODEL=base # or whatever --whisper-model the user passed
28
+ $(cat graphify-out/.graphify_python) -c "
29
+ import json, os
30
+ from pathlib import Path
31
+ from graphify.transcribe import transcribe_all
32
+
33
+ detect = json.loads(Path('graphify-out/.graphify_detect.json').read_text(encoding=\"utf-8\"))
34
+ video_files = detect.get('files', {}).get('video', [])
35
+ prompt = os.environ.get('GRAPHIFY_WHISPER_PROMPT', 'Use proper punctuation and paragraph breaks.')
36
+
37
+ transcript_paths = transcribe_all(video_files, initial_prompt=prompt)
38
+ print(json.dumps(transcript_paths, ensure_ascii=False))
39
+ " > graphify-out/.graphify_transcripts.json
40
+ ```
41
+
42
+ After transcription:
43
+ - Read the transcript paths from `graphify-out/.graphify_transcripts.json`
44
+ - Add them to the docs list before dispatching semantic subagents in Step 3B
45
+ - Print how many transcripts were created: `Transcribed N video file(s) -> treating as docs`
46
+ - If transcription fails for a file, print a warning and continue with the rest
47
+
48
+ **Whisper model:** Default is `base`. If the user passed `--whisper-model <name>`, set `GRAPHIFY_WHISPER_MODEL=<name>` in the environment before running the command above.