kennel 0.2.0 → 0.2.2
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 +18 -5
- package/dist/cli/dispatch.js +9 -0
- package/dist/cli/src/automations/notifications.d.ts +40 -0
- package/dist/cli/src/automations/notifications.js +220 -0
- package/dist/cli/src/cli/dispatch.d.ts +1 -0
- package/dist/cli/src/cli/dispatch.js +125 -0
- package/dist/cli/src/cli/usage.d.ts +1 -0
- package/dist/cli/src/cli/usage.js +25 -0
- package/dist/cli/src/core/api-client.d.ts +13 -0
- package/dist/cli/src/core/api-client.js +1 -0
- package/dist/cli/src/core/command.d.ts +1 -0
- package/dist/cli/src/core/command.js +69 -0
- package/dist/cli/src/core/core-folders.d.ts +1 -0
- package/dist/cli/src/core/core-folders.js +42 -0
- package/dist/cli/src/core/init.d.ts +1 -0
- package/dist/cli/src/core/init.js +141 -0
- package/dist/cli/src/core/runtime.d.ts +14 -0
- package/dist/cli/src/core/runtime.js +1 -0
- package/dist/cli/src/deploy/cloudflare.d.ts +6 -0
- package/dist/cli/src/deploy/cloudflare.js +100 -0
- package/dist/cli/src/deploy/environment.d.ts +2 -0
- package/dist/cli/src/deploy/environment.js +47 -0
- package/dist/cli/src/deploy/smoke-tests.d.ts +4 -0
- package/dist/cli/src/deploy/smoke-tests.js +92 -0
- package/dist/cli/src/deploy/trigger-dev.d.ts +2 -0
- package/dist/cli/src/deploy/trigger-dev.js +255 -0
- package/dist/cli/src/deploy/vercel.d.ts +3 -0
- package/dist/cli/src/deploy/vercel.js +67 -0
- package/dist/cli/src/main.d.ts +1 -0
- package/dist/cli/src/main.js +9 -0
- package/dist/cli/src/mcp/agent-tools.d.ts +8 -0
- package/dist/cli/src/mcp/agent-tools.js +247 -0
- package/dist/cli/src/mcp/config.d.ts +25 -0
- package/dist/cli/src/mcp/config.js +185 -0
- package/dist/cli/src/mcp/function-source.d.ts +7 -0
- package/dist/cli/src/mcp/function-source.js +42 -0
- package/dist/cli/src/mcp/generate.d.ts +1 -0
- package/dist/cli/src/mcp/generate.js +47 -0
- package/dist/cli/src/mcp/install-page.d.ts +12 -0
- package/dist/cli/src/mcp/install-page.js +5 -0
- package/dist/cli/src/notifications/email-worker.d.ts +8 -0
- package/dist/cli/src/notifications/email-worker.js +137 -0
- package/dist/cli/src/package/mcp-data.d.ts +1 -0
- package/dist/cli/src/package/mcp-data.js +1 -0
- package/dist/cli/src/package/mcp-email-worker.d.ts +1 -0
- package/dist/cli/src/package/mcp-email-worker.js +1 -0
- package/dist/cli/src/package/mcp-http.d.ts +1 -0
- package/dist/cli/src/package/mcp-http.js +1 -0
- package/dist/cli/src/package/mcp-stdio.d.ts +1 -0
- package/dist/cli/src/package/mcp-stdio.js +1 -0
- package/dist/cli/src/package/mcp.d.ts +1 -0
- package/dist/cli/src/package/mcp.js +1 -0
- package/dist/cli/src/package/preview.d.ts +9 -0
- package/dist/cli/src/package/preview.js +1 -0
- package/dist/cli/src/plugins/external.d.ts +36 -0
- package/dist/cli/src/plugins/external.js +503 -0
- package/dist/cli/src/publish/cloudflare-init.d.ts +12 -0
- package/dist/cli/src/publish/cloudflare-init.js +101 -0
- package/dist/cli/src/publish/config.d.ts +28 -0
- package/dist/cli/src/publish/config.js +178 -0
- package/dist/cli/src/publish/options.d.ts +13 -0
- package/dist/cli/src/publish/options.js +78 -0
- package/dist/cli/src/publish/vercel-init.d.ts +9 -0
- package/dist/cli/src/publish/vercel-init.js +52 -0
- package/dist/cli/src/shared/json.d.ts +4 -0
- package/dist/cli/src/shared/json.js +56 -0
- package/dist/cli/src/shared/object.d.ts +2 -0
- package/dist/cli/src/shared/object.js +3 -0
- package/dist/cli/src/shared/package-manager.d.ts +11 -0
- package/dist/cli/src/shared/package-manager.js +39 -0
- package/dist/cli/src/shared/path.d.ts +4 -0
- package/dist/cli/src/shared/path.js +40 -0
- package/dist/cli/src/shared/process.d.ts +7 -0
- package/dist/cli/src/shared/process.js +12 -0
- package/dist/cli/src/shared/project-config.d.ts +2 -0
- package/dist/cli/src/shared/project-config.js +26 -0
- package/dist/cli/src/site/dev.d.ts +10 -0
- package/dist/cli/src/site/dev.js +126 -0
- package/dist/cli/src/site/extension.d.ts +8 -0
- package/dist/cli/src/site/extension.js +113 -0
- package/dist/cli/src/site/folder-icons.d.ts +46 -0
- package/dist/cli/src/site/folder-icons.js +86 -0
- package/dist/cli/src/site/hot-viewer.d.ts +2 -0
- package/dist/cli/src/site/hot-viewer.js +231 -0
- package/dist/cli/src/site/kinds.d.ts +1 -0
- package/dist/cli/src/site/kinds.js +1 -0
- package/dist/cli/src/site/mail.d.ts +1 -0
- package/dist/cli/src/site/mail.js +10 -0
- package/dist/cli/src/site/renderers.d.ts +61 -0
- package/dist/cli/src/site/renderers.js +219 -0
- package/dist/cli/src/site/server-plugins.d.ts +54 -0
- package/dist/cli/src/site/server-plugins.js +1 -0
- package/dist/cli/src/site/viewer.d.ts +36 -0
- package/dist/cli/src/site/viewer.js +352 -0
- package/dist/cli/src/site/vitepress.d.ts +1 -0
- package/dist/cli/src/site/vitepress.js +1 -0
- package/dist/cli/usage.js +1 -0
- package/dist/core/api-client.js +75 -44
- package/dist/core/command.js +6 -3
- package/dist/core/core-folders.js +38280 -33
- package/dist/core/init.js +59 -4
- package/dist/core/runtime.js +57163 -41853
- package/dist/package/preview.js +40589 -17894
- package/dist/plugins/external.d.ts +36 -0
- package/dist/plugins/external.js +503 -0
- package/dist/site/server-plugins.js +394 -59
- package/dist/site/viewer.js +18 -5
- package/kernel/apps/web/.env.example +11 -0
- package/kernel/apps/web/components.json +20 -0
- package/kernel/apps/web/eslint.config.mjs +60 -0
- package/kernel/apps/web/index.html +17 -0
- package/kernel/apps/web/package.json +79 -0
- package/kernel/apps/web/public/favicon.svg +6 -0
- package/kernel/apps/web/public/providers/claude.svg +1 -0
- package/kernel/apps/web/public/providers/codex.svg +1 -0
- package/kernel/apps/web/public/providers/cursor.svg +1 -0
- package/kernel/apps/web/public/providers/opencode.svg +1 -0
- package/kernel/apps/web/public/providers/pi.svg +1 -0
- package/kernel/apps/web/server/acp/index.ts +1 -0
- package/kernel/apps/web/server/acp/live-agent-connection.ts +1 -0
- package/kernel/apps/web/server/acp/process-manager.ts +1 -0
- package/kernel/apps/web/server/acp/registry.ts +1 -0
- package/kernel/apps/web/server/acp/sdk.ts +1 -0
- package/kernel/apps/web/server/acp/transport.ts +1 -0
- package/kernel/apps/web/server/acp/types.ts +1 -0
- package/kernel/apps/web/server/acp-live-plugin.ts +30 -0
- package/kernel/apps/web/server/api/document-edit.ts +1 -0
- package/kernel/apps/web/server/api/open-path.ts +1 -0
- package/kernel/apps/web/server/core-plugin.ts +49 -0
- package/kernel/apps/web/server/folder-favicon.ts +1 -0
- package/kernel/apps/web/server/folder-icons.ts +1 -0
- package/kernel/apps/web/server/folder-metadata-plugin.ts +31 -0
- package/kernel/apps/web/server/plugins.ts +1 -0
- package/kernel/apps/web/server/preview-kinds.ts +1 -0
- package/kernel/apps/web/src/ai-input.tsx +62 -0
- package/kernel/apps/web/src/annotations.tsx +430 -0
- package/kernel/apps/web/src/api/client.ts +3 -0
- package/kernel/apps/web/src/api/errors.ts +1 -0
- package/kernel/apps/web/src/api/events.ts +42 -0
- package/kernel/apps/web/src/app.css +332 -0
- package/kernel/apps/web/src/app.tsx +667 -0
- package/kernel/apps/web/src/ask-draft.ts +164 -0
- package/kernel/apps/web/src/ask-tray.tsx +256 -0
- package/kernel/apps/web/src/comment-editor.tsx +93 -0
- package/kernel/apps/web/src/comment-form.tsx +162 -0
- package/kernel/apps/web/src/copy-path.ts +18 -0
- package/kernel/apps/web/src/deferred-ask-tray.tsx +20 -0
- package/kernel/apps/web/src/document-url.ts +46 -0
- package/kernel/apps/web/src/documents-url.ts +23 -0
- package/kernel/apps/web/src/dropped-folder.ts +64 -0
- package/kernel/apps/web/src/external-plugins.ts +3 -0
- package/kernel/apps/web/src/file-viewer.tsx +171 -0
- package/kernel/apps/web/src/folder-filter-icons.tsx +39 -0
- package/kernel/apps/web/src/folder-metadata.ts +76 -0
- package/kernel/apps/web/src/folder-plugin-view.tsx +87 -0
- package/kernel/apps/web/src/folder-query-cache.ts +66 -0
- package/kernel/apps/web/src/host-adapters.ts +209 -0
- package/kernel/apps/web/src/host-bridge.ts +214 -0
- package/kernel/apps/web/src/lib/entity-folder.ts +2 -0
- package/kernel/apps/web/src/linked-session-header.tsx +43 -0
- package/kernel/apps/web/src/live-session-controls.tsx +326 -0
- package/kernel/apps/web/src/local-source.ts +32 -0
- package/kernel/apps/web/src/main.tsx +24 -0
- package/kernel/apps/web/src/markdown-page.tsx +444 -0
- package/kernel/apps/web/src/notes-page.tsx +103 -0
- package/kernel/apps/web/src/plugins.ts +53 -0
- package/kernel/apps/web/src/project-search-dialog.tsx +257 -0
- package/kernel/apps/web/src/project-search.ts +18 -0
- package/kernel/apps/web/src/query-client.ts +4 -0
- package/kernel/apps/web/src/rehype-source-lines.ts +22 -0
- package/kernel/apps/web/src/routes/document.tsx +1 -0
- package/kernel/apps/web/src/routes/entities.tsx +277 -0
- package/kernel/apps/web/src/routes/search.tsx +60 -0
- package/kernel/apps/web/src/selection-context.ts +68 -0
- package/kernel/apps/web/src/selection-input.tsx +58 -0
- package/kernel/apps/web/src/selection-popup.tsx +155 -0
- package/kernel/apps/web/src/session-transcript-page.tsx +152 -0
- package/kernel/apps/web/src/use-annotations.ts +162 -0
- package/kernel/apps/web/src/use-ask-ai.ts +26 -0
- package/kernel/apps/web/src/use-ask-draft.ts +27 -0
- package/kernel/apps/web/src/use-document.ts +37 -0
- package/kernel/apps/web/src/use-folder-notes.ts +49 -0
- package/kernel/apps/web/src/use-linked-session.ts +33 -0
- package/kernel/apps/web/src/view-context.tsx +69 -0
- package/kernel/apps/web/src/view-header.tsx +66 -0
- package/kernel/apps/web/src/viewer-capabilities.ts +33 -0
- package/kernel/apps/web/src/viewer-route.ts +1 -0
- package/kernel/apps/web/src/viewport-height.ts +33 -0
- package/kernel/apps/web/tsconfig.json +24 -0
- package/kernel/apps/web/vite.config.ts +252 -0
- package/kernel/packages/agents/eslint.config.js +10 -0
- package/kernel/packages/agents/package.json +75 -0
- package/kernel/packages/agents/src/agent-card.tsx +334 -0
- package/kernel/packages/agents/src/client.tsx +13 -0
- package/kernel/packages/agents/src/index.ts +18 -0
- package/kernel/packages/agents/src/manifest.ts +7 -0
- package/kernel/packages/agents/src/node.ts +447 -0
- package/kernel/packages/agents/src/profiles.ts +137 -0
- package/kernel/packages/agents/src/resolve.ts +69 -0
- package/kernel/packages/agents/src/server.ts +60 -0
- package/kernel/packages/agents/src/types.ts +82 -0
- package/kernel/packages/agents/src/viewer.tsx +370 -0
- package/kernel/packages/agents/test/profiles.test.mjs +88 -0
- package/kernel/packages/agents/test/resolve.test.mjs +729 -0
- package/kernel/packages/agents/tsconfig.json +17 -0
- package/kernel/packages/api/README.md +73 -0
- package/kernel/packages/api/openapi.json +3368 -0
- package/kernel/packages/api/package.json +41 -0
- package/kernel/packages/api/src/client/errors.ts +1 -0
- package/kernel/packages/api/src/client/index.ts +2 -0
- package/kernel/packages/api/src/contracts/schemas.ts +277 -0
- package/kernel/packages/api/src/contracts.ts +20 -0
- package/kernel/packages/api/src/index.ts +34 -0
- package/kernel/packages/api/src/server/acp/index.ts +35 -0
- package/kernel/packages/api/src/server/acp/live-agent-connection.ts +44 -0
- package/kernel/packages/api/src/server/acp/process-manager.ts +291 -0
- package/kernel/packages/api/src/server/acp/registry.ts +140 -0
- package/kernel/packages/api/src/server/acp/sdk.ts +15 -0
- package/kernel/packages/api/src/server/acp/transport.ts +115 -0
- package/kernel/packages/api/src/server/acp/types.ts +89 -0
- package/kernel/packages/api/src/server/acp-live-plugin.ts +423 -0
- package/kernel/packages/api/src/server/api/create-agent-file.ts +46 -0
- package/kernel/packages/api/src/server/api/document-edit.ts +125 -0
- package/kernel/packages/api/src/server/api/open-path.ts +40 -0
- package/kernel/packages/api/src/server/contracts.ts +85 -0
- package/kernel/packages/api/src/server/entity-folder.ts +353 -0
- package/kernel/packages/api/src/server/folder-favicon.ts +17 -0
- package/kernel/packages/api/src/server/folder-icons.ts +113 -0
- package/kernel/packages/api/src/server/folder-metadata-plugin.ts +1758 -0
- package/kernel/packages/api/src/server/host.ts +21 -0
- package/kernel/packages/api/src/server/index.ts +197 -0
- package/kernel/packages/api/src/server/linked-folder-discovery.ts +158 -0
- package/kernel/packages/api/src/server/plugins.ts +205 -0
- package/kernel/packages/api/src/server/project-discovery.ts +69 -0
- package/kernel/packages/api/src/server/watcher.ts +46 -0
- package/kernel/packages/api/src/shared/selection.ts +16 -0
- package/kernel/packages/api/src/shared/viewer-route.ts +200 -0
- package/kernel/packages/api/test/agents-loading.test.ts +94 -0
- package/kernel/packages/api/test/core.test.ts +364 -0
- package/kernel/packages/api/test/entity-folder.test.ts +131 -0
- package/kernel/packages/api/test/linked-folder-discovery.test.ts +78 -0
- package/kernel/packages/api/test/media-endpoint.test.ts +83 -0
- package/kernel/packages/api/test/partial-loading.test.ts +43 -0
- package/kernel/packages/api/test/project-discovery.test.ts +44 -0
- package/kernel/packages/api/tsconfig.json +11 -0
- package/kernel/packages/api-client/README.md +72 -0
- package/kernel/packages/api-client/package.json +26 -0
- package/kernel/packages/api-client/scripts/generate.ts +68 -0
- package/kernel/packages/api-client/src/errors.ts +59 -0
- package/kernel/packages/api-client/src/generated.d.ts +1248 -0
- package/kernel/packages/api-client/src/index.ts +206 -0
- package/kernel/packages/api-client/src/responses.ts +19 -0
- package/kernel/packages/api-client/test/client.test.ts +143 -0
- package/kernel/packages/api-client/tsconfig.json +12 -0
- package/kernel/packages/folder-plugin/eslint.config.js +10 -0
- package/kernel/packages/folder-plugin/package.json +50 -0
- package/kernel/packages/folder-plugin/src/client.ts +73 -0
- package/kernel/packages/folder-plugin/src/endpoint.ts +273 -0
- package/kernel/packages/folder-plugin/src/index.ts +15 -0
- package/kernel/packages/folder-plugin/src/server.ts +78 -0
- package/kernel/packages/folder-plugin/src/subpath.ts +34 -0
- package/kernel/packages/folder-plugin/src/types.ts +86 -0
- package/kernel/packages/folder-plugin/src/validation.ts +56 -0
- package/kernel/packages/folder-plugin/test/contract.test.mjs +133 -0
- package/kernel/packages/folder-plugin/tsconfig.json +17 -0
- package/kernel/packages/kinds/package.json +24 -0
- package/kernel/packages/kinds/src/kinds.ts +172 -0
- package/kernel/packages/markdown/README.md +40 -0
- package/kernel/packages/markdown/explorer.css +1 -0
- package/kernel/packages/markdown/package.json +30 -0
- package/kernel/packages/markdown/src/documents.ts +1 -0
- package/kernel/packages/markdown/src/explorer.ts +1 -0
- package/kernel/packages/markdown/src/index.ts +2 -0
- package/kernel/packages/markdown/src/metadata.ts +63 -0
- package/kernel/packages/markdown/src/node.ts +1 -0
- package/kernel/packages/markdown/styles.css +1 -0
- package/kernel/packages/notes/SKILL.md +19 -0
- package/kernel/packages/notes/eslint.config.js +10 -0
- package/kernel/packages/notes/package.json +72 -0
- package/kernel/packages/notes/src/client.tsx +12 -0
- package/kernel/packages/notes/src/data/ai-input.ts +58 -0
- package/kernel/packages/notes/src/data/api.ts +40 -0
- package/kernel/packages/notes/src/data/parse.ts +15 -0
- package/kernel/packages/notes/src/data/routing.ts +33 -0
- package/kernel/packages/notes/src/data/use-folder-notes.ts +49 -0
- package/kernel/packages/notes/src/index.ts +2 -0
- package/kernel/packages/notes/src/manifest.ts +6 -0
- package/kernel/packages/notes/src/pages/notes-page.tsx +79 -0
- package/kernel/packages/notes/src/pages/single-note-page.tsx +57 -0
- package/kernel/packages/notes/src/server.ts +88 -0
- package/kernel/packages/notes/src/ui/ai-composer-controls.tsx +70 -0
- package/kernel/packages/notes/src/ui/folder-notes-list.tsx +140 -0
- package/kernel/packages/notes/tsconfig.json +16 -0
- package/kernel/packages/schemas/ICON-POLICY.md +43 -0
- package/kernel/packages/schemas/SKILL.md +185 -0
- package/kernel/packages/schemas/eslint.config.js +10 -0
- package/kernel/packages/schemas/package.json +81 -0
- package/kernel/packages/schemas/src/client.tsx +137 -0
- package/kernel/packages/schemas/src/data/config-file.ts +37 -0
- package/kernel/packages/schemas/src/data/contract.ts +174 -0
- package/kernel/packages/schemas/src/data/favicon.ts +218 -0
- package/kernel/packages/schemas/src/data/fields.ts +96 -0
- package/kernel/packages/schemas/src/data/icon-image.ts +53 -0
- package/kernel/packages/schemas/src/data/icon.ts +97 -0
- package/kernel/packages/schemas/src/data/load.ts +161 -0
- package/kernel/packages/schemas/src/data/params.ts +103 -0
- package/kernel/packages/schemas/src/data/query.ts +33 -0
- package/kernel/packages/schemas/src/data/sort.ts +50 -0
- package/kernel/packages/schemas/src/data/workspace.ts +101 -0
- package/kernel/packages/schemas/src/index.ts +22 -0
- package/kernel/packages/schemas/src/manifest.ts +4 -0
- package/kernel/packages/schemas/src/node.ts +384 -0
- package/kernel/packages/schemas/src/pages/collection.tsx +252 -0
- package/kernel/packages/schemas/src/server.ts +208 -0
- package/kernel/packages/schemas/src/ui/schema-entity-list.tsx +124 -0
- package/kernel/packages/schemas/src/ui/schema-filters.tsx +186 -0
- package/kernel/packages/schemas/src/ui/schema-search.tsx +35 -0
- package/kernel/packages/schemas/src/ui/use-query-param-filter-setting.tsx +15 -0
- package/kernel/packages/schemas/test/contract.test.mjs +26 -0
- package/kernel/packages/schemas/test/fields.test.mjs +187 -0
- package/kernel/packages/schemas/test/load.test.mjs +12 -0
- package/kernel/packages/schemas/test/node.test.mjs +412 -0
- package/kernel/packages/schemas/test/query.test.mjs +134 -0
- package/kernel/packages/schemas/test/workspace.test.mjs +86 -0
- package/kernel/packages/schemas/tsconfig.json +17 -0
- package/kernel/packages/session-finding/package.json +33 -0
- package/kernel/packages/session-finding/src/index.ts +120 -0
- package/kernel/packages/session-finding/test/list-sessions.test.mjs +139 -0
- package/kernel/packages/session-finding/tsconfig.json +12 -0
- package/kernel/packages/ui/LICENSE +21 -0
- package/kernel/packages/ui/components.json +20 -0
- package/kernel/packages/ui/eslint.config.js +8 -0
- package/kernel/packages/ui/package.json +106 -0
- package/kernel/packages/ui/src/chat/file-link.ts +178 -0
- package/kernel/packages/ui/src/chat/index.ts +18 -0
- package/kernel/packages/ui/src/chat/transcript.tsx +348 -0
- package/kernel/packages/ui/src/chat/turns.ts +76 -0
- package/kernel/packages/ui/src/chat/types.ts +23 -0
- package/kernel/packages/ui/src/chat/use-overflowing.ts +56 -0
- package/kernel/packages/ui/src/components/accordion.tsx +74 -0
- package/kernel/packages/ui/src/components/alert-dialog.tsx +164 -0
- package/kernel/packages/ui/src/components/alert.tsx +68 -0
- package/kernel/packages/ui/src/components/app-breadcrumbs.tsx +170 -0
- package/kernel/packages/ui/src/components/app-header.tsx +125 -0
- package/kernel/packages/ui/src/components/app-options.tsx +87 -0
- package/kernel/packages/ui/src/components/app-view-header.tsx +34 -0
- package/kernel/packages/ui/src/components/aspect-ratio.tsx +11 -0
- package/kernel/packages/ui/src/components/avatar.tsx +53 -0
- package/kernel/packages/ui/src/components/badge.tsx +47 -0
- package/kernel/packages/ui/src/components/base-dialog.tsx +3 -0
- package/kernel/packages/ui/src/components/base-tabs.tsx +63 -0
- package/kernel/packages/ui/src/components/breadcrumb.tsx +110 -0
- package/kernel/packages/ui/src/components/button-group.tsx +86 -0
- package/kernel/packages/ui/src/components/button.tsx +65 -0
- package/kernel/packages/ui/src/components/calendar.tsx +240 -0
- package/kernel/packages/ui/src/components/card.tsx +95 -0
- package/kernel/packages/ui/src/components/carousel.tsx +240 -0
- package/kernel/packages/ui/src/components/chart.tsx +375 -0
- package/kernel/packages/ui/src/components/checkbox.tsx +39 -0
- package/kernel/packages/ui/src/components/collapsible.tsx +33 -0
- package/kernel/packages/ui/src/components/collection-icon.tsx +28 -0
- package/kernel/packages/ui/src/components/command.tsx +205 -0
- package/kernel/packages/ui/src/components/content-issues.tsx +63 -0
- package/kernel/packages/ui/src/components/context-menu.tsx +298 -0
- package/kernel/packages/ui/src/components/copy-context.tsx +134 -0
- package/kernel/packages/ui/src/components/dialog.tsx +157 -0
- package/kernel/packages/ui/src/components/drawer.tsx +162 -0
- package/kernel/packages/ui/src/components/dropdown-menu.tsx +303 -0
- package/kernel/packages/ui/src/components/empty.tsx +108 -0
- package/kernel/packages/ui/src/components/field.tsx +260 -0
- package/kernel/packages/ui/src/components/file-preview.tsx +152 -0
- package/kernel/packages/ui/src/components/file-renderer.tsx +466 -0
- package/kernel/packages/ui/src/components/filter-chip-panel.tsx +157 -0
- package/kernel/packages/ui/src/components/filter-select.tsx +127 -0
- package/kernel/packages/ui/src/components/folder-activity.tsx +646 -0
- package/kernel/packages/ui/src/components/folder-file-list.tsx +58 -0
- package/kernel/packages/ui/src/components/folder-filter-bar.tsx +191 -0
- package/kernel/packages/ui/src/components/folder-image.tsx +18 -0
- package/kernel/packages/ui/src/components/folder-landing.tsx +70 -0
- package/kernel/packages/ui/src/components/folder-list.tsx +140 -0
- package/kernel/packages/ui/src/components/folder-metadata.tsx +107 -0
- package/kernel/packages/ui/src/components/folder-mobile-bar.tsx +60 -0
- package/kernel/packages/ui/src/components/folder-project-list.tsx +133 -0
- package/kernel/packages/ui/src/components/folder-session-list.tsx +113 -0
- package/kernel/packages/ui/src/components/folder-session-page.tsx +126 -0
- package/kernel/packages/ui/src/components/folder-sidebar.tsx +52 -0
- package/kernel/packages/ui/src/components/folder-skill-list.tsx +62 -0
- package/kernel/packages/ui/src/components/folder-tabs.tsx +156 -0
- package/kernel/packages/ui/src/components/form.tsx +167 -0
- package/kernel/packages/ui/src/components/hover-card.tsx +52 -0
- package/kernel/packages/ui/src/components/icons.tsx +34 -0
- package/kernel/packages/ui/src/components/input-group.tsx +184 -0
- package/kernel/packages/ui/src/components/input-otp.tsx +90 -0
- package/kernel/packages/ui/src/components/input.tsx +29 -0
- package/kernel/packages/ui/src/components/item.tsx +195 -0
- package/kernel/packages/ui/src/components/kbd.tsx +32 -0
- package/kernel/packages/ui/src/components/label.tsx +27 -0
- package/kernel/packages/ui/src/components/link.tsx +45 -0
- package/kernel/packages/ui/src/components/live-tool-call.tsx +193 -0
- package/kernel/packages/ui/src/components/menubar.tsx +323 -0
- package/kernel/packages/ui/src/components/navigation-menu.tsx +210 -0
- package/kernel/packages/ui/src/components/note-card.tsx +149 -0
- package/kernel/packages/ui/src/components/pagination.tsx +128 -0
- package/kernel/packages/ui/src/components/popover.tsx +56 -0
- package/kernel/packages/ui/src/components/progress.tsx +31 -0
- package/kernel/packages/ui/src/components/radio-group.tsx +54 -0
- package/kernel/packages/ui/src/components/scroll-area.tsx +61 -0
- package/kernel/packages/ui/src/components/select.tsx +219 -0
- package/kernel/packages/ui/src/components/separator.tsx +30 -0
- package/kernel/packages/ui/src/components/session-icon.tsx +124 -0
- package/kernel/packages/ui/src/components/sheet.tsx +157 -0
- package/kernel/packages/ui/src/components/sidebar.tsx +789 -0
- package/kernel/packages/ui/src/components/skeleton.tsx +13 -0
- package/kernel/packages/ui/src/components/slider.tsx +73 -0
- package/kernel/packages/ui/src/components/sonner.tsx +41 -0
- package/kernel/packages/ui/src/components/spinner.tsx +16 -0
- package/kernel/packages/ui/src/components/switch.tsx +40 -0
- package/kernel/packages/ui/src/components/table.tsx +120 -0
- package/kernel/packages/ui/src/components/tabs.tsx +78 -0
- package/kernel/packages/ui/src/components/textarea.tsx +25 -0
- package/kernel/packages/ui/src/components/toggle-group.tsx +87 -0
- package/kernel/packages/ui/src/components/toggle.tsx +48 -0
- package/kernel/packages/ui/src/components/tooltip.tsx +71 -0
- package/kernel/packages/ui/src/components/viewer-options.tsx +166 -0
- package/kernel/packages/ui/src/hooks/use-folder-filter.ts +103 -0
- package/kernel/packages/ui/src/hooks/use-mobile.ts +19 -0
- package/kernel/packages/ui/src/index.ts +13 -0
- package/kernel/packages/ui/src/lib/document-extensions.ts +83 -0
- package/kernel/packages/ui/src/lib/folder-activity.ts +143 -0
- package/kernel/packages/ui/src/lib/folder-filter.ts +284 -0
- package/kernel/packages/ui/src/lib/live-tool-call.tsx +109 -0
- package/kernel/packages/ui/src/lib/media-urls.ts +176 -0
- package/kernel/packages/ui/src/lib/obsidian-links.ts +120 -0
- package/kernel/packages/ui/src/lib/source-components.tsx +65 -0
- package/kernel/packages/ui/src/lib/utils.tsx +7 -0
- package/kernel/packages/ui/src/pages/entity-detail-page.tsx +82 -0
- package/kernel/packages/ui/src/pages/entity-list-page.tsx +50 -0
- package/kernel/packages/ui/src/pages/entity-page.tsx +69 -0
- package/kernel/packages/ui/src/styles/folder-activity.css +2151 -0
- package/kernel/packages/ui/test/copy-context.test.mjs +48 -0
- package/kernel/packages/ui/test/folder-filter.test.mjs +484 -0
- package/kernel/packages/ui/tsconfig.json +15 -0
- package/kernel/plugins/calendar/SKILL.md +173 -0
- package/kernel/plugins/calendar/eslint.config.js +10 -0
- package/kernel/plugins/calendar/package.json +73 -0
- package/kernel/plugins/calendar/schema.json +137 -0
- package/kernel/plugins/calendar/src/calendar.tsx +328 -0
- package/kernel/plugins/calendar/src/client.tsx +139 -0
- package/kernel/plugins/calendar/src/context.ts +48 -0
- package/kernel/plugins/calendar/src/copy-button.tsx +66 -0
- package/kernel/plugins/calendar/src/event-dialog.tsx +270 -0
- package/kernel/plugins/calendar/src/index.ts +4 -0
- package/kernel/plugins/calendar/src/manifest.ts +7 -0
- package/kernel/plugins/calendar/src/parse.ts +610 -0
- package/kernel/plugins/calendar/src/server.ts +160 -0
- package/kernel/plugins/calendar/src/utils.ts +80 -0
- package/kernel/plugins/calendar/src/views.tsx +418 -0
- package/kernel/plugins/calendar/test/context.test.mjs +60 -0
- package/kernel/plugins/calendar/test/package.test.mjs +43 -0
- package/kernel/plugins/calendar/test/parse.test.mjs +392 -0
- package/kernel/plugins/calendar/test/server.test.mjs +126 -0
- package/kernel/plugins/calendar/tsconfig.json +17 -0
- package/kernel/plugins/mail/SKILL.md +97 -0
- package/kernel/plugins/mail/eslint.config.js +10 -0
- package/kernel/plugins/mail/package.json +79 -0
- package/kernel/plugins/mail/src/api.ts +359 -0
- package/kernel/plugins/mail/src/bun-ffi.d.ts +14 -0
- package/kernel/plugins/mail/src/client.tsx +14 -0
- package/kernel/plugins/mail/src/flock.ts +137 -0
- package/kernel/plugins/mail/src/folders.ts +37 -0
- package/kernel/plugins/mail/src/history.ts +485 -0
- package/kernel/plugins/mail/src/index.ts +3 -0
- package/kernel/plugins/mail/src/mail-card.tsx +123 -0
- package/kernel/plugins/mail/src/mail-conversation.tsx +153 -0
- package/kernel/plugins/mail/src/mail-detail-page.tsx +467 -0
- package/kernel/plugins/mail/src/mail-hooks.ts +252 -0
- package/kernel/plugins/mail/src/mail-page.tsx +109 -0
- package/kernel/plugins/mail/src/mail-request.ts +78 -0
- package/kernel/plugins/mail/src/mail-send-box.tsx +175 -0
- package/kernel/plugins/mail/src/mailos.ts +723 -0
- package/kernel/plugins/mail/src/manifest.ts +7 -0
- package/kernel/plugins/mail/src/node.ts +171 -0
- package/kernel/plugins/mail/src/parse.ts +139 -0
- package/kernel/plugins/mail/src/server.ts +125 -0
- package/kernel/plugins/mail/src/types.ts +10 -0
- package/kernel/plugins/mail/src/viewer.tsx +147 -0
- package/kernel/plugins/mail/test/flock.test.mjs +156 -0
- package/kernel/plugins/mail/test/folders.test.mjs +138 -0
- package/kernel/plugins/mail/test/history.test.mjs +460 -0
- package/kernel/plugins/mail/test/mailos.test.mjs +752 -0
- package/kernel/plugins/mail/test/node.test.mjs +207 -0
- package/kernel/plugins/mail/test/package.test.mjs +54 -0
- package/kernel/plugins/mail/test/parse.test.mjs +32 -0
- package/kernel/plugins/mail/test/server.test.mjs +116 -0
- package/kernel/plugins/mail/test/viewer.test.mjs +192 -0
- package/kernel/plugins/mail/tsconfig.json +17 -0
- package/kernel/plugins/projects/SKILL.md +73 -0
- package/kernel/plugins/projects/eslint.config.js +10 -0
- package/kernel/plugins/projects/package.json +70 -0
- package/kernel/plugins/projects/src/client.tsx +17 -0
- package/kernel/plugins/projects/src/data/model.ts +129 -0
- package/kernel/plugins/projects/src/index.ts +17 -0
- package/kernel/plugins/projects/src/manifest.ts +7 -0
- package/kernel/plugins/projects/src/project-context.ts +41 -0
- package/kernel/plugins/projects/src/server.ts +276 -0
- package/kernel/plugins/projects/src/ui/project-card.tsx +61 -0
- package/kernel/plugins/projects/src/ui/projects-page.tsx +102 -0
- package/kernel/plugins/projects/test/package.test.mjs +51 -0
- package/kernel/plugins/projects/tsconfig.json +17 -0
- package/kernel/plugins/tasks/SKILL.md +341 -0
- package/kernel/plugins/tasks/eslint.config.js +10 -0
- package/kernel/plugins/tasks/package.json +74 -0
- package/kernel/plugins/tasks/schema.json +939 -0
- package/kernel/plugins/tasks/src/api.ts +212 -0
- package/kernel/plugins/tasks/src/client.tsx +23 -0
- package/kernel/plugins/tasks/src/data/parse.ts +544 -0
- package/kernel/plugins/tasks/src/data/task-id.ts +56 -0
- package/kernel/plugins/tasks/src/data/todo-model.ts +795 -0
- package/kernel/plugins/tasks/src/index.ts +34 -0
- package/kernel/plugins/tasks/src/manifest.ts +7 -0
- package/kernel/plugins/tasks/src/pages/task-detail.tsx +48 -0
- package/kernel/plugins/tasks/src/pages/task-list.tsx +88 -0
- package/kernel/plugins/tasks/src/server.ts +447 -0
- package/kernel/plugins/tasks/src/styles.css +9 -0
- package/kernel/plugins/tasks/src/ui/compact-todo-list.tsx +372 -0
- package/kernel/plugins/tasks/src/ui/error-details.tsx +78 -0
- package/kernel/plugins/tasks/src/ui/task-page.tsx +392 -0
- package/kernel/plugins/tasks/src/ui/todo-agent-filter.tsx +36 -0
- package/kernel/plugins/tasks/src/ui/todo-filter-bar.tsx +66 -0
- package/kernel/plugins/tasks/src/ui/todo-item.tsx +494 -0
- package/kernel/plugins/tasks/src/ui/todo-status-filter.tsx +60 -0
- package/kernel/plugins/tasks/src/ui/todo-tag-filter.tsx +48 -0
- package/kernel/plugins/tasks/src/ui/todo-warnings.tsx +106 -0
- package/kernel/plugins/tasks/test/api.test.mjs +99 -0
- package/kernel/plugins/tasks/test/folder-sources.test.mjs +46 -0
- package/kernel/plugins/tasks/test/package.test.mjs +54 -0
- package/kernel/plugins/tasks/test/parse.test.mjs +225 -0
- package/kernel/plugins/tasks/test/server.test.mjs +386 -0
- package/kernel/plugins/tasks/tsconfig.json +17 -0
- package/node_modules/@agentclientprotocol/sdk/LICENSE +191 -0
- package/node_modules/@agentclientprotocol/sdk/README.md +70 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.d.ts +1835 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.js +1885 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.test.js +5036 -0
- package/node_modules/@agentclientprotocol/sdk/dist/acp.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.d.ts +82 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.js +428 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.test.js +470 -0
- package/node_modules/@agentclientprotocol/sdk/dist/connection.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.d.ts +26 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.js +96 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.test.js +77 -0
- package/node_modules/@agentclientprotocol/sdk/dist/cookie-store.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/agent.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/agent.js +232 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/agent.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/client.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/client.js +132 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/client.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/dual-version-agent.d.ts +9 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/dual-version-agent.js +221 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/dual-version-agent.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-client.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-client.js +86 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-client.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-server.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-server.js +112 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/http-server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/ws-client.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/ws-client.js +88 -0
- package/node_modules/@agentclientprotocol/sdk/dist/examples/ws-client.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.d.ts +33 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.js +435 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.test.js +1380 -0
- package/node_modules/@agentclientprotocol/sdk/dist/http-stream.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.d.ts +603 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.js +1064 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.test.js +851 -0
- package/node_modules/@agentclientprotocol/sdk/dist/jsonrpc.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.d.ts +22 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.js +64 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.test.js +45 -0
- package/node_modules/@agentclientprotocol/sdk/dist/line-buffer.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.d.ts +17 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.js +426 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.test.js +499 -0
- package/node_modules/@agentclientprotocol/sdk/dist/node-adapter.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.d.ts +37 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.js +474 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.test.js +535 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol-router.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.d.ts +11 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.js +57 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.test.js +73 -0
- package/node_modules/@agentclientprotocol/sdk/dist/protocol.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/guards.gen.d.ts +199 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/guards.gen.js +211 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/guards.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/index.d.ts +51 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/index.js +52 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/index.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/types.gen.d.ts +6118 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/types.gen.js +3 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/types.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/zod.gen.d.ts +14160 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/zod.gen.js +3066 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema/zod.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.d.ts +30 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.js +98 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.test.js +93 -0
- package/node_modules/@agentclientprotocol/sdk/dist/schema-deserialize.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-permission.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-permission.test.js +261 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-permission.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-session-sse.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-session-sse.test.js +490 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-session-sse.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.d.ts +2 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.js +104 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.test.js +52 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-sse.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-websocket-upgrade.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-websocket-upgrade.test.js +946 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server-websocket-upgrade.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.d.ts +81 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.js +380 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.test.js +1082 -0
- package/node_modules/@agentclientprotocol/sdk/dist/server.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.d.ts +4 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.js +91 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.test.js +126 -0
- package/node_modules/@agentclientprotocol/sdk/dist/sse.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.d.ts +35 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.js +106 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.test.js +206 -0
- package/node_modules/@agentclientprotocol/sdk/dist/stream.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/streams.d.ts +8 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/streams.js +51 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/streams.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-agent.d.ts +24 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-agent.js +163 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-agent.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-http-server.d.ts +9 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-http-server.js +74 -0
- package/node_modules/@agentclientprotocol/sdk/dist/test-support/test-http-server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.d.ts +806 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.js +1183 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.test.js +512 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/acp.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/guards.gen.d.ts +954 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/guards.gen.js +1035 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/guards.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/index.d.ts +42 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/index.js +43 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/index.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/types.gen.d.ts +6146 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/types.gen.js +3 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/types.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/zod.gen.d.ts +30552 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/zod.gen.js +3204 -0
- package/node_modules/@agentclientprotocol/sdk/dist/v2/schema/zod.gen.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-server.d.ts +14 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-server.js +358 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-server.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.d.ts +54 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.js +246 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.test.js +833 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-stream.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.d.ts +13 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.js +78 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.test.d.ts +1 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.test.js +42 -0
- package/node_modules/@agentclientprotocol/sdk/dist/ws-utils.test.js.map +1 -0
- package/node_modules/@agentclientprotocol/sdk/package.json +105 -0
- package/node_modules/@agentclientprotocol/sdk/schema/schema.json +8819 -0
- package/node_modules/@agentclientprotocol/sdk/schema/v2/schema.unstable.json +10098 -0
- package/package.json +52 -6
- package/web/assets/{abnfDiagram-VRR7QNED-Nfq-O04D.js → abnfDiagram-VRR7QNED-Bgfb1nEB.js} +1 -1
- package/web/assets/app-DoGr2Zi7.js +2 -0
- package/web/assets/app-options-D-RJiQ-X.js +25 -0
- package/web/assets/app-view-header-BLvLq02T.js +1 -0
- package/web/assets/arc-Dk_KI36B.js +1 -0
- package/web/assets/{architectureDiagram-ZJ3FMSHR-qhRwPNcQ.js → architectureDiagram-ZJ3FMSHR-NR_KhRCf.js} +1 -1
- package/web/assets/ask-tray-TzeTcO6-.js +14 -0
- package/web/assets/{blockDiagram-677ZJIJ3-C56P3bGu.js → blockDiagram-677ZJIJ3-CkLkwx9C.js} +1 -1
- package/web/assets/button-C6arH7zt.js +1 -0
- package/web/assets/{c4Diagram-LMCZKHZV-Ey1M72zD.js → c4Diagram-LMCZKHZV-CFCUH8e_.js} +1 -1
- package/web/assets/channel-uMEjV8qc.js +1 -0
- package/web/assets/{chunk-2Q5K7J3B-a6isk9VU.js → chunk-2Q5K7J3B-B_BPLWsW.js} +1 -1
- package/web/assets/{chunk-32BRIVSS-uy4kdSLL.js → chunk-32BRIVSS-B1VB1hOy.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-oj2sBFd7.js → chunk-5VM5RSS4-KFcYr8Co.js} +1 -1
- package/web/assets/{chunk-EX3LRPZG-Bzl1ukAi.js → chunk-EX3LRPZG-CpBX3kuK.js} +3 -3
- package/web/assets/{chunk-JWPE2WC7-sUph7I_t.js → chunk-JWPE2WC7-BPSl40wG.js} +1 -1
- package/web/assets/{chunk-MOJQB5TN-C0ERSuVK.js → chunk-MOJQB5TN-D2RcYmoU.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-Dyw1Hfwp.js → chunk-RYQCIY6F-m7Gyn-t3.js} +1 -1
- package/web/assets/{chunk-V7JOEXUC-DnSz22rb.js → chunk-V7JOEXUC-TDvdopxS.js} +1 -1
- package/web/assets/{chunk-VR4S4FIN-Bp2SNel7.js → chunk-VR4S4FIN-DZTsG51a.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-Dqtar746.js → chunk-XXDRQBXY-Dp0--RE2.js} +1 -1
- package/web/assets/classDiagram-OUVF2IWQ-fbZocVor.js +1 -0
- package/web/assets/classDiagram-v2-EOCWNBFH-fbZocVor.js +1 -0
- package/web/assets/client-C6Nxdfif.js +2 -0
- package/web/assets/client-CXYfBko5.js +17 -0
- package/web/assets/client-CoKtOq-X.js +7 -0
- package/web/assets/client-DyRQz5RU.js +53 -0
- package/web/assets/client-OY6HUzuD.js +98 -0
- package/web/assets/client-YOYWZIFi.js +34 -0
- package/web/assets/client-j2kQmxsO.js +22 -0
- package/web/assets/command-BugZBGXE.js +38 -0
- package/web/assets/copy-context-C0Uqsp-3.js +1 -0
- package/web/assets/{cose-bilkent-JH36ORCC-Dx1VqMjj.js → cose-bilkent-JH36ORCC-CPu3PI8h.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-SjhCWmIV.js → cynefin-VYW2F7L2-DWxftYAm.js} +1 -1
- package/web/assets/{cynefinDiagram-TSTJHNR4-Dvqz2594.js → cynefinDiagram-TSTJHNR4-DsmN2V-p.js} +1 -1
- package/web/assets/{dagre-VKFMJZFB-Ju2m2qXt.js → dagre-VKFMJZFB-COEbApyY.js} +1 -1
- package/web/assets/{diagram-FQU43EPY-DsHKTt0k.js → diagram-FQU43EPY-0O9WGWKB.js} +1 -1
- package/web/assets/{diagram-G47NLZAW-DWHAcLkJ.js → diagram-G47NLZAW-CutEdMVh.js} +1 -1
- package/web/assets/{diagram-NH7WQ7WH-uUMz46ZD.js → diagram-NH7WQ7WH-C9KZc3B2.js} +1 -1
- package/web/assets/{diagram-OA4YK3LP-BRjVzjdp.js → diagram-OA4YK3LP-D8kkPXbY.js} +1 -1
- package/web/assets/{diagram-WEI45ONY-Cb-FhBpQ.js → diagram-WEI45ONY-_YqiTaGP.js} +1 -1
- package/web/assets/document-Dgt5eZFj.js +19 -0
- package/web/assets/{ebnfDiagram-CCIWWBDH-IhhxX3IB.js → ebnfDiagram-CCIWWBDH-JO-zQh6g.js} +1 -1
- package/web/assets/{entities-DUnx74kH.js → entities-C3wz7FCx.js} +12 -12
- package/web/assets/{erDiagram-Q63AITRT-D1frgeWf.js → erDiagram-Q63AITRT-9UjQwJ4P.js} +1 -1
- package/web/assets/file-viewer-DZJ8nYnl.js +1 -0
- package/web/assets/{flowDiagram-23GEKE2U-BiPPM-FY.js → flowDiagram-23GEKE2U-Ca08tnYM.js} +5 -5
- package/web/assets/folder-image-BfGgxo7i.js +1 -0
- package/web/assets/folder-landing-qUKBCnG-.js +54 -0
- package/web/assets/folder-list-BfFjv7rR.js +1 -0
- package/web/assets/folder-metadata-DCw8xzHk.js +2 -0
- package/web/assets/folder-mobile-bar-Ubz4babf.js +1 -0
- package/web/assets/folder-plugin-view-DsWR1zmQ.js +6 -0
- package/web/assets/{ganttDiagram-NO4QXBWP-CmEOlHD7.js → ganttDiagram-NO4QXBWP-KnHzX5W3.js} +1 -1
- package/web/assets/{gitGraphDiagram-IHSO6WYX-tTjcpZpU.js → gitGraphDiagram-IHSO6WYX-Cm8woNtK.js} +1 -1
- package/web/assets/index-BaRnbYRw.js +1 -0
- package/web/assets/index-BexmLxIP.css +1 -0
- package/web/assets/index-Bp9DidgD.js +1 -0
- package/web/assets/{index-eL1k96k8.js → index-CCXE8zc9.js} +1 -1
- package/web/assets/index-CNyy98F8.js +2 -0
- package/web/assets/{index-DmrKjrlM.js → index-CXhBn-ar.js} +1 -1
- package/web/assets/index-DDirZMgx.js +1 -0
- package/web/assets/{infoDiagram-FWYZ7A6U-Ok2sdbc1.js → infoDiagram-FWYZ7A6U-yyqmUtIb.js} +1 -1
- package/web/assets/{ishikawaDiagram-FXEZZL3T-kPnM5psX.js → ishikawaDiagram-FXEZZL3T-BfvR_Zy4.js} +4 -4
- package/web/assets/{journeyDiagram-5HDEW3XC-BkoT0-45.js → journeyDiagram-5HDEW3XC-BKuw06HM.js} +1 -1
- package/web/assets/{kanban-definition-HUTT4EX6-xnm_eFoU.js → kanban-definition-HUTT4EX6-n0010rmQ.js} +8 -8
- package/web/assets/{linear-CLZpgLH-.js → linear-C0d0lT8O.js} +1 -1
- package/web/assets/linked-session-header-BkEweU0Z.js +3 -0
- package/web/assets/{markdown-njUwQKsR.js → markdown-Bw9RgUGR.js} +9 -9
- package/web/assets/{mermaid.core-Bvxj3RoN.js → mermaid.core-BDVbShyO.js} +6 -6
- package/web/assets/metadata-KV0dpp4G.js +1 -0
- package/web/assets/{mindmap-definition-LN4V7U3C-42Uoox79.js → mindmap-definition-LN4V7U3C--_0ks3GF.js} +1 -1
- package/web/assets/note-card-DBfX6gW1.js +6 -0
- package/web/assets/{pegDiagram-2B236MQR-B-GZCw3w.js → pegDiagram-2B236MQR-CBoNIpKR.js} +1 -1
- package/web/assets/{pieDiagram-ENE6RG2P-DRmmssIB.js → pieDiagram-ENE6RG2P-MA5tkYh5.js} +3 -3
- package/web/assets/popover-DBD7FF-W.js +9 -0
- package/web/assets/{project-search-dialog-B730oZ1S.js → project-search-dialog-DM1IkSZu.js} +6 -6
- package/web/assets/{quadrantDiagram-ABIIQ3AL-BfhVQ7V9.js → quadrantDiagram-ABIIQ3AL-CWT1ryqF.js} +1 -1
- package/web/assets/{railroadDiagram-RFXS5EU6-DxKx7XRp.js → railroadDiagram-RFXS5EU6-ZiLB5FGi.js} +1 -1
- package/web/assets/{react-DZzLHL-l.js → react-B9jn2M18.js} +2 -2
- package/web/assets/{requirementDiagram-TGXJPOKE-NUzj9fw1.js → requirementDiagram-TGXJPOKE-CQq9uneq.js} +1 -1
- package/web/assets/{sankeyDiagram-HTMAVEWB-Cy9OMnl-.js → sankeyDiagram-HTMAVEWB-qDG-0JqI.js} +1 -1
- package/web/assets/search-DNrQA5fF.js +2 -0
- package/web/assets/select-D8cqNgcp.js +30 -0
- package/web/assets/selection-popup-DmtTeRs2.js +7 -0
- package/web/assets/{sequenceDiagram-DBY2YBRQ-CBNE9mzn.js → sequenceDiagram-DBY2YBRQ-CiApurLO.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-S4HhfX0n.js → sizeCapture-X5ZJPWSS-DZSR5QXm.js} +1 -1
- package/web/assets/stateDiagram-2N3HPSRC-CjJJR9_z.js +1 -0
- package/web/assets/stateDiagram-v2-6OUMAXLB-BpeGSCu9.js +1 -0
- package/web/assets/{swimlanes-5IMT3BWC-DJ2aLWal.js → swimlanes-5IMT3BWC-CKmo1sg6.js} +2 -2
- package/web/assets/swimlanesDiagram-G3AALYLV-D9RjLKb9.js +8 -0
- package/web/assets/tanstack-YzX_Mi37.js +3 -0
- package/web/assets/{timeline-definition-FHXFAJF6-vFDUVPCX.js → timeline-definition-FHXFAJF6-D-NMwS3y.js} +1 -1
- package/web/assets/{use-folder-filter-BbTUlXgG.js → use-folder-filter-LQyXns5Q.js} +1 -1
- package/web/assets/{utils-CwHGE3BB.js → utils-DCaHk0Gm.js} +1 -1
- package/web/assets/{vennDiagram-L72KCM5P-AsnhK2zW.js → vennDiagram-L72KCM5P-CfL6LBWw.js} +1 -1
- package/web/assets/view-context-gyDl_p2V.js +229 -0
- package/web/assets/viewer-capabilities-Bpp8Uvcg.js +1 -0
- package/web/assets/{wardleyDiagram-EHGQE667-Cj1wFbNV.js → wardleyDiagram-EHGQE667-DgldMxaj.js} +1 -1
- package/web/assets/{xychartDiagram-FW5EYKEG-Bbvnutsm.js → xychartDiagram-FW5EYKEG-CIoAIFX8.js} +1 -1
- package/web/favicon.svg +6 -0
- package/web/index.html +5 -4
- package/web/assets/app-CPSmsokP.js +0 -2
- package/web/assets/app-options-XEWvevsz.js +0 -25
- package/web/assets/app-view-header-BKZ90ToF.js +0 -1
- package/web/assets/arc-DbpbZvCt.js +0 -1
- package/web/assets/arrow-left-CFeHb-Z1.js +0 -1
- package/web/assets/ask-tray-D2YHtbPj.js +0 -14
- package/web/assets/button-BJ7z-ZA7.js +0 -1
- package/web/assets/calendar-days-DWh2XMO2.js +0 -1
- package/web/assets/channel-dSRp_qTo.js +0 -1
- package/web/assets/chevron-down-C5oRtqbX.js +0 -1
- package/web/assets/chevron-right-CsPtvh8C.js +0 -1
- package/web/assets/chevron-up-DjpU6Pyv.js +0 -1
- package/web/assets/classDiagram-OUVF2IWQ-B7B2zLzM.js +0 -1
- package/web/assets/classDiagram-v2-EOCWNBFH-B7B2zLzM.js +0 -1
- package/web/assets/client-CAudjYV9.js +0 -34
- package/web/assets/client-Dn9-_Gm_.js +0 -14
- package/web/assets/client-Dxrf2tyq.js +0 -102
- package/web/assets/client-aFI2M4pE.js +0 -53
- package/web/assets/collection-icon-TbOVyORG.js +0 -1
- package/web/assets/collection-page-Du6FKkuU.js +0 -10
- package/web/assets/command-C_g5E1Wx.js +0 -38
- package/web/assets/copy-Ikmr6Iq2.js +0 -1
- package/web/assets/copy-context-Cl1TE2PJ.js +0 -1
- package/web/assets/document-DcjNSJCk.js +0 -2
- package/web/assets/external-link-BXmSXqqF.js +0 -1
- package/web/assets/file-renderer-BRZTrYx8.js +0 -19
- package/web/assets/file-text-CiiSsCDq.js +0 -1
- package/web/assets/file-viewer-C1wAeVDK.js +0 -1
- package/web/assets/folder-image-AXBrHUcU.js +0 -1
- package/web/assets/folder-landing-BhRg7hwn.js +0 -54
- package/web/assets/folder-list-rIdszVde.js +0 -1
- package/web/assets/folder-metadata-puTC5QqJ.js +0 -2
- package/web/assets/folder-mobile-bar-DjjRQo3T.js +0 -1
- package/web/assets/folder-plugin-view-BU_kzR8j.js +0 -6
- package/web/assets/index-DS2Wmd9I.css +0 -1
- package/web/assets/index-DgqzSeIR.js +0 -1
- package/web/assets/index-DnlTDqaa.js +0 -1
- package/web/assets/index-DztTMDFz.js +0 -2
- package/web/assets/index-kY75qc96.js +0 -1
- package/web/assets/index-p38i_yyY.js +0 -1
- package/web/assets/link-2-BWKA6t--.js +0 -1
- package/web/assets/link-DC_1Z6Yy.js +0 -11
- package/web/assets/linked-session-header-DJYWZ_-q.js +0 -3
- package/web/assets/mail-2rCdIFul.js +0 -1
- package/web/assets/markdown-title-dncAYYiP.js +0 -131
- package/web/assets/notes-page-DIW6rgJp.js +0 -10
- package/web/assets/pencil-8cobiSSq.js +0 -1
- package/web/assets/plus-BHV2wJr7.js +0 -1
- package/web/assets/popover-Cmmgj-MJ.js +0 -9
- package/web/assets/search-CvlYUkN6.js +0 -2
- package/web/assets/select-1SvaKQsS.js +0 -30
- package/web/assets/selection-popup-ntjycEVh.js +0 -7
- package/web/assets/sparkles-CBhGREdc.js +0 -1
- package/web/assets/stateDiagram-2N3HPSRC-BEw1Mheu.js +0 -1
- package/web/assets/stateDiagram-v2-6OUMAXLB-BHtjl1iD.js +0 -1
- package/web/assets/swimlanesDiagram-G3AALYLV-Z362aroZ.js +0 -8
- package/web/assets/tanstack-CD46mJkU.js +0 -1
- package/web/assets/view-context-D-fh9AbH.js +0 -81
- package/web/assets/viewer-capabilities-CROIaoqh.js +0 -1
- package/web/assets/x-BUeE--I4.js +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Link } from "lucide-react"
|
|
2
|
+
|
|
3
|
+
import { folderPathId } from "@raggle-ai/folder-plugin/client"
|
|
4
|
+
import { Button } from "@raggle-ai/ui/components/button"
|
|
5
|
+
import {
|
|
6
|
+
Card,
|
|
7
|
+
CardAction,
|
|
8
|
+
CardHeader,
|
|
9
|
+
CardTitle,
|
|
10
|
+
} from "@raggle-ai/ui/components/card"
|
|
11
|
+
import { CopyContextButton } from "@raggle-ai/ui/components/copy-context"
|
|
12
|
+
import { FolderContextIcon } from "@raggle-ai/ui/components/folder-filter-bar"
|
|
13
|
+
import { FolderMetadata } from "@raggle-ai/ui/components/folder-metadata"
|
|
14
|
+
|
|
15
|
+
import type { ConnectedProject } from "../data/model.ts"
|
|
16
|
+
|
|
17
|
+
/** One connected-project card: identity, relation badges, and paths. */
|
|
18
|
+
export type ProjectCardProps = {
|
|
19
|
+
readonly project: ConnectedProject
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function ProjectCard({ project }: ProjectCardProps) {
|
|
23
|
+
const hostPathId = folderPathId(project.worktree)
|
|
24
|
+
const folderHref = `/folder/${hostPathId}/notes`
|
|
25
|
+
return (
|
|
26
|
+
<article className="min-w-0">
|
|
27
|
+
<Card className="h-full min-h-48 py-5">
|
|
28
|
+
<CardHeader className="min-w-0 gap-1.5">
|
|
29
|
+
<CardTitle className="min-w-0 break-words">
|
|
30
|
+
<FolderMetadata
|
|
31
|
+
href={folderHref}
|
|
32
|
+
icon={<FolderContextIcon folder={project.worktree} />}
|
|
33
|
+
path={project.worktree}
|
|
34
|
+
size="large"
|
|
35
|
+
/>
|
|
36
|
+
</CardTitle>
|
|
37
|
+
<CardAction className="flex items-center gap-1">
|
|
38
|
+
{project.repository ? (
|
|
39
|
+
<Button asChild size="icon-sm" variant="ghost">
|
|
40
|
+
<a
|
|
41
|
+
aria-label="Open Git repository"
|
|
42
|
+
href={project.repository}
|
|
43
|
+
rel="noreferrer"
|
|
44
|
+
target="_blank"
|
|
45
|
+
title="Open Git repository"
|
|
46
|
+
>
|
|
47
|
+
<Link className="size-4" />
|
|
48
|
+
</a>
|
|
49
|
+
</Button>
|
|
50
|
+
) : null}
|
|
51
|
+
<CopyContextButton
|
|
52
|
+
context={project.worktree}
|
|
53
|
+
label="Copy folder path"
|
|
54
|
+
size="icon-sm"
|
|
55
|
+
/>
|
|
56
|
+
</CardAction>
|
|
57
|
+
</CardHeader>
|
|
58
|
+
</Card>
|
|
59
|
+
</article>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { useQuery } from "@tanstack/react-query"
|
|
2
|
+
|
|
3
|
+
import type { FolderPluginViewProps } from "@raggle-ai/folder-plugin/client"
|
|
4
|
+
import { CopyContextButton } from "@raggle-ai/ui/components/copy-context"
|
|
5
|
+
|
|
6
|
+
import type { ProjectsPayload } from "../data/model.ts"
|
|
7
|
+
import { decodeProjectsPayload } from "../data/model.ts"
|
|
8
|
+
import { projectsErrorContext } from "../project-context.ts"
|
|
9
|
+
import { ProjectCard } from "./project-card.tsx"
|
|
10
|
+
|
|
11
|
+
/** Projects plugin page: one card per connected project. */
|
|
12
|
+
export type ProjectsPluginProps = FolderPluginViewProps
|
|
13
|
+
|
|
14
|
+
export function ProjectsPage(props: ProjectsPluginProps) {
|
|
15
|
+
const { folder, folderId, request, subpath } = props
|
|
16
|
+
const query = useQuery({
|
|
17
|
+
queryKey: ["folder", folderId, "projects", subpath],
|
|
18
|
+
queryFn: ({ signal }) =>
|
|
19
|
+
request(subpath, { signal }) as Promise<ProjectsPayload>,
|
|
20
|
+
staleTime: 30_000,
|
|
21
|
+
})
|
|
22
|
+
const payload = query.data
|
|
23
|
+
? (() => {
|
|
24
|
+
try {
|
|
25
|
+
return decodeProjectsPayload(query.data)
|
|
26
|
+
} catch (error) {
|
|
27
|
+
return {
|
|
28
|
+
folder,
|
|
29
|
+
message:
|
|
30
|
+
error instanceof Error && error.message
|
|
31
|
+
? error.message
|
|
32
|
+
: "Could not parse the projects payload.",
|
|
33
|
+
projects: [],
|
|
34
|
+
status: "error" as const,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
})()
|
|
38
|
+
: undefined
|
|
39
|
+
const fetchError =
|
|
40
|
+
query.error instanceof Error && query.error.message
|
|
41
|
+
? query.error.message
|
|
42
|
+
: undefined
|
|
43
|
+
const failure =
|
|
44
|
+
fetchError ??
|
|
45
|
+
(payload?.status === "error" ? payload.message : undefined) ??
|
|
46
|
+
undefined
|
|
47
|
+
const loading = !query.error && !payload && query.isPending
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<main className="min-h-full bg-transparent text-slate-950">
|
|
51
|
+
<section
|
|
52
|
+
className="mx-auto grid w-full max-w-5xl min-w-0 grid-cols-1 gap-4 px-4
|
|
53
|
+
py-5"
|
|
54
|
+
>
|
|
55
|
+
<h2 className="m-0 text-lg font-semibold">Connected projects</h2>
|
|
56
|
+
|
|
57
|
+
{loading ? (
|
|
58
|
+
<p className="text-muted-foreground m-0 text-sm">
|
|
59
|
+
Loading connected projects…
|
|
60
|
+
</p>
|
|
61
|
+
) : null}
|
|
62
|
+
|
|
63
|
+
{failure ? (
|
|
64
|
+
<div
|
|
65
|
+
className="rounded-lg border border-red-200 bg-red-50 px-3 py-2
|
|
66
|
+
text-sm text-red-700"
|
|
67
|
+
>
|
|
68
|
+
<p className="m-0" role="alert">
|
|
69
|
+
{failure}
|
|
70
|
+
</p>
|
|
71
|
+
<button
|
|
72
|
+
className="mt-2 underline underline-offset-2"
|
|
73
|
+
onClick={() => void query.refetch()}
|
|
74
|
+
type="button"
|
|
75
|
+
>
|
|
76
|
+
Retry
|
|
77
|
+
</button>
|
|
78
|
+
<CopyContextButton
|
|
79
|
+
className="mt-2"
|
|
80
|
+
context={() => projectsErrorContext(folder, failure)}
|
|
81
|
+
label="Copy full context for the Projects failure"
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
) : null}
|
|
85
|
+
|
|
86
|
+
{payload?.status === "available" ? (
|
|
87
|
+
payload.projects.length ? (
|
|
88
|
+
<div className="grid min-w-0 grid-cols-1 gap-4">
|
|
89
|
+
{payload.projects.map((project) => (
|
|
90
|
+
<ProjectCard key={project.worktree} project={project} />
|
|
91
|
+
))}
|
|
92
|
+
</div>
|
|
93
|
+
) : (
|
|
94
|
+
<p className="text-muted-foreground m-0 text-sm">
|
|
95
|
+
No connected projects found.
|
|
96
|
+
</p>
|
|
97
|
+
)
|
|
98
|
+
) : null}
|
|
99
|
+
</section>
|
|
100
|
+
</main>
|
|
101
|
+
)
|
|
102
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import assert from "node:assert/strict"
|
|
2
|
+
import { readFile } from "node:fs/promises"
|
|
3
|
+
import test from "node:test"
|
|
4
|
+
|
|
5
|
+
const packageJson = JSON.parse(
|
|
6
|
+
await readFile(new URL("../package.json", import.meta.url), "utf8"),
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
test("projects package is ready for public npm publishing", () => {
|
|
10
|
+
assert.equal(packageJson.private, undefined)
|
|
11
|
+
assert.equal(packageJson.version, "0.1.0")
|
|
12
|
+
assert.equal(packageJson.license, "MIT")
|
|
13
|
+
assert.equal(packageJson.publishConfig?.access, "public")
|
|
14
|
+
assert.equal(packageJson.repository?.directory, "plugins/projects")
|
|
15
|
+
assert.deepEqual(packageJson.files, ["src"])
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test("projects package ships the standard plugin script set", () => {
|
|
19
|
+
for (const script of [
|
|
20
|
+
"test",
|
|
21
|
+
"typecheck",
|
|
22
|
+
"format",
|
|
23
|
+
"lint",
|
|
24
|
+
"clean",
|
|
25
|
+
"pack:check",
|
|
26
|
+
"publish:public:dry-run",
|
|
27
|
+
]) {
|
|
28
|
+
assert.ok(
|
|
29
|
+
typeof packageJson.scripts?.[script] === "string",
|
|
30
|
+
`missing script "${script}"`,
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test("projects package exposes manifest, model, and split server/client entry points", () => {
|
|
36
|
+
assert.deepEqual(Object.keys(packageJson.exports).sort(), [
|
|
37
|
+
".",
|
|
38
|
+
"./client",
|
|
39
|
+
"./manifest",
|
|
40
|
+
"./model",
|
|
41
|
+
"./server",
|
|
42
|
+
])
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test("projects client entry does not import the Node server entry", async () => {
|
|
46
|
+
const clientSource = await readFile(
|
|
47
|
+
new URL("../src/client.tsx", import.meta.url),
|
|
48
|
+
"utf8",
|
|
49
|
+
)
|
|
50
|
+
assert.doesNotMatch(clientSource, /node:|\/server"/)
|
|
51
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
3
|
+
"extends": "@raggle-ai/tsconfig/base.json",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"target": "ES2022",
|
|
6
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
7
|
+
"jsx": "preserve",
|
|
8
|
+
"baseUrl": ".",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
// local copy: bun doesn't read paths inherited via `extends`
|
|
11
|
+
"paths": {
|
|
12
|
+
"~/*": ["${configDir}/../../packages/*/src"]
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"include": ["src"],
|
|
16
|
+
"exclude": ["node_modules", "dist", "eslint.config.mjs"]
|
|
17
|
+
}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kennel-tasks
|
|
3
|
+
description: Open and read a folder's `todo.json` task file in the Kennel viewer — valid detection, task dataset shaping (workspace-merged across nested folders), folder filter chips, agent and tag filter areas, open/completed summaries, validation errors and warnings, or scaffold a starter file with `kennel init`. Also covers how to write todos well — note linking through the task `notes` field, accompanying note files with their linked sections, and soft warnings for todos that have no notes. Use when the user asks to view tasks or a todo list for a folder in Kennel, open a workspace's backend `todo.json`, see open or completed task counts, list tasks by status, priority, tag, or assignee, create or update tasks, create a starter task file, or verify a tasks view loads.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Kennel Tasks Plugin
|
|
7
|
+
|
|
8
|
+
The Tasks plugin (`@raggle-ai/tasks`) renders a folder's `todo.json` task file
|
|
9
|
+
in the Kennel web viewer: a compact open-task list with title + status/key
|
|
10
|
+
rows, and an individual task page per task (title, description, steps,
|
|
11
|
+
acceptance criteria, badges, links). The file is a repository-native task
|
|
12
|
+
format intended to cover Jira/Linear-style planning from one JSON file.
|
|
13
|
+
|
|
14
|
+
This skill covers the agent-facing parts of that plugin: where the task file
|
|
15
|
+
lives, how detection works, how the dataset is shaped, and how to open and
|
|
16
|
+
verify the view. For the plugin package's implementation contract, see
|
|
17
|
+
`plugins/README.md` in the Kennel repo.
|
|
18
|
+
|
|
19
|
+
## When to use
|
|
20
|
+
|
|
21
|
+
- The user asks to view tasks or a todo list for a folder in Kennel.
|
|
22
|
+
- The user wants open/completed counts, or which tasks exist for a workspace.
|
|
23
|
+
- The user asks to create, update, or organize tasks — the writing guidance
|
|
24
|
+
below is what makes a task useful later.
|
|
25
|
+
- Preview or verification work needs the Tasks plugin tab to be available and
|
|
26
|
+
populated for a target folder.
|
|
27
|
+
|
|
28
|
+
## Workflow
|
|
29
|
+
|
|
30
|
+
1. **Identify the folder** whose tasks the user wants. The plugin reads
|
|
31
|
+
exactly one file: `todo.json` at the root of the served folder.
|
|
32
|
+
2. **Check for a task file.** Confirm `todo.json` exists at the folder root,
|
|
33
|
+
or open the folder in the viewer and check the **Tasks** plugin tab. The
|
|
34
|
+
tab is always present on a folder; its badge shows the task count when the
|
|
35
|
+
file is valid and a warning marker when `todo.json` exists but is invalid
|
|
36
|
+
(hover for the first validation problem). There is no recursive scan — a
|
|
37
|
+
`todo.json` in a subfolder does not count for the parent.
|
|
38
|
+
|
|
39
|
+
If no `todo.json` exists and the user wants to start tracking tasks, run
|
|
40
|
+
`kennel init` (or `kennel init --plugin tasks`) in the folder to scaffold
|
|
41
|
+
a valid v2 starter file — it passes detection immediately and the tab
|
|
42
|
+
gains a badge right away. Only scaffold when the user asks for it or when
|
|
43
|
+
creating a task file is clearly in scope; never modify an existing file.
|
|
44
|
+
|
|
45
|
+
3. **Read the tasks.** Read and summarize tasks from the source `todo.json`
|
|
46
|
+
itself — names, statuses, priorities, assignees, deadlines. Do not invent
|
|
47
|
+
tasks or states. The completion rule is: a task is complete when
|
|
48
|
+
`done: true` **or** `status: "done"`.
|
|
49
|
+
|
|
50
|
+
**Write tags for grouped todos.** When creating or editing `todo.json`
|
|
51
|
+
tasks, add a short lowercase `tags` entry to every task that belongs to a
|
|
52
|
+
group (subtasks of an epic, tasks for the same project, cycle, or batch,
|
|
53
|
+
related bugs) — for example `"tags": ["auth"]`. One tag per group is
|
|
54
|
+
enough; the viewer renders one filter chip per tag, so tagging is what
|
|
55
|
+
makes grouped todos filterable together.
|
|
56
|
+
|
|
57
|
+
**Link notes to every todo.** A todo is only half the work — the
|
|
58
|
+
context lives in notes. When creating or updating a task, set a
|
|
59
|
+
`notes` array on the task with at least one entry: a note path relative
|
|
60
|
+
to the folder that owns the `todo.json` (for example
|
|
61
|
+
`"notes": ["company-records/finance/vat-registration-submission.md"]`),
|
|
62
|
+
optionally with a `#section` heading, or an https URL for external
|
|
63
|
+
references. Create or update the accompanying note in the same pass —
|
|
64
|
+
put the related file references (specs, evidence, other notes, the task
|
|
65
|
+
key itself) into the note's linked sections so the link works in both
|
|
66
|
+
directions. The viewer renders local note refs as chips that open the
|
|
67
|
+
note in the same view, and https refs as external links. Note that the
|
|
68
|
+
path is relative to the owning `todo.json` folder, so nested task files
|
|
69
|
+
use paths relative to their own directory.
|
|
70
|
+
|
|
71
|
+
4. **Handle validation errors.** If the badge is a warning marker (or the
|
|
72
|
+
view shows the red error panel), the file exists but is not valid. Read
|
|
73
|
+
the exact issues — either from the view's `path: message` lines or from
|
|
74
|
+
the API: `curl -fsS "$URL/api/plugins/tasks?path=<folder>"` returns
|
|
75
|
+
`status: "error"` with an `issues` array (for example
|
|
76
|
+
`tasks[2].status: must be one of …; got "in-progress"`). Report what is
|
|
77
|
+
wrong and where; do not report counts or summarize an invalid file as if
|
|
78
|
+
it worked.
|
|
79
|
+
5. **Open the view.** `kennel serve <folder>` (or `kennel view <folder>` in a
|
|
80
|
+
source checkout), then point at the Tasks tab. Launch, port, watch, and
|
|
81
|
+
link verification mechanics come from the `kennel-preview` skill — install
|
|
82
|
+
it alongside this one so the full workflow works.
|
|
83
|
+
6. **Verify before reporting.** Confirm the server is alive
|
|
84
|
+
(`curl -fsS "$URL/api/health"`), the printed URL serves the exact requested
|
|
85
|
+
folder root, the Tasks tab is present, and the rendered open/completed
|
|
86
|
+
counts match the `todo.json` tasks (or, for an invalid file, that the
|
|
87
|
+
shown issues match the validation output).
|
|
88
|
+
|
|
89
|
+
## Views
|
|
90
|
+
|
|
91
|
+
- **Task list** (`/folder/<id>/views/tasks`) — one compact row per task:
|
|
92
|
+
a complete/reopen tick button, the title (linked to the task page), and a
|
|
93
|
+
status/key meta line. The description is intentionally not repeated here.
|
|
94
|
+
All filter areas share one wrapping horizontal line above the list, so
|
|
95
|
+
done tasks appear with their checkmark while filtered: the **folder**
|
|
96
|
+
filter bar (skims workspace-merged `todo.json` files), a **Status**
|
|
97
|
+
dropdown (All / Open / Done / Blocked / Late with counts), and two
|
|
98
|
+
expand/collapse multi-select chip panels — **Agent** (assignees used by
|
|
99
|
+
the tasks, from `people` plus raw assignee ids) and **Tag** (one chip per
|
|
100
|
+
tag, each with its task count). Each panel opens on button click, reveals its chip wall,
|
|
101
|
+
and filters the list in real time as chips are toggled; the button shows
|
|
102
|
+
a count badge while selections are active. Status, agent, and tag
|
|
103
|
+
filters combine; the Agent and Tag panels disappear when the dataset has
|
|
104
|
+
no assignees or no tags.
|
|
105
|
+
- **Task page** (`/folder/<id>/views/tasks/<taskAddress>`) — the full single
|
|
106
|
+
task: description, steps/acceptance criteria checklists, status/priority/
|
|
107
|
+
due/tags badges, a Notes strip (local note refs and https references, with
|
|
108
|
+
local refs clickable into the viewer's document view when the host serves
|
|
109
|
+
documents), external links, a complete/reopen toggle, and a
|
|
110
|
+
copy-context action. "Back to Tasks" returns to the list. An unknown id
|
|
111
|
+
returns `status: "error"` with a `message` like `Task not found: …`.
|
|
112
|
+
Advisory warnings stay hidden: a compact amber "Warnings (n)" button — at
|
|
113
|
+
the right end of the filter bar on the list and top-right on the task
|
|
114
|
+
page — opens them in a modal, so they never push the task list around.
|
|
115
|
+
The red error panel stays for hard errors that replace the view.
|
|
116
|
+
|
|
117
|
+
A workspace view merges several `todo.json` files, and file-local ids
|
|
118
|
+
(`todo:1`) repeat across files. The task address therefore qualifies the
|
|
119
|
+
task id with its owning folder: `<folderPathId(source folder)>@<taskId|key>`
|
|
120
|
+
(the same base64url folder id scheme as the `/folder/<id>` route, so the
|
|
121
|
+
address stays one URL-safe segment). Every link the plugin builds is
|
|
122
|
+
qualified. A bare `<taskId|key>` still works as a legacy address and
|
|
123
|
+
resolves to the first matching source; a qualified address that names a
|
|
124
|
+
real source but a missing task is an error, never a different task.
|
|
125
|
+
|
|
126
|
+
## Completing tasks
|
|
127
|
+
|
|
128
|
+
The tick buttons are write operations: `POST /api/tasks/toggle` with body
|
|
129
|
+
`{ "path": "<folder>", "id": "<taskAddress>" }` flips a task between
|
|
130
|
+
`todo` and `done`. The id accepts the same qualified
|
|
131
|
+
`<folderPathId(source folder)>@<taskId|key>` address as task page URLs, so
|
|
132
|
+
the write lands in the exact `todo.json` that owns the task even when ids
|
|
133
|
+
repeat across the workspace's files. Completing sets `status: "done"`, `done: true`,
|
|
134
|
+
`resolution: "completed"`, `completedAt`, and refreshes `updatedAt`;
|
|
135
|
+
reopening restores `status: "todo"` and clears `resolution`/`completedAt`.
|
|
136
|
+
The edit is written back to the owning `todo.json` preserving the file's
|
|
137
|
+
indent and trailing newline. The API enforces same-origin, rejects unknown
|
|
138
|
+
ids with `Task not found: …`, and is disabled entirely (403) on remote/
|
|
139
|
+
restricted hosts. Tasks in linked folders are read-only and never
|
|
140
|
+
editable.
|
|
141
|
+
|
|
142
|
+
## Content shape
|
|
143
|
+
|
|
144
|
+
### Source file (`todo.json`)
|
|
145
|
+
|
|
146
|
+
Located at the root of the served folder. Shape (`schema.json` in the
|
|
147
|
+
plugin source mirrors the published
|
|
148
|
+
`https://raggle.co/schemas/tasks.json`):
|
|
149
|
+
|
|
150
|
+
| Field | Meaning |
|
|
151
|
+
| --------- | ---------------------------------------------------------------- |
|
|
152
|
+
| `id` | Source id; default `"todo"` when absent |
|
|
153
|
+
| `title` | Project name; default `"<folder name> tasks"` when absent |
|
|
154
|
+
| `version` | `1` \| `2`; default `1` when absent |
|
|
155
|
+
| `$schema` | Schema reference; default `https://raggle.co/schemas/tasks.json` |
|
|
156
|
+
| `tasks` | Array of tasks |
|
|
157
|
+
|
|
158
|
+
Optional plan structures (`people`, `projects`, `cycles`, `milestones`,
|
|
159
|
+
`components`, `areas`, `integrations`, `customFields`, `automations`) are
|
|
160
|
+
carried through to the dataset.
|
|
161
|
+
|
|
162
|
+
### Task
|
|
163
|
+
|
|
164
|
+
| Field | Meaning |
|
|
165
|
+
| ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
166
|
+
| `name` | Required task title |
|
|
167
|
+
| `id`, `key`, `index`, `rank` | Identity/ordering |
|
|
168
|
+
| `status` | `todo` \| `in_progress` \| `blocked` \| `review` \| `done` \| `canceled` |
|
|
169
|
+
| `done` | Legacy boolean; `status: "done"` is authoritative in v2. Either marks the task complete |
|
|
170
|
+
| `type` | `task` \| `bug` \| `feature` \| `chore` \| `spike` \| `epic` \| `milestone` |
|
|
171
|
+
| `priority` | Integer `1`–`5` |
|
|
172
|
+
| `deadline` | `YYYY-MM-DD` |
|
|
173
|
+
| `assigneeIds`, `tags` | Assignment and labels. Tag every grouped todo: related or grouped tasks (subtasks of one epic, tasks in the same project or batch) share one short lowercase tag so the viewer groups them under that tag chip |
|
|
174
|
+
| `parentId`, `cycleId`, `milestoneIds`, `projectIds`, `componentIds`, `areaIds` | Links to plan structures |
|
|
175
|
+
| `estimate` | `points`, `minutes`, `confidence` |
|
|
176
|
+
| `notes` | Accompanying notes and file references. Each entry is a path relative to the owning `todo.json` folder (optionally `path.md#Section`) or an https URL. Give every task at least one note — the viewer warns when a task has none |
|
|
177
|
+
| `relations`, `links`, `comments`, `decisions` | Rich task metadata |
|
|
178
|
+
| `acceptanceCriteria`, `steps` | Check items (`id`, `text`, `done`) |
|
|
179
|
+
| `createdAt`, `updatedAt`, `startedAt`, `completedAt`, `canceledAt` | Timestamps |
|
|
180
|
+
|
|
181
|
+
### Dataset shaping
|
|
182
|
+
|
|
183
|
+
The plugin normalizes every discovered `todo.json` into one task dataset for
|
|
184
|
+
the viewed folder (recursively, like the calendar plugin): each file becomes
|
|
185
|
+
a `sources` entry (`[{ id, title, total, open }]`) keyed by the absolute
|
|
186
|
+
folder that owns it, every task is tagged with that `source`, and `summary`
|
|
187
|
+
(`{ completed, open, sources }`) aggregates them. The viewer renders a
|
|
188
|
+
compact open-task list with **folder filter chips** (shown when more than
|
|
189
|
+
one folder has tasks) — like mail — so a workspace root can narrow to a
|
|
190
|
+
nested project. An unparseable root file shows a clear error instead of a
|
|
191
|
+
broken view. A task subpath (`?subpath=<taskId|key>` or the task page URL)
|
|
192
|
+
returns the same dataset filtered to exactly that task.
|
|
193
|
+
|
|
194
|
+
### Note linking (`notes`)
|
|
195
|
+
|
|
196
|
+
Note linking is the core of a well-written todo: task data is small, and
|
|
197
|
+
the context lives in the accompanying notes. The convention:
|
|
198
|
+
|
|
199
|
+
- Every task carries at least one `notes` entry.
|
|
200
|
+
- An entry is either a note path **relative to the folder that owns the
|
|
201
|
+
`todo.json`** — optionally with a `#section` heading
|
|
202
|
+
(`notes/spec.md#Plan`) — or an https URL.
|
|
203
|
+
- Create or update the accompanying note in the same pass, and put the
|
|
204
|
+
related file references (specs, evidence, other notes, the task key —
|
|
205
|
+
for example "Tracked as `office/todo.json` TODO-7") into the note's
|
|
206
|
+
linked sections, so task and note point at each other.
|
|
207
|
+
- In the task view, local note chips open the note in the same viewer (the
|
|
208
|
+
web app passes a document-route builder; on hosts without one, chips are
|
|
209
|
+
labels), and https chips open externally.
|
|
210
|
+
|
|
211
|
+
### Warnings (soft validation)
|
|
212
|
+
|
|
213
|
+
Advisory problems stay out of the view until wanted: a compact amber
|
|
214
|
+
"Warnings (n)" button (right of the filter bar; on a task page, top-right)
|
|
215
|
+
opens the full list in a modal. Warnings never invalidate the file —
|
|
216
|
+
the badge keeps its count and the API stays `status: "available"`. Today's
|
|
217
|
+
warnings (`todoFileWarnings()` in `src/data/parse.ts` plus a server-side pass
|
|
218
|
+
in `src/server.ts`):
|
|
219
|
+
|
|
220
|
+
- `tasks[i].notes: no notes; link the accompanying note file or https
|
|
221
|
+
reference` — a task with an empty or absent `notes` array.
|
|
222
|
+
- `tasks[i].notes[j]: references a missing note file: <path>` — a
|
|
223
|
+
folder-relative entry that does not resolve to a file next to its owning
|
|
224
|
+
`todo.json` (checked by the server, not the synchronous file validator).
|
|
225
|
+
|
|
226
|
+
Warning paths use the same `tasks[i]` convention as validation issues,
|
|
227
|
+
relative to the file the task lives in. Warnings travel in the `warnings`
|
|
228
|
+
array of an available payload (separate from `issues`) and surface only
|
|
229
|
+
when the user opens the warnings modal. The modal has a "Copy fix
|
|
230
|
+
instructions for an agent" button: it copies a ready-made prompt that
|
|
231
|
+
lists the exact warnings and tells an agent to fix them — create or update
|
|
232
|
+
the accompanying notes, set the `notes` entries, connect file references
|
|
233
|
+
in the note's linked sections, repair dead paths, and keep `todo.json`
|
|
234
|
+
valid. Use it to hand the whole warning list to an agent in one step.
|
|
235
|
+
|
|
236
|
+
### Linked folders
|
|
237
|
+
|
|
238
|
+
When the served folder is connected to other repositories by Raggle links
|
|
239
|
+
(the same relation graph that powers linked notes in the Notes tab — for
|
|
240
|
+
example a `type: "notes"` entry in a workspace `raggle.json`), the host
|
|
241
|
+
passes those folders to the plugin and their `todo.json` files merge into
|
|
242
|
+
the same dataset as their own `sources` entries and folder chips. A folder
|
|
243
|
+
with no local `todo.json` still shows connected team to-dos, and detail
|
|
244
|
+
subpaths resolve across linked sources. Linked content is read-only and
|
|
245
|
+
never appears for remote or restricted hosts.
|
|
246
|
+
|
|
247
|
+
### Validation errors
|
|
248
|
+
|
|
249
|
+
Files that exist but are not valid show their problems instead of a generic
|
|
250
|
+
error: the Tasks tab gets a warning badge and the view lists each issue as
|
|
251
|
+
`path: message` lines (for example
|
|
252
|
+
`tasks[2].status: must be one of todo, in_progress, blocked, review, done,
|
|
253
|
+
canceled; got "in-progress"`). The same rules live in `src/data/parse.ts` and
|
|
254
|
+
are
|
|
255
|
+
exported as `@raggle-ai/tasks/parse`; `validateTodoFile()` returns the issue
|
|
256
|
+
list and `parseTodoSource()` turns invalid JSON into an issue rather than
|
|
257
|
+
throwing. Advisory (warning-severity) problems never produce this badge —
|
|
258
|
+
see the "Warnings (soft validation)" section above.
|
|
259
|
+
|
|
260
|
+
### Schema decode failures ("Task data is not valid.")
|
|
261
|
+
|
|
262
|
+
There are two validation layers, and a file can pass one and fail the other:
|
|
263
|
+
|
|
264
|
+
1. **File validation** (`validateTodoFile()` in `src/data/parse.ts`) checks
|
|
265
|
+
JSON
|
|
266
|
+
well-formedness and basic field rules. Its issues render as `path:
|
|
267
|
+
message` lines and reach the API as `status: "error"`.
|
|
268
|
+
2. **Strict schema decode** — the viewer decodes the merged dataset against
|
|
269
|
+
the schema in `src/data/todo-model.ts`, mirrored by `schema.json` and
|
|
270
|
+
the published `https://raggle.co/schemas/tasks.json`. When this fails the
|
|
271
|
+
view shows a red "Task data is not valid." panel with a failure tree, but
|
|
272
|
+
`/api/plugins/tasks` still returns `status: "available"` — so the API
|
|
273
|
+
issues check alone does not prove the file renders.
|
|
274
|
+
|
|
275
|
+
The failure tree is an Effect Schema tree. Read its bracketed keys as a JSON
|
|
276
|
+
path into `todo.json`: `"tasks" -> [7] -> "resolution"` means
|
|
277
|
+
`tasks[7].resolution` in the source file. The number is the task's position
|
|
278
|
+
in the `tasks` array; tasks from linked folders follow the local file's. The
|
|
279
|
+
leaves list every accepted value, and `Expected X, actual Y` shows the
|
|
280
|
+
current value.
|
|
281
|
+
|
|
282
|
+
Common causes and fixes:
|
|
283
|
+
|
|
284
|
+
- Enum fields given free text: `resolution` accepts only `completed`,
|
|
285
|
+
`duplicate`, `wont_do`, `not_reproducible`, `moved`, or null; `status` and
|
|
286
|
+
`type` are enums too. Move the sentence into a `comments` entry (`id` +
|
|
287
|
+
`body` + `createdAt`) or into `description`, then set the field to an
|
|
288
|
+
allowed value (finished work uses `resolution: "completed"`).
|
|
289
|
+
- Missing required fields: each `comments` entry needs `id`, `body`, and
|
|
290
|
+
`createdAt` (ISO date-time); each task needs `name`.
|
|
291
|
+
- Shape mismatches: `null` where a string is required or the reverse, dates
|
|
292
|
+
not in `YYYY-MM-DD`, timestamps not ISO.
|
|
293
|
+
|
|
294
|
+
To validate a fix, either re-open the Tasks tab (no red panel and counts
|
|
295
|
+
match the file = valid), or decode the same payload the viewer uses:
|
|
296
|
+
|
|
297
|
+
```sh
|
|
298
|
+
curl -fsS "$URL/api/plugins/tasks?path=<folder>" | jq -c '.dataset' > /tmp/dataset.json
|
|
299
|
+
bun -e 'const { decodeTodoDataset } = await import("@raggle-ai/tasks/todo-model");
|
|
300
|
+
decodeTodoDataset(await Bun.file("/tmp/dataset.json").json());
|
|
301
|
+
console.log("decode ok")'
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
The decode import resolves inside the Kennel checkout, or anywhere
|
|
305
|
+
`@raggle-ai/tasks` is installed.
|
|
306
|
+
|
|
307
|
+
## Verification
|
|
308
|
+
|
|
309
|
+
- Server alive: `curl -fsS --connect-timeout 3 --max-time 5 "$URL/api/health"`
|
|
310
|
+
- Folder root: request `/api/documents` and confirm `root` is the requested
|
|
311
|
+
absolute folder.
|
|
312
|
+
- Tasks availability: the Tasks plugin tab is present and its badge equals the
|
|
313
|
+
number of tasks in the root `todo.json` plus any linked folders' task
|
|
314
|
+
files; an invalid file (local or linked) shows a warning marker instead of
|
|
315
|
+
a badge.
|
|
316
|
+
- Invalid file: `/api/plugins/tasks?path=<folder>` returns `status: "error"`
|
|
317
|
+
with the `issues` array (`path` + `message` per problem) and the view shows
|
|
318
|
+
them; it never 404s or renders a broken/empty list for a file that exists.
|
|
319
|
+
Note that `status: "available"` does not prove the file renders — the
|
|
320
|
+
strict client-side decode can still fail (see the "Schema decode failures"
|
|
321
|
+
section); re-open the Tasks tab or decode `dataset` with
|
|
322
|
+
`decodeTodoDataset` from `@raggle-ai/tasks/todo-model` to be sure.
|
|
323
|
+
- Counts: `summary.completed` equals the count of tasks with `done: true` or
|
|
324
|
+
`status: "done"`; `summary.open` equals the remainder. Task names and
|
|
325
|
+
statuses in the view match the source file.
|
|
326
|
+
- Warnings: tasks with no `notes` entries (or dead folder-relative note
|
|
327
|
+
paths) produce an amber "Warnings (n)" button on the Tasks view; open it
|
|
328
|
+
for the full lines, and `/api/plugins/tasks?path=<folder>` returns the
|
|
329
|
+
same lines in its `warnings` array. Warnings never change `status`, the
|
|
330
|
+
badge, or the counts; a valid file with warnings is still valid.
|
|
331
|
+
|
|
332
|
+
## Boundaries
|
|
333
|
+
|
|
334
|
+
- This plugin is read-only: it detects and renders `todo.json`. Editing tasks
|
|
335
|
+
follows the repo's normal `todo.json` conventions (for example the 2do CLI
|
|
336
|
+
or direct file edits), not this plugin — except `kennel init`, which only
|
|
337
|
+
scaffolds a starter file when none exists (or with `--force`).
|
|
338
|
+
- Do not invent tasks, statuses, counts, or validation fixes — read the file
|
|
339
|
+
and report exact issues.
|
|
340
|
+
- The tasks view only exists inside the Kennel viewer (server + web app); the
|
|
341
|
+
`@raggle-ai/tasks` package is not a standalone CLI.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@raggle-ai/tasks",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Tasks folder plugin: valid todo.json detection and task dataset loading for Kennel folders.",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"prettier": "@raggle-ai/prettier-config",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/raggle-ai/kennel.git",
|
|
12
|
+
"directory": "plugins/tasks"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"registry": "https://registry.npmjs.org",
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"src"
|
|
20
|
+
],
|
|
21
|
+
"exports": {
|
|
22
|
+
".": "./src/index.ts",
|
|
23
|
+
"./api": "./src/api.ts",
|
|
24
|
+
"./client": "./src/client.tsx",
|
|
25
|
+
"./manifest": "./src/manifest.ts",
|
|
26
|
+
"./parse": "./src/data/parse.ts",
|
|
27
|
+
"./server": "./src/server.ts",
|
|
28
|
+
"./todo-model": "./src/data/todo-model.ts",
|
|
29
|
+
"./todo-model/styles.css": "./src/styles.css"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"test": "bun test test/*.test.mjs",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"format": "prettier . --check --cache --cache-location .cache/.prettiercache --ignore-path ../../.prettierignore",
|
|
35
|
+
"format:fix": "prettier . --write --cache --cache-location .cache/.prettiercache --ignore-path ../../.prettierignore",
|
|
36
|
+
"lint": "eslint . --cache --cache-location .cache/.eslintcache",
|
|
37
|
+
"lint:fix": "eslint . --fix --cache --cache-location .cache/.eslintcache",
|
|
38
|
+
"clean": "git clean -xdf dist node_modules .cache .turbo/cache",
|
|
39
|
+
"pack:check": "npm pack --dry-run",
|
|
40
|
+
"publish:public:dry-run": "npm --@raggle-ai:registry=https://registry.npmjs.org publish --dry-run --access public --registry=https://registry.npmjs.org"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@raggle-ai/folder-plugin": "workspace:*",
|
|
44
|
+
"@raggle-ai/ui": "workspace:*",
|
|
45
|
+
"@tanstack/react-query": "catalog:tanstack",
|
|
46
|
+
"effect": "^3.19.7",
|
|
47
|
+
"lucide-react": "^0.562.0"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"react": ">=18.3.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/compat": "catalog:eslint",
|
|
54
|
+
"@eslint/eslintrc": "catalog:eslint",
|
|
55
|
+
"@ianvs/prettier-plugin-sort-imports": "catalog:prettier",
|
|
56
|
+
"@prettier/plugin-oxc": "catalog:prettier",
|
|
57
|
+
"@raggle-ai/eslint-config": "workspace:*",
|
|
58
|
+
"@raggle-ai/prettier-config": "workspace:*",
|
|
59
|
+
"@raggle-ai/tsconfig": "workspace:*",
|
|
60
|
+
"@types/node": "catalog:",
|
|
61
|
+
"@types/react": "catalog:react19",
|
|
62
|
+
"@types/react-dom": "catalog:react19",
|
|
63
|
+
"eslint": "catalog:eslint",
|
|
64
|
+
"eslint-plugin-unused-imports": "catalog:eslint",
|
|
65
|
+
"prettier": "catalog:prettier",
|
|
66
|
+
"prettier-plugin-classnames": "catalog:prettier",
|
|
67
|
+
"prettier-plugin-merge": "catalog:prettier",
|
|
68
|
+
"prettier-plugin-tailwindcss": "catalog:prettier",
|
|
69
|
+
"react": "catalog:react19",
|
|
70
|
+
"react-dom": "catalog:react19",
|
|
71
|
+
"typescript": "catalog:",
|
|
72
|
+
"typescript-eslint": "catalog:eslint"
|
|
73
|
+
}
|
|
74
|
+
}
|