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.
- package/README.md +2 -8
- package/dist/agent/orchestrator.d.ts +53 -0
- package/dist/agent/orchestrator.js +197 -12
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +43 -11
- package/dist/agent/skill-loader.d.ts +48 -0
- package/dist/agent/skill-loader.js +166 -0
- package/dist/agent/skill-loader.js.map +1 -0
- package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
- package/dist/agent/skills/entity-schema.md +502 -0
- package/dist/agent/skills/obsidian-source-setup.md +246 -0
- package/dist/agent/skills/sync-configuration.md +144 -0
- package/dist/agent/skills/sync-setup.md +84 -0
- package/dist/agent/tools/connector-tools.d.ts +37 -0
- package/dist/agent/tools/connector-tools.js +132 -0
- package/dist/agent/tools/connector-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +39 -0
- package/dist/agent/tools/fs-tools.js +106 -0
- package/dist/agent/tools/fs-tools.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +33 -1
- package/dist/agent/tools/graph-tools.js +192 -44
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +1 -1
- package/dist/agent/tools/load-skill.js +1 -1
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +24 -0
- package/dist/agent/tools/ops-tools.js +542 -0
- package/dist/agent/tools/ops-tools.js.map +1 -0
- package/dist/agent/tools/sync-tools.d.ts +33 -0
- package/dist/agent/tools/sync-tools.js +947 -0
- package/dist/agent/tools/sync-tools.js.map +1 -0
- package/dist/auth/github.d.ts +11 -8
- package/dist/auth/github.js +56 -75
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/colors.d.ts +54 -0
- package/dist/cli/colors.js +133 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/app.js +121 -18
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +26 -10
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +9 -0
- package/dist/cli/commands/clone.js +167 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +8 -0
- package/dist/cli/commands/commit.js +44 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/connector.js +10 -2
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +4 -6
- package/dist/cli/commands/deploy.js +292 -115
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts +11 -0
- package/dist/cli/commands/enrich.js +135 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/graphrag.d.ts +12 -0
- package/dist/cli/commands/graphrag.js +122 -0
- package/dist/cli/commands/graphrag.js.map +1 -0
- package/dist/cli/commands/init.js +29 -196
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +23 -3
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/orphans.d.ts +8 -0
- package/dist/cli/commands/orphans.js +125 -0
- package/dist/cli/commands/orphans.js.map +1 -0
- package/dist/cli/commands/provision.js +11 -7
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/r2.js +8 -2
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.d.ts +9 -0
- package/dist/cli/commands/redeploy.js +203 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.js +137 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/resolve.d.ts +8 -0
- package/dist/cli/commands/resolve.js +85 -0
- package/dist/cli/commands/resolve.js.map +1 -0
- package/dist/cli/commands/review.d.ts +19 -0
- package/dist/cli/commands/review.js +128 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/serve.js +55 -8
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/source.d.ts +16 -0
- package/dist/cli/commands/source.js +159 -0
- package/dist/cli/commands/source.js.map +1 -0
- package/dist/cli/commands/start.js +307 -55
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync-entities.d.ts +13 -0
- package/dist/cli/commands/sync-entities.js +242 -0
- package/dist/cli/commands/sync-entities.js.map +1 -0
- package/dist/cli/commands/sync.js +81 -5
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +45 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +2 -1
- package/dist/cli/scaffolding.js +38 -23
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +30 -0
- package/dist/cli/setup-wizard.js +244 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/sync-review-interactive.d.ts +31 -0
- package/dist/cli/sync-review-interactive.js +393 -0
- package/dist/cli/sync-review-interactive.js.map +1 -0
- package/dist/cli/theme.d.ts +31 -0
- package/dist/cli/theme.js +116 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/core/graph.d.ts +40 -12
- package/dist/core/graph.js +344 -104
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +4 -1
- package/dist/core/migration-runner.js +14 -3
- package/dist/core/migration-runner.js.map +1 -1
- package/dist/core/types.d.ts +2 -4
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +12 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +6 -1
- package/dist/core/workspace-manager.js +29 -4
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +13 -5
- package/dist/core/workspace.js +115 -33
- package/dist/core/workspace.js.map +1 -1
- package/dist/lib/lib/utils.d.ts +2 -0
- package/dist/lib/lib/utils.js +6 -0
- package/dist/lib/lib/utils.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +7 -3
- package/dist/mcp/connector-manager.js +61 -16
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/connectors/asana.d.ts +2 -0
- package/dist/mcp/connectors/asana.js +20 -0
- package/dist/mcp/connectors/asana.js.map +1 -0
- package/dist/mcp/connectors/definitions.d.ts +3 -1
- package/dist/mcp/connectors/definitions.js +19 -127
- package/dist/mcp/connectors/definitions.js.map +1 -1
- package/dist/mcp/connectors/figma.d.ts +5 -0
- package/dist/mcp/connectors/figma.js +21 -0
- package/dist/mcp/connectors/figma.js.map +1 -0
- package/dist/mcp/connectors/gdrive.d.ts +2 -0
- package/dist/mcp/connectors/gdrive.js +20 -0
- package/dist/mcp/connectors/gdrive.js.map +1 -0
- package/dist/mcp/connectors/granola.d.ts +2 -0
- package/dist/mcp/connectors/granola.js +12 -0
- package/dist/mcp/connectors/granola.js.map +1 -0
- package/dist/mcp/connectors/linear.d.ts +2 -0
- package/dist/mcp/connectors/linear.js +19 -0
- package/dist/mcp/connectors/linear.js.map +1 -0
- package/dist/mcp/connectors/obsidian.d.ts +2 -0
- package/dist/mcp/connectors/obsidian.js +19 -0
- package/dist/mcp/connectors/obsidian.js.map +1 -0
- package/dist/mcp/connectors/pipedrive.d.ts +2 -0
- package/dist/mcp/connectors/pipedrive.js +20 -0
- package/dist/mcp/connectors/pipedrive.js.map +1 -0
- package/dist/mcp/connectors/slack.d.ts +2 -0
- package/dist/mcp/connectors/slack.js +21 -0
- package/dist/mcp/connectors/slack.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +41 -0
- package/dist/mcp/oauth-provider.js +160 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/server/index.js +97 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +8 -0
- package/dist/server/plugin-loader.js +54 -2
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/chat.d.ts +3 -2
- package/dist/server/routes/chat.js +67 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/git-api.d.ts +9 -0
- package/dist/server/routes/git-api.js +82 -0
- package/dist/server/routes/git-api.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -2
- package/dist/server/routes/graph-api.js +164 -3
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +9 -0
- package/dist/server/routes/workspace-api.js +170 -0
- package/dist/server/routes/workspace-api.js.map +1 -0
- package/dist/services/assets/base.d.ts +2 -2
- package/dist/services/assets/base.js +4 -4
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +6 -6
- package/dist/services/assets/index.js +12 -12
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/git.d.ts +31 -0
- package/dist/services/git.js +92 -3
- package/dist/services/git.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +8 -3
- package/dist/services/github-provisioner.js +35 -8
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.js +8 -1
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +3 -3
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -1
- package/dist/services/memory-service.js +2 -3
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/orphan-service.d.ts +31 -0
- package/dist/services/orphan-service.js +100 -0
- package/dist/services/orphan-service.js.map +1 -0
- package/dist/services/sync/commit.d.ts +60 -0
- package/dist/services/sync/commit.js +370 -0
- package/dist/services/sync/commit.js.map +1 -0
- package/dist/services/sync/context-index.d.ts +69 -0
- package/dist/services/sync/context-index.js +280 -0
- package/dist/services/sync/context-index.js.map +1 -0
- package/dist/services/sync/derive.d.ts +34 -0
- package/dist/services/sync/derive.js +164 -0
- package/dist/services/sync/derive.js.map +1 -0
- package/dist/services/sync/enrichment-state.d.ts +31 -0
- package/dist/services/sync/enrichment-state.js +63 -0
- package/dist/services/sync/enrichment-state.js.map +1 -0
- package/dist/services/sync/enrichment.d.ts +25 -0
- package/dist/services/sync/enrichment.js +121 -0
- package/dist/services/sync/enrichment.js.map +1 -0
- package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
- package/dist/services/sync/frontmatter-extractor.js +273 -0
- package/dist/services/sync/frontmatter-extractor.js.map +1 -0
- package/dist/services/sync/graph-match-state.d.ts +33 -0
- package/dist/services/sync/graph-match-state.js +61 -0
- package/dist/services/sync/graph-match-state.js.map +1 -0
- package/dist/services/sync/graph-match.d.ts +53 -0
- package/dist/services/sync/graph-match.js +316 -0
- package/dist/services/sync/graph-match.js.map +1 -0
- package/dist/services/sync/graphrag-client.d.ts +43 -0
- package/dist/services/sync/graphrag-client.js +94 -0
- package/dist/services/sync/graphrag-client.js.map +1 -0
- package/dist/services/sync/graphrag-config.d.ts +16 -0
- package/dist/services/sync/graphrag-config.js +39 -0
- package/dist/services/sync/graphrag-config.js.map +1 -0
- package/dist/services/sync/graphrag-context.d.ts +14 -0
- package/dist/services/sync/graphrag-context.js +109 -0
- package/dist/services/sync/graphrag-context.js.map +1 -0
- package/dist/services/sync/graphrag-indexer.d.ts +30 -0
- package/dist/services/sync/graphrag-indexer.js +358 -0
- package/dist/services/sync/graphrag-indexer.js.map +1 -0
- package/dist/services/sync/llm.d.ts +32 -0
- package/dist/services/sync/llm.js +115 -0
- package/dist/services/sync/llm.js.map +1 -0
- package/dist/services/sync/mcp-client.d.ts +59 -0
- package/dist/services/sync/mcp-client.js +285 -0
- package/dist/services/sync/mcp-client.js.map +1 -0
- package/dist/services/sync/model-factory.d.ts +10 -0
- package/dist/services/sync/model-factory.js +24 -0
- package/dist/services/sync/model-factory.js.map +1 -0
- package/dist/services/sync/name-quality.d.ts +31 -0
- package/dist/services/sync/name-quality.js +60 -0
- package/dist/services/sync/name-quality.js.map +1 -0
- package/dist/services/sync/output-schemas.d.ts +92 -0
- package/dist/services/sync/output-schemas.js +43 -0
- package/dist/services/sync/output-schemas.js.map +1 -0
- package/dist/services/sync/prompts.d.ts +19 -0
- package/dist/services/sync/prompts.js +128 -0
- package/dist/services/sync/prompts.js.map +1 -0
- package/dist/services/sync/reconciler.d.ts +48 -0
- package/dist/services/sync/reconciler.js +295 -0
- package/dist/services/sync/reconciler.js.map +1 -0
- package/dist/services/sync/source-config.d.ts +45 -0
- package/dist/services/sync/source-config.js +208 -0
- package/dist/services/sync/source-config.js.map +1 -0
- package/dist/services/sync/source-definitions/asana.d.ts +15 -0
- package/dist/services/sync/source-definitions/asana.js +48 -0
- package/dist/services/sync/source-definitions/asana.js.map +1 -0
- package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
- package/dist/services/sync/source-definitions/definitions.js +26 -0
- package/dist/services/sync/source-definitions/definitions.js.map +1 -0
- package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
- package/dist/services/sync/source-definitions/gdrive.js +68 -0
- package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
- package/dist/services/sync/source-definitions/granola.d.ts +2 -0
- package/dist/services/sync/source-definitions/granola.js +28 -0
- package/dist/services/sync/source-definitions/granola.js.map +1 -0
- package/dist/services/sync/source-definitions/linear.d.ts +2 -0
- package/dist/services/sync/source-definitions/linear.js +60 -0
- package/dist/services/sync/source-definitions/linear.js.map +1 -0
- package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
- package/dist/services/sync/source-definitions/obsidian.js +55 -0
- package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
- package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
- package/dist/services/sync/source-definitions/pipedrive.js +52 -0
- package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
- package/dist/services/sync/staging.d.ts +53 -0
- package/dist/services/sync/staging.js +131 -0
- package/dist/services/sync/staging.js.map +1 -0
- package/dist/services/sync/structured-extractor.d.ts +49 -0
- package/dist/services/sync/structured-extractor.js +344 -0
- package/dist/services/sync/structured-extractor.js.map +1 -0
- package/dist/services/sync/sync-runner.d.ts +32 -0
- package/dist/services/sync/sync-runner.js +195 -0
- package/dist/services/sync/sync-runner.js.map +1 -0
- package/dist/services/sync/sync-state.d.ts +43 -0
- package/dist/services/sync/sync-state.js +154 -0
- package/dist/services/sync/sync-state.js.map +1 -0
- package/dist/services/sync/types.d.ts +203 -0
- package/dist/services/sync/types.js +8 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/sync/unstructured-extractor.d.ts +29 -0
- package/dist/services/sync/unstructured-extractor.js +197 -0
- package/dist/services/sync/unstructured-extractor.js.map +1 -0
- package/dist/services/vector-service.d.ts +11 -0
- package/dist/services/vector-service.js +42 -0
- package/dist/services/vector-service.js.map +1 -1
- package/dist/utils/git.d.ts +31 -4
- package/dist/utils/git.js +65 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +60 -0
- package/dist/utils/merge-resolver.js +304 -0
- package/dist/utils/merge-resolver.js.map +1 -0
- package/dist/utils/preflight.d.ts +2 -1
- package/dist/utils/preflight.js +8 -1
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/workspace-config.d.ts +8 -0
- package/dist/utils/workspace-config.js +22 -0
- package/dist/utils/workspace-config.js.map +1 -0
- package/dist/web/_app/env.js +1 -0
- package/dist/web/_app/immutable/assets/0.BwJV4fvl.css +1 -0
- package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
- package/dist/web/_app/immutable/assets/3.CnAQdPKU.css +1 -0
- package/dist/web/_app/immutable/assets/4.BG92MufE.css +1 -0
- package/dist/web/_app/immutable/assets/5.CfrQIPYs.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.BNzaCFTL.css +1 -0
- package/dist/web/_app/immutable/assets/editor.D6Rjo7RE.css +1 -0
- package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
- package/dist/web/_app/immutable/chunks/B4G4uWkV.js +1 -0
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
- package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
- package/dist/web/_app/immutable/chunks/CksE5s8n.js +1 -0
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
- package/dist/web/_app/immutable/chunks/D0JBkEPE.js +86 -0
- package/dist/web/_app/immutable/chunks/D2K5GzLj.js +1 -0
- package/dist/web/_app/immutable/chunks/DEkoussQ.js +2 -0
- package/dist/web/_app/immutable/chunks/DW-KmHRi.js +1 -0
- package/dist/web/_app/immutable/chunks/DcCr4z9k.js +1 -0
- package/dist/web/_app/immutable/chunks/Dg2wWwJu.js +2 -0
- package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
- package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
- package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/dist/web/_app/immutable/chunks/SBEriEQR.js +1 -0
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
- package/dist/web/_app/immutable/chunks/YTERt3Ul.js +6 -0
- package/dist/web/_app/immutable/chunks/m_R7HatS.js +1 -0
- package/dist/web/_app/immutable/chunks/vlmEnjfO.js +1 -0
- package/dist/web/_app/immutable/entry/app.B9pwpU_x.js +2 -0
- package/dist/web/_app/immutable/entry/start.CDuNCEco.js +1 -0
- package/dist/web/_app/immutable/nodes/0.YEQhw1us.js +1 -0
- package/dist/web/_app/immutable/nodes/1.CvmHhpRy.js +1 -0
- package/dist/web/_app/immutable/nodes/2.c5k1r7dq.js +1 -0
- package/dist/web/_app/immutable/nodes/3.B24tcdLK.js +1 -0
- package/dist/web/_app/immutable/nodes/4.kX2m5Pp9.js +16 -0
- package/dist/web/_app/immutable/nodes/5.DELt6wTD.js +2 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/index.html +41 -0
- package/package.json +21 -7
- /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 |
|