@notis_ai/cli 0.2.5 → 0.2.7
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 +33 -9
- package/dist/scaffolds/notis-affiliate-prospects/CHANGELOG.md +7 -0
- package/dist/scaffolds/notis-affiliate-prospects/README.md +20 -0
- package/dist/scaffolds/notis-affiliate-prospects/app/globals.css +42 -0
- package/dist/scaffolds/notis-affiliate-prospects/app/layout.tsx +7 -0
- package/dist/scaffolds/notis-affiliate-prospects/app/page.tsx +248 -0
- package/dist/scaffolds/notis-affiliate-prospects/app/prospects/page.tsx +134 -0
- package/dist/scaffolds/notis-affiliate-prospects/app/segments/page.tsx +108 -0
- package/dist/scaffolds/notis-affiliate-prospects/components/ui/card.tsx +35 -0
- package/dist/scaffolds/notis-affiliate-prospects/components.json +20 -0
- package/dist/scaffolds/notis-affiliate-prospects/index.html +12 -0
- package/dist/scaffolds/notis-affiliate-prospects/lib/affiliate-data.ts +218 -0
- package/dist/scaffolds/notis-affiliate-prospects/lib/demo-prospects.ts +52 -0
- package/dist/scaffolds/notis-affiliate-prospects/lib/notis-tools.ts +100 -0
- package/dist/scaffolds/notis-affiliate-prospects/lib/utils.ts +25 -0
- package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-1.png +0 -0
- package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-2.png +0 -0
- package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-3.png +0 -0
- package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-fixtures.json +187 -0
- package/dist/scaffolds/notis-affiliate-prospects/notis.config.ts +65 -0
- package/dist/scaffolds/notis-affiliate-prospects/package.json +32 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/package.json +32 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/components/MultiSelectActionBar.tsx +273 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/config.ts +90 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useBackend.ts +41 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useMultiSelect.ts +503 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useNotis.ts +34 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useTool.ts +64 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useTools.ts +56 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useUpsertDocument.ts +50 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/index.ts +54 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/provider.tsx +43 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/runtime.ts +161 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/styles.css +38 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/ui.ts +15 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/vite.ts +56 -0
- package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/tsconfig.json +15 -0
- package/dist/scaffolds/notis-affiliate-prospects/postcss.config.mjs +6 -0
- package/dist/scaffolds/notis-affiliate-prospects/src/dev-main.tsx +72 -0
- package/dist/scaffolds/notis-affiliate-prospects/src/mock-runtime.ts +242 -0
- package/dist/scaffolds/notis-affiliate-prospects/tailwind.config.ts +51 -0
- package/dist/scaffolds/notis-affiliate-prospects/tsconfig.json +23 -0
- package/dist/scaffolds/notis-affiliate-prospects/vite.config.ts +11 -0
- package/dist/scaffolds/notis-database/CHANGELOG.md +5 -0
- package/dist/scaffolds/notis-database/notis.config.ts +0 -1
- package/dist/scaffolds/notis-database/src/mock-runtime.ts +1 -0
- package/dist/scaffolds/notis-journal/CHANGELOG.md +25 -0
- package/dist/scaffolds/notis-journal/app/globals.css +37 -0
- package/dist/scaffolds/notis-journal/app/insights/page.tsx +513 -0
- package/dist/scaffolds/notis-journal/app/journal-core.tsx +362 -0
- package/dist/scaffolds/notis-journal/app/journal-ui.tsx +337 -0
- package/dist/scaffolds/notis-journal/app/layout.tsx +6 -0
- package/dist/scaffolds/notis-journal/app/page.tsx +485 -0
- package/dist/scaffolds/notis-journal/components/ui/badge.tsx +28 -0
- package/dist/scaffolds/notis-journal/components/ui/button.tsx +53 -0
- package/dist/scaffolds/notis-journal/components/ui/card.tsx +56 -0
- package/dist/scaffolds/notis-journal/components.json +20 -0
- package/dist/scaffolds/notis-journal/index.html +12 -0
- package/dist/scaffolds/notis-journal/lib/utils.ts +6 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-1.png +0 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-2.png +0 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-3.png +0 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-4.png +0 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-5.png +0 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-6.png +0 -0
- package/dist/scaffolds/notis-journal/metadata/screenshot-fixtures.json +132 -0
- package/dist/scaffolds/notis-journal/notis.config.ts +93 -0
- package/dist/scaffolds/notis-journal/package.json +34 -0
- package/dist/scaffolds/notis-journal/packages/sdk/package.json +36 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/components/DocumentEditor.tsx +93 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/components/Markdown.tsx +60 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +145 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/documents.ts +229 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useBackend.ts +41 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocument.ts +78 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocuments.ts +121 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotis.ts +34 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTool.ts +64 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTools.ts +56 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/index.ts +83 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/provider.tsx +43 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/runtime.ts +220 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/styles.css +186 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/ui.ts +15 -0
- package/dist/scaffolds/notis-journal/packages/sdk/src/vite.ts +56 -0
- package/dist/scaffolds/notis-journal/packages/sdk/tsconfig.json +15 -0
- package/dist/scaffolds/notis-journal/postcss.config.mjs +8 -0
- package/dist/scaffolds/notis-journal/skills/journal-onboarding/SKILL.md +120 -0
- package/dist/scaffolds/notis-journal/src/dev-main.tsx +58 -0
- package/dist/scaffolds/notis-journal/src/mock-runtime.ts +197 -0
- package/dist/scaffolds/notis-journal/tailwind.config.ts +58 -0
- package/dist/scaffolds/notis-journal/tsconfig.json +23 -0
- package/dist/scaffolds/notis-journal/vite.config.ts +10 -0
- package/dist/scaffolds/notis-notes/CHANGELOG.md +5 -0
- package/dist/scaffolds/notis-notes/app/page.tsx +17 -373
- package/dist/scaffolds/notis-notes/notis.config.ts +0 -1
- package/dist/scaffolds/notis-random/CHANGELOG.md +5 -0
- package/dist/scaffolds/notis-random/notis.config.ts +0 -1
- package/dist/scaffolds/notis-random/src/mock-runtime.ts +1 -0
- package/dist/scaffolds.json +22 -0
- package/package.json +3 -3
- package/skills/notis-apps/SKILL.md +43 -5
- package/skills/notis-apps/cli.md +22 -6
- package/skills/notis-cli/SKILL.md +20 -2
- package/skills/notis-query/cli.md +1 -1
- package/src/cli.js +8 -1
- package/src/command-specs/apps.js +307 -36
- package/src/command-specs/diagnostics.js +674 -0
- package/src/command-specs/helpers.js +4 -1
- package/src/command-specs/index.js +7 -1
- package/src/command-specs/meta.js +8 -2
- package/src/command-specs/smoke.js +386 -0
- package/src/command-specs/tools.js +237 -44
- package/src/runtime/agent-browser.js +204 -21
- package/src/runtime/app-changelog.js +79 -0
- package/src/runtime/app-dev-server.js +21 -4
- package/src/runtime/app-dev-sessions.js +99 -1
- package/src/runtime/app-platform.js +197 -18
- package/src/runtime/assets/store-screenshot-dark.png +0 -0
- package/src/runtime/desktop-auth.js +93 -0
- package/src/runtime/output.js +12 -1
- package/src/runtime/profiles.js +72 -16
- package/src/runtime/store-screenshot.js +138 -0
- package/src/runtime/transport.js +24 -82
- package/template/.harness/index.html.tmpl +128 -6
- package/template/CHANGELOG.md +5 -0
- package/template/app/page.tsx +11 -41
- package/template/notis.config.ts +0 -1
- package/template/package-lock.json +4137 -0
- package/template/package.json +1 -0
- package/template/packages/sdk/package.json +4 -0
- package/template/packages/sdk/src/components/DocumentEditor.tsx +93 -0
- package/template/packages/sdk/src/components/Markdown.tsx +60 -0
- package/template/packages/sdk/src/components/MultiSelectActionBar.tsx +7 -2
- package/template/packages/sdk/src/config.ts +74 -0
- package/template/packages/sdk/src/documents.ts +229 -0
- package/template/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
- package/template/packages/sdk/src/hooks/useDocument.ts +78 -0
- package/template/packages/sdk/src/hooks/useDocuments.ts +121 -0
- package/template/packages/sdk/src/hooks/useMultiSelect.ts +38 -2
- package/template/packages/sdk/src/hooks/useUpsertDocument.ts +54 -9
- package/template/packages/sdk/src/index.ts +30 -1
- package/template/packages/sdk/src/runtime.ts +76 -17
- package/template/packages/sdk/src/styles.css +148 -0
- /package/{template → dist/scaffolds/notis-affiliate-prospects}/packages/sdk/src/hooks/useDatabase.ts +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tools": {
|
|
3
|
+
"LOCAL_NOTIS_DATABASE_QUERY": {
|
|
4
|
+
"documents": [
|
|
5
|
+
{
|
|
6
|
+
"id": "journal-demo-1",
|
|
7
|
+
"title": "Journal — 2026-07-16",
|
|
8
|
+
"content_markdown": "",
|
|
9
|
+
"created_time": "2026-07-16T08:00:00.000Z",
|
|
10
|
+
"properties": {
|
|
11
|
+
"Name": { "type": "title", "title": [{ "type": "text", "text": { "content": "Journal — 2026-07-16" } }] },
|
|
12
|
+
"Date": { "type": "date", "date": { "start": "2026-07-16", "end": null, "timezone": null } },
|
|
13
|
+
"Morning Mood": { "type": "number", "number": 6 },
|
|
14
|
+
"Morning Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "rested" } }] },
|
|
15
|
+
"Morning Feeling": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Calm and a little excited about the demo this afternoon." } }] },
|
|
16
|
+
"Energy": { "type": "number", "number": 8 },
|
|
17
|
+
"Motivation": { "type": "number", "number": 9 },
|
|
18
|
+
"Gratitude 1": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "A slow coffee on the balcony before anyone was awake" } }] },
|
|
19
|
+
"Gratitude 2": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Camille laughing at my terrible pun last night" } }] },
|
|
20
|
+
"Gratitude 3": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "That my back finally feels normal again" } }] },
|
|
21
|
+
"Intention": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "One deep-work block on the launch page before opening messages." } }] },
|
|
22
|
+
"Affirmation": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "I am allowed to do one thing at a time." } }] }
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "journal-demo-2",
|
|
27
|
+
"title": "Journal — 2026-07-15",
|
|
28
|
+
"content_markdown": "Started the day convinced it was a write-off. By 16:00 the fix was shipped and the walk with Théo unknotted the roadmap question that has been bugging me for a week. Note to self: leave the house earlier.",
|
|
29
|
+
"created_time": "2026-07-15T08:00:00.000Z",
|
|
30
|
+
"properties": {
|
|
31
|
+
"Name": { "type": "title", "title": [{ "type": "text", "text": { "content": "Journal — 2026-07-15" } }] },
|
|
32
|
+
"Date": { "type": "date", "date": { "start": "2026-07-15", "end": null, "timezone": null } },
|
|
33
|
+
"Morning Mood": { "type": "number", "number": 4 },
|
|
34
|
+
"Morning Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "foggy" } }] },
|
|
35
|
+
"Morning Feeling": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Slept badly, brain still booting." } }] },
|
|
36
|
+
"Energy": { "type": "number", "number": 4 },
|
|
37
|
+
"Motivation": { "type": "number", "number": 6 },
|
|
38
|
+
"Gratitude 1": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Rain on the window while working" } }] },
|
|
39
|
+
"Gratitude 2": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "The boulangerie was still open at 19:30" } }] },
|
|
40
|
+
"Gratitude 3": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "A friend checking in for no reason" } }] },
|
|
41
|
+
"Intention": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Keep the day small: ship the fix, walk at lunch." } }] },
|
|
42
|
+
"Affirmation": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "I am steady even on slow days." } }] },
|
|
43
|
+
"Day Mood": { "type": "number", "number": 6 },
|
|
44
|
+
"Day Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "redeemed" } }] },
|
|
45
|
+
"Highlight": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "The afternoon walk turned into an hour of ideas with Théo." } }] },
|
|
46
|
+
"Lesson": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "A rough morning predicts nothing about the afternoon." } }] }
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "journal-demo-3",
|
|
51
|
+
"title": "Journal — 2026-07-14",
|
|
52
|
+
"content_markdown": "",
|
|
53
|
+
"created_time": "2026-07-14T08:00:00.000Z",
|
|
54
|
+
"properties": {
|
|
55
|
+
"Name": { "type": "title", "title": [{ "type": "text", "text": { "content": "Journal — 2026-07-14" } }] },
|
|
56
|
+
"Date": { "type": "date", "date": { "start": "2026-07-14", "end": null, "timezone": null } },
|
|
57
|
+
"Morning Mood": { "type": "number", "number": 7 },
|
|
58
|
+
"Morning Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "sunny" } }] },
|
|
59
|
+
"Morning Feeling": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Woke up before the alarm, ready to go." } }] },
|
|
60
|
+
"Energy": { "type": "number", "number": 9 },
|
|
61
|
+
"Motivation": { "type": "number", "number": 9 },
|
|
62
|
+
"Gratitude 1": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Eight hours of sleep, finally" } }] },
|
|
63
|
+
"Gratitude 2": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "The new espresso beans" } }] },
|
|
64
|
+
"Gratitude 3": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "A clear calendar until noon" } }] },
|
|
65
|
+
"Intention": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Finish the investor update and actually send it." } }] },
|
|
66
|
+
"Affirmation": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "I am building something worth the patience it takes." } }] },
|
|
67
|
+
"Day Mood": { "type": "number", "number": 7 },
|
|
68
|
+
"Day Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "unstoppable" } }] },
|
|
69
|
+
"Highlight": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Sent the update and got two warm replies within the hour." } }] },
|
|
70
|
+
"Lesson": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Momentum compounds when I front-load the scary task." } }] }
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "journal-demo-4",
|
|
75
|
+
"title": "Journal — 2026-07-13",
|
|
76
|
+
"content_markdown": "",
|
|
77
|
+
"created_time": "2026-07-13T08:00:00.000Z",
|
|
78
|
+
"properties": {
|
|
79
|
+
"Name": { "type": "title", "title": [{ "type": "text", "text": { "content": "Journal — 2026-07-13" } }] },
|
|
80
|
+
"Date": { "type": "date", "date": { "start": "2026-07-13", "end": null, "timezone": null } },
|
|
81
|
+
"Morning Mood": { "type": "number", "number": 3 },
|
|
82
|
+
"Morning Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "heavy" } }] },
|
|
83
|
+
"Morning Feeling": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Anxious about the support backlog." } }] },
|
|
84
|
+
"Energy": { "type": "number", "number": 3 },
|
|
85
|
+
"Motivation": { "type": "number", "number": 4 },
|
|
86
|
+
"Gratitude 1": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Tea instead of a third coffee" } }] },
|
|
87
|
+
"Gratitude 2": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "The cat sleeping on my desk all morning" } }] },
|
|
88
|
+
"Intention": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Answer ten tickets, then stop counting." } }] },
|
|
89
|
+
"Affirmation": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "I am more than my inbox." } }] },
|
|
90
|
+
"Day Mood": { "type": "number", "number": 4 },
|
|
91
|
+
"Day Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "okay" } }] },
|
|
92
|
+
"Highlight": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Closed the hardest ticket with an actual fix, not a workaround." } }] },
|
|
93
|
+
"Lesson": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Naming the dread out loud makes it about half as loud." } }] }
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "journal-demo-5",
|
|
98
|
+
"title": "Journal — 2026-07-12",
|
|
99
|
+
"content_markdown": "Quiet, focused day. The kind that does not make stories but makes progress.",
|
|
100
|
+
"created_time": "2026-07-12T08:00:00.000Z",
|
|
101
|
+
"properties": {
|
|
102
|
+
"Name": { "type": "title", "title": [{ "type": "text", "text": { "content": "Journal — 2026-07-12" } }] },
|
|
103
|
+
"Date": { "type": "date", "date": { "start": "2026-07-12", "end": null, "timezone": null } },
|
|
104
|
+
"Morning Mood": { "type": "number", "number": 5 },
|
|
105
|
+
"Morning Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "curious" } }] },
|
|
106
|
+
"Morning Feeling": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Mildly under-slept but interested in the day." } }] },
|
|
107
|
+
"Energy": { "type": "number", "number": 6 },
|
|
108
|
+
"Motivation": { "type": "number", "number": 7 },
|
|
109
|
+
"Gratitude 1": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Morning light in the kitchen" } }] },
|
|
110
|
+
"Gratitude 2": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "A podcast that made the dishes disappear" } }] },
|
|
111
|
+
"Gratitude 3": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Knowing exactly what today is for" } }] },
|
|
112
|
+
"Intention": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "Prototype the stats page before lunch." } }] },
|
|
113
|
+
"Affirmation": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "I am learning fast enough." } }] },
|
|
114
|
+
"Day Mood": { "type": "number", "number": 6 },
|
|
115
|
+
"Day Mood Word": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "satisfying" } }] },
|
|
116
|
+
"Highlight": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "The prototype clicked on the third try." } }] },
|
|
117
|
+
"Lesson": { "type": "rich_text", "rich_text": [{ "type": "text", "text": { "content": "The second draft is where the good ideas live." } }] }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"scenarios": {
|
|
124
|
+
"journal-overview": { "actions": [] },
|
|
125
|
+
"journal-evening": {
|
|
126
|
+
"actions": [
|
|
127
|
+
{ "type": "click", "selector": "[data-rail-row='2026-07-15']", "settle_ms": 700 }
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
"journal-stats": { "actions": [] }
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { defineNotisApp } from '@notis/sdk/config';
|
|
2
|
+
|
|
3
|
+
export default defineNotisApp({
|
|
4
|
+
name: 'notis-journal',
|
|
5
|
+
title: '5 Minutes Journal',
|
|
6
|
+
description:
|
|
7
|
+
'A display-only five-minute journal built from your morning and evening check-ins with Notis. Browse daily mood, energy, motivation, gratitude, intentions, affirmations, highlights, lessons, and free-form reflections, then use Stats to see trends and ritual consistency over time.',
|
|
8
|
+
icon: 'phosphor:notebook',
|
|
9
|
+
accent: 'amber',
|
|
10
|
+
author: { name: 'Florian (Flo) Pariset' },
|
|
11
|
+
categories: ['Personal', 'Productivity'],
|
|
12
|
+
tagline: 'Five intentional minutes with Notis, split between morning and evening.',
|
|
13
|
+
screenshots: [
|
|
14
|
+
{
|
|
15
|
+
path: 'metadata/screenshot-1.png',
|
|
16
|
+
alt: '5 Minutes Journal timeline with a morning check-in: mood scale, energy and motivation, gratitudes, intention, and affirmation.',
|
|
17
|
+
route: 'journal',
|
|
18
|
+
scenario: 'journal-overview',
|
|
19
|
+
focus: '[data-store-screenshot="journal"]',
|
|
20
|
+
theme: 'light',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
path: 'metadata/screenshot-2.png',
|
|
24
|
+
alt: '5 Minutes Journal timeline in dark mode with a morning check-in, mood, energy, motivation, gratitudes, intention, and affirmation.',
|
|
25
|
+
route: 'journal',
|
|
26
|
+
scenario: 'journal-overview',
|
|
27
|
+
focus: '[data-store-screenshot="journal"]',
|
|
28
|
+
theme: 'dark',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
path: 'metadata/screenshot-3.png',
|
|
32
|
+
alt: 'A completed day with both the morning ritual and the evening reflection, highlight, and lesson.',
|
|
33
|
+
route: 'journal',
|
|
34
|
+
scenario: 'journal-evening',
|
|
35
|
+
focus: '[data-store-screenshot="journal"]',
|
|
36
|
+
theme: 'light',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
path: 'metadata/screenshot-4.png',
|
|
40
|
+
alt: 'A completed 5 Minutes Journal day in dark mode with both the morning ritual and evening reflection.',
|
|
41
|
+
route: 'journal',
|
|
42
|
+
scenario: 'journal-evening',
|
|
43
|
+
focus: '[data-store-screenshot="journal"]',
|
|
44
|
+
theme: 'dark',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
path: 'metadata/screenshot-5.png',
|
|
48
|
+
alt: 'Stats page with mood trends, energy and motivation, ritual consistency, and the gratitude wall.',
|
|
49
|
+
route: 'insights',
|
|
50
|
+
scenario: 'journal-stats',
|
|
51
|
+
focus: '[data-store-screenshot="stats"]',
|
|
52
|
+
theme: 'light',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
path: 'metadata/screenshot-6.png',
|
|
56
|
+
alt: '5 Minutes Journal Stats in dark mode with mood trends, ritual consistency, and recent gratitudes.',
|
|
57
|
+
route: 'insights',
|
|
58
|
+
scenario: 'journal-stats',
|
|
59
|
+
focus: '[data-store-screenshot="stats"]',
|
|
60
|
+
theme: 'dark',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
databases: ['journal_entries'],
|
|
64
|
+
skills: [
|
|
65
|
+
{
|
|
66
|
+
key: 'journal-onboarding',
|
|
67
|
+
path: './skills/journal-onboarding/SKILL.md',
|
|
68
|
+
name: 'journal-onboarding',
|
|
69
|
+
description:
|
|
70
|
+
'Set up the Journal morning and evening automations and run their check-ins.',
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
onboarding: {
|
|
74
|
+
skill: 'journal-onboarding',
|
|
75
|
+
prompt: 'Help me set up my Journal morning and evening check-ins.',
|
|
76
|
+
},
|
|
77
|
+
routes: [
|
|
78
|
+
{
|
|
79
|
+
path: '/',
|
|
80
|
+
slug: 'journal',
|
|
81
|
+
name: 'Journal',
|
|
82
|
+
icon: 'phosphor:notebook',
|
|
83
|
+
default: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
path: '/insights',
|
|
87
|
+
slug: 'insights',
|
|
88
|
+
name: 'Stats',
|
|
89
|
+
icon: 'phosphor:chart-line-up',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
tools: ['LOCAL_NOTIS_DATABASE_QUERY'],
|
|
93
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "notis-journal",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"notisAppVersion": "0.1.6",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "vite",
|
|
9
|
+
"build": "vite build",
|
|
10
|
+
"test": "tsx --test app/journal-core.test.ts"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@notis/sdk": "file:./packages/sdk",
|
|
14
|
+
"@phosphor-icons/react": "^2.1.10",
|
|
15
|
+
"@radix-ui/react-slot": "^1.1.0",
|
|
16
|
+
"class-variance-authority": "^0.7.0",
|
|
17
|
+
"clsx": "^2.1.1",
|
|
18
|
+
"react": "^19.0.0",
|
|
19
|
+
"react-dom": "^19.0.0",
|
|
20
|
+
"tailwind-merge": "^2.6.0",
|
|
21
|
+
"tailwindcss-animate": "^1.0.7"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^22.0.0",
|
|
25
|
+
"@types/react": "^19.0.0",
|
|
26
|
+
"@types/react-dom": "^19.0.0",
|
|
27
|
+
"@vitejs/plugin-react": "^4.0.0",
|
|
28
|
+
"postcss": "^8.0.0",
|
|
29
|
+
"tailwindcss": "^3.4.0",
|
|
30
|
+
"tsx": "^4.21.0",
|
|
31
|
+
"typescript": "^5.0.0",
|
|
32
|
+
"vite": "^6.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@notis/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./src/index.ts",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.ts",
|
|
8
|
+
"./config": "./src/config.ts",
|
|
9
|
+
"./vite": "./src/vite.ts",
|
|
10
|
+
"./ui": "./src/ui.ts",
|
|
11
|
+
"./styles.css": "./src/styles.css"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"src",
|
|
15
|
+
"template"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"type-check": "tsc --noEmit"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"react-markdown": "^10.1.0",
|
|
22
|
+
"remark-gfm": "^4.0.1"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": ">=18.0.0",
|
|
26
|
+
"react-dom": ">=18.0.0",
|
|
27
|
+
"vite": ">=5.0.0",
|
|
28
|
+
"@vitejs/plugin-react": ">=4.0.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^20.0.0",
|
|
32
|
+
"@types/react": "^19.0.0",
|
|
33
|
+
"@types/react-dom": "^19.0.0",
|
|
34
|
+
"typescript": "^5.0.0"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import type { CSSProperties, ReactElement } from 'react';
|
|
4
|
+
import { useNotisRuntime } from '../provider';
|
|
5
|
+
import { useDocument } from '../hooks/useDocument';
|
|
6
|
+
import { Markdown } from './Markdown';
|
|
7
|
+
import type { NotisDocumentEditorProps } from '../runtime';
|
|
8
|
+
|
|
9
|
+
const fallbackNoticeStyle: CSSProperties = {
|
|
10
|
+
marginTop: '0.75rem',
|
|
11
|
+
fontSize: '12px',
|
|
12
|
+
color: 'hsl(var(--muted-foreground))',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const fallbackFrameStyle: CSSProperties = {
|
|
16
|
+
borderRadius: '0.5rem',
|
|
17
|
+
border: '1px dashed hsl(var(--border))',
|
|
18
|
+
padding: '1rem',
|
|
19
|
+
fontSize: '13px',
|
|
20
|
+
color: 'hsl(var(--muted-foreground))',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const fallbackTitleStyle: CSSProperties = {
|
|
24
|
+
margin: '0 0 0.75rem',
|
|
25
|
+
fontSize: '1.5rem',
|
|
26
|
+
fontWeight: 700,
|
|
27
|
+
letterSpacing: '-0.01em',
|
|
28
|
+
color: 'hsl(var(--foreground))',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Read-only stand-in used when no host editor is available (standalone dev
|
|
33
|
+
* harness, snapshots). Markdown content renders via `Markdown`; other content
|
|
34
|
+
* types get a typed placeholder.
|
|
35
|
+
*/
|
|
36
|
+
function DocumentEditorFallback({ documentId, variant = 'full', className }: NotisDocumentEditorProps) {
|
|
37
|
+
const runtime = useNotisRuntime();
|
|
38
|
+
const { document, loading, error } = useDocument(documentId);
|
|
39
|
+
// Listing screenshots should show the app as it looks in the portal, so the
|
|
40
|
+
// harness-only editing notice stays out of scenario captures.
|
|
41
|
+
const isScreenshot = Boolean(runtime?.context?.screenshotScenario);
|
|
42
|
+
|
|
43
|
+
if (loading) {
|
|
44
|
+
return <div className={className} style={fallbackFrameStyle}>Loading document…</div>;
|
|
45
|
+
}
|
|
46
|
+
if (error || !document) {
|
|
47
|
+
return (
|
|
48
|
+
<div className={className} style={fallbackFrameStyle}>
|
|
49
|
+
{error?.message ?? 'Document not found.'}
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const isMarkdown = document.contentType !== 'file';
|
|
55
|
+
return (
|
|
56
|
+
<div className={className}>
|
|
57
|
+
{variant === 'full' ? <h1 style={fallbackTitleStyle}>{document.title}</h1> : null}
|
|
58
|
+
{isMarkdown ? (
|
|
59
|
+
<>
|
|
60
|
+
<Markdown value={document.contentMarkdown ?? ''} />
|
|
61
|
+
{isScreenshot ? null : (
|
|
62
|
+
<p style={fallbackNoticeStyle}>Read-only preview — editing is available inside the Notis portal.</p>
|
|
63
|
+
)}
|
|
64
|
+
</>
|
|
65
|
+
) : (
|
|
66
|
+
<div style={fallbackFrameStyle}>
|
|
67
|
+
{document.fileType ? `${document.fileType.toUpperCase()} document` : 'File document'} — open it in
|
|
68
|
+
the Notis portal to view.
|
|
69
|
+
</div>
|
|
70
|
+
)}
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Embeds the document editor for a document anywhere in an app view. The host
|
|
77
|
+
* (portal) provides the implementation through `runtime.ui.DocumentEditor` and
|
|
78
|
+
* dispatches on the document's content type (markdown -> rich text editor,
|
|
79
|
+
* files -> matching viewer). Outside the portal this falls back to a read-only
|
|
80
|
+
* preview.
|
|
81
|
+
*
|
|
82
|
+
* ```tsx
|
|
83
|
+
* <DocumentEditor documentId={entry.id} variant="body" className="min-h-[320px]" />
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export function DocumentEditor(props: NotisDocumentEditorProps): ReactElement {
|
|
87
|
+
const runtime = useNotisRuntime();
|
|
88
|
+
const HostEditor = runtime?.ui?.DocumentEditor;
|
|
89
|
+
if (HostEditor) {
|
|
90
|
+
return <HostEditor {...props} />;
|
|
91
|
+
}
|
|
92
|
+
return <DocumentEditorFallback {...props} />;
|
|
93
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import type { AnchorHTMLAttributes, ReactElement } from 'react';
|
|
4
|
+
import ReactMarkdown, { type Components } from 'react-markdown';
|
|
5
|
+
import remarkGfm from 'remark-gfm';
|
|
6
|
+
|
|
7
|
+
export interface MarkdownProps {
|
|
8
|
+
/** Markdown source to render. */
|
|
9
|
+
value: string;
|
|
10
|
+
/** Typography scale. 'sm' suits dense surfaces (cards, list rows). */
|
|
11
|
+
size?: 'sm' | 'base';
|
|
12
|
+
className?: string;
|
|
13
|
+
/** Per-element overrides, passed through to react-markdown. */
|
|
14
|
+
components?: Components;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function MarkdownLink({
|
|
18
|
+
href,
|
|
19
|
+
children,
|
|
20
|
+
node: _node,
|
|
21
|
+
...rest
|
|
22
|
+
}: AnchorHTMLAttributes<HTMLAnchorElement> & { node?: unknown }) {
|
|
23
|
+
const isExternal = typeof href === 'string' && /^https?:\/\//i.test(href);
|
|
24
|
+
return (
|
|
25
|
+
<a
|
|
26
|
+
href={href}
|
|
27
|
+
{...(isExternal ? { target: '_blank', rel: 'noreferrer noopener' } : {})}
|
|
28
|
+
{...rest}
|
|
29
|
+
>
|
|
30
|
+
{children}
|
|
31
|
+
</a>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const defaultComponents: Components = {
|
|
36
|
+
a: MarkdownLink,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Renders a markdown value with Notis typography. Markdown is a value type:
|
|
41
|
+
* use this anywhere markdown appears — document content, database fields,
|
|
42
|
+
* generated text. Styling comes from `.notis-markdown` rules in the SDK
|
|
43
|
+
* stylesheet and follows the portal theme variables.
|
|
44
|
+
*/
|
|
45
|
+
export function Markdown({ value, size = 'base', className, components }: MarkdownProps): ReactElement {
|
|
46
|
+
const classes = ['notis-markdown', size === 'sm' ? 'notis-markdown--sm' : null, className]
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.join(' ');
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div className={classes}>
|
|
52
|
+
<ReactMarkdown
|
|
53
|
+
remarkPlugins={[remarkGfm]}
|
|
54
|
+
components={components ? { ...defaultComponents, ...components } : defaultComponents}
|
|
55
|
+
>
|
|
56
|
+
{value}
|
|
57
|
+
</ReactMarkdown>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|