feat: journal dashboard widgets, agent polish, and edit-mode live previews
CI / checks (push) Failing after 2m7s
CI / build (push) Successful in 4m36s

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:
ginnoir
2026-07-04 22:03:45 -05:00
parent 4a924a4107
commit a09747c314
76 changed files with 4594 additions and 611 deletions
+286
View File
@@ -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
View File
@@ -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.
+3 -3
View File
@@ -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