@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,159 @@
1
+ from __future__ import annotations
2
+ import json
3
+ import hashlib
4
+ import sys
5
+ from datetime import datetime, timezone
6
+ from pathlib import Path
7
+ import networkx as nx
8
+ from networkx.readwrite import json_graph as _jg
9
+
10
+ _GLOBAL_DIR = Path.home() / ".graphify"
11
+ _GLOBAL_GRAPH = _GLOBAL_DIR / "global-graph.json"
12
+ _GLOBAL_MANIFEST = _GLOBAL_DIR / "global-manifest.json"
13
+
14
+
15
+ def _load_manifest() -> dict:
16
+ if _GLOBAL_MANIFEST.exists():
17
+ try:
18
+ return json.loads(_GLOBAL_MANIFEST.read_text(encoding="utf-8"))
19
+ except Exception:
20
+ pass
21
+ return {"version": 1, "repos": {}}
22
+
23
+
24
+ def _save_manifest(manifest: dict) -> None:
25
+ _GLOBAL_DIR.mkdir(parents=True, exist_ok=True)
26
+ _GLOBAL_MANIFEST.write_text(json.dumps(manifest, indent=2), encoding="utf-8")
27
+
28
+
29
+ def _load_global_graph() -> nx.Graph:
30
+ if _GLOBAL_GRAPH.exists():
31
+ from graphify.security import check_graph_file_size_cap
32
+ check_graph_file_size_cap(_GLOBAL_GRAPH)
33
+ data = json.loads(_GLOBAL_GRAPH.read_text(encoding="utf-8"))
34
+ if "links" not in data and "edges" in data:
35
+ data = dict(data, links=data["edges"])
36
+ try:
37
+ return _jg.node_link_graph(data, edges="links")
38
+ except TypeError:
39
+ return _jg.node_link_graph(data)
40
+ return nx.Graph()
41
+
42
+
43
+ def _save_global_graph(G: nx.Graph) -> None:
44
+ _GLOBAL_DIR.mkdir(parents=True, exist_ok=True)
45
+ try:
46
+ data = _jg.node_link_data(G, edges="links")
47
+ except TypeError:
48
+ data = _jg.node_link_data(G)
49
+ _GLOBAL_GRAPH.write_text(json.dumps(data, indent=2), encoding="utf-8")
50
+
51
+
52
+ def _file_hash(path: Path) -> str:
53
+ h = hashlib.sha256()
54
+ h.update(path.read_bytes())
55
+ return h.hexdigest()[:16]
56
+
57
+
58
+ def global_add(source_path: Path, repo_tag: str) -> dict:
59
+ """Add or update a project graph in the global graph.
60
+
61
+ Returns a summary dict with keys: repo_tag, nodes_added, nodes_removed, skipped.
62
+ Skipped=True means the source graph hasn't changed since last add.
63
+ """
64
+ from graphify.build import prefix_graph_for_global, prune_repo_from_graph
65
+
66
+ if not source_path.exists():
67
+ raise FileNotFoundError(f"graph not found: {source_path}")
68
+
69
+ manifest = _load_manifest()
70
+ src_hash = _file_hash(source_path)
71
+
72
+ existing = manifest["repos"].get(repo_tag, {})
73
+ existing_path = existing.get("source_path", "")
74
+ if existing_path and existing_path != str(source_path.resolve()):
75
+ print(
76
+ f"[graphify global] warning: repo tag '{repo_tag}' previously pointed to "
77
+ f"{existing_path!r}, now updating to {str(source_path.resolve())!r}. "
78
+ f"Use --as <tag> to give it a different name.",
79
+ file=sys.stderr,
80
+ )
81
+ if existing.get("source_hash") == src_hash:
82
+ return {"repo_tag": repo_tag, "nodes_added": 0, "nodes_removed": 0, "skipped": True}
83
+
84
+ # Load source graph
85
+ from graphify.security import check_graph_file_size_cap
86
+ check_graph_file_size_cap(source_path)
87
+ data = json.loads(source_path.read_text(encoding="utf-8"))
88
+ if "links" not in data and "edges" in data:
89
+ data = dict(data, links=data["edges"])
90
+ try:
91
+ src_G = _jg.node_link_graph(data, edges="links")
92
+ except TypeError:
93
+ src_G = _jg.node_link_graph(data)
94
+
95
+ # Prefix IDs for cross-project isolation
96
+ prefixed = prefix_graph_for_global(src_G, repo_tag)
97
+
98
+ # Load global graph and prune stale nodes for this repo
99
+ G = _load_global_graph()
100
+ removed = prune_repo_from_graph(G, repo_tag)
101
+
102
+ # Merge external-library nodes (no source_file) by label to avoid duplication
103
+ external_labels = {
104
+ d.get("label", ""): n
105
+ for n, d in G.nodes(data=True)
106
+ if not d.get("source_file") and d.get("label")
107
+ }
108
+ nodes_to_skip = set()
109
+ for node, data in prefixed.nodes(data=True):
110
+ if not data.get("source_file") and data.get("label") in external_labels:
111
+ nodes_to_skip.add(node)
112
+
113
+ # Compose: add prefixed nodes (except deduplicated externals) into global graph
114
+ for node, data in prefixed.nodes(data=True):
115
+ if node not in nodes_to_skip:
116
+ G.add_node(node, **data)
117
+ for u, v, data in prefixed.edges(data=True):
118
+ if u not in nodes_to_skip and v not in nodes_to_skip:
119
+ G.add_edge(u, v, **data)
120
+
121
+ added = prefixed.number_of_nodes() - len(nodes_to_skip)
122
+ _save_global_graph(G)
123
+
124
+ manifest["repos"][repo_tag] = {
125
+ "added_at": datetime.now(timezone.utc).isoformat(),
126
+ "source_path": str(source_path.resolve()),
127
+ "node_count": added,
128
+ "edge_count": prefixed.number_of_edges(),
129
+ "source_hash": src_hash,
130
+ }
131
+ _save_manifest(manifest)
132
+
133
+ return {"repo_tag": repo_tag, "nodes_added": added, "nodes_removed": removed, "skipped": False}
134
+
135
+
136
+ def global_remove(repo_tag: str) -> int:
137
+ """Remove all nodes for repo_tag from the global graph. Returns count removed."""
138
+ from graphify.build import prune_repo_from_graph
139
+
140
+ manifest = _load_manifest()
141
+ if repo_tag not in manifest["repos"]:
142
+ raise KeyError(f"repo '{repo_tag}' not in global graph")
143
+
144
+ G = _load_global_graph()
145
+ removed = prune_repo_from_graph(G, repo_tag)
146
+ _save_global_graph(G)
147
+
148
+ del manifest["repos"][repo_tag]
149
+ _save_manifest(manifest)
150
+ return removed
151
+
152
+
153
+ def global_list() -> dict:
154
+ """Return the manifest repos dict."""
155
+ return _load_manifest().get("repos", {})
156
+
157
+
158
+ def global_path() -> Path:
159
+ return _GLOBAL_GRAPH
@@ -0,0 +1,223 @@
1
+ """Optional Google Workspace shortcut export support.
2
+
3
+ Google Drive for desktop stores native Docs, Sheets, and Slides as small JSON
4
+ shortcut files (.gdoc, .gsheet, .gslides). Those files are pointers, not the
5
+ document content. This module exports them to Markdown sidecars via the
6
+ googleworkspace CLI (`gws`) so Graphify can extract their actual contents.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import json
12
+ import os
13
+ import re
14
+ import shutil
15
+ import subprocess
16
+ import tempfile
17
+ import urllib.parse
18
+ from pathlib import Path
19
+ from typing import Callable, Any
20
+
21
+
22
+ GOOGLE_WORKSPACE_EXTENSIONS = {".gdoc", ".gsheet", ".gslides"}
23
+
24
+
25
+ def google_workspace_enabled(value: str | None = None) -> bool:
26
+ """Return True when Google Workspace shortcut export is enabled."""
27
+ raw = value if value is not None else os.environ.get("GRAPHIFY_GOOGLE_WORKSPACE", "")
28
+ return raw.strip().lower() in {"1", "true", "yes", "on"}
29
+
30
+
31
+ def _safe_yaml_str(value: str) -> str:
32
+ return value.replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ").replace("\r", " ")
33
+
34
+
35
+ def _extract_file_id_from_url(url: str) -> str | None:
36
+ """Extract a Drive file ID from common Google Docs/Drive URL shapes."""
37
+ if not url:
38
+ return None
39
+ parsed = urllib.parse.urlparse(url)
40
+ query = urllib.parse.parse_qs(parsed.query)
41
+ if query.get("id"):
42
+ return query["id"][0]
43
+ match = re.search(r"/(?:document|spreadsheets|presentation|file)/d/([^/?#]+)", parsed.path)
44
+ if match:
45
+ return match.group(1)
46
+ return None
47
+
48
+
49
+ def _extract_resource_key(url: str, data: dict[str, Any]) -> str | None:
50
+ for key in ("resource_key", "resourceKey"):
51
+ value = data.get(key)
52
+ if value:
53
+ return str(value)
54
+ if not url:
55
+ return None
56
+ parsed = urllib.parse.urlparse(url)
57
+ query = urllib.parse.parse_qs(parsed.query)
58
+ if query.get("resourcekey"):
59
+ return query["resourcekey"][0]
60
+ return None
61
+
62
+
63
+ def read_google_shortcut(path: Path) -> dict[str, str | None]:
64
+ """Read a .gdoc/.gsheet/.gslides shortcut and return export metadata."""
65
+ try:
66
+ data = json.loads(path.read_text(encoding="utf-8"))
67
+ except Exception as exc:
68
+ raise RuntimeError(f"could not read Google Workspace shortcut {path}: {exc}") from exc
69
+
70
+ url = str(data.get("url") or "")
71
+ file_id = (
72
+ data.get("doc_id")
73
+ or data.get("file_id")
74
+ or data.get("fileId")
75
+ or data.get("id")
76
+ or _extract_file_id_from_url(url)
77
+ )
78
+ if not file_id:
79
+ resource_id = str(data.get("resource_id") or "")
80
+ if ":" in resource_id:
81
+ file_id = resource_id.split(":", 1)[1]
82
+
83
+ if not file_id:
84
+ raise RuntimeError(f"Google Workspace shortcut {path} does not include a Drive file ID")
85
+
86
+ return {
87
+ "file_id": str(file_id),
88
+ "url": url or None,
89
+ "resource_key": _extract_resource_key(url, data),
90
+ "account": str(data.get("email")) if data.get("email") else None,
91
+ }
92
+
93
+
94
+ def _run_gws_export(file_id: str, mime_type: str, output: Path, resource_key: str | None = None) -> None:
95
+ exe = shutil.which("gws")
96
+ if not exe:
97
+ raise RuntimeError(
98
+ "gws is required for Google Workspace export. Install it from "
99
+ "https://github.com/googleworkspace/cli and run `gws auth login -s drive`."
100
+ )
101
+
102
+ params: dict[str, str] = {"fileId": file_id, "mimeType": mime_type}
103
+ # Drive resource keys are sent via X-Goog-Drive-Resource-Keys. The current
104
+ # gws export command has no custom-header flag, so do not pass resourceKey
105
+ # as an unsupported query parameter.
106
+ _ = resource_key
107
+ output = output.resolve()
108
+ output.parent.mkdir(parents=True, exist_ok=True)
109
+ timeout = int(os.environ.get("GRAPHIFY_GOOGLE_WORKSPACE_TIMEOUT", "120"))
110
+ result = subprocess.run(
111
+ [exe, "drive", "files", "export", "--params", json.dumps(params), "-o", output.name],
112
+ capture_output=True,
113
+ cwd=output.parent,
114
+ text=True,
115
+ timeout=timeout,
116
+ )
117
+ if result.returncode != 0:
118
+ stderr = (result.stderr or result.stdout or "").strip()
119
+ if len(stderr) > 1200:
120
+ stderr = stderr[:1200] + "..."
121
+ raise RuntimeError(f"gws export failed for {file_id}: {stderr}")
122
+
123
+
124
+ def _sidecar_path(path: Path, out_dir: Path) -> Path:
125
+ name_hash = hashlib.sha256(str(path.resolve()).encode()).hexdigest()[:8]
126
+ return out_dir / f"{path.stem}_{name_hash}.md"
127
+
128
+
129
+ def _with_frontmatter(path: Path, shortcut: dict[str, str | None], body: str, exported_mime_type: str) -> str:
130
+ source_url = shortcut.get("url") or ""
131
+ account = shortcut.get("account") or ""
132
+ account_line = ""
133
+ if account:
134
+ account_hash = hashlib.sha256(account.encode()).hexdigest()[:12]
135
+ account_line = f'google_account_hash: "{account_hash}"\n'
136
+ return (
137
+ "---\n"
138
+ f'source_file: "{_safe_yaml_str(str(path))}"\n'
139
+ 'source_type: "google_workspace"\n'
140
+ f'google_file_id: "{_safe_yaml_str(shortcut["file_id"] or "")}"\n'
141
+ f'google_export_mime_type: "{_safe_yaml_str(exported_mime_type)}"\n'
142
+ f'source_url: "{_safe_yaml_str(source_url)}"\n'
143
+ f"{account_line}"
144
+ "---\n\n"
145
+ f"<!-- converted from Google Workspace shortcut: {path.name} -->\n\n"
146
+ f"{body.strip()}\n"
147
+ )
148
+
149
+
150
+ def convert_google_workspace_file(
151
+ path: Path,
152
+ out_dir: Path,
153
+ *,
154
+ xlsx_to_markdown: Callable[[Path], str] | None = None,
155
+ ) -> Path | None:
156
+ """Export a Google Workspace shortcut to a Markdown sidecar.
157
+
158
+ Returns the converted Markdown path, or None when conversion is unsupported
159
+ or produced no readable content.
160
+ """
161
+ ext = path.suffix.lower()
162
+ if ext not in GOOGLE_WORKSPACE_EXTENSIONS:
163
+ return None
164
+
165
+ shortcut = read_google_shortcut(path)
166
+ out_dir.mkdir(parents=True, exist_ok=True)
167
+ out_path = _sidecar_path(path, out_dir)
168
+
169
+ if ext == ".gdoc":
170
+ with tempfile.NamedTemporaryFile("w+b", suffix=".md", delete=False, dir=out_dir) as tmp:
171
+ tmp_path = Path(tmp.name)
172
+ try:
173
+ _run_gws_export(shortcut["file_id"] or "", "text/markdown", tmp_path, shortcut.get("resource_key"))
174
+ body = tmp_path.read_text(encoding="utf-8", errors="replace")
175
+ finally:
176
+ tmp_path.unlink(missing_ok=True)
177
+ if not body.strip():
178
+ return None
179
+ out_path.write_text(_with_frontmatter(path, shortcut, body, "text/markdown"), encoding="utf-8")
180
+ return out_path
181
+
182
+ if ext == ".gslides":
183
+ with tempfile.NamedTemporaryFile("w+b", suffix=".txt", delete=False, dir=out_dir) as tmp:
184
+ tmp_path = Path(tmp.name)
185
+ try:
186
+ _run_gws_export(shortcut["file_id"] or "", "text/plain", tmp_path, shortcut.get("resource_key"))
187
+ body = tmp_path.read_text(encoding="utf-8", errors="replace")
188
+ finally:
189
+ tmp_path.unlink(missing_ok=True)
190
+ if not body.strip():
191
+ return None
192
+ out_path.write_text(_with_frontmatter(path, shortcut, body, "text/plain"), encoding="utf-8")
193
+ return out_path
194
+
195
+ if ext == ".gsheet":
196
+ if xlsx_to_markdown is None:
197
+ raise RuntimeError("Google Sheets export requires the office extra: pip install graphifyy[office,google]")
198
+ with tempfile.NamedTemporaryFile("w+b", suffix=".xlsx", delete=False, dir=out_dir) as tmp:
199
+ tmp_path = Path(tmp.name)
200
+ try:
201
+ _run_gws_export(
202
+ shortcut["file_id"] or "",
203
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
204
+ tmp_path,
205
+ shortcut.get("resource_key"),
206
+ )
207
+ body = xlsx_to_markdown(tmp_path)
208
+ finally:
209
+ tmp_path.unlink(missing_ok=True)
210
+ if not body.strip():
211
+ return None
212
+ out_path.write_text(
213
+ _with_frontmatter(
214
+ path,
215
+ shortcut,
216
+ body,
217
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
218
+ ),
219
+ encoding="utf-8",
220
+ )
221
+ return out_path
222
+
223
+ return None