@notis_ai/cli 0.2.7 → 0.2.9

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.
Files changed (183) hide show
  1. package/README.md +56 -2
  2. package/dist/scaffolds/notis-database/app/page.tsx +38 -41
  3. package/dist/scaffolds/notis-database/lib/types.ts +5 -7
  4. package/dist/scaffolds/notis-database/metadata/screenshot-1.png +0 -0
  5. package/dist/scaffolds/notis-database/metadata/screenshot-2.png +0 -0
  6. package/dist/scaffolds/notis-database/metadata/screenshot-3.png +0 -0
  7. package/dist/scaffolds/notis-database/metadata/screenshot-4.png +0 -0
  8. package/dist/scaffolds/notis-database/metadata/screenshot-5.png +0 -0
  9. package/dist/scaffolds/notis-database/metadata/screenshot-fixtures.json +1839 -0
  10. package/dist/scaffolds/notis-database/notis.config.ts +48 -1
  11. package/dist/scaffolds/notis-database/package-lock.json +3935 -0
  12. package/dist/scaffolds/notis-database/package.json +2 -1
  13. package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/package.json +4 -0
  14. package/dist/scaffolds/notis-database/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  15. package/dist/scaffolds/notis-database/packages/sdk/src/components/Markdown.tsx +60 -0
  16. package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/components/MultiSelectActionBar.tsx +7 -2
  17. package/dist/scaffolds/notis-database/packages/sdk/src/config.ts +196 -0
  18. package/dist/scaffolds/notis-database/packages/sdk/src/documents.ts +229 -0
  19. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  20. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocument.ts +78 -0
  21. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocuments.ts +121 -0
  22. package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useMultiSelect.ts +38 -2
  23. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  24. package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/index.ts +30 -1
  25. package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/runtime.ts +76 -17
  26. package/dist/scaffolds/notis-database/packages/sdk/src/styles.css +186 -0
  27. package/dist/scaffolds/notis-database/src/mock-runtime.ts +4 -1
  28. package/dist/scaffolds/notis-journal/CHANGELOG.md +4 -0
  29. package/dist/scaffolds/notis-journal/app/page.tsx +1 -0
  30. package/dist/scaffolds/notis-journal/package-lock.json +4615 -0
  31. package/dist/scaffolds/notis-journal/package.json +2 -2
  32. package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +52 -1
  33. package/dist/scaffolds/notis-notes/app/page.tsx +39 -46
  34. package/dist/scaffolds/notis-notes/app/phosphor-icons.ts +596 -0
  35. package/dist/scaffolds/notis-notes/lib/visible-properties.ts +144 -0
  36. package/dist/scaffolds/notis-notes/metadata/screenshot-1.png +0 -0
  37. package/dist/scaffolds/notis-notes/metadata/screenshot-2.png +0 -0
  38. package/dist/scaffolds/notis-notes/metadata/screenshot-3.png +0 -0
  39. package/dist/scaffolds/notis-notes/metadata/screenshot-4.png +0 -0
  40. package/dist/scaffolds/notis-notes/metadata/screenshot-5.png +0 -0
  41. package/dist/scaffolds/notis-notes/metadata/screenshot-fixtures.json +752 -0
  42. package/dist/scaffolds/notis-notes/notis.config.ts +48 -3
  43. package/dist/scaffolds/notis-notes/package-lock.json +4636 -0
  44. package/dist/scaffolds/notis-notes/package.json +7 -3
  45. package/dist/scaffolds/notis-notes/packages/sdk/package.json +36 -0
  46. package/dist/scaffolds/notis-notes/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  47. package/dist/scaffolds/notis-notes/packages/sdk/src/components/Markdown.tsx +60 -0
  48. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
  49. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  50. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  51. package/dist/scaffolds/notis-notes/packages/sdk/src/config.ts +196 -0
  52. package/dist/scaffolds/notis-notes/packages/sdk/src/documents.ts +229 -0
  53. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useBackend.ts +41 -0
  54. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  55. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocument.ts +78 -0
  56. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocuments.ts +121 -0
  57. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
  58. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotis.ts +34 -0
  59. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  60. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTool.ts +64 -0
  61. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTools.ts +56 -0
  62. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  63. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  64. package/dist/scaffolds/notis-notes/packages/sdk/src/index.ts +83 -0
  65. package/dist/scaffolds/notis-notes/packages/sdk/src/provider.tsx +43 -0
  66. package/dist/scaffolds/notis-notes/packages/sdk/src/runtime.ts +220 -0
  67. package/dist/scaffolds/notis-notes/packages/sdk/src/styles.css +186 -0
  68. package/dist/scaffolds/notis-notes/packages/sdk/src/ui.ts +15 -0
  69. package/dist/scaffolds/notis-notes/packages/sdk/src/vite.ts +56 -0
  70. package/dist/scaffolds/notis-notes/packages/sdk/tsconfig.json +15 -0
  71. package/dist/scaffolds/notis-random/CHANGELOG.md +12 -2
  72. package/dist/scaffolds/notis-random/app/history/page.tsx +5 -4
  73. package/dist/scaffolds/notis-random/app/page.tsx +141 -74
  74. package/dist/scaffolds/notis-random/components/ui/button.tsx +50 -0
  75. package/dist/scaffolds/notis-random/components/ui/card.tsx +16 -0
  76. package/dist/scaffolds/notis-random/components/ui/input.tsx +23 -0
  77. package/dist/scaffolds/notis-random/lib/notis-tools.ts +26 -7
  78. package/dist/scaffolds/notis-random/lib/rng.ts +179 -19
  79. package/dist/scaffolds/notis-random/lib/roll-record.ts +103 -16
  80. package/dist/scaffolds/notis-random/metadata/screenshot-1.png +0 -0
  81. package/dist/scaffolds/notis-random/metadata/screenshot-2.png +0 -0
  82. package/dist/scaffolds/notis-random/metadata/screenshot-3.png +0 -0
  83. package/dist/scaffolds/notis-random/metadata/screenshot-4.png +0 -0
  84. package/dist/scaffolds/notis-random/metadata/screenshot-5.png +0 -0
  85. package/dist/scaffolds/notis-random/metadata/screenshot-fixtures.json +753 -0
  86. package/dist/scaffolds/notis-random/notis.config.ts +47 -3
  87. package/dist/scaffolds/notis-random/package-lock.json +4513 -0
  88. package/dist/scaffolds/notis-random/package.json +6 -2
  89. package/dist/scaffolds/notis-random/packages/sdk/package.json +36 -0
  90. package/dist/scaffolds/notis-random/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  91. package/dist/scaffolds/notis-random/packages/sdk/src/components/Markdown.tsx +60 -0
  92. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
  93. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  94. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  95. package/dist/scaffolds/notis-random/packages/sdk/src/config.ts +196 -0
  96. package/dist/scaffolds/notis-random/packages/sdk/src/documents.ts +229 -0
  97. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useBackend.ts +41 -0
  98. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  99. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocument.ts +78 -0
  100. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocuments.ts +121 -0
  101. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
  102. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotis.ts +34 -0
  103. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  104. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTool.ts +64 -0
  105. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTools.ts +56 -0
  106. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  107. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  108. package/dist/scaffolds/notis-random/packages/sdk/src/index.ts +83 -0
  109. package/dist/scaffolds/notis-random/packages/sdk/src/provider.tsx +43 -0
  110. package/dist/scaffolds/notis-random/packages/sdk/src/runtime.ts +220 -0
  111. package/dist/scaffolds/notis-random/packages/sdk/src/styles.css +186 -0
  112. package/dist/scaffolds/notis-random/packages/sdk/src/ui.ts +15 -0
  113. package/dist/scaffolds/notis-random/packages/sdk/src/vite.ts +56 -0
  114. package/dist/scaffolds/notis-random/packages/sdk/tsconfig.json +15 -0
  115. package/dist/scaffolds/notis-random/tailwind.config.ts +8 -1
  116. package/dist/scaffolds.json +8 -17
  117. package/package.json +2 -1
  118. package/skills/notis-apps/SKILL.md +438 -144
  119. package/skills/notis-apps/cli.md +16 -1
  120. package/skills/notis-cli/SKILL.md +11 -4
  121. package/skills/notis-onboarding/BRIEF.md +93 -0
  122. package/skills/notis-query/cli.md +1 -1
  123. package/src/cli.js +50 -12
  124. package/src/command-specs/apps.js +309 -41
  125. package/src/command-specs/auth.js +107 -0
  126. package/src/command-specs/index.js +4 -0
  127. package/src/command-specs/meta.js +68 -6
  128. package/src/command-specs/onboarding.js +304 -0
  129. package/src/command-specs/tools.js +8 -4
  130. package/src/runtime/app-dev-server.js +3 -2
  131. package/src/runtime/app-dev-sessions.js +14 -40
  132. package/src/runtime/app-platform.js +65 -4
  133. package/src/runtime/desktop-auth.js +86 -17
  134. package/src/runtime/errors.js +1 -0
  135. package/src/runtime/oauth.js +1105 -0
  136. package/src/runtime/output.js +16 -2
  137. package/src/runtime/profiles.js +542 -18
  138. package/src/runtime/telemetry.js +92 -0
  139. package/src/runtime/transport.js +66 -11
  140. package/template/.harness/index.html.tmpl +30 -2
  141. package/template/packages/sdk/src/config.ts +38 -1
  142. package/dist/scaffolds/notis-affiliate-prospects/CHANGELOG.md +0 -7
  143. package/dist/scaffolds/notis-affiliate-prospects/README.md +0 -20
  144. package/dist/scaffolds/notis-affiliate-prospects/app/globals.css +0 -42
  145. package/dist/scaffolds/notis-affiliate-prospects/app/layout.tsx +0 -7
  146. package/dist/scaffolds/notis-affiliate-prospects/app/page.tsx +0 -248
  147. package/dist/scaffolds/notis-affiliate-prospects/app/prospects/page.tsx +0 -134
  148. package/dist/scaffolds/notis-affiliate-prospects/app/segments/page.tsx +0 -108
  149. package/dist/scaffolds/notis-affiliate-prospects/components/ui/card.tsx +0 -35
  150. package/dist/scaffolds/notis-affiliate-prospects/index.html +0 -12
  151. package/dist/scaffolds/notis-affiliate-prospects/lib/affiliate-data.ts +0 -218
  152. package/dist/scaffolds/notis-affiliate-prospects/lib/demo-prospects.ts +0 -52
  153. package/dist/scaffolds/notis-affiliate-prospects/lib/notis-tools.ts +0 -100
  154. package/dist/scaffolds/notis-affiliate-prospects/lib/utils.ts +0 -25
  155. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-1.png +0 -0
  156. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-2.png +0 -0
  157. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-3.png +0 -0
  158. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-fixtures.json +0 -187
  159. package/dist/scaffolds/notis-affiliate-prospects/notis.config.ts +0 -65
  160. package/dist/scaffolds/notis-affiliate-prospects/package.json +0 -32
  161. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/config.ts +0 -90
  162. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useDatabase.ts +0 -76
  163. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useUpsertDocument.ts +0 -50
  164. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/styles.css +0 -38
  165. package/dist/scaffolds/notis-affiliate-prospects/postcss.config.mjs +0 -6
  166. package/dist/scaffolds/notis-affiliate-prospects/src/dev-main.tsx +0 -72
  167. package/dist/scaffolds/notis-affiliate-prospects/src/mock-runtime.ts +0 -242
  168. package/dist/scaffolds/notis-affiliate-prospects/tailwind.config.ts +0 -51
  169. package/dist/scaffolds/notis-affiliate-prospects/tsconfig.json +0 -23
  170. package/dist/scaffolds/notis-affiliate-prospects/vite.config.ts +0 -11
  171. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -0
  172. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -0
  173. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useBackend.ts +0 -0
  174. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useNotis.ts +0 -0
  175. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useNotisNavigation.ts +0 -0
  176. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useTool.ts +0 -0
  177. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useTools.ts +0 -0
  178. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useTopBarSearch.ts +0 -0
  179. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/provider.tsx +0 -0
  180. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/ui.ts +0 -0
  181. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/vite.ts +0 -0
  182. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/tsconfig.json +0 -0
  183. /package/dist/scaffolds/{notis-affiliate-prospects → notis-random}/components.json +0 -0
@@ -1,25 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
3
-
4
- export function cn(...inputs: ClassValue[]): string {
5
- return twMerge(clsx(inputs));
6
- }
7
-
8
- export function formatNumber(value: number): string {
9
- if (Number.isInteger(value)) return value.toString();
10
- return value.toFixed(4).replace(/0+$/, '').replace(/\.$/, '');
11
- }
12
-
13
- export function relativeTime(iso: string | null | undefined): string {
14
- if (!iso) return '';
15
- const then = new Date(iso).getTime();
16
- if (Number.isNaN(then)) return '';
17
- const diffSeconds = Math.round((Date.now() - then) / 1000);
18
- if (diffSeconds < 5) return 'just now';
19
- if (diffSeconds < 60) return `${diffSeconds}s ago`;
20
- const diffMinutes = Math.round(diffSeconds / 60);
21
- if (diffMinutes < 60) return `${diffMinutes}m ago`;
22
- const diffHours = Math.round(diffMinutes / 60);
23
- if (diffHours < 24) return `${diffHours}h ago`;
24
- return new Date(iso).toLocaleDateString();
25
- }
@@ -1,187 +0,0 @@
1
- {
2
- "tools": {
3
- "LOCAL_NOTIS_DATABASE_QUERY": {
4
- "documents": [
5
- {
6
- "id": "demo-alex",
7
- "title": "Alex Morgan",
8
- "properties": {
9
- "Name": "Alex Morgan",
10
- "Company": "FlowNorth",
11
- "Segment": "Automation Agency",
12
- "Status": "Interested",
13
- "Priority": "P0",
14
- "Fit Score": 94,
15
- "Email": "alex@flownorth.example",
16
- "LinkedIn": "https://linkedin.com/in/alex-morgan",
17
- "Source": "Zapier Solution Partner Directory",
18
- "Audience Size": 8200,
19
- "Monthly Traffic": 14000,
20
- "Next Action": "Send partner economics one-pager",
21
- "Next Action Date": "2026-07-24"
22
- }
23
- },
24
- {
25
- "id": "demo-maya",
26
- "title": "Maya Chen",
27
- "properties": {
28
- "Name": "Maya Chen",
29
- "Company": "Agent Ops Weekly",
30
- "Segment": "AI Creator",
31
- "Status": "Replied",
32
- "Priority": "P0",
33
- "Fit Score": 91,
34
- "Email": "maya@agentopsweekly.example",
35
- "LinkedIn": "https://linkedin.com/in/maya-chen",
36
- "Source": "Newsletter discovery",
37
- "Audience Size": 38000,
38
- "Monthly Traffic": 22000,
39
- "Next Action": "Share creator demo kit",
40
- "Next Action Date": "2026-07-24"
41
- }
42
- },
43
- {
44
- "id": "demo-noah",
45
- "title": "Noah Williams",
46
- "properties": {
47
- "Name": "Noah Williams",
48
- "Company": "Automate Better",
49
- "Segment": "SEO Publisher",
50
- "Status": "Ready for Outreach",
51
- "Priority": "P1",
52
- "Fit Score": 88,
53
- "Email": "noah@automatebetter.example",
54
- "Website": "https://automatebetter.example",
55
- "Source": "DataForSEO: Zapier alternatives",
56
- "Monthly Traffic": 76000,
57
- "Next Action": "Approve comparison-page pitch",
58
- "Next Action Date": "2026-07-25"
59
- }
60
- },
61
- {
62
- "id": "demo-sofia",
63
- "title": "Sofia Rossi",
64
- "properties": {
65
- "Name": "Sofia Rossi",
66
- "Company": "RevOps Circle",
67
- "Segment": "Community Educator",
68
- "Status": "Qualified",
69
- "Priority": "P1",
70
- "Fit Score": 86,
71
- "LinkedIn": "https://linkedin.com/in/sofia-rossi",
72
- "Source": "Community operator list",
73
- "Audience Size": 14500,
74
- "Next Action": "Enrich sponsor history",
75
- "Next Action Date": "2026-07-25"
76
- }
77
- },
78
- {
79
- "id": "demo-theo",
80
- "title": "Theo Martin",
81
- "properties": {
82
- "Name": "Theo Martin",
83
- "Company": "Notis customer",
84
- "Segment": "Customer Advocate",
85
- "Status": "Activated",
86
- "Priority": "P0",
87
- "Fit Score": 97,
88
- "Source": "Rewardful + product usage",
89
- "Referred Signups": 19,
90
- "Activated Referrals": 7,
91
- "Attributed MRR": 1680
92
- }
93
- },
94
- {
95
- "id": "demo-lena",
96
- "title": "Lena Fischer",
97
- "properties": {
98
- "Name": "Lena Fischer",
99
- "Company": "StackPilot",
100
- "Segment": "Integration Partner",
101
- "Status": "Applied",
102
- "Priority": "P0",
103
- "Fit Score": 92,
104
- "Email": "lena@stackpilot.example",
105
- "LinkedIn": "https://linkedin.com/in/lena-fischer",
106
- "Source": "Integration overlap analysis",
107
- "Audience Size": 21000,
108
- "Monthly Traffic": 41000,
109
- "Next Action": "Confirm co-marketing launch date",
110
- "Next Action Date": "2026-07-28"
111
- }
112
- },
113
- {
114
- "id": "demo-sam",
115
- "title": "Sam Patel",
116
- "properties": {
117
- "Name": "Sam Patel",
118
- "Company": "SaaS Growth Lab",
119
- "Segment": "Affiliate Marketplace",
120
- "Status": "Contacted",
121
- "Priority": "P1",
122
- "Fit Score": 82,
123
- "Email": "sam@saasgrowthlab.example",
124
- "Source": "PartnerStack marketplace",
125
- "Audience Size": 18000,
126
- "Monthly Traffic": 33000,
127
- "Next Action": "Follow up with use-case proof",
128
- "Next Action Date": "2026-07-27"
129
- }
130
- },
131
- {
132
- "id": "demo-jordan",
133
- "title": "Jordan Lee",
134
- "properties": {
135
- "Name": "Jordan Lee",
136
- "Company": "OpsCraft",
137
- "Segment": "Automation Agency",
138
- "Status": "Qualified",
139
- "Priority": "P1",
140
- "Fit Score": 84,
141
- "Email": "jordan@opscraft.example",
142
- "LinkedIn": "https://linkedin.com/in/jordan-lee",
143
- "Source": "Make Partner Directory",
144
- "Audience Size": 5400,
145
- "Next Action": "Review recent client verticals",
146
- "Next Action Date": "2026-07-25"
147
- }
148
- },
149
- {
150
- "id": "demo-camille",
151
- "title": "Camille Laurent",
152
- "properties": {
153
- "Name": "Camille Laurent",
154
- "Company": "Productive AI",
155
- "Segment": "SEO Publisher",
156
- "Status": "Activated",
157
- "Priority": "P0",
158
- "Fit Score": 90,
159
- "Email": "camille@productiveai.example",
160
- "Website": "https://productiveai.example",
161
- "Source": "DataForSEO: AI automation tools",
162
- "Monthly Traffic": 92000,
163
- "Referred Signups": 31,
164
- "Activated Referrals": 11,
165
- "Attributed MRR": 2940
166
- }
167
- },
168
- {
169
- "id": "demo-owen",
170
- "title": "Owen King",
171
- "properties": {
172
- "Name": "Owen King",
173
- "Company": "Notis customer",
174
- "Segment": "Customer Advocate",
175
- "Status": "Contacted",
176
- "Priority": "P1",
177
- "Fit Score": 80,
178
- "Email": "owen@example.com",
179
- "Source": "Product usage: 25 successful workflows",
180
- "Next Action": "Invite to advocate cohort",
181
- "Next Action Date": "2026-07-26"
182
- }
183
- }
184
- ]
185
- }
186
- }
187
- }
@@ -1,65 +0,0 @@
1
- import { defineNotisApp } from '@notis/sdk/config';
2
-
3
- export default defineNotisApp({
4
- name: 'affiliate-prospects',
5
- title: 'Affiliate Prospects',
6
- description:
7
- 'A campaign control center for sourcing, qualifying, contacting, and activating high-fit Notis affiliates.',
8
- icon: 'phosphor:users-three',
9
- accent: 'violet',
10
- author: { name: 'Florian (Flo) Pariset' },
11
- categories: ['Sales & Marketing', 'Operations'],
12
- tagline: 'Turn affiliate recruiting into a measurable, repeatable pipeline.',
13
- screenshots: [
14
- {
15
- path: 'metadata/screenshot-1.png',
16
- alt: 'Affiliate campaign dashboard with pipeline, priority queue, and segment performance.',
17
- route: 'dashboard',
18
- scenario: 'affiliate-dashboard',
19
- focus: '[data-store-screenshot="dashboard"]',
20
- theme: 'light',
21
- },
22
- {
23
- path: 'metadata/screenshot-2.png',
24
- alt: 'Affiliate prospect list with status, segment, fit score, source, and next action.',
25
- route: 'prospects',
26
- scenario: 'affiliate-prospects',
27
- focus: '[data-store-screenshot="prospects"]',
28
- theme: 'light',
29
- },
30
- {
31
- path: 'metadata/screenshot-3.png',
32
- alt: 'Affiliate segment scorecards showing campaign progress and sourcing playbooks.',
33
- route: 'segments',
34
- scenario: 'affiliate-segments',
35
- focus: '[data-store-screenshot="segments"]',
36
- theme: 'dark',
37
- },
38
- ],
39
-
40
- databases: ['affiliate_prospects_1', 'affiliate_outreach_events_1'],
41
-
42
- routes: [
43
- {
44
- path: '/',
45
- slug: 'dashboard',
46
- name: 'Dashboard',
47
- icon: 'phosphor:squares-four',
48
- default: true,
49
- },
50
- {
51
- path: '/prospects',
52
- slug: 'prospects',
53
- name: 'Prospects',
54
- icon: 'phosphor:users',
55
- },
56
- {
57
- path: '/segments',
58
- slug: 'segments',
59
- name: 'Segments',
60
- icon: 'phosphor:circles-three-plus',
61
- },
62
- ],
63
-
64
- tools: ['LOCAL_NOTIS_DATABASE_QUERY'],
65
- });
@@ -1,32 +0,0 @@
1
- {
2
- "name": "affiliate-prospects",
3
- "version": "0.1.0",
4
- "notisAppVersion": "0.1.0",
5
- "private": true,
6
- "type": "module",
7
- "scripts": {
8
- "build": "vite build",
9
- "dev": "vite",
10
- "typecheck": "tsc --noEmit"
11
- },
12
- "dependencies": {
13
- "@notis/sdk": "file:./packages/sdk",
14
- "@phosphor-icons/react": "^2.1.10",
15
- "clsx": "^2.1.1",
16
- "react": "^19.0.0",
17
- "react-dom": "^19.0.0",
18
- "tailwind-merge": "^2.6.0"
19
- },
20
- "devDependencies": {
21
- "@types/node": "^22.0.0",
22
- "@types/react": "^19.0.0",
23
- "@types/react-dom": "^19.0.0",
24
- "@vitejs/plugin-react": "^4.3.0",
25
- "autoprefixer": "^10.4.0",
26
- "postcss": "^8.4.0",
27
- "tailwindcss": "^3.4.0",
28
- "tailwindcss-animate": "^1.0.7",
29
- "typescript": "^5.5.0",
30
- "vite": "^6.0.0"
31
- }
32
- }
@@ -1,90 +0,0 @@
1
- /**
2
- * Configuration utilities for notis.config.ts.
3
- *
4
- * Usage:
5
- * ```ts
6
- * // notis.config.ts
7
- * import { defineNotisApp } from '@notis/sdk/config';
8
- *
9
- * export default defineNotisApp({
10
- * name: 'My App',
11
- * description: 'Does things',
12
- * icon: 'phosphor:squares-four',
13
- * databases: ['tasks'],
14
- * routes: [
15
- * {
16
- * path: '/',
17
- * slug: 'notes',
18
- * name: 'Notes',
19
- * default: true,
20
- * collection: {
21
- * database: 'notes',
22
- * titleProperty: 'Name',
23
- * parentProperty: 'Parent',
24
- * sidebar: {
25
- * mode: 'tree',
26
- * allowCreate: true,
27
- * },
28
- * },
29
- * },
30
- * ],
31
- * tools: [...],
32
- * });
33
- * ```
34
- */
35
-
36
- export interface NotisRouteConfig {
37
- path: string;
38
- slug: string;
39
- name: string;
40
- icon?: string;
41
- parentSlug?: string | null;
42
- default?: boolean;
43
- exportName?: string;
44
- collection?: {
45
- database: string;
46
- titleProperty: string;
47
- parentProperty?: string | null;
48
- sidebar?: {
49
- mode: 'flat-list' | 'tree';
50
- allowCreate: boolean;
51
- };
52
- };
53
- }
54
-
55
- export interface NotisAppConfig {
56
- name: string;
57
- title?: string;
58
- description?: string;
59
- icon?: string;
60
- accent?: 'blue' | 'violet' | 'emerald' | 'amber' | 'rose' | 'sky' | 'fuchsia' | 'teal';
61
- author?: {
62
- name: string;
63
- handle?: string;
64
- url?: string;
65
- };
66
- categories?: Array<
67
- 'Productivity' | 'Sales & Marketing' | 'Operations' | 'Product & Engineering' | 'Personal'
68
- >;
69
- tagline?: string;
70
- screenshots?: Array<{
71
- path: string;
72
- alt: string;
73
- route?: string;
74
- scenario?: string;
75
- focus?: string;
76
- theme?: 'light' | 'dark';
77
- }>;
78
- databases?: string[];
79
- routes?: NotisRouteConfig[];
80
- tools?: string[];
81
- }
82
-
83
- /**
84
- * Identity function that provides type checking and autocomplete for the
85
- * Notis app configuration. The returned object is read at build time by
86
- * `notis apps build` to generate the manifest.
87
- */
88
- export function defineNotisApp(config: NotisAppConfig): NotisAppConfig {
89
- return config;
90
- }
@@ -1,76 +0,0 @@
1
- 'use client';
2
-
3
- import { useCallback, useEffect, useState } from 'react';
4
- import { useNotisRuntime } from '../provider';
5
- import type { DocumentRecord, QueryFilter } from '../runtime';
6
-
7
- interface UseDatabaseOptions {
8
- filter?: QueryFilter;
9
- pageSize?: number;
10
- offset?: number;
11
- enabled?: boolean;
12
- }
13
-
14
- interface UseDatabaseResult {
15
- documents: DocumentRecord[];
16
- loading: boolean;
17
- error: Error | null;
18
- refetch: () => void;
19
- }
20
-
21
- export function useDatabase(
22
- databaseSlug: string,
23
- options: UseDatabaseOptions = {},
24
- ): UseDatabaseResult {
25
- const runtime = useNotisRuntime();
26
- const [documents, setDocuments] = useState<DocumentRecord[]>([]);
27
- const [loading, setLoading] = useState(true);
28
- const [error, setError] = useState<Error | null>(null);
29
- const [fetchKey, setFetchKey] = useState(0);
30
-
31
- const enabled = options.enabled !== false;
32
- const filterKey = JSON.stringify(options.filter ?? null);
33
-
34
- const refetch = useCallback(() => {
35
- setFetchKey((key) => key + 1);
36
- }, []);
37
-
38
- useEffect(() => {
39
- if (!runtime || !enabled) {
40
- setLoading(false);
41
- return;
42
- }
43
-
44
- let cancelled = false;
45
- setLoading(true);
46
- setError(null);
47
-
48
- runtime
49
- .queryDatabase({
50
- databaseSlug,
51
- query: {
52
- ...options.filter,
53
- page_size: options.pageSize,
54
- },
55
- offset: options.offset,
56
- })
57
- .then((result) => {
58
- if (!cancelled) {
59
- setDocuments(result.documents);
60
- setLoading(false);
61
- }
62
- })
63
- .catch((err) => {
64
- if (!cancelled) {
65
- setError(err instanceof Error ? err : new Error(String(err)));
66
- setLoading(false);
67
- }
68
- });
69
-
70
- return () => {
71
- cancelled = true;
72
- };
73
- }, [runtime, databaseSlug, fetchKey, enabled, filterKey, options.offset, options.pageSize]);
74
-
75
- return { documents, loading, error, refetch };
76
- }
@@ -1,50 +0,0 @@
1
- 'use client';
2
-
3
- import { useCallback, useState } from 'react';
4
- import { useNotisRuntime } from '../provider';
5
- import type { DocumentRecord } from '../runtime';
6
-
7
- interface UpsertArgs {
8
- databaseSlug: string;
9
- documentId?: string;
10
- title?: string;
11
- properties?: Record<string, unknown>;
12
- contentBlocknote?: Array<Record<string, unknown>> | null;
13
- }
14
-
15
- interface UseUpsertDocumentResult {
16
- upsert: (args: UpsertArgs) => Promise<DocumentRecord>;
17
- loading: boolean;
18
- error: Error | null;
19
- }
20
-
21
- export function useUpsertDocument(): UseUpsertDocumentResult {
22
- const runtime = useNotisRuntime();
23
- const [loading, setLoading] = useState(false);
24
- const [error, setError] = useState<Error | null>(null);
25
-
26
- const upsert = useCallback(
27
- async (args: UpsertArgs): Promise<DocumentRecord> => {
28
- if (!runtime) {
29
- throw new Error('Notis runtime not available. Ensure NotisProvider is mounted.');
30
- }
31
-
32
- setLoading(true);
33
- setError(null);
34
-
35
- try {
36
- const result = await runtime.upsertDocument(args);
37
- return result.document;
38
- } catch (err) {
39
- const e = err instanceof Error ? err : new Error(String(err));
40
- setError(e);
41
- throw e;
42
- } finally {
43
- setLoading(false);
44
- }
45
- },
46
- [runtime],
47
- );
48
-
49
- return { upsert, loading, error };
50
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * Notis theme CSS variables.
3
- *
4
- * Import this in your app layout:
5
- *
6
- * import '@notis/sdk/styles.css';
7
- *
8
- * The portal injects the live Notis theme variables at render time.
9
- */
10
-
11
- @tailwind base;
12
- @tailwind components;
13
- @tailwind utilities;
14
-
15
- @layer base {
16
- * {
17
- @apply border-border;
18
- }
19
- [data-notis-app-root] {
20
- color: hsl(var(--foreground));
21
- display: block;
22
- min-height: 100%;
23
- }
24
- }
25
-
26
- @layer components {
27
- .notis-app-shell {
28
- @apply mx-auto w-full max-w-[var(--portal-page-max-width)] px-4 py-6 md:px-4 md:py-8;
29
- }
30
-
31
- .notis-app-surface {
32
- @apply rounded-2xl border border-border bg-card text-card-foreground shadow-sm;
33
- }
34
-
35
- .notis-app-section {
36
- @apply p-5 md:p-6;
37
- }
38
- }
@@ -1,6 +0,0 @@
1
- export default {
2
- plugins: {
3
- tailwindcss: {},
4
- autoprefixer: {},
5
- },
6
- };
@@ -1,72 +0,0 @@
1
- import { StrictMode, useEffect, useState } from 'react';
2
- import { createRoot } from 'react-dom/client';
3
- import { NotisProvider } from '@notis/sdk';
4
-
5
- import AppShell from '../app/layout';
6
- import DashboardPage from '../app/page';
7
- import ProspectsPage from '../app/prospects/page';
8
- import SegmentsPage from '../app/segments/page';
9
- import { installMockRuntime, setMockRoute } from './mock-runtime';
10
-
11
- type Route = 'dashboard' | 'prospects' | 'segments';
12
- const runtime = installMockRuntime(hashRoute());
13
-
14
- function hashRoute(): Route {
15
- if (window.location.hash === '#/prospects') return 'prospects';
16
- if (window.location.hash === '#/segments') return 'segments';
17
- return 'dashboard';
18
- }
19
-
20
- function DevApp() {
21
- const [route, setRoute] = useState<Route>(hashRoute());
22
- useEffect(() => {
23
- const onChange = () => {
24
- const next = hashRoute();
25
- setRoute(next);
26
- setMockRoute(next);
27
- };
28
- window.addEventListener('hashchange', onChange);
29
- return () => window.removeEventListener('hashchange', onChange);
30
- }, []);
31
-
32
- const Page = route === 'prospects' ? ProspectsPage : route === 'segments' ? SegmentsPage : DashboardPage;
33
-
34
- return (
35
- <AppShell>
36
- <div className="mx-auto max-w-7xl px-4 pt-4">
37
- <nav className="flex w-fit items-center gap-1 rounded-lg border border-border bg-card p-1 text-sm">
38
- {([
39
- ['dashboard', '#/', 'Dashboard'],
40
- ['prospects', '#/prospects', 'Prospects'],
41
- ['segments', '#/segments', 'Segments'],
42
- ] as const).map(([id, href, label]) => (
43
- <a
44
- key={id}
45
- href={href}
46
- className={
47
- (route === id ? 'bg-muted text-foreground ' : 'text-muted-foreground hover:text-foreground ') +
48
- 'min-h-9 rounded-md px-3 py-2 transition'
49
- }
50
- >
51
- {label}
52
- </a>
53
- ))}
54
- <span className="hidden pl-2 pr-3 text-[10px] uppercase tracking-wide text-muted-foreground sm:inline">
55
- dev preview
56
- </span>
57
- </nav>
58
- </div>
59
- <Page />
60
- </AppShell>
61
- );
62
- }
63
-
64
- const root = document.getElementById('root');
65
- if (!root) throw new Error('#root element missing');
66
- createRoot(root).render(
67
- <StrictMode>
68
- <NotisProvider runtime={runtime}>
69
- <DevApp />
70
- </NotisProvider>
71
- </StrictMode>,
72
- );