@agent-native/core 0.101.14 → 0.102.1
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/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/templates-meta.ts +13 -0
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +1 -1
- package/corpus/core/src/client/org/OrgSwitcher.tsx +2 -0
- package/corpus/templates/analytics/changelog/2026-07-15-fixed-the-agent-discarding-a-successful-dashboard-edit-and-r.md +6 -0
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +30 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +15 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +59 -4
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +9 -0
- package/corpus/templates/content/actions/preview-builder-source-review.ts +6 -4
- package/corpus/templates/content/app/components/editor/DescriptionField.tsx +10 -2
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +4 -0
- package/corpus/templates/content/changelog/2026-07-15-page-and-database-descriptions-now-use-a-clean-single-line-f.md +6 -0
- package/corpus/templates/content/changelog/2026-07-15-selected-builder-reviews-now-load-only-the-chosen-rows-avoid.md +6 -0
- package/corpus/templates/content/shared/api.ts +1 -0
- package/corpus/templates/tasks/.agents/commands/visual-plan.md +9 -0
- package/corpus/templates/tasks/.agents/commands/visual-recap.md +8 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +492 -0
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +189 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +76 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/README.md +43 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +110 -0
- package/corpus/templates/tasks/.agents/skills/agent-watchdog/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/capture-learnings/SKILL.md +89 -0
- package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +83 -0
- package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +221 -0
- package/corpus/templates/tasks/.agents/skills/delegate-to-agent/SKILL.md +263 -0
- package/corpus/templates/tasks/.agents/skills/efficient-fable/README.md +75 -0
- package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +95 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/README.md +53 -0
- package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +73 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +112 -0
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/README.md +41 -0
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +114 -0
- package/corpus/templates/tasks/.agents/skills/plan-arbiter/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/README.md +42 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +104 -0
- package/corpus/templates/tasks/.agents/skills/plow-ahead/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/README.md +55 -0
- package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +54 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/README.md +54 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +126 -0
- package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/agents/openai.yaml +4 -0
- package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +232 -0
- package/corpus/templates/tasks/.agents/skills/security/SKILL.md +280 -0
- package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +106 -0
- package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +95 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/README.md +61 -0
- package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +83 -0
- package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/SKILL.md +547 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/agent-native-skill.json +12 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/canvas.md +121 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/document-quality.md +178 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/exemplar.md +62 -0
- package/corpus/templates/tasks/.agents/skills/visual-plan/references/wireframe.md +264 -0
- package/corpus/templates/tasks/.agents/skills/visual-recap/SKILL.md +634 -0
- package/corpus/templates/tasks/.agents/skills/visual-recap/agent-native-skill.json +12 -0
- package/corpus/templates/tasks/.agents/skills/visual-recap/references/wireframe.md +264 -0
- package/corpus/templates/tasks/.claude/commands/visual-plan.md +9 -0
- package/corpus/templates/tasks/.claude/commands/visual-recap.md +8 -0
- package/corpus/templates/tasks/.env.example +5 -0
- package/corpus/templates/tasks/.ignore +0 -0
- package/corpus/templates/tasks/.prettierrc +5 -0
- package/corpus/templates/tasks/AGENTS.md +158 -0
- package/corpus/templates/tasks/DEVELOPING.md +185 -0
- package/corpus/templates/tasks/README.md +16 -0
- package/corpus/templates/tasks/actions/bulk-delete-inbox-items.ts +24 -0
- package/corpus/templates/tasks/actions/bulk-delete-tasks.ts +21 -0
- package/corpus/templates/tasks/actions/bulk-mark-inbox-items-ready.ts +27 -0
- package/corpus/templates/tasks/actions/bulk-update-tasks.ts +35 -0
- package/corpus/templates/tasks/actions/create-custom-field.ts +22 -0
- package/corpus/templates/tasks/actions/create-inbox-item.ts +30 -0
- package/corpus/templates/tasks/actions/create-task.ts +33 -0
- package/corpus/templates/tasks/actions/delete-custom-field.ts +19 -0
- package/corpus/templates/tasks/actions/delete-inbox-item.ts +17 -0
- package/corpus/templates/tasks/actions/delete-task.ts +17 -0
- package/corpus/templates/tasks/actions/lib/boolean-query-param.ts +30 -0
- package/corpus/templates/tasks/actions/list-custom-fields.ts +18 -0
- package/corpus/templates/tasks/actions/list-inbox-items.ts +16 -0
- package/corpus/templates/tasks/actions/list-tasks.ts +52 -0
- package/corpus/templates/tasks/actions/list-visible-task-fields.ts +18 -0
- package/corpus/templates/tasks/actions/mark-inbox-item-ready.ts +31 -0
- package/corpus/templates/tasks/actions/navigate.ts +51 -0
- package/corpus/templates/tasks/actions/reorder-custom-fields.ts +27 -0
- package/corpus/templates/tasks/actions/reorder-inbox-items.ts +24 -0
- package/corpus/templates/tasks/actions/reorder-tasks.ts +29 -0
- package/corpus/templates/tasks/actions/run.ts +2 -0
- package/corpus/templates/tasks/actions/update-custom-field.ts +33 -0
- package/corpus/templates/tasks/actions/update-inbox-item.ts +24 -0
- package/corpus/templates/tasks/actions/update-task.ts +68 -0
- package/corpus/templates/tasks/actions/update-visible-task-fields.ts +27 -0
- package/corpus/templates/tasks/actions/view-screen-helpers.ts +68 -0
- package/corpus/templates/tasks/actions/view-screen.ts +207 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldCreateBar.tsx +121 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldListRow.tsx +116 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldsList.tsx +225 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldsListSkeleton.tsx +18 -0
- package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +42 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/FieldEditorSidebar.tsx +69 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/FieldTitleSection.tsx +32 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/CurrencyConfigControl.tsx +49 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/FieldConfigControl.tsx +56 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/NumberConfigControl.tsx +52 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/PercentConfigControl.tsx +30 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/SelectConfigControl.tsx +135 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/select-colors.ts +23 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/config/utils.ts +52 -0
- package/corpus/templates/tasks/app/components/custom-fields/editor/types.ts +7 -0
- package/corpus/templates/tasks/app/components/dnd/SortableItem.tsx +72 -0
- package/corpus/templates/tasks/app/components/dnd/SortableList.tsx +136 -0
- package/corpus/templates/tasks/app/components/dnd/reorder-moving-items.ts +160 -0
- package/corpus/templates/tasks/app/components/dnd/sortable-drag-props.ts +60 -0
- package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +222 -0
- package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +39 -0
- package/corpus/templates/tasks/app/components/inbox/InboxListRow.tsx +122 -0
- package/corpus/templates/tasks/app/components/layout/Header.tsx +55 -0
- package/corpus/templates/tasks/app/components/layout/HeaderActions.tsx +84 -0
- package/corpus/templates/tasks/app/components/layout/Layout.tsx +134 -0
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +211 -0
- package/corpus/templates/tasks/app/components/shared/AddListItemInput.tsx +57 -0
- package/corpus/templates/tasks/app/components/shared/AlertDialog.tsx +53 -0
- package/corpus/templates/tasks/app/components/shared/BulkDeleteDialog.tsx +76 -0
- package/corpus/templates/tasks/app/components/shared/ChipSelect.tsx +240 -0
- package/corpus/templates/tasks/app/components/shared/DeleteItemDialog.tsx +40 -0
- package/corpus/templates/tasks/app/components/shared/InlineEditable.tsx +166 -0
- package/corpus/templates/tasks/app/components/shared/ListEmptyState.tsx +13 -0
- package/corpus/templates/tasks/app/components/shared/ListErrorMessage.tsx +15 -0
- package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +75 -0
- package/corpus/templates/tasks/app/components/shared/PageHeader.tsx +25 -0
- package/corpus/templates/tasks/app/components/shared/RowActionsMenu.tsx +42 -0
- package/corpus/templates/tasks/app/components/shared/SidePanel.tsx +99 -0
- package/corpus/templates/tasks/app/components/shared/dnd/ListRowPreview.tsx +37 -0
- package/corpus/templates/tasks/app/components/shared/list/List.tsx +63 -0
- package/corpus/templates/tasks/app/components/shared/list/ListRow.tsx +159 -0
- package/corpus/templates/tasks/app/components/shared/list/ListRowDragHandle.tsx +52 -0
- package/corpus/templates/tasks/app/components/shared/list/ListSkeletonRows.tsx +11 -0
- package/corpus/templates/tasks/app/components/shared/list/SortableListItemShell.tsx +32 -0
- package/corpus/templates/tasks/app/components/shared/list/types.ts +1 -0
- package/corpus/templates/tasks/app/components/shared/selection/ListSelectionBar.tsx +158 -0
- package/corpus/templates/tasks/app/components/shared/selection/ListSelectionHeaderToggle.tsx +28 -0
- package/corpus/templates/tasks/app/components/shared/selection/ListSelectionToolbar.tsx +81 -0
- package/corpus/templates/tasks/app/components/shared/selection/get-list-row-selection-ui.ts +41 -0
- package/corpus/templates/tasks/app/components/shared/selection/use-list-selection.ts +196 -0
- package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +333 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListHeaderRow.tsx +46 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +115 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.css +49 -0
- package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +307 -0
- package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +102 -0
- package/corpus/templates/tasks/app/components/tasks/fields/TaskTitleSection.tsx +27 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/DateValueControl.tsx +21 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/FieldValueControl.tsx +76 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/MultiSelectValueControl.tsx +52 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/NumberValueControl.tsx +56 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/RichTextValueControl.tsx +115 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/SingleSelectValueControl.tsx +61 -0
- package/corpus/templates/tasks/app/components/tasks/fields/controls/TextValueControl.tsx +20 -0
- package/corpus/templates/tasks/app/components/tasks/use-task-row-completion-animation.ts +181 -0
- package/corpus/templates/tasks/app/components/ui/accordion.tsx +56 -0
- package/corpus/templates/tasks/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/alert.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +5 -0
- package/corpus/templates/tasks/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +115 -0
- package/corpus/templates/tasks/app/components/ui/button.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/calendar.tsx +70 -0
- package/corpus/templates/tasks/app/components/ui/card.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/carousel.tsx +260 -0
- package/corpus/templates/tasks/app/components/ui/chart.tsx +379 -0
- package/corpus/templates/tasks/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/command.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/context-menu.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/drawer.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/form.tsx +177 -0
- package/corpus/templates/tasks/app/components/ui/hover-card.tsx +27 -0
- package/corpus/templates/tasks/app/components/ui/input-otp.tsx +69 -0
- package/corpus/templates/tasks/app/components/ui/input.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/label.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/menubar.tsx +254 -0
- package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +128 -0
- package/corpus/templates/tasks/app/components/ui/pagination.tsx +121 -0
- package/corpus/templates/tasks/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/radio-group.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/resizable.tsx +43 -0
- package/corpus/templates/tasks/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/select.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/sidebar.tsx +782 -0
- package/corpus/templates/tasks/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/table.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toast.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/toggle.tsx +43 -0
- package/corpus/templates/tasks/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/tasks/app/components/ui/use-toast.ts +3 -0
- package/corpus/templates/tasks/app/entry.client.tsx +19 -0
- package/corpus/templates/tasks/app/entry.server.tsx +10 -0
- package/corpus/templates/tasks/app/global.css +93 -0
- package/corpus/templates/tasks/app/hooks/cache.ts +31 -0
- package/corpus/templates/tasks/app/hooks/use-custom-fields.ts +93 -0
- package/corpus/templates/tasks/app/hooks/use-inbox-items.ts +196 -0
- package/corpus/templates/tasks/app/hooks/use-mobile.tsx +21 -0
- package/corpus/templates/tasks/app/hooks/use-navigation-state.ts +40 -0
- package/corpus/templates/tasks/app/hooks/use-tasks.ts +276 -0
- package/corpus/templates/tasks/app/hooks/use-toast.ts +188 -0
- package/corpus/templates/tasks/app/hooks/use-visible-task-fields.ts +140 -0
- package/corpus/templates/tasks/app/lib/app-config.ts +11 -0
- package/corpus/templates/tasks/app/lib/tab-id.ts +1 -0
- package/corpus/templates/tasks/app/lib/utils.ts +1 -0
- package/corpus/templates/tasks/app/root.tsx +130 -0
- package/corpus/templates/tasks/app/routes/_index.tsx +22 -0
- package/corpus/templates/tasks/app/routes/extensions.$id.$slug.tsx +2 -0
- package/corpus/templates/tasks/app/routes/extensions.$id.tsx +11 -0
- package/corpus/templates/tasks/app/routes/extensions._index.tsx +11 -0
- package/corpus/templates/tasks/app/routes/extensions.tsx +5 -0
- package/corpus/templates/tasks/app/routes/fields.tsx +16 -0
- package/corpus/templates/tasks/app/routes/inbox.tsx +16 -0
- package/corpus/templates/tasks/app/routes/tasks.tsx +17 -0
- package/corpus/templates/tasks/app/routes/team.tsx +17 -0
- package/corpus/templates/tasks/app/routes.ts +4 -0
- package/corpus/templates/tasks/app/vite-env.d.ts +6 -0
- package/corpus/templates/tasks/components.json +20 -0
- package/corpus/templates/tasks/data/sync-config.json +1 -0
- package/corpus/templates/tasks/docs/features/README.md +81 -0
- package/corpus/templates/tasks/docs/features/f1-tasks.mdx +67 -0
- package/corpus/templates/tasks/docs/features/f2-custom-fields.mdx +68 -0
- package/corpus/templates/tasks/docs/features/f3-projects.mdx +33 -0
- package/corpus/templates/tasks/docs/features/f4-inbox.mdx +55 -0
- package/corpus/templates/tasks/docs/features/f5-views.mdx +65 -0
- package/corpus/templates/tasks/docs/features/f6-search.mdx +43 -0
- package/corpus/templates/tasks/docs/features/f7-first-run.mdx +66 -0
- package/corpus/templates/tasks/docs/features/f8-chat.mdx +120 -0
- package/corpus/templates/tasks/e2e/global-setup.ts +42 -0
- package/corpus/templates/tasks/e2e/helpers/inbox.ts +71 -0
- package/corpus/templates/tasks/e2e/helpers/tasks.ts +99 -0
- package/corpus/templates/tasks/learnings.defaults.md +5 -0
- package/corpus/templates/tasks/netlify.toml +10 -0
- package/corpus/templates/tasks/package.json +104 -0
- package/corpus/templates/tasks/playwright.config.ts +34 -0
- package/corpus/templates/tasks/public/agent-native-icon-dark.svg +10 -0
- package/corpus/templates/tasks/public/agent-native-icon-light.svg +10 -0
- package/corpus/templates/tasks/public/agent-native-logo-dark.svg +21 -0
- package/corpus/templates/tasks/public/agent-native-logo-light.svg +21 -0
- package/corpus/templates/tasks/public/favicon.svg +1 -0
- package/corpus/templates/tasks/public/icon-180.svg +1 -0
- package/corpus/templates/tasks/public/icon-192.svg +1 -0
- package/corpus/templates/tasks/public/icon-512.svg +1 -0
- package/corpus/templates/tasks/public/manifest.json +21 -0
- package/corpus/templates/tasks/react-router.config.ts +7 -0
- package/corpus/templates/tasks/server/custom-fields/normalize.ts +163 -0
- package/corpus/templates/tasks/server/custom-fields/parse.ts +146 -0
- package/corpus/templates/tasks/server/custom-fields/schema.ts +147 -0
- package/corpus/templates/tasks/server/custom-fields/store.ts +425 -0
- package/corpus/templates/tasks/server/custom-fields/task-fields.ts +104 -0
- package/corpus/templates/tasks/server/custom-fields/types.ts +98 -0
- package/corpus/templates/tasks/server/custom-fields/validate.ts +210 -0
- package/corpus/templates/tasks/server/custom-fields/values/store.ts +386 -0
- package/corpus/templates/tasks/server/db/bulk-write.ts +30 -0
- package/corpus/templates/tasks/server/db/index.ts +5 -0
- package/corpus/templates/tasks/server/db/record-utils.ts +7 -0
- package/corpus/templates/tasks/server/db/schema.ts +67 -0
- package/corpus/templates/tasks/server/db/test-tasks-table.ts +76 -0
- package/corpus/templates/tasks/server/db/transaction.ts +6 -0
- package/corpus/templates/tasks/server/errors.ts +31 -0
- package/corpus/templates/tasks/server/inbox/store.ts +216 -0
- package/corpus/templates/tasks/server/middleware/auth.ts +15 -0
- package/corpus/templates/tasks/server/plugins/agent-chat.ts +46 -0
- package/corpus/templates/tasks/server/plugins/auth.ts +15 -0
- package/corpus/templates/tasks/server/plugins/db.ts +90 -0
- package/corpus/templates/tasks/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/tasks/server/stored-items/store.ts +548 -0
- package/corpus/templates/tasks/server/tasks/store.ts +306 -0
- package/corpus/templates/tasks/server/user-config/store.ts +138 -0
- package/corpus/templates/tasks/shared/app-state-tabs.ts +15 -0
- package/corpus/templates/tasks/shared/boolean-param.ts +22 -0
- package/corpus/templates/tasks/shared/bulk-limits.ts +7 -0
- package/corpus/templates/tasks/shared/list-screen-snapshot.ts +90 -0
- package/corpus/templates/tasks/shared/navigation.ts +104 -0
- package/corpus/templates/tasks/shared/visible-task-fields.ts +2 -0
- package/corpus/templates/tasks/ssr-entry.ts +15 -0
- package/corpus/templates/tasks/tsconfig.json +24 -0
- package/corpus/templates/tasks/vite.config.ts +19 -0
- package/corpus/templates/tasks/vitest.config.ts +8 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +13 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +1 -1
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +2 -1
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +5 -5
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { useDbSync } from "@agent-native/core/client";
|
|
2
|
+
import {
|
|
3
|
+
AppProviders,
|
|
4
|
+
CommandMenu,
|
|
5
|
+
appPath,
|
|
6
|
+
configureTracking,
|
|
7
|
+
createAgentNativeQueryClient,
|
|
8
|
+
getThemeInitScript,
|
|
9
|
+
useCommandMenuShortcut,
|
|
10
|
+
} from "@agent-native/core/client";
|
|
11
|
+
import { IconSun, IconMoon } from "@tabler/icons-react";
|
|
12
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
13
|
+
import { useTheme } from "next-themes";
|
|
14
|
+
import { useCallback, useState } from "react";
|
|
15
|
+
import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router";
|
|
16
|
+
import type { LinksFunction } from "react-router";
|
|
17
|
+
|
|
18
|
+
import { Layout as AppLayout } from "@/components/layout/Layout";
|
|
19
|
+
import { Toaster } from "@/components/ui/sonner";
|
|
20
|
+
import { useNavigationState } from "@/hooks/use-navigation-state";
|
|
21
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
22
|
+
import { TAB_ID } from "@/lib/tab-id";
|
|
23
|
+
|
|
24
|
+
import stylesheet from "./global.css?url";
|
|
25
|
+
|
|
26
|
+
configureTracking({
|
|
27
|
+
getDefaultProps: (_name, properties) => ({
|
|
28
|
+
...properties,
|
|
29
|
+
app: "tasks",
|
|
30
|
+
template: "tasks",
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
export const links: LinksFunction = () => [
|
|
35
|
+
{ rel: "stylesheet", href: stylesheet },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const THEME_INIT_SCRIPT = getThemeInitScript();
|
|
39
|
+
|
|
40
|
+
export function Layout({ children }: { children: React.ReactNode }) {
|
|
41
|
+
return (
|
|
42
|
+
<html lang="en" suppressHydrationWarning>
|
|
43
|
+
<head>
|
|
44
|
+
<meta charSet="utf-8" />
|
|
45
|
+
<meta
|
|
46
|
+
name="viewport"
|
|
47
|
+
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
|
|
48
|
+
/>
|
|
49
|
+
<script
|
|
50
|
+
suppressHydrationWarning
|
|
51
|
+
dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
|
|
52
|
+
/>
|
|
53
|
+
<link rel="manifest" href={appPath("/manifest.json")} />
|
|
54
|
+
<meta name="theme-color" content="#18181B" />
|
|
55
|
+
<meta name="mobile-web-app-capable" content="yes" />
|
|
56
|
+
<meta
|
|
57
|
+
name="apple-mobile-web-app-status-bar-style"
|
|
58
|
+
content="black-translucent"
|
|
59
|
+
/>
|
|
60
|
+
<meta name="apple-mobile-web-app-title" content={APP_TITLE} />
|
|
61
|
+
<link rel="icon" type="image/svg+xml" href={appPath("/favicon.svg")} />
|
|
62
|
+
<link rel="apple-touch-icon" href={appPath("/icon-180.svg")} />
|
|
63
|
+
<Meta />
|
|
64
|
+
<Links />
|
|
65
|
+
</head>
|
|
66
|
+
<body>
|
|
67
|
+
{children}
|
|
68
|
+
<ScrollRestoration />
|
|
69
|
+
<Scripts />
|
|
70
|
+
</body>
|
|
71
|
+
</html>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function DbSyncSetup() {
|
|
76
|
+
const qc = useQueryClient();
|
|
77
|
+
useNavigationState();
|
|
78
|
+
useDbSync({
|
|
79
|
+
queryClient: qc,
|
|
80
|
+
ignoreSource: TAB_ID,
|
|
81
|
+
});
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function ThemeToggleItem() {
|
|
86
|
+
const { resolvedTheme, setTheme } = useTheme();
|
|
87
|
+
const isDark = resolvedTheme === "dark";
|
|
88
|
+
return (
|
|
89
|
+
<CommandMenu.Item
|
|
90
|
+
onSelect={() => setTheme(isDark ? "light" : "dark")}
|
|
91
|
+
keywords={["theme", "dark", "light", "mode"]}
|
|
92
|
+
>
|
|
93
|
+
{isDark ? <IconSun size={16} /> : <IconMoon size={16} />}
|
|
94
|
+
Toggle {isDark ? "light" : "dark"} mode
|
|
95
|
+
</CommandMenu.Item>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function AppContent() {
|
|
100
|
+
const [cmdkOpen, setCmdkOpen] = useState(false);
|
|
101
|
+
useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
|
|
102
|
+
return (
|
|
103
|
+
<>
|
|
104
|
+
<CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
|
|
105
|
+
<CommandMenu.Group heading="Actions">
|
|
106
|
+
<CommandMenu.Item onSelect={() => {}}>Search</CommandMenu.Item>
|
|
107
|
+
</CommandMenu.Group>
|
|
108
|
+
<CommandMenu.Group heading="Appearance">
|
|
109
|
+
<ThemeToggleItem />
|
|
110
|
+
</CommandMenu.Group>
|
|
111
|
+
</CommandMenu>
|
|
112
|
+
<Toaster position="bottom-left" />
|
|
113
|
+
<AppLayout>
|
|
114
|
+
<Outlet />
|
|
115
|
+
</AppLayout>
|
|
116
|
+
</>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export default function Root() {
|
|
121
|
+
const [queryClient] = useState(() => createAgentNativeQueryClient());
|
|
122
|
+
return (
|
|
123
|
+
<AppProviders queryClient={queryClient}>
|
|
124
|
+
<DbSyncSetup />
|
|
125
|
+
<AppContent />
|
|
126
|
+
</AppProviders>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export { ErrorBoundary } from "@agent-native/core/client";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { redirect } from "react-router";
|
|
2
|
+
|
|
3
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
4
|
+
|
|
5
|
+
export function meta() {
|
|
6
|
+
return [
|
|
7
|
+
{ title: APP_TITLE },
|
|
8
|
+
{
|
|
9
|
+
name: "description",
|
|
10
|
+
content:
|
|
11
|
+
"Redirect to the task list home for this agent-native tasks app.",
|
|
12
|
+
},
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function loader() {
|
|
17
|
+
return redirect("/tasks");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default function IndexRedirect() {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExtensionViewerPage } from "@agent-native/core/client/extensions";
|
|
2
|
+
|
|
3
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
4
|
+
|
|
5
|
+
export function meta() {
|
|
6
|
+
return [{ title: `Extension — ${APP_TITLE}` }];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default function ExtensionViewerRoute() {
|
|
10
|
+
return <ExtensionViewerPage />;
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExtensionsListPage } from "@agent-native/core/client/extensions";
|
|
2
|
+
|
|
3
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
4
|
+
|
|
5
|
+
export function meta() {
|
|
6
|
+
return [{ title: `Extensions — ${APP_TITLE}` }];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default function ExtensionsRoute() {
|
|
10
|
+
return <ExtensionsListPage />;
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FieldsPage } from "@/components/custom-fields/FieldsPage";
|
|
2
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
3
|
+
|
|
4
|
+
export function meta() {
|
|
5
|
+
return [
|
|
6
|
+
{ title: `Fields · ${APP_TITLE}` },
|
|
7
|
+
{
|
|
8
|
+
name: "description",
|
|
9
|
+
content: "Define reusable custom fields for tasks.",
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default function FieldsRoute() {
|
|
15
|
+
return <FieldsPage />;
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { InboxListPage } from "@/components/inbox/InboxListPage";
|
|
2
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
3
|
+
|
|
4
|
+
export function meta() {
|
|
5
|
+
return [
|
|
6
|
+
{ title: `Inbox · ${APP_TITLE}` },
|
|
7
|
+
{
|
|
8
|
+
name: "description",
|
|
9
|
+
content: "Capture rough ideas in the inbox before they become tasks.",
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default function InboxRoute() {
|
|
15
|
+
return <InboxListPage />;
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TaskListPage } from "@/components/tasks/TaskListPage";
|
|
2
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
3
|
+
|
|
4
|
+
export function meta() {
|
|
5
|
+
return [
|
|
6
|
+
{ title: `Tasks · ${APP_TITLE}` },
|
|
7
|
+
{
|
|
8
|
+
name: "description",
|
|
9
|
+
content:
|
|
10
|
+
"Manage tasks, reorder by drag-and-drop, and ask chat to add or update reminders.",
|
|
11
|
+
},
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default function TasksRoute() {
|
|
16
|
+
return <TaskListPage />;
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TeamPage } from "@agent-native/core/client/org";
|
|
2
|
+
|
|
3
|
+
import { useSetPageTitle } from "@/components/layout/HeaderActions";
|
|
4
|
+
import { APP_TITLE } from "@/lib/app-config";
|
|
5
|
+
|
|
6
|
+
export function meta() {
|
|
7
|
+
return [{ title: `Team — ${APP_TITLE}` }];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default function TeamRoute() {
|
|
11
|
+
useSetPageTitle("Team");
|
|
12
|
+
return (
|
|
13
|
+
<main className="mx-auto w-full max-w-3xl px-4 py-6 sm:px-6 sm:py-10">
|
|
14
|
+
<TeamPage createOrgDescription="Set up a team to share this app with your colleagues." />
|
|
15
|
+
</main>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "default",
|
|
4
|
+
"rsc": false,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "",
|
|
8
|
+
"css": "app/global.css",
|
|
9
|
+
"baseColor": "slate",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"aliases": {
|
|
14
|
+
"components": "@/components",
|
|
15
|
+
"utils": "@/lib/utils",
|
|
16
|
+
"ui": "@/components/ui",
|
|
17
|
+
"lib": "@/lib",
|
|
18
|
+
"hooks": "@/hooks"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "patterns": ["data/**/*.json"] }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Tasks — Features
|
|
2
|
+
|
|
3
|
+
This folder describes **what the Tasks app is** — its product capabilities, not implementation plans.
|
|
4
|
+
|
|
5
|
+
Features are **ordered** (F1, F2, …). Read in order when learning the product.
|
|
6
|
+
|
|
7
|
+
## Shipped core
|
|
8
|
+
|
|
9
|
+
The app is **task-list-first** with agent parity:
|
|
10
|
+
|
|
11
|
+
- **Tasks** (F1) — add, edit title, mark complete / incomplete, delete, **filter completed**, **drag reorder** on the main task page
|
|
12
|
+
- **Inbox** (F4) — capture, edit, reorder, select, mark ready, delete
|
|
13
|
+
- **Chat** (F8) — task and inbox operations via actions; **capture defaults to inbox** (`create-inbox-item`)
|
|
14
|
+
|
|
15
|
+
See the repository [README](../../README.md) for implementation backlog items.
|
|
16
|
+
|
|
17
|
+
## Where work lives
|
|
18
|
+
|
|
19
|
+
| Surface | What appears there | Status |
|
|
20
|
+
| ---------------------------------------- | -------------------------------------------------------- | ------- |
|
|
21
|
+
| **Main task page** | All **tasks** | done |
|
|
22
|
+
| **[F4 Inbox](./f4-inbox.mdx)** | Not-ready **items** — capture and triage (not tasks yet) | partial |
|
|
23
|
+
| **[F3 Project](./f3-projects.mdx) page** | **Tasks** in that project only | planned |
|
|
24
|
+
|
|
25
|
+
Inbox items become tasks when **marked ready**. An item may have a project assigned before then — it still won't show on the project page until ready.
|
|
26
|
+
|
|
27
|
+
## Features (in order)
|
|
28
|
+
|
|
29
|
+
| | Feature | Status | Description |
|
|
30
|
+
| ------ | ------------------------------------------ | ------- | ----------------------------------------------------------------------------------- |
|
|
31
|
+
| **F1** | [Tasks](./f1-tasks.mdx) | partial | Core task list + bulk actions shipped; project/field assignment remains |
|
|
32
|
+
| **F2** | [Custom fields](./f2-custom-fields.mdx) | done | Definitions, per-task values, UI, and actions shipped |
|
|
33
|
+
| **F3** | [Projects](./f3-projects.mdx) | planned | Group tasks by area; focused project pages |
|
|
34
|
+
| **F4** | [Inbox](./f4-inbox.mdx) | partial | Triage UI shipped; custom fields and project assignment on items remain |
|
|
35
|
+
| **F5** | [Views](./f5-views.mdx) | planned | Filter, sort, group, and save list arrangements |
|
|
36
|
+
| **F6** | [Search](./f6-search.mdx) | planned | Find tasks by title and projects by name |
|
|
37
|
+
| **F7** | [First-run experience](./f7-first-run.mdx) | partial | Empty slate shipped; starter config remains |
|
|
38
|
+
| **F8** | [Chat](./f8-chat.mdx) | partial | Task, inbox, and custom-field parity shipped; extended parity with F3/F5/F6 remains |
|
|
39
|
+
|
|
40
|
+
## What Tasks is
|
|
41
|
+
|
|
42
|
+
Tasks is a **task-list-first to-do app**. Users capture and manage work on the main list and [inbox](./f4-inbox.mdx) through the UI or chat. Planned additions: [projects](./f3-projects.mdx), [custom fields](./f2-custom-fields.mdx), [saved views](./f5-views.mdx), and [search](./f6-search.mdx). The app ships increasingly pre-configured ([F7](./f7-first-run.mdx)). **Chat** (F8) stays at parity with the UI at every stage.
|
|
43
|
+
|
|
44
|
+
## Status flags
|
|
45
|
+
|
|
46
|
+
Each capability is **planned**, **partial**, or **done**. Flags apply to a whole file or to a section within a file.
|
|
47
|
+
|
|
48
|
+
### File-level
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
---
|
|
52
|
+
id: F1
|
|
53
|
+
title: Tasks
|
|
54
|
+
status: partial
|
|
55
|
+
order: 1
|
|
56
|
+
---
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Section-level
|
|
60
|
+
|
|
61
|
+
```md
|
|
62
|
+
<!-- status: done -->
|
|
63
|
+
|
|
64
|
+
## Task list filter
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```md
|
|
68
|
+
<!-- status: todo -->
|
|
69
|
+
|
|
70
|
+
## Bulk actions
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
| Value | Meaning |
|
|
74
|
+
| --------- | ------------------------------------ |
|
|
75
|
+
| `planned` | Described but not yet in the product |
|
|
76
|
+
| `partial` | Some sections shipped |
|
|
77
|
+
| `done` | Shipped and matches the description |
|
|
78
|
+
|
|
79
|
+
## Adding a capability
|
|
80
|
+
|
|
81
|
+
Pick the next `F{n}`, set `order`, add `f{n}-<slug>.mdx`, and a row in the table above.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F1
|
|
3
|
+
title: Tasks
|
|
4
|
+
status: partial
|
|
5
|
+
order: 1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F1 — Tasks
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
|
|
12
|
+
A **task** is a unit of work with a **title** and a built-in **complete / incomplete** state. Tasks appear on the **main task page**.
|
|
13
|
+
|
|
14
|
+
Tasks also appear inside [projects](./f3-projects.mdx) (F3). Optional [custom fields](./f2-custom-fields.mdx) (F2) extend tasks with due dates, notes, and more. [Inbox](./f4-inbox.mdx) items are not tasks until **marked ready** — until then, capture can land in the inbox instead of the task list.
|
|
15
|
+
|
|
16
|
+
## What users can do
|
|
17
|
+
|
|
18
|
+
<!-- status: done -->
|
|
19
|
+
|
|
20
|
+
### Single tasks
|
|
21
|
+
|
|
22
|
+
- **Add** a task by entering a title on the main task page.
|
|
23
|
+
- **Edit** a task's title.
|
|
24
|
+
- **Mark complete** or **mark incomplete** via the completion control.
|
|
25
|
+
- **Delete** a task (with confirmation).
|
|
26
|
+
- **Filter completed tasks out** on the main task page — show incomplete only, or show all (including completed).
|
|
27
|
+
- **Reorder** tasks by dragging and dropping (single task; order persisted).
|
|
28
|
+
|
|
29
|
+
For project assignment and custom fields, see [F3 Projects](./f3-projects.mdx) and [F2 Custom fields](./f2-custom-fields.mdx).
|
|
30
|
+
|
|
31
|
+
### Multiple tasks (bulk)
|
|
32
|
+
|
|
33
|
+
- **Select** one or more tasks by tapping rows in selection mode (shift-click for a range, select-all for the visible list).
|
|
34
|
+
- **Apply an action** to every selected task in one step:
|
|
35
|
+
- Mark complete or mark incomplete (applies immediately; already-matching tasks are skipped and summarized)
|
|
36
|
+
- Delete (requires confirmation)
|
|
37
|
+
- **Reorder** selected tasks together by dragging any one of them — all selected tasks move as a group.
|
|
38
|
+
- **Clear selection** after an action; skipped tasks are summarized when an action does not apply to all.
|
|
39
|
+
|
|
40
|
+
## How it behaves
|
|
41
|
+
|
|
42
|
+
### Completion
|
|
43
|
+
|
|
44
|
+
Completion is a **built-in property** on every task — not a custom field.
|
|
45
|
+
|
|
46
|
+
<!-- status: done -->
|
|
47
|
+
|
|
48
|
+
- New tasks start **incomplete**.
|
|
49
|
+
- **Mark complete** checks the task off; **mark incomplete** reopens it.
|
|
50
|
+
- Completed tasks appear **greyed out** (or struck through) when shown.
|
|
51
|
+
|
|
52
|
+
### Completed tasks
|
|
53
|
+
|
|
54
|
+
Completed tasks **stay in the list** — there is no archive step. They remain in place but can be hidden:
|
|
55
|
+
|
|
56
|
+
<!-- status: done -->
|
|
57
|
+
|
|
58
|
+
- **Filter completed out** on the main task page to hide finished work (default: incomplete only, or user toggles to show all).
|
|
59
|
+
- When shown, completed tasks are greyed out; when filtered out, they disappear from the list.
|
|
60
|
+
|
|
61
|
+
<!-- status: done -->
|
|
62
|
+
|
|
63
|
+
### Order
|
|
64
|
+
|
|
65
|
+
- Manual drag order is remembered on the main task page (`sort_order` in the database).
|
|
66
|
+
- Dragging one task reorders it; the list updates optimistically and persists via `reorder-tasks`.
|
|
67
|
+
- When **multiple tasks are selected**, dragging any selected task moves **all of them** together.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F2
|
|
3
|
+
title: Custom fields
|
|
4
|
+
status: done
|
|
5
|
+
order: 2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F2 — Custom fields
|
|
9
|
+
|
|
10
|
+
<!-- status: done -->
|
|
11
|
+
|
|
12
|
+
## What it is
|
|
13
|
+
|
|
14
|
+
**Custom fields** extend [F1 tasks](./f1-tasks.mdx) with user-defined properties — due dates, notes, priority, and anything else the user models. Fields are defined once for the app; each task fills in its own values. [F3 Projects](./f3-projects.mdx) are not extended by custom fields — only tasks are.
|
|
15
|
+
|
|
16
|
+
**Completion** (complete / incomplete) is **not** a custom field — it is built into every task. There is no separate built-in "description" or "due date" either; users can model those as custom fields.
|
|
17
|
+
|
|
18
|
+
## What users can do
|
|
19
|
+
|
|
20
|
+
- **Create** a field with a name and type.
|
|
21
|
+
- **Edit** a field's name or option list (for select fields).
|
|
22
|
+
- **Delete** a field definition (removes stored values on all tasks).
|
|
23
|
+
|
|
24
|
+
## Field types
|
|
25
|
+
|
|
26
|
+
| Type | Example use |
|
|
27
|
+
| ----------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
28
|
+
| **Text** | Short label, reference number |
|
|
29
|
+
| **Rich text** | Notes, context, links, checklists |
|
|
30
|
+
| **Number** | Story points, quantity; decimal precision (`0` means whole numbers only) and optional positive-only constraints |
|
|
31
|
+
| **Percent** | Completion %; optional decimal precision |
|
|
32
|
+
| **Currency** | Budget, cost; currency symbol and decimal precision |
|
|
33
|
+
| **Single-select** | Priority, workflow stage — one option from a defined list |
|
|
34
|
+
| **Multi-select** | Tags, categories — multiple options |
|
|
35
|
+
| **Date** | Due date, follow-up |
|
|
36
|
+
|
|
37
|
+
### Rich text
|
|
38
|
+
|
|
39
|
+
Bold, italic, headings, bulleted and numbered lists, links, and paragraphs.
|
|
40
|
+
|
|
41
|
+
### Select fields
|
|
42
|
+
|
|
43
|
+
Options are defined when the field is created (name and optional color per option). Single-select allows one choice; multi-select allows many.
|
|
44
|
+
|
|
45
|
+
## How it behaves
|
|
46
|
+
|
|
47
|
+
- Empty fields stay blank — values are not required.
|
|
48
|
+
- The task **title** stays the primary label in lists; field values show in the detail area or optional columns.
|
|
49
|
+
- [F5 Views](./f5-views.mdx) can filter, sort, and group by custom fields and by built-in **completion**.
|
|
50
|
+
- [F6 Search](./f6-search.mdx) matches **task titles** only — custom field values are not searchable.
|
|
51
|
+
|
|
52
|
+
### Field type cannot change
|
|
53
|
+
|
|
54
|
+
Once a field is created, its **type cannot be changed**. To use a different type, create a new field and move values over manually. If the old field is no longer needed, delete it — stored values are removed from all tasks.
|
|
55
|
+
|
|
56
|
+
### Deleting a field
|
|
57
|
+
|
|
58
|
+
Deleting a field definition removes its values on every task. Saved [views](./f5-views.mdx) that filter, sort, or group by that field may need to be updated.
|
|
59
|
+
|
|
60
|
+
## Shipped contract
|
|
61
|
+
|
|
62
|
+
<!-- status: done -->
|
|
63
|
+
|
|
64
|
+
- **Fields** in the sidebar opens the definition manager.
|
|
65
|
+
- Task rows open a pinned field editor for setting values on promoted tasks.
|
|
66
|
+
- Configured field values can be shown on the main task card; which fields appear is chosen on the Fields page and persisted per user in SQL (max 3).
|
|
67
|
+
- Field definitions have dedicated actions; task values are read with `list-tasks` `includeFields` and written with `update-task` `fieldValues`.
|
|
68
|
+
- Task-card visibility uses `list-visible-task-fields` and `update-visible-task-fields`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F3
|
|
3
|
+
title: Projects
|
|
4
|
+
status: planned
|
|
5
|
+
order: 3
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F3 — Projects
|
|
9
|
+
|
|
10
|
+
<!-- status: todo -->
|
|
11
|
+
|
|
12
|
+
## What it is
|
|
13
|
+
|
|
14
|
+
A **project** is a named area of work — "Home renovation", "Side hustle", "Q2 goals". A project contains **tasks** ([F1](./f1-tasks.mdx)). [Inbox](./f4-inbox.mdx) items are not tasks and do not appear in a project, even if a project is already assigned.
|
|
15
|
+
|
|
16
|
+
Opening a project shows **only that project's tasks**. The main task page still shows **all tasks** across every project.
|
|
17
|
+
|
|
18
|
+
## What users can do
|
|
19
|
+
|
|
20
|
+
- **Create**, **rename**, or **delete** a project.
|
|
21
|
+
- **Open** a project for focused work on its tasks and [F5 views](./f5-views.mdx).
|
|
22
|
+
|
|
23
|
+
## How it behaves
|
|
24
|
+
|
|
25
|
+
- A task belongs to **at most one project** (or none).
|
|
26
|
+
- An inbox item may have a **project assigned** for when it becomes ready — it is **not shown** on the project page until [marked ready](./f4-inbox.mdx).
|
|
27
|
+
- Assigned tasks still appear on the **main** task page with a project indicator.
|
|
28
|
+
- Deleting a project **unassigns** its tasks and removes its project-scoped views; tasks are not deleted.
|
|
29
|
+
|
|
30
|
+
## Limits (v1)
|
|
31
|
+
|
|
32
|
+
- No nested or shared projects.
|
|
33
|
+
- List layout only — no per-project board or calendar.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: F4
|
|
3
|
+
title: Inbox
|
|
4
|
+
status: partial
|
|
5
|
+
order: 4
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# F4 — Inbox
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
|
|
12
|
+
The **inbox** is where new and rough ideas land before they become **tasks**. Inbox **items** are not tasks yet — they are **not ready**. They do not appear on the main task page, in [F3 projects](./f3-projects.mdx), or in [F5 views](./f5-views.mdx) until the user **marks them ready**.
|
|
13
|
+
|
|
14
|
+
<!-- status: done -->
|
|
15
|
+
|
|
16
|
+
### Foundation
|
|
17
|
+
|
|
18
|
+
- **Backend** — unified `tasks` table with a storage-only `ready` flag; inbox and task list share one store with scoped queries and actions (`list-inbox-items`, `create-inbox-item`, `update-inbox-item`, `delete-inbox-item`, `mark-inbox-item-ready`, `reorder-inbox-items`)
|
|
19
|
+
- **Navigation** — `/inbox` route and sidebar entry (before Tasks)
|
|
20
|
+
- **Inbox UI** — add, inline edit, delete, mark ready, drag-to-reorder, and multi-select (bulk mark ready / bulk delete)
|
|
21
|
+
- **Chat capture** — [chat](./f8-chat.mdx) defaults to `create-inbox-item`; `create-task` when the user asks to add directly to the task list
|
|
22
|
+
|
|
23
|
+
## What users can do
|
|
24
|
+
|
|
25
|
+
<!-- status: done -->
|
|
26
|
+
|
|
27
|
+
- **Add** an inbox item from the inbox page or via agent (`create-inbox-item`).
|
|
28
|
+
- **Edit** title inline or via `update-inbox-item`.
|
|
29
|
+
- **Reorder** via drag-and-drop or `reorder-inbox-items`.
|
|
30
|
+
- **Select** multiple items on the inbox page; bulk mark ready or bulk delete.
|
|
31
|
+
- **Mark ready** via row action, bulk toolbar, or `mark-inbox-item-ready` — becomes an incomplete task (same id).
|
|
32
|
+
- **Delete** via row action, bulk toolbar, or `delete-inbox-item` (confirm with user first in chat).
|
|
33
|
+
|
|
34
|
+
<!-- status: todo -->
|
|
35
|
+
|
|
36
|
+
- **Edit** [custom fields](./f2-custom-fields.mdx) and project assignment on items.
|
|
37
|
+
|
|
38
|
+
## How it behaves
|
|
39
|
+
|
|
40
|
+
| State | What it is | Where it appears |
|
|
41
|
+
| --------- | -------------- | ----------------------------------------------------------------------------------------------- |
|
|
42
|
+
| **Inbox** | Not-ready item | Inbox page only |
|
|
43
|
+
| **Task** | Ready item | Main task page, project (if assigned), [F5 views](./f5-views.mdx), [F6 search](./f6-search.mdx) |
|
|
44
|
+
|
|
45
|
+
- **Completion** cannot be changed on inbox items — only after mark ready (F1).
|
|
46
|
+
- An item may have a **project assigned** before it is ready; the project page does not show it until mark ready.
|
|
47
|
+
- **Mark ready** creates a normal **incomplete** task with any preset project applied.
|
|
48
|
+
- New capture from chat defaults to **inbox** unless the user asks for the task list directly ([F8](./f8-chat.mdx)).
|
|
49
|
+
- New items added on the main task page or in a project are **tasks immediately** (`ready` in storage).
|
|
50
|
+
- A task cannot return to the inbox.
|
|
51
|
+
- Flat list — no sub-groups within the inbox.
|
|
52
|
+
|
|
53
|
+
## Still partial
|
|
54
|
+
|
|
55
|
+
Feature status stays **partial** until inbox metadata (custom fields, project assignment before mark ready) ships. Core inbox triage — capture, edit, reorder, select, mark ready, delete — is shipped.
|