studiograph 1.1.3 → 1.2.0-beta.10

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 (356) hide show
  1. package/README.md +2 -8
  2. package/dist/agent/orchestrator.d.ts +53 -0
  3. package/dist/agent/orchestrator.js +197 -12
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/agent/prompts/system.md +43 -11
  6. package/dist/agent/skill-loader.d.ts +48 -0
  7. package/dist/agent/skill-loader.js +166 -0
  8. package/dist/agent/skill-loader.js.map +1 -0
  9. package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
  10. package/dist/agent/skills/entity-schema.md +502 -0
  11. package/dist/agent/skills/obsidian-source-setup.md +246 -0
  12. package/dist/agent/skills/sync-configuration.md +144 -0
  13. package/dist/agent/skills/sync-setup.md +84 -0
  14. package/dist/agent/tools/connector-tools.d.ts +37 -0
  15. package/dist/agent/tools/connector-tools.js +132 -0
  16. package/dist/agent/tools/connector-tools.js.map +1 -0
  17. package/dist/agent/tools/fs-tools.d.ts +39 -0
  18. package/dist/agent/tools/fs-tools.js +106 -0
  19. package/dist/agent/tools/fs-tools.js.map +1 -0
  20. package/dist/agent/tools/graph-tools.d.ts +33 -1
  21. package/dist/agent/tools/graph-tools.js +192 -44
  22. package/dist/agent/tools/graph-tools.js.map +1 -1
  23. package/dist/agent/tools/load-skill.d.ts +1 -1
  24. package/dist/agent/tools/load-skill.js +1 -1
  25. package/dist/agent/tools/load-skill.js.map +1 -1
  26. package/dist/agent/tools/ops-tools.d.ts +24 -0
  27. package/dist/agent/tools/ops-tools.js +542 -0
  28. package/dist/agent/tools/ops-tools.js.map +1 -0
  29. package/dist/agent/tools/sync-tools.d.ts +33 -0
  30. package/dist/agent/tools/sync-tools.js +947 -0
  31. package/dist/agent/tools/sync-tools.js.map +1 -0
  32. package/dist/auth/github.d.ts +11 -8
  33. package/dist/auth/github.js +56 -75
  34. package/dist/auth/github.js.map +1 -1
  35. package/dist/cli/colors.d.ts +54 -0
  36. package/dist/cli/colors.js +133 -0
  37. package/dist/cli/colors.js.map +1 -0
  38. package/dist/cli/commands/app.js +121 -18
  39. package/dist/cli/commands/app.js.map +1 -1
  40. package/dist/cli/commands/auth.d.ts +1 -1
  41. package/dist/cli/commands/auth.js +26 -10
  42. package/dist/cli/commands/auth.js.map +1 -1
  43. package/dist/cli/commands/clone.d.ts +9 -0
  44. package/dist/cli/commands/clone.js +167 -0
  45. package/dist/cli/commands/clone.js.map +1 -0
  46. package/dist/cli/commands/commit.d.ts +8 -0
  47. package/dist/cli/commands/commit.js +44 -0
  48. package/dist/cli/commands/commit.js.map +1 -0
  49. package/dist/cli/commands/connector.js +10 -2
  50. package/dist/cli/commands/connector.js.map +1 -1
  51. package/dist/cli/commands/deploy.d.ts +4 -6
  52. package/dist/cli/commands/deploy.js +292 -115
  53. package/dist/cli/commands/deploy.js.map +1 -1
  54. package/dist/cli/commands/enrich.d.ts +11 -0
  55. package/dist/cli/commands/enrich.js +135 -0
  56. package/dist/cli/commands/enrich.js.map +1 -0
  57. package/dist/cli/commands/graphrag.d.ts +12 -0
  58. package/dist/cli/commands/graphrag.js +122 -0
  59. package/dist/cli/commands/graphrag.js.map +1 -0
  60. package/dist/cli/commands/init.js +29 -196
  61. package/dist/cli/commands/init.js.map +1 -1
  62. package/dist/cli/commands/join.js +23 -3
  63. package/dist/cli/commands/join.js.map +1 -1
  64. package/dist/cli/commands/orphans.d.ts +8 -0
  65. package/dist/cli/commands/orphans.js +125 -0
  66. package/dist/cli/commands/orphans.js.map +1 -0
  67. package/dist/cli/commands/provision.js +11 -7
  68. package/dist/cli/commands/provision.js.map +1 -1
  69. package/dist/cli/commands/r2.js +8 -2
  70. package/dist/cli/commands/r2.js.map +1 -1
  71. package/dist/cli/commands/redeploy.d.ts +9 -0
  72. package/dist/cli/commands/redeploy.js +203 -0
  73. package/dist/cli/commands/redeploy.js.map +1 -0
  74. package/dist/cli/commands/reset.d.ts +12 -0
  75. package/dist/cli/commands/reset.js +137 -0
  76. package/dist/cli/commands/reset.js.map +1 -0
  77. package/dist/cli/commands/resolve.d.ts +8 -0
  78. package/dist/cli/commands/resolve.js +85 -0
  79. package/dist/cli/commands/resolve.js.map +1 -0
  80. package/dist/cli/commands/review.d.ts +19 -0
  81. package/dist/cli/commands/review.js +128 -0
  82. package/dist/cli/commands/review.js.map +1 -0
  83. package/dist/cli/commands/serve.js +55 -8
  84. package/dist/cli/commands/serve.js.map +1 -1
  85. package/dist/cli/commands/source.d.ts +16 -0
  86. package/dist/cli/commands/source.js +159 -0
  87. package/dist/cli/commands/source.js.map +1 -0
  88. package/dist/cli/commands/start.js +307 -55
  89. package/dist/cli/commands/start.js.map +1 -1
  90. package/dist/cli/commands/sync-entities.d.ts +13 -0
  91. package/dist/cli/commands/sync-entities.js +242 -0
  92. package/dist/cli/commands/sync-entities.js.map +1 -0
  93. package/dist/cli/commands/sync.js +81 -5
  94. package/dist/cli/commands/sync.js.map +1 -1
  95. package/dist/cli/index.js +45 -9
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/cli/scaffolding.d.ts +2 -1
  98. package/dist/cli/scaffolding.js +38 -23
  99. package/dist/cli/scaffolding.js.map +1 -1
  100. package/dist/cli/setup-wizard.d.ts +30 -0
  101. package/dist/cli/setup-wizard.js +244 -0
  102. package/dist/cli/setup-wizard.js.map +1 -0
  103. package/dist/cli/sync-review-interactive.d.ts +31 -0
  104. package/dist/cli/sync-review-interactive.js +393 -0
  105. package/dist/cli/sync-review-interactive.js.map +1 -0
  106. package/dist/cli/theme.d.ts +31 -0
  107. package/dist/cli/theme.js +116 -0
  108. package/dist/cli/theme.js.map +1 -0
  109. package/dist/core/graph.d.ts +40 -12
  110. package/dist/core/graph.js +344 -104
  111. package/dist/core/graph.js.map +1 -1
  112. package/dist/core/migration-runner.d.ts +4 -1
  113. package/dist/core/migration-runner.js +14 -3
  114. package/dist/core/migration-runner.js.map +1 -1
  115. package/dist/core/types.d.ts +2 -4
  116. package/dist/core/types.js +1 -2
  117. package/dist/core/types.js.map +1 -1
  118. package/dist/core/user-config.d.ts +12 -0
  119. package/dist/core/user-config.js.map +1 -1
  120. package/dist/core/workspace-manager.d.ts +6 -1
  121. package/dist/core/workspace-manager.js +29 -4
  122. package/dist/core/workspace-manager.js.map +1 -1
  123. package/dist/core/workspace.d.ts +13 -5
  124. package/dist/core/workspace.js +115 -33
  125. package/dist/core/workspace.js.map +1 -1
  126. package/dist/lib/lib/utils.d.ts +2 -0
  127. package/dist/lib/lib/utils.js +6 -0
  128. package/dist/lib/lib/utils.js.map +1 -0
  129. package/dist/mcp/connector-manager.d.ts +7 -3
  130. package/dist/mcp/connector-manager.js +61 -16
  131. package/dist/mcp/connector-manager.js.map +1 -1
  132. package/dist/mcp/connectors/asana.d.ts +2 -0
  133. package/dist/mcp/connectors/asana.js +20 -0
  134. package/dist/mcp/connectors/asana.js.map +1 -0
  135. package/dist/mcp/connectors/definitions.d.ts +3 -1
  136. package/dist/mcp/connectors/definitions.js +19 -127
  137. package/dist/mcp/connectors/definitions.js.map +1 -1
  138. package/dist/mcp/connectors/figma.d.ts +5 -0
  139. package/dist/mcp/connectors/figma.js +21 -0
  140. package/dist/mcp/connectors/figma.js.map +1 -0
  141. package/dist/mcp/connectors/gdrive.d.ts +2 -0
  142. package/dist/mcp/connectors/gdrive.js +20 -0
  143. package/dist/mcp/connectors/gdrive.js.map +1 -0
  144. package/dist/mcp/connectors/granola.d.ts +2 -0
  145. package/dist/mcp/connectors/granola.js +12 -0
  146. package/dist/mcp/connectors/granola.js.map +1 -0
  147. package/dist/mcp/connectors/linear.d.ts +2 -0
  148. package/dist/mcp/connectors/linear.js +19 -0
  149. package/dist/mcp/connectors/linear.js.map +1 -0
  150. package/dist/mcp/connectors/obsidian.d.ts +2 -0
  151. package/dist/mcp/connectors/obsidian.js +19 -0
  152. package/dist/mcp/connectors/obsidian.js.map +1 -0
  153. package/dist/mcp/connectors/pipedrive.d.ts +2 -0
  154. package/dist/mcp/connectors/pipedrive.js +20 -0
  155. package/dist/mcp/connectors/pipedrive.js.map +1 -0
  156. package/dist/mcp/connectors/slack.d.ts +2 -0
  157. package/dist/mcp/connectors/slack.js +21 -0
  158. package/dist/mcp/connectors/slack.js.map +1 -0
  159. package/dist/mcp/oauth-provider.d.ts +41 -0
  160. package/dist/mcp/oauth-provider.js +160 -0
  161. package/dist/mcp/oauth-provider.js.map +1 -0
  162. package/dist/server/index.js +97 -11
  163. package/dist/server/index.js.map +1 -1
  164. package/dist/server/plugin-loader.d.ts +8 -0
  165. package/dist/server/plugin-loader.js +54 -2
  166. package/dist/server/plugin-loader.js.map +1 -1
  167. package/dist/server/routes/chat.d.ts +3 -2
  168. package/dist/server/routes/chat.js +67 -16
  169. package/dist/server/routes/chat.js.map +1 -1
  170. package/dist/server/routes/git-api.d.ts +9 -0
  171. package/dist/server/routes/git-api.js +82 -0
  172. package/dist/server/routes/git-api.js.map +1 -0
  173. package/dist/server/routes/graph-api.d.ts +2 -2
  174. package/dist/server/routes/graph-api.js +164 -3
  175. package/dist/server/routes/graph-api.js.map +1 -1
  176. package/dist/server/routes/workspace-api.d.ts +9 -0
  177. package/dist/server/routes/workspace-api.js +170 -0
  178. package/dist/server/routes/workspace-api.js.map +1 -0
  179. package/dist/services/assets/base.d.ts +2 -2
  180. package/dist/services/assets/base.js +4 -4
  181. package/dist/services/assets/base.js.map +1 -1
  182. package/dist/services/assets/index.d.ts +6 -6
  183. package/dist/services/assets/index.js +12 -12
  184. package/dist/services/assets/index.js.map +1 -1
  185. package/dist/services/git.d.ts +31 -0
  186. package/dist/services/git.js +92 -3
  187. package/dist/services/git.js.map +1 -1
  188. package/dist/services/github-provisioner.d.ts +8 -3
  189. package/dist/services/github-provisioner.js +35 -8
  190. package/dist/services/github-provisioner.js.map +1 -1
  191. package/dist/services/lint-service.js +8 -1
  192. package/dist/services/lint-service.js.map +1 -1
  193. package/dist/services/markdown.js +3 -3
  194. package/dist/services/markdown.js.map +1 -1
  195. package/dist/services/memory-service.d.ts +1 -1
  196. package/dist/services/memory-service.js +2 -3
  197. package/dist/services/memory-service.js.map +1 -1
  198. package/dist/services/orphan-service.d.ts +31 -0
  199. package/dist/services/orphan-service.js +100 -0
  200. package/dist/services/orphan-service.js.map +1 -0
  201. package/dist/services/sync/commit.d.ts +60 -0
  202. package/dist/services/sync/commit.js +370 -0
  203. package/dist/services/sync/commit.js.map +1 -0
  204. package/dist/services/sync/context-index.d.ts +69 -0
  205. package/dist/services/sync/context-index.js +280 -0
  206. package/dist/services/sync/context-index.js.map +1 -0
  207. package/dist/services/sync/derive.d.ts +34 -0
  208. package/dist/services/sync/derive.js +164 -0
  209. package/dist/services/sync/derive.js.map +1 -0
  210. package/dist/services/sync/enrichment-state.d.ts +31 -0
  211. package/dist/services/sync/enrichment-state.js +63 -0
  212. package/dist/services/sync/enrichment-state.js.map +1 -0
  213. package/dist/services/sync/enrichment.d.ts +25 -0
  214. package/dist/services/sync/enrichment.js +121 -0
  215. package/dist/services/sync/enrichment.js.map +1 -0
  216. package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
  217. package/dist/services/sync/frontmatter-extractor.js +273 -0
  218. package/dist/services/sync/frontmatter-extractor.js.map +1 -0
  219. package/dist/services/sync/graph-match-state.d.ts +33 -0
  220. package/dist/services/sync/graph-match-state.js +61 -0
  221. package/dist/services/sync/graph-match-state.js.map +1 -0
  222. package/dist/services/sync/graph-match.d.ts +53 -0
  223. package/dist/services/sync/graph-match.js +316 -0
  224. package/dist/services/sync/graph-match.js.map +1 -0
  225. package/dist/services/sync/graphrag-client.d.ts +43 -0
  226. package/dist/services/sync/graphrag-client.js +94 -0
  227. package/dist/services/sync/graphrag-client.js.map +1 -0
  228. package/dist/services/sync/graphrag-config.d.ts +16 -0
  229. package/dist/services/sync/graphrag-config.js +39 -0
  230. package/dist/services/sync/graphrag-config.js.map +1 -0
  231. package/dist/services/sync/graphrag-context.d.ts +14 -0
  232. package/dist/services/sync/graphrag-context.js +109 -0
  233. package/dist/services/sync/graphrag-context.js.map +1 -0
  234. package/dist/services/sync/graphrag-indexer.d.ts +30 -0
  235. package/dist/services/sync/graphrag-indexer.js +358 -0
  236. package/dist/services/sync/graphrag-indexer.js.map +1 -0
  237. package/dist/services/sync/llm.d.ts +32 -0
  238. package/dist/services/sync/llm.js +115 -0
  239. package/dist/services/sync/llm.js.map +1 -0
  240. package/dist/services/sync/mcp-client.d.ts +59 -0
  241. package/dist/services/sync/mcp-client.js +285 -0
  242. package/dist/services/sync/mcp-client.js.map +1 -0
  243. package/dist/services/sync/model-factory.d.ts +10 -0
  244. package/dist/services/sync/model-factory.js +24 -0
  245. package/dist/services/sync/model-factory.js.map +1 -0
  246. package/dist/services/sync/name-quality.d.ts +31 -0
  247. package/dist/services/sync/name-quality.js +60 -0
  248. package/dist/services/sync/name-quality.js.map +1 -0
  249. package/dist/services/sync/output-schemas.d.ts +92 -0
  250. package/dist/services/sync/output-schemas.js +43 -0
  251. package/dist/services/sync/output-schemas.js.map +1 -0
  252. package/dist/services/sync/prompts.d.ts +19 -0
  253. package/dist/services/sync/prompts.js +128 -0
  254. package/dist/services/sync/prompts.js.map +1 -0
  255. package/dist/services/sync/reconciler.d.ts +48 -0
  256. package/dist/services/sync/reconciler.js +295 -0
  257. package/dist/services/sync/reconciler.js.map +1 -0
  258. package/dist/services/sync/source-config.d.ts +45 -0
  259. package/dist/services/sync/source-config.js +208 -0
  260. package/dist/services/sync/source-config.js.map +1 -0
  261. package/dist/services/sync/source-definitions/asana.d.ts +15 -0
  262. package/dist/services/sync/source-definitions/asana.js +48 -0
  263. package/dist/services/sync/source-definitions/asana.js.map +1 -0
  264. package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
  265. package/dist/services/sync/source-definitions/definitions.js +26 -0
  266. package/dist/services/sync/source-definitions/definitions.js.map +1 -0
  267. package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
  268. package/dist/services/sync/source-definitions/gdrive.js +68 -0
  269. package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
  270. package/dist/services/sync/source-definitions/granola.d.ts +2 -0
  271. package/dist/services/sync/source-definitions/granola.js +28 -0
  272. package/dist/services/sync/source-definitions/granola.js.map +1 -0
  273. package/dist/services/sync/source-definitions/linear.d.ts +2 -0
  274. package/dist/services/sync/source-definitions/linear.js +60 -0
  275. package/dist/services/sync/source-definitions/linear.js.map +1 -0
  276. package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
  277. package/dist/services/sync/source-definitions/obsidian.js +55 -0
  278. package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
  279. package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
  280. package/dist/services/sync/source-definitions/pipedrive.js +52 -0
  281. package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
  282. package/dist/services/sync/staging.d.ts +53 -0
  283. package/dist/services/sync/staging.js +131 -0
  284. package/dist/services/sync/staging.js.map +1 -0
  285. package/dist/services/sync/structured-extractor.d.ts +49 -0
  286. package/dist/services/sync/structured-extractor.js +344 -0
  287. package/dist/services/sync/structured-extractor.js.map +1 -0
  288. package/dist/services/sync/sync-runner.d.ts +32 -0
  289. package/dist/services/sync/sync-runner.js +195 -0
  290. package/dist/services/sync/sync-runner.js.map +1 -0
  291. package/dist/services/sync/sync-state.d.ts +43 -0
  292. package/dist/services/sync/sync-state.js +154 -0
  293. package/dist/services/sync/sync-state.js.map +1 -0
  294. package/dist/services/sync/types.d.ts +203 -0
  295. package/dist/services/sync/types.js +8 -0
  296. package/dist/services/sync/types.js.map +1 -0
  297. package/dist/services/sync/unstructured-extractor.d.ts +29 -0
  298. package/dist/services/sync/unstructured-extractor.js +197 -0
  299. package/dist/services/sync/unstructured-extractor.js.map +1 -0
  300. package/dist/services/vector-service.d.ts +11 -0
  301. package/dist/services/vector-service.js +42 -0
  302. package/dist/services/vector-service.js.map +1 -1
  303. package/dist/utils/git.d.ts +31 -4
  304. package/dist/utils/git.js +65 -7
  305. package/dist/utils/git.js.map +1 -1
  306. package/dist/utils/merge-resolver.d.ts +60 -0
  307. package/dist/utils/merge-resolver.js +304 -0
  308. package/dist/utils/merge-resolver.js.map +1 -0
  309. package/dist/utils/preflight.d.ts +2 -1
  310. package/dist/utils/preflight.js +8 -1
  311. package/dist/utils/preflight.js.map +1 -1
  312. package/dist/utils/workspace-config.d.ts +8 -0
  313. package/dist/utils/workspace-config.js +22 -0
  314. package/dist/utils/workspace-config.js.map +1 -0
  315. package/dist/web/_app/env.js +1 -0
  316. package/dist/web/_app/immutable/assets/0.BwJV4fvl.css +1 -0
  317. package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
  318. package/dist/web/_app/immutable/assets/3.CnAQdPKU.css +1 -0
  319. package/dist/web/_app/immutable/assets/4.BG92MufE.css +1 -0
  320. package/dist/web/_app/immutable/assets/5.CfrQIPYs.css +1 -0
  321. package/dist/web/_app/immutable/assets/ChatPanel.BNzaCFTL.css +1 -0
  322. package/dist/web/_app/immutable/assets/editor.D6Rjo7RE.css +1 -0
  323. package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
  324. package/dist/web/_app/immutable/chunks/B4G4uWkV.js +1 -0
  325. package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
  326. package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
  327. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
  328. package/dist/web/_app/immutable/chunks/CksE5s8n.js +1 -0
  329. package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
  330. package/dist/web/_app/immutable/chunks/D0JBkEPE.js +86 -0
  331. package/dist/web/_app/immutable/chunks/D2K5GzLj.js +1 -0
  332. package/dist/web/_app/immutable/chunks/DEkoussQ.js +2 -0
  333. package/dist/web/_app/immutable/chunks/DW-KmHRi.js +1 -0
  334. package/dist/web/_app/immutable/chunks/DcCr4z9k.js +1 -0
  335. package/dist/web/_app/immutable/chunks/Dg2wWwJu.js +2 -0
  336. package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
  337. package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
  338. package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
  339. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  340. package/dist/web/_app/immutable/chunks/SBEriEQR.js +1 -0
  341. package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
  342. package/dist/web/_app/immutable/chunks/YTERt3Ul.js +6 -0
  343. package/dist/web/_app/immutable/chunks/m_R7HatS.js +1 -0
  344. package/dist/web/_app/immutable/chunks/vlmEnjfO.js +1 -0
  345. package/dist/web/_app/immutable/entry/app.B9pwpU_x.js +2 -0
  346. package/dist/web/_app/immutable/entry/start.CDuNCEco.js +1 -0
  347. package/dist/web/_app/immutable/nodes/0.YEQhw1us.js +1 -0
  348. package/dist/web/_app/immutable/nodes/1.CvmHhpRy.js +1 -0
  349. package/dist/web/_app/immutable/nodes/2.c5k1r7dq.js +1 -0
  350. package/dist/web/_app/immutable/nodes/3.B24tcdLK.js +1 -0
  351. package/dist/web/_app/immutable/nodes/4.kX2m5Pp9.js +16 -0
  352. package/dist/web/_app/immutable/nodes/5.DELt6wTD.js +2 -0
  353. package/dist/web/_app/version.json +1 -0
  354. package/dist/web/index.html +41 -0
  355. package/package.json +21 -7
  356. /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Skill Loader — prompt skills for the Studiograph agent.
3
+ *
4
+ * Skills are markdown files with YAML frontmatter that inject domain-specific
5
+ * knowledge into the agent's system prompt. Two formats supported:
6
+ *
7
+ * Directory skill:
8
+ * skills/create-deck/
9
+ * skill.md ← required entrypoint
10
+ * slide-types.md ← optional sub-files
11
+ *
12
+ * Single-file skill:
13
+ * skills/quick-tip.md
14
+ *
15
+ * Frontmatter fields:
16
+ * name: kebab-case identifier (defaults to directory/filename)
17
+ * description: shown in skill index so agent knows when to load it
18
+ * loading: "on-demand" (default) | "eager" (inlined in system prompt)
19
+ */
20
+ import { existsSync, readdirSync, readFileSync } from 'fs';
21
+ import { join, extname, basename } from 'path';
22
+ /**
23
+ * Minimal YAML frontmatter parser — handles the subset used by skills.
24
+ */
25
+ function parseFrontmatter(content) {
26
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
27
+ if (!match) {
28
+ return { meta: {}, body: content };
29
+ }
30
+ const meta = {};
31
+ for (const line of match[1].split('\n')) {
32
+ const colon = line.indexOf(':');
33
+ if (colon === -1)
34
+ continue;
35
+ const key = line.slice(0, colon).trim();
36
+ const value = line.slice(colon + 1).trim();
37
+ if (key)
38
+ meta[key] = value;
39
+ }
40
+ return { meta, body: match[2] };
41
+ }
42
+ /**
43
+ * Scan one or more skill directories and return a de-duplicated skill index.
44
+ * Directories are processed in order — first occurrence of a name wins,
45
+ * so workspace-level skills override app-bundled skills.
46
+ */
47
+ export function loadSkillIndex(skillsDirs) {
48
+ const skills = [];
49
+ const seen = new Set();
50
+ for (const dir of skillsDirs) {
51
+ if (!existsSync(dir))
52
+ continue;
53
+ let entries;
54
+ try {
55
+ entries = readdirSync(dir);
56
+ }
57
+ catch {
58
+ continue;
59
+ }
60
+ for (const entry of entries) {
61
+ if (entry.startsWith('.'))
62
+ continue;
63
+ const entryPath = join(dir, entry);
64
+ // Directory skill: subdirectory containing skill.md
65
+ const skillMd = join(entryPath, 'skill.md');
66
+ if (existsSync(skillMd)) {
67
+ try {
68
+ const content = readFileSync(skillMd, 'utf-8');
69
+ const { meta } = parseFrontmatter(content);
70
+ const name = meta.name || entry;
71
+ if (!seen.has(name)) {
72
+ seen.add(name);
73
+ skills.push({
74
+ name,
75
+ description: meta.description || '',
76
+ loading: meta.loading === 'eager' ? 'eager' : 'on-demand',
77
+ dir: entryPath,
78
+ entrypoint: skillMd,
79
+ isDirectory: true,
80
+ });
81
+ }
82
+ }
83
+ catch {
84
+ // skip malformed skill
85
+ }
86
+ continue;
87
+ }
88
+ // Single-file skill: top-level .md file with valid frontmatter
89
+ if (extname(entry) === '.md') {
90
+ try {
91
+ const content = readFileSync(entryPath, 'utf-8');
92
+ const { meta } = parseFrontmatter(content);
93
+ // Must have at least name or description to be a skill
94
+ if (!meta.name && !meta.description)
95
+ continue;
96
+ const name = meta.name || basename(entry, '.md');
97
+ if (!seen.has(name)) {
98
+ seen.add(name);
99
+ skills.push({
100
+ name,
101
+ description: meta.description || '',
102
+ loading: meta.loading === 'eager' ? 'eager' : 'on-demand',
103
+ dir,
104
+ entrypoint: entryPath,
105
+ isDirectory: false,
106
+ });
107
+ }
108
+ }
109
+ catch {
110
+ // skip
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return skills;
116
+ }
117
+ /**
118
+ * Load the full content of a skill's entrypoint or a named sub-file.
119
+ * Sanitises the file parameter to prevent path traversal.
120
+ */
121
+ export function loadSkillContent(meta, file) {
122
+ if (file) {
123
+ if (!meta.isDirectory) {
124
+ return `Error: skill "${meta.name}" is a single-file skill with no sub-files.`;
125
+ }
126
+ // Allow only simple filenames — no slashes, no dots at start
127
+ const safeName = file.replace(/[^a-zA-Z0-9._-]/g, '');
128
+ if (!safeName || safeName.startsWith('.')) {
129
+ return `Error: invalid sub-file name "${file}".`;
130
+ }
131
+ const filePath = join(meta.dir, safeName);
132
+ if (!existsSync(filePath)) {
133
+ return `Error: sub-file "${safeName}" not found in skill "${meta.name}".`;
134
+ }
135
+ return readFileSync(filePath, 'utf-8');
136
+ }
137
+ return readFileSync(meta.entrypoint, 'utf-8');
138
+ }
139
+ /**
140
+ * Build the skill index section to append to the system prompt.
141
+ * Eager skills are inlined separately; this lists only on-demand skills.
142
+ */
143
+ export function buildSkillIndexPrompt(skills) {
144
+ const onDemand = skills.filter(s => s.loading === 'on-demand');
145
+ if (onDemand.length === 0)
146
+ return '';
147
+ const lines = [
148
+ '## Available Skills',
149
+ '',
150
+ 'Call `load_skill` to load domain-specific guidance when it is relevant to the current task.',
151
+ '',
152
+ ...onDemand.map(s => `- **${s.name}** — ${s.description}`),
153
+ ];
154
+ return lines.join('\n');
155
+ }
156
+ /**
157
+ * Return the full content of all eager skills, to be injected directly
158
+ * into the system prompt at startup.
159
+ */
160
+ export function loadEagerSkills(skills) {
161
+ return skills
162
+ .filter(s => s.loading === 'eager')
163
+ .map(s => loadSkillContent(s))
164
+ .join('\n\n---\n\n');
165
+ }
166
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/agent/skill-loader.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,18 @@ loading: eager
8
8
 
9
9
  When you discover incomplete entities (missing recommended fields), proactively suggest enrichment using contextual inference.
10
10
 
11
+ ## Batch Enrichment (automated)
12
+
13
+ For bulk enrichment of entities with low completeness scores, use the `enrich_run` tool:
14
+
15
+ 1. `enrich_run({ dryRun: true })` — preview what would be enriched
16
+ 2. Present summary to user, get confirmation
17
+ 3. `enrich_run()` — run enrichment (writes in-place, no git commit)
18
+ 4. "Review changes with `studiograph review`, then commit with `studiograph commit`"
19
+ 5. `workspace_commit({ messagePrefix: "enrich" })` — or let user commit via CLI
20
+
21
+ Use `enrich_abort` to discard all changes if the results aren't satisfactory.
22
+
11
23
  ## When to Enrich
12
24
 
13
25
  **Proactive discovery:**
@@ -0,0 +1,502 @@
1
+ ---
2
+ name: entity-schema
3
+ description: Complete entity type reference — fields, repo groupings, status enums, file layout, and example frontmatter
4
+ loading: on-demand
5
+ ---
6
+
7
+ # Entity Schema Reference
8
+
9
+ Use this reference when creating, validating, scaffolding, or mapping entities. All entities are Markdown files with YAML frontmatter stored in `{repo}/{entity_id}/main.md` (entity-folder layout).
10
+
11
+ ## Repo Types
12
+
13
+ | Repo Type | Purpose | Typical Entity Types |
14
+ |-----------|---------|---------------------|
15
+ | `project` | One per client/initiative | project, meeting, decision, task, brief, artifact, deliverable |
16
+ | `function` | Business operations | proposal, contract, person, client, financial-plan, deal, vendor, role |
17
+ | `shared-resource` | Team knowledge | template, process, standard, reference, technique, practice-area, case-study |
18
+
19
+ Custom types are also supported via `schema_extensions` in workspace config.
20
+
21
+ ## Base Fields (all entities)
22
+
23
+ Every entity inherits these fields. They are auto-populated by the system on create/update.
24
+
25
+ | Field | Type | Required | Description |
26
+ |-------|------|----------|-------------|
27
+ | `entity_type` | string | Yes | The entity type identifier |
28
+ | `entity_id` | string (kebab-case) | Yes | Unique ID: lowercase, numbers, hyphens, underscores |
29
+ | `created_at` | datetime | Yes | ISO 8601 |
30
+ | `updated_at` | datetime | Yes | ISO 8601 |
31
+ | `created_by` | string | Yes | Username |
32
+ | `updated_by` | string | Yes | Username |
33
+ | `visibility` | enum | No | `public` \| `team` (default) \| `admin` \| `restricted` |
34
+ | `restricted_to` | string[] | No | User IDs (when visibility=restricted) |
35
+ | `sensitive_fields` | string[] | No | Fields containing sensitive data |
36
+ | `tags` | string[] | No | Categorization tags |
37
+
38
+ Schemas use `.passthrough()` — custom fields beyond the schema are preserved.
39
+
40
+ ## Wikilinks
41
+
42
+ Cross-entity references use `[[entity-id]]` wikilink syntax in string or string[] fields. Fields named `related_*`, `contacts`, `team`, `attendees`, `proposals`, `artifacts`, `deliverables` typically hold wikilinks.
43
+
44
+ ---
45
+
46
+ ## Project Repo Entities
47
+
48
+ ### project
49
+
50
+ A client engagement or internal initiative.
51
+
52
+ | Field | Type | Required | Description |
53
+ |-------|------|----------|-------------|
54
+ | `name` | string | Yes | Project name |
55
+ | `client` | string | No | Client name or wikilink |
56
+ | `website_url` | url | No | Project website |
57
+ | `start_date` | string | No | ISO 8601 or human-readable |
58
+ | `end_date` | string | No | Project end date |
59
+ | `target_completion` | string | No | Target completion date |
60
+ | `year_released` | number | No | Year released |
61
+ | `status` | enum | No | `planning` \| `scoping` \| `active` \| `on-hold` \| `completed` \| `archived` |
62
+ | `related_projects` | string[] | No | Related project wikilinks |
63
+ | `related_areas` | string[] | No | Practice area wikilinks |
64
+ | `team` | string[] | No | Team member wikilinks |
65
+ | `deliverables` | string[] | No | Deliverable wikilinks |
66
+ | `deal` | string | No | Originating deal wikilink |
67
+
68
+ ### meeting
69
+
70
+ Meeting notes, decisions, and action items.
71
+
72
+ | Field | Type | Required | Description |
73
+ |-------|------|----------|-------------|
74
+ | `name` | string | Yes | Meeting name/subject |
75
+ | `date` | string | No | Meeting date |
76
+ | `attendees` | string[] | No | Attendee names or wikilinks |
77
+ | `related_projects` | string[] | No | Project wikilinks |
78
+ | `related_organizations` | string[] | No | Organization wikilinks |
79
+ | `related_areas` | string[] | No | Practice area wikilinks |
80
+ | `agenda` | string | No | Agenda (markdown) |
81
+ | `notes` | string | No | Notes (markdown) |
82
+ | `action_items` | string[] | No | Action items |
83
+ | `summary` | string | No | Meeting summary |
84
+
85
+ ### decision
86
+
87
+ Structured decision records (ADR-style). ID format: `DEC-YYYY-NNN`.
88
+
89
+ | Field | Type | Required | Description |
90
+ |-------|------|----------|-------------|
91
+ | `id` | string | Yes | Format: DEC-YYYY-NNN |
92
+ | `title` | string | Yes | Decision title |
93
+ | `date` | string | Yes | Decision date |
94
+ | `status` | enum | No | `proposed` (default) \| `accepted` \| `rejected` \| `deprecated` \| `superseded` |
95
+ | `decision_makers` | string[] | No | Who decided |
96
+ | `stakeholders` | string[] | No | Who's affected |
97
+ | `related_decisions` | string[] | No | Related decision wikilinks |
98
+ | `supersedes` | string | No | Decision this replaces |
99
+ | `superseded_by` | string | No | Decision that replaces this |
100
+ | `context` | string | No | Background |
101
+ | `alternatives` | string | No | Alternatives considered |
102
+ | `decision` | string | No | The actual decision |
103
+ | `rationale` | string | No | Why chosen |
104
+ | `consequences` | string | No | Outcomes and risks |
105
+ | `enables` | string[] | No | Decisions this enables |
106
+
107
+ ### task
108
+
109
+ Lightweight action items and to-dos.
110
+
111
+ | Field | Type | Required | Description |
112
+ |-------|------|----------|-------------|
113
+ | `name` | string | Yes | Task name |
114
+ | `assignee` | string | No | Person wikilink |
115
+ | `due_date` | string | No | Due date |
116
+ | `status` | enum | No | `open` (default) \| `in-progress` \| `done` \| `cancelled` |
117
+ | `priority` | enum | No | `low` \| `medium` \| `high` \| `urgent` |
118
+ | `project` | string | No | Project wikilink |
119
+ | `deliverable` | string | No | Deliverable wikilink |
120
+ | `related_meeting` | string | No | Meeting wikilink |
121
+ | `description` | string | No | Detailed description |
122
+
123
+ ### brief
124
+
125
+ Project briefs and requirements documents.
126
+
127
+ | Field | Type | Required | Description |
128
+ |-------|------|----------|-------------|
129
+ | `project_name` | string | Yes | Project name |
130
+ | `client` | string | No | Client wikilink |
131
+ | `start_date` | string | No | Start date |
132
+ | `target_completion` | string | No | Target completion |
133
+ | `status` | enum | No | `planning` (default) \| `approved` \| `in-progress` \| `completed` |
134
+ | `objectives` | string[] | No | Project objectives |
135
+ | `target_users` | string | No | Target users/audience |
136
+ | `success_criteria` | string[] | No | Success criteria |
137
+ | `constraints` | string | No | Constraints |
138
+ | `stakeholders` | string[] | No | Stakeholder wikilinks |
139
+ | `deliverables` | string[] | No | Expected deliverables |
140
+ | `related_projects` | string[] | No | Related project wikilinks |
141
+
142
+ ### artifact
143
+
144
+ Individual project outputs (files, designs, prototypes).
145
+
146
+ | Field | Type | Required | Description |
147
+ |-------|------|----------|-------------|
148
+ | `name` | string | Yes | Artifact name |
149
+ | `type` | string | No | e.g. presentation, prototype, report, design-file |
150
+ | `project` | string | No | Project wikilink |
151
+ | `deliverable` | string | No | Parent deliverable wikilink |
152
+ | `date_created` | string | No | Creation date |
153
+ | `description` | string | No | Description |
154
+ | `url` | string | No | URL or file path |
155
+ | `version` | string | No | Version number |
156
+
157
+ ### deliverable
158
+
159
+ Scoped, contractual output promised to a client. Higher-level than artifacts: a deliverable (e.g. "Brand Identity System") contains artifacts (logo SVG, style guide PDF).
160
+
161
+ | Field | Type | Required | Description |
162
+ |-------|------|----------|-------------|
163
+ | `name` | string | Yes | Deliverable name |
164
+ | `project` | string | No | Project wikilink |
165
+ | `proposal` | string | No | Originating proposal wikilink |
166
+ | `contract` | string | No | Formalizing contract wikilink |
167
+ | `artifacts` | string[] | No | Component artifact wikilinks |
168
+ | `status` | enum | No | `planned` (default) \| `in-progress` \| `delivered` \| `accepted` \| `rejected` |
169
+ | `due_date` | string | No | Due date |
170
+ | `delivered_date` | string | No | Actual delivery date |
171
+ | `description` | string | No | What this comprises |
172
+
173
+ ---
174
+
175
+ ## Function Repo Entities
176
+
177
+ ### proposal
178
+
179
+ Client proposals and SOWs.
180
+
181
+ | Field | Type | Required | Description |
182
+ |-------|------|----------|-------------|
183
+ | `name` | string | Yes | Proposal name |
184
+ | `client` | string | No | Client wikilink |
185
+ | `project_name` | string | No | Project name |
186
+ | `date` | string | No | Proposal date |
187
+ | `version` | string | No | e.g. v1, v2 |
188
+ | `status` | enum | No | `draft` (default) \| `sent` \| `accepted` \| `rejected` \| `negotiating` |
189
+ | `deliverables` | string[] | No | Proposed deliverables |
190
+ | `phases` | string | No | Project phases (markdown) |
191
+ | `team` | string[] | No | Proposed team members |
192
+ | `schedule` | string | No | Proposed schedule |
193
+ | `fees` | string | No | Fee structure |
194
+ | `payment_terms` | string | No | Payment terms |
195
+
196
+ ### contract
197
+
198
+ SOWs, MSAs, NDAs.
199
+
200
+ | Field | Type | Required | Description |
201
+ |-------|------|----------|-------------|
202
+ | `name` | string | Yes | Contract name |
203
+ | `type` | enum | No | `sow` \| `msa` \| `nda` \| `other` |
204
+ | `client` | string | No | Client wikilink |
205
+ | `project` | string | No | Project wikilink |
206
+ | `date_signed` | string | No | Signature date |
207
+ | `start_date` | string | No | Start date |
208
+ | `end_date` | string | No | End date |
209
+ | `status` | enum | No | `draft` (default) \| `pending` \| `signed` \| `completed` \| `terminated` |
210
+ | `value` | string | No | Contract value |
211
+ | `payment_terms` | string | No | Payment terms |
212
+
213
+ ### person
214
+
215
+ Team members, clients, contacts.
216
+
217
+ | Field | Type | Required | Description |
218
+ |-------|------|----------|-------------|
219
+ | `name` | string | Yes | Full name |
220
+ | `role` | string | No | Role or title |
221
+ | `status` | enum | No | `current` \| `former` \| `contractor` \| `client` \| `partner` |
222
+ | `email` | string | No | Email address |
223
+ | `location` | string | No | Location |
224
+ | `organization` | string | No | Organization wikilink |
225
+ | `years_experience` | number | No | Years of experience |
226
+ | `bio` | string | No | Biography (markdown) |
227
+ | `projects` | string[] | No | Project wikilinks |
228
+ | `reports_to` | string | No | Manager or role wikilink |
229
+ | `department` | string | No | e.g. Creative Technology, Design |
230
+
231
+ ### client
232
+
233
+ Client organizations.
234
+
235
+ | Field | Type | Required | Description |
236
+ |-------|------|----------|-------------|
237
+ | `name` | string | Yes | Client name |
238
+ | `type` | enum | No | `corporate` \| `nonprofit` \| `government` \| `startup` \| `agency` \| `other` |
239
+ | `status` | enum | No | `active` (default) \| `inactive` \| `prospect` \| `former` |
240
+ | `industry` | string | No | Industry sector |
241
+ | `website` | url | No | Website URL |
242
+ | `location` | string | No | Primary location |
243
+ | `size` | enum | No | `small` \| `medium` \| `large` \| `enterprise` |
244
+ | `contacts` | string[] | No | Person wikilinks |
245
+ | `projects` | string[] | No | Project wikilinks |
246
+ | `relationship_start` | string | No | Relationship start date |
247
+ | `notes` | string | No | Additional notes (markdown) |
248
+
249
+ ### financial-plan
250
+
251
+ Budgets, rates, forecasts.
252
+
253
+ | Field | Type | Required | Description |
254
+ |-------|------|----------|-------------|
255
+ | `name` | string | Yes | Plan name |
256
+ | `type` | enum | No | `budget` \| `forecast` \| `rates` \| `compensation` |
257
+ | `period` | string | No | e.g. Q1 2026, FY2026 |
258
+ | `project` | string | No | Project wikilink |
259
+ | `amounts` | string | No | Financial amounts (markdown table) |
260
+
261
+ ### deal
262
+
263
+ Pre-project sales opportunity.
264
+
265
+ | Field | Type | Required | Description |
266
+ |-------|------|----------|-------------|
267
+ | `name` | string | Yes | Deal name |
268
+ | `client` | string | No | Client wikilink |
269
+ | `contacts` | string[] | No | Contact person wikilinks |
270
+ | `stage` | enum | No | `scoping` (default) \| `proposal` \| `negotiating` \| `won` \| `lost` |
271
+ | `deal_value` | number | No | Estimated value (USD) |
272
+ | `probability` | number (0-100) | No | Win probability |
273
+ | `expected_close` | string | No | Expected close date |
274
+ | `source` | enum | No | `referral` \| `inbound` \| `outbound` \| `repeat` \| `partner` \| `other` |
275
+ | `proposals` | string[] | No | Proposal wikilinks |
276
+ | `project` | string | No | Resulting project wikilink (once won) |
277
+ | `lost_reason` | string | No | Why lost |
278
+
279
+ ### vendor
280
+
281
+ External suppliers, freelancers, partners.
282
+
283
+ | Field | Type | Required | Description |
284
+ |-------|------|----------|-------------|
285
+ | `name` | string | Yes | Vendor name |
286
+ | `type` | enum | No | `freelancer` \| `agency` \| `supplier` \| `platform` \| `partner` \| `other` |
287
+ | `status` | enum | No | `active` (default) \| `inactive` \| `preferred` |
288
+ | `contact_name` | string | No | Primary contact |
289
+ | `email` | string | No | Contact email |
290
+ | `website` | url | No | Website URL |
291
+ | `services` | string[] | No | Services provided |
292
+ | `projects` | string[] | No | Project wikilinks |
293
+ | `notes` | string | No | Additional notes (markdown) |
294
+
295
+ ### role
296
+
297
+ Role definitions from the firm's leveling framework. Body holds: Role Overview, Key Responsibilities, Leveling Criteria, Required Skills.
298
+
299
+ | Field | Type | Required | Description |
300
+ |-------|------|----------|-------------|
301
+ | `title` | string | Yes | Role title |
302
+ | `department` | string | No | e.g. Creative Technology, Design |
303
+ | `level` | number | No | Level 1-5 |
304
+ | `type` | enum | No | `staff` \| `contractor` \| `intern` |
305
+ | `status` | enum | No | `active` (default) \| `archived` |
306
+ | `location` | string | No | Location |
307
+ | `reports_to` | string | No | Parent role or person wikilink |
308
+
309
+ ---
310
+
311
+ ## Shared Resource Repo Entities
312
+
313
+ ### template
314
+
315
+ Document templates and boilerplates.
316
+
317
+ | Field | Type | Required | Description |
318
+ |-------|------|----------|-------------|
319
+ | `name` | string | Yes | Template name |
320
+ | `category` | string | No | e.g. proposal, brief, sow, meeting-notes |
321
+ | `description` | string | No | Template description |
322
+ | `template_content` | string | No | Template content (markdown) |
323
+ | `variables` | string[] | No | Template variables e.g. `{{project_name}}` |
324
+
325
+ ### process
326
+
327
+ Workflows, SOPs, and methodologies.
328
+
329
+ | Field | Type | Required | Description |
330
+ |-------|------|----------|-------------|
331
+ | `name` | string | Yes | Process name |
332
+ | `description` | string | No | Process description |
333
+ | `steps` | string | No | Process steps (markdown) |
334
+ | `related_areas` | string[] | No | Practice area wikilinks |
335
+ | `related_templates` | string[] | No | Template wikilinks |
336
+ | `owner` | string | No | Responsible person/team wikilink |
337
+ | `review_cycle` | enum | No | `monthly` \| `quarterly` \| `annual` \| `as-needed` |
338
+
339
+ ### standard
340
+
341
+ Guidelines and best practices.
342
+
343
+ | Field | Type | Required | Description |
344
+ |-------|------|----------|-------------|
345
+ | `name` | string | Yes | Standard name |
346
+ | `category` | string | No | e.g. accessibility, design-principles, code-standards |
347
+ | `description` | string | No | Standard description |
348
+ | `guidelines` | string | No | Guidelines (markdown) |
349
+ | `examples` | string[] | No | Example wikilinks |
350
+
351
+ ### reference
352
+
353
+ External references and inspirations.
354
+
355
+ | Field | Type | Required | Description |
356
+ |-------|------|----------|-------------|
357
+ | `name` | string | Yes | Reference name |
358
+ | `type` | enum | No | `article` \| `video` \| `visualization` \| `website` \| `research` \| `podcast` \| `project` \| `tool` |
359
+ | `date` | string | No | Publication date |
360
+ | `source` | string | No | Source/author |
361
+ | `link` | string | No | URL |
362
+ | `related_projects` | string[] | No | Project wikilinks |
363
+ | `related_people` | string[] | No | People wikilinks |
364
+ | `related_areas` | string[] | No | Practice area wikilinks |
365
+ | `description` | string | No | Description |
366
+
367
+ ### technique
368
+
369
+ Methods and patterns.
370
+
371
+ | Field | Type | Required | Description |
372
+ |-------|------|----------|-------------|
373
+ | `name` | string | Yes | Technique name |
374
+ | `category` | string | No | e.g. visualization, interaction-pattern |
375
+ | `description` | string | No | Description |
376
+ | `difficulty` | enum | No | `beginner` \| `intermediate` \| `advanced` |
377
+ | `related_frameworks` | string[] | No | Framework wikilinks |
378
+ | `examples` | string[] | No | Example wikilinks |
379
+
380
+ ### practice-area
381
+
382
+ Firm capabilities and disciplines.
383
+
384
+ | Field | Type | Required | Description |
385
+ |-------|------|----------|-------------|
386
+ | `name` | string | Yes | Practice area name |
387
+ | `description` | string | No | Overview of the discipline |
388
+ | `capabilities` | string[] | No | Specific service offerings |
389
+ | `related_case_studies` | string[] | No | Case study wikilinks |
390
+ | `related_projects` | string[] | No | Project wikilinks |
391
+
392
+ ### case-study
393
+
394
+ Portfolio narratives for completed projects. Body holds: Objective, Solution, Outcome, Team, Press, Awards.
395
+
396
+ | Field | Type | Required | Description |
397
+ |-------|------|----------|-------------|
398
+ | `title` | string | Yes | Case study title |
399
+ | `client` | string | No | Client wikilink |
400
+ | `year` | number | No | Year of the project |
401
+ | `practice_areas` | string[] | No | Practice area wikilinks |
402
+ | `sectors` | string[] | No | Industry tags |
403
+ | `website_url` | url | No | Project website URL |
404
+ | `description` | string | No | Short description / meta |
405
+
406
+ ---
407
+
408
+ ## Special Entity Types
409
+
410
+ ### dataset
411
+
412
+ Structured tabular data with CSV body.
413
+
414
+ | Field | Type | Required | Description |
415
+ |-------|------|----------|-------------|
416
+ | `name` | string | Yes | Dataset name |
417
+ | `schema` | ColumnDefinition[] | Yes | Column definitions (min 1) |
418
+
419
+ Each column: `{ name, type: "string"|"number"|"boolean"|"date", required?, description? }`
420
+
421
+ ### deck
422
+
423
+ Presentation deck (Schema Slides app plugin). Body is slide markdown.
424
+
425
+ | Field | Type | Required | Description |
426
+ |-------|------|----------|-------------|
427
+ | `title` | string | Yes | Deck title |
428
+ | `client` | string | No | Client |
429
+ | `date` | string | Yes | Date |
430
+ | `phase` | string | No | Phase |
431
+ | `theme` | enum | No | `dark` (default) \| `light` |
432
+ | `status` | enum | No | `draft` (default) \| `review` \| `approved` |
433
+ | `related_project` | string | No | Project wikilink |
434
+ | `related_client` | string | No | Client wikilink |
435
+
436
+ ---
437
+
438
+ ## File Layout
439
+
440
+ Entities use the **entity-folder** layout:
441
+
442
+ ```
443
+ {repo}/
444
+ {entity_id}/
445
+ main.md # Sentinel file (frontmatter + body)
446
+ notes/ # Optional sub-content
447
+ artifacts/ # Optional attachments
448
+ ```
449
+
450
+ - `entity_id` must be kebab-case: `acme-website-redesign`
451
+ - The folder name IS the entity_id
452
+ - `main.md` is the sentinel — its presence defines the entity
453
+ - Sub-content (notes, artifacts) lives alongside main.md
454
+
455
+ ## Example Frontmatter
456
+
457
+ ```yaml
458
+ ---
459
+ entity_type: project
460
+ entity_id: acme-website-redesign
461
+ name: Acme Website Redesign
462
+ client: "[[acme-corp]]"
463
+ start_date: "2026-01-15"
464
+ end_date: "2026-06-30"
465
+ status: active
466
+ related_areas:
467
+ - "[[ux-design]]"
468
+ - "[[design-engineering]]"
469
+ team:
470
+ - "[[christian-schmidt]]"
471
+ - "[[kenton-powell]]"
472
+ tags:
473
+ - website
474
+ - redesign
475
+ created_at: "2026-01-15T00:00:00Z"
476
+ updated_at: "2026-02-20T00:00:00Z"
477
+ created_by: christian-schmidt
478
+ updated_by: christian-schmidt
479
+ ---
480
+
481
+ # Acme Website Redesign
482
+
483
+ Project content goes here. Use [[wikilinks]] to reference other entities.
484
+ ```
485
+
486
+ ## Scaffolding Repos
487
+
488
+ When scaffolding a workspace (Obsidian vault, Google Drive, or file system), create one directory per repo and seed each with README.md or an empty entity folder. Recommended repo groupings:
489
+
490
+ | Repo Name | Repo Type | Entity Types |
491
+ |-----------|-----------|-------------|
492
+ | `projects` | project | project, brief, deliverable, artifact |
493
+ | `meetings` | project | meeting, decision |
494
+ | `clients` | function | client, vendor, deal |
495
+ | `people` | function | person, role |
496
+ | `proposals` | function | proposal, contract |
497
+ | `finance` | function | financial-plan |
498
+ | `case-studies` | shared-resource | case-study |
499
+ | `processes` | shared-resource | process, standard |
500
+ | `practice-areas` | shared-resource | practice-area, technique |
501
+ | `resources` | shared-resource | reference, template |
502
+ | `tasks` | project | task |