feat: journal dashboard widgets, agent polish, and edit-mode live previews
Journal dashboard widgets and quick-add; rich-text quick-add dialogs. Dashboard draft sync for live edit previews; assistant bubble + API tools. Journal UX: stress slider, mood grid, query cap fix.
This commit is contained in:
@@ -314,6 +314,103 @@ components:
|
||||
properties:
|
||||
occurredOn: { type: string, format: date }
|
||||
|
||||
CareLog:
|
||||
type: object
|
||||
properties:
|
||||
id: { type: string, format: uuid }
|
||||
careType: { type: string }
|
||||
notes: { type: string, nullable: true }
|
||||
performedAt: { type: string, format: date-time }
|
||||
performedBy: { type: string, format: uuid, nullable: true }
|
||||
|
||||
CareLogInput:
|
||||
type: object
|
||||
required: [careType]
|
||||
properties:
|
||||
careType: { type: string }
|
||||
notes: { type: string, nullable: true }
|
||||
performedAt: { type: string, format: date-time }
|
||||
|
||||
CareSchedule:
|
||||
type: object
|
||||
properties:
|
||||
id: { type: string, format: uuid }
|
||||
careType: { type: string }
|
||||
intervalDays: { type: integer }
|
||||
lastPerformedAt: { type: string, format: date-time, nullable: true }
|
||||
nextDueAt: { type: string, format: date-time, nullable: true }
|
||||
enabled: { type: boolean }
|
||||
daysUntilDue: { type: integer, nullable: true }
|
||||
isOverdue: { type: boolean }
|
||||
|
||||
CareScheduleInput:
|
||||
type: object
|
||||
required: [careType, intervalDays]
|
||||
properties:
|
||||
careType: { type: string }
|
||||
intervalDays: { type: integer, minimum: 1, maximum: 365 }
|
||||
enabled: { type: boolean }
|
||||
|
||||
CareScheduleToggleInput:
|
||||
type: object
|
||||
required: [enabled]
|
||||
properties:
|
||||
enabled: { type: boolean }
|
||||
|
||||
ScheduleOnCalendarInput:
|
||||
type: object
|
||||
required: [calendarId]
|
||||
properties:
|
||||
calendarId: { type: string, format: uuid }
|
||||
reminderMinutesBefore: { type: integer, nullable: true }
|
||||
|
||||
ShareableEntityType:
|
||||
type: object
|
||||
properties:
|
||||
type: { type: string }
|
||||
label: { type: string }
|
||||
defaultCapabilities:
|
||||
type: array
|
||||
items: { type: string }
|
||||
|
||||
ShareLink:
|
||||
type: object
|
||||
properties:
|
||||
id: { type: string, format: uuid }
|
||||
entityType: { type: string }
|
||||
entityId: { type: string, format: uuid }
|
||||
createdAt: { type: string, format: date-time }
|
||||
expiresAt: { type: string, format: date-time, nullable: true }
|
||||
capabilities:
|
||||
type: object
|
||||
properties:
|
||||
read: { type: boolean }
|
||||
write: { type: boolean }
|
||||
|
||||
ShareLinkCreateInput:
|
||||
type: object
|
||||
required: [entityType, entityId]
|
||||
properties:
|
||||
entityType: { type: string }
|
||||
entityId: { type: string, format: uuid }
|
||||
expiresAt: { type: string, format: date-time, nullable: true }
|
||||
capabilities:
|
||||
type: object
|
||||
properties:
|
||||
read: { type: boolean }
|
||||
write: { type: boolean }
|
||||
|
||||
ShareLinkCreated:
|
||||
type: object
|
||||
properties:
|
||||
url: { type: string, format: uri }
|
||||
expiresAt: { type: string, format: date-time, nullable: true }
|
||||
|
||||
PushOverdueResult:
|
||||
type: object
|
||||
properties:
|
||||
added: { type: integer }
|
||||
|
||||
paths:
|
||||
/api/v1/calendars:
|
||||
get:
|
||||
@@ -791,6 +888,193 @@ paths:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/OkResponse" }
|
||||
|
||||
/api/v1/garden/plants/{id}/care-logs:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: { type: string, format: uuid }
|
||||
get:
|
||||
summary: List care logs for a plant
|
||||
tags: [Garden]
|
||||
parameters:
|
||||
- name: limit
|
||||
in: query
|
||||
schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items: { $ref: "#/components/schemas/CareLog" }
|
||||
post:
|
||||
summary: Log care performed on a plant
|
||||
tags: [Garden]
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/CareLogInput" }
|
||||
responses:
|
||||
"201":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/CareLog" }
|
||||
|
||||
/api/v1/garden/plants/{id}/care-schedules:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: { type: string, format: uuid }
|
||||
get:
|
||||
summary: List care schedules for a plant
|
||||
tags: [Garden]
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items: { $ref: "#/components/schemas/CareSchedule" }
|
||||
post:
|
||||
summary: Create or update a care schedule
|
||||
tags: [Garden]
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/CareScheduleInput" }
|
||||
responses:
|
||||
"201":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/CareSchedule" }
|
||||
|
||||
/api/v1/garden/care-schedules/{id}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: { type: string, format: uuid }
|
||||
patch:
|
||||
summary: Enable or disable a care schedule
|
||||
tags: [Garden]
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/CareScheduleToggleInput" }
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/OkResponse" }
|
||||
delete:
|
||||
summary: Delete a care schedule
|
||||
tags: [Garden]
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/OkResponse" }
|
||||
|
||||
/api/v1/garden/care-schedules/{id}/calendar:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: { type: string, format: uuid }
|
||||
post:
|
||||
summary: Add next due care to calendar
|
||||
tags: [Garden]
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/ScheduleOnCalendarInput" }
|
||||
responses:
|
||||
"201":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/OkResponse" }
|
||||
|
||||
/api/v1/garden/overdue-care/push:
|
||||
post:
|
||||
summary: Push overdue care items to task list
|
||||
tags: [Garden]
|
||||
responses:
|
||||
"201":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/PushOverdueResult" }
|
||||
|
||||
/api/v1/share-links:
|
||||
get:
|
||||
summary: List share links or shareable entity types
|
||||
tags: [Sharing]
|
||||
parameters:
|
||||
- name: entityTypes
|
||||
in: query
|
||||
schema: { type: string, enum: ["true"] }
|
||||
description: When true, returns shareable entity types instead of links
|
||||
- name: entityType
|
||||
in: query
|
||||
schema: { type: string }
|
||||
- name: entityId
|
||||
in: query
|
||||
schema: { type: string, format: uuid }
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
oneOf:
|
||||
- type: array
|
||||
items: { $ref: "#/components/schemas/ShareLink" }
|
||||
- type: array
|
||||
items: { $ref: "#/components/schemas/ShareableEntityType" }
|
||||
post:
|
||||
summary: Create a share link
|
||||
tags: [Sharing]
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/ShareLinkCreateInput" }
|
||||
responses:
|
||||
"201":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/ShareLinkCreated" }
|
||||
|
||||
/api/v1/share-links/{id}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: { type: string, format: uuid }
|
||||
delete:
|
||||
summary: Revoke a share link
|
||||
tags: [Sharing]
|
||||
responses:
|
||||
"200":
|
||||
content:
|
||||
application/json:
|
||||
schema: { $ref: "#/components/schemas/OkResponse" }
|
||||
|
||||
/api/v1/openapi:
|
||||
get:
|
||||
summary: OpenAPI specification (YAML)
|
||||
tags: [Meta]
|
||||
responses:
|
||||
"200":
|
||||
description: OpenAPI 3.1 YAML document
|
||||
content:
|
||||
application/yaml:
|
||||
schema: { type: string }
|
||||
|
||||
/api/v1/bangs:
|
||||
get:
|
||||
summary: Bang stats (total + recent)
|
||||
@@ -916,4 +1200,6 @@ tags:
|
||||
- name: Notes
|
||||
- name: Journal
|
||||
- name: Garden
|
||||
- name: Sharing
|
||||
- name: Bangs
|
||||
- name: Meta
|
||||
|
||||
+48
-47
@@ -2,55 +2,56 @@
|
||||
|
||||
Design IDs from `docs/superpowers/specs/2026-07-03-backlog-triage-design.md` → Gitea (`ginnoir/famapp`).
|
||||
|
||||
| Design | Gitea | Title | URL |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | 1 | Quick-add opens create UI, not module page | https://gitea.ginnoir.com/ginnoir/famapp/issues/1 |
|
||||
| 2 | 2 | Dashboard edit mode renders live widgets at true size | https://gitea.ginnoir.com/ginnoir/famapp/issues/2 |
|
||||
| 3 | 3 | Garden container plant count is wrong | https://gitea.ginnoir.com/ginnoir/famapp/issues/3 |
|
||||
| 4 | 4 | Bangs are not editable (add edit and delete) | https://gitea.ginnoir.com/ginnoir/famapp/issues/4 |
|
||||
| 5 | 5 | Notes overflow horizontally on mobile | https://gitea.ginnoir.com/ginnoir/famapp/issues/5 |
|
||||
| 6 | 6 | Missing back navigation on detail pages (audit + shared affordance) | https://gitea.ginnoir.com/ginnoir/famapp/issues/6 |
|
||||
| 7 | 28 | Calendar reminders overhaul | https://gitea.ginnoir.com/ginnoir/famapp/issues/28 |
|
||||
| 8 | 29 | Lists index: inline task add + list property edit | https://gitea.ginnoir.com/ginnoir/famapp/issues/29 |
|
||||
| 9 | 30 | Comments on lists and tasks | https://gitea.ginnoir.com/ginnoir/famapp/issues/30 |
|
||||
| 10 | 7 | Notes editor overhaul (shared rich-text component) | https://gitea.ginnoir.com/ginnoir/famapp/issues/7 |
|
||||
| 10.1 | 8 | Research ADR: rich-text editor library and storage format | https://gitea.ginnoir.com/ginnoir/famapp/issues/8 |
|
||||
| 10.2 | 9 | Shared rich-text editor component | https://gitea.ginnoir.com/ginnoir/famapp/issues/9 |
|
||||
| 10.3 | 10 | Wire shared editor into notes create/edit | https://gitea.ginnoir.com/ginnoir/famapp/issues/10 |
|
||||
| 10.4 | 11 | Render note formatting on all notes surfaces | https://gitea.ginnoir.com/ginnoir/famapp/issues/11 |
|
||||
| 10.5 | 12 | Fix notes mobile horizontal overflow | https://gitea.ginnoir.com/ginnoir/famapp/issues/12 |
|
||||
| 11 | 31 | Bang stats dashboard widget | https://gitea.ginnoir.com/ginnoir/famapp/issues/31 |
|
||||
| 12 | 35 | Appearance / theming options | https://gitea.ginnoir.com/ginnoir/famapp/issues/35 |
|
||||
| 13 | 19 | Journal module | https://gitea.ginnoir.com/ginnoir/famapp/issues/19 |
|
||||
| 13.1 | 20 | Research ADR: journal/mood tracking build-vs-adopt | https://gitea.ginnoir.com/ginnoir/famapp/issues/20 |
|
||||
| 13.2 | 21 | Journal schema + CRUD | https://gitea.ginnoir.com/ginnoir/famapp/issues/21 |
|
||||
| 13.3 | 22 | Journal index (recent, browse, entry calendar) | https://gitea.ginnoir.com/ginnoir/famapp/issues/22 |
|
||||
| 13.4 | 23 | Journal entry detail and create | https://gitea.ginnoir.com/ginnoir/famapp/issues/23 |
|
||||
| 13.5 | 24 | Journal mood tracker view | https://gitea.ginnoir.com/ginnoir/famapp/issues/24 |
|
||||
| 13.6 | 25 | Journal insights/stats views | https://gitea.ginnoir.com/ginnoir/famapp/issues/25 |
|
||||
| 13.7 | 26 | Journal E2E happy path | https://gitea.ginnoir.com/ginnoir/famapp/issues/26 |
|
||||
| 13.8 | 27 | Journal API endpoints | https://gitea.ginnoir.com/ginnoir/famapp/issues/27 |
|
||||
| 14 | 13 | API + LLM agent chat | https://gitea.ginnoir.com/ginnoir/famapp/issues/13 |
|
||||
| 14.1 | 14 | Research ADR: API auth, surface shape, and LLM agent architecture | https://gitea.ginnoir.com/ginnoir/famapp/issues/14 |
|
||||
| 14.2 | 15 | API surface + token auth for existing modules | https://gitea.ginnoir.com/ginnoir/famapp/issues/15 |
|
||||
| 14.3 | 16 | LLM agent chat UI | https://gitea.ginnoir.com/ginnoir/famapp/issues/16 |
|
||||
| 14.4 | 17 | Map agent tool-calling to API | https://gitea.ginnoir.com/ginnoir/famapp/issues/17 |
|
||||
| 14.5 | 18 | Agent smoke tests with mock provider | https://gitea.ginnoir.com/ginnoir/famapp/issues/18 |
|
||||
| 15 | 32 | Pets module | https://gitea.ginnoir.com/ginnoir/famapp/issues/32 |
|
||||
| 16 | 33 | Shopping/pantry module | https://gitea.ginnoir.com/ginnoir/famapp/issues/33 |
|
||||
| 17 | 34 | Backups and exports | https://gitea.ginnoir.com/ginnoir/famapp/issues/34 |
|
||||
| 18 | 36 | GPS locations for calendar events | https://gitea.ginnoir.com/ginnoir/famapp/issues/36 |
|
||||
| 19 | 37 | Lists and notes cohesion (research proposal) | https://gitea.ginnoir.com/ginnoir/famapp/issues/37 |
|
||||
| Design | Gitea | Title | URL |
|
||||
| ------ | ----- | ------------------------------------------------------------------- | -------------------------------------------------- |
|
||||
| 1 | 1 | Quick-add opens create UI, not module page | https://gitea.ginnoir.com/ginnoir/famapp/issues/1 |
|
||||
| 2 | 2 | Dashboard edit mode renders live widgets at true size | https://gitea.ginnoir.com/ginnoir/famapp/issues/2 |
|
||||
| 3 | 3 | Garden container plant count is wrong | https://gitea.ginnoir.com/ginnoir/famapp/issues/3 |
|
||||
| 4 | 4 | Bangs are not editable (add edit and delete) | https://gitea.ginnoir.com/ginnoir/famapp/issues/4 |
|
||||
| 5 | 5 | Notes overflow horizontally on mobile | https://gitea.ginnoir.com/ginnoir/famapp/issues/5 |
|
||||
| 6 | 6 | Missing back navigation on detail pages (audit + shared affordance) | https://gitea.ginnoir.com/ginnoir/famapp/issues/6 |
|
||||
| 7 | 28 | Calendar reminders overhaul | https://gitea.ginnoir.com/ginnoir/famapp/issues/28 |
|
||||
| 8 | 29 | Lists index: inline task add + list property edit | https://gitea.ginnoir.com/ginnoir/famapp/issues/29 |
|
||||
| 9 | 30 | Comments on lists and tasks | https://gitea.ginnoir.com/ginnoir/famapp/issues/30 |
|
||||
| 10 | 7 | Notes editor overhaul (shared rich-text component) | https://gitea.ginnoir.com/ginnoir/famapp/issues/7 |
|
||||
| 10.1 | 8 | Research ADR: rich-text editor library and storage format | https://gitea.ginnoir.com/ginnoir/famapp/issues/8 |
|
||||
| 10.2 | 9 | Shared rich-text editor component | https://gitea.ginnoir.com/ginnoir/famapp/issues/9 |
|
||||
| 10.3 | 10 | Wire shared editor into notes create/edit | https://gitea.ginnoir.com/ginnoir/famapp/issues/10 |
|
||||
| 10.4 | 11 | Render note formatting on all notes surfaces | https://gitea.ginnoir.com/ginnoir/famapp/issues/11 |
|
||||
| 10.5 | 12 | Fix notes mobile horizontal overflow | https://gitea.ginnoir.com/ginnoir/famapp/issues/12 |
|
||||
| 11 | 31 | Bang stats dashboard widget | https://gitea.ginnoir.com/ginnoir/famapp/issues/31 |
|
||||
| 12 | 35 | Appearance / theming options | https://gitea.ginnoir.com/ginnoir/famapp/issues/35 |
|
||||
| 13 | 19 | Journal module | https://gitea.ginnoir.com/ginnoir/famapp/issues/19 |
|
||||
| 13.1 | 20 | Research ADR: journal/mood tracking build-vs-adopt | https://gitea.ginnoir.com/ginnoir/famapp/issues/20 |
|
||||
| 13.2 | 21 | Journal schema + CRUD | https://gitea.ginnoir.com/ginnoir/famapp/issues/21 |
|
||||
| 13.3 | 22 | Journal index (recent, browse, entry calendar) | https://gitea.ginnoir.com/ginnoir/famapp/issues/22 |
|
||||
| 13.4 | 23 | Journal entry detail and create | https://gitea.ginnoir.com/ginnoir/famapp/issues/23 |
|
||||
| 13.5 | 24 | Journal mood tracker view | https://gitea.ginnoir.com/ginnoir/famapp/issues/24 |
|
||||
| 13.6 | 25 | Journal insights/stats views | https://gitea.ginnoir.com/ginnoir/famapp/issues/25 |
|
||||
| 13.7 | 26 | Journal E2E happy path | https://gitea.ginnoir.com/ginnoir/famapp/issues/26 |
|
||||
| 13.8 | 27 | Journal API endpoints | https://gitea.ginnoir.com/ginnoir/famapp/issues/27 |
|
||||
| 14 | 13 | API + LLM agent chat | https://gitea.ginnoir.com/ginnoir/famapp/issues/13 |
|
||||
| 14.1 | 14 | Research ADR: API auth, surface shape, and LLM agent architecture | https://gitea.ginnoir.com/ginnoir/famapp/issues/14 |
|
||||
| 14.2 | 15 | API surface + token auth for existing modules | https://gitea.ginnoir.com/ginnoir/famapp/issues/15 |
|
||||
| 14.3 | 16 | LLM agent chat UI | https://gitea.ginnoir.com/ginnoir/famapp/issues/16 |
|
||||
| 14.4 | 17 | Map agent tool-calling to API | https://gitea.ginnoir.com/ginnoir/famapp/issues/17 |
|
||||
| 14.5 | 18 | Agent smoke tests with mock provider | https://gitea.ginnoir.com/ginnoir/famapp/issues/18 |
|
||||
| 15 | 32 | Pets module | https://gitea.ginnoir.com/ginnoir/famapp/issues/32 |
|
||||
| 16 | 33 | Shopping/pantry module | https://gitea.ginnoir.com/ginnoir/famapp/issues/33 |
|
||||
| 17 | 34 | Backups and exports | https://gitea.ginnoir.com/ginnoir/famapp/issues/34 |
|
||||
| 18 | 36 | GPS locations for calendar events | https://gitea.ginnoir.com/ginnoir/famapp/issues/36 |
|
||||
| 19 | 37 | Lists and notes cohesion (research proposal) | https://gitea.ginnoir.com/ginnoir/famapp/issues/37 |
|
||||
| — | 38 | Revisit journal day-switch animations (smoother paper transition) | https://gitea.ginnoir.com/ginnoir/famapp/issues/38 |
|
||||
|
||||
## Dependencies (P1)
|
||||
|
||||
| Issue | Depends on |
|
||||
| --- | --- |
|
||||
| #5 (notes overflow) | #7 (rich-text epic) |
|
||||
| #12 (mobile overflow child) | #8 (rich-text research ADR) |
|
||||
| #19 (journal epic) | #7 (rich-text epic), #15 (API surface) |
|
||||
| #16 (agent UI) | #15 (API surface) |
|
||||
| #17 (tool-calling) | #15 (API surface) |
|
||||
| #27 (journal API) | #15 (API surface) |
|
||||
| Issue | Depends on |
|
||||
| --------------------------- | -------------------------------------- |
|
||||
| #5 (notes overflow) | #7 (rich-text epic) |
|
||||
| #12 (mobile overflow child) | #8 (rich-text research ADR) |
|
||||
| #19 (journal epic) | #7 (rich-text epic), #15 (API surface) |
|
||||
| #16 (agent UI) | #15 (API surface) |
|
||||
| #17 (tool-calling) | #15 (API surface) |
|
||||
| #27 (journal API) | #15 (API surface) |
|
||||
|
||||
Native Gitea issue dependencies API 404s on this instance; dependencies are also noted as comments on the issues above.
|
||||
|
||||
@@ -25,9 +25,9 @@ Edit mode currently shows empty placeholders; on save, content-heavy widgets (e.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- [ ] Edit mode shows real widget content for registered widgets.
|
||||
- [ ] Saving layout does not cause a large content-driven reflow for content-heavy widgets.
|
||||
- [ ] E2E covers real content visible in edit mode.
|
||||
- [x] Edit mode shows real widget content for registered widgets.
|
||||
- [x] Saving layout does not cause a large content-driven reflow for content-heavy widgets.
|
||||
- [x] E2E covers real content visible in edit mode.
|
||||
|
||||
## Notes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user