@notis_ai/cli 0.2.7 → 0.2.8

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 (177) hide show
  1. package/README.md +15 -0
  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 +449 -144
  119. package/skills/notis-apps/cli.md +15 -0
  120. package/skills/notis-cli/SKILL.md +8 -4
  121. package/skills/notis-onboarding/BRIEF.md +93 -0
  122. package/src/cli.js +50 -12
  123. package/src/command-specs/apps.js +154 -21
  124. package/src/command-specs/index.js +2 -0
  125. package/src/command-specs/onboarding.js +216 -0
  126. package/src/command-specs/tools.js +8 -4
  127. package/src/runtime/app-platform.js +65 -4
  128. package/src/runtime/desktop-auth.js +66 -17
  129. package/src/runtime/errors.js +1 -0
  130. package/src/runtime/output.js +9 -2
  131. package/src/runtime/profiles.js +179 -17
  132. package/src/runtime/telemetry.js +92 -0
  133. package/src/runtime/transport.js +26 -1
  134. package/template/.harness/index.html.tmpl +30 -2
  135. package/template/packages/sdk/src/config.ts +38 -1
  136. package/dist/scaffolds/notis-affiliate-prospects/CHANGELOG.md +0 -7
  137. package/dist/scaffolds/notis-affiliate-prospects/README.md +0 -20
  138. package/dist/scaffolds/notis-affiliate-prospects/app/globals.css +0 -42
  139. package/dist/scaffolds/notis-affiliate-prospects/app/layout.tsx +0 -7
  140. package/dist/scaffolds/notis-affiliate-prospects/app/page.tsx +0 -248
  141. package/dist/scaffolds/notis-affiliate-prospects/app/prospects/page.tsx +0 -134
  142. package/dist/scaffolds/notis-affiliate-prospects/app/segments/page.tsx +0 -108
  143. package/dist/scaffolds/notis-affiliate-prospects/components/ui/card.tsx +0 -35
  144. package/dist/scaffolds/notis-affiliate-prospects/index.html +0 -12
  145. package/dist/scaffolds/notis-affiliate-prospects/lib/affiliate-data.ts +0 -218
  146. package/dist/scaffolds/notis-affiliate-prospects/lib/demo-prospects.ts +0 -52
  147. package/dist/scaffolds/notis-affiliate-prospects/lib/notis-tools.ts +0 -100
  148. package/dist/scaffolds/notis-affiliate-prospects/lib/utils.ts +0 -25
  149. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-1.png +0 -0
  150. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-2.png +0 -0
  151. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-3.png +0 -0
  152. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-fixtures.json +0 -187
  153. package/dist/scaffolds/notis-affiliate-prospects/notis.config.ts +0 -65
  154. package/dist/scaffolds/notis-affiliate-prospects/package.json +0 -32
  155. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/config.ts +0 -90
  156. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useDatabase.ts +0 -76
  157. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useUpsertDocument.ts +0 -50
  158. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/styles.css +0 -38
  159. package/dist/scaffolds/notis-affiliate-prospects/postcss.config.mjs +0 -6
  160. package/dist/scaffolds/notis-affiliate-prospects/src/dev-main.tsx +0 -72
  161. package/dist/scaffolds/notis-affiliate-prospects/src/mock-runtime.ts +0 -242
  162. package/dist/scaffolds/notis-affiliate-prospects/tailwind.config.ts +0 -51
  163. package/dist/scaffolds/notis-affiliate-prospects/tsconfig.json +0 -23
  164. package/dist/scaffolds/notis-affiliate-prospects/vite.config.ts +0 -11
  165. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -0
  166. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -0
  167. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useBackend.ts +0 -0
  168. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useNotis.ts +0 -0
  169. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useNotisNavigation.ts +0 -0
  170. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useTool.ts +0 -0
  171. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useTools.ts +0 -0
  172. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/hooks/useTopBarSearch.ts +0 -0
  173. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/provider.tsx +0 -0
  174. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/ui.ts +0 -0
  175. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/src/vite.ts +0 -0
  176. /package/dist/scaffolds/{notis-affiliate-prospects → notis-database}/packages/sdk/tsconfig.json +0 -0
  177. /package/dist/scaffolds/{notis-affiliate-prospects → notis-random}/components.json +0 -0
@@ -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
- );
@@ -1,242 +0,0 @@
1
- import type { NotisRuntime } from '@notis/sdk';
2
-
3
- type Route = 'dashboard' | 'prospects' | 'segments';
4
-
5
- interface MockDocument {
6
- id: string;
7
- title: string;
8
- properties: Record<string, unknown>;
9
- }
10
-
11
- const PROSPECTS: MockDocument[] = [
12
- prospect('Alex Morgan', 'FlowNorth', 'Automation Agency', 'Interested', 'P0', 94, {
13
- Email: 'alex@flownorth.example',
14
- LinkedIn: 'https://linkedin.com/in/alex-morgan',
15
- Website: 'https://flownorth.example',
16
- Source: 'Zapier Solution Partner Directory',
17
- 'Audience Size': 8200,
18
- 'Monthly Traffic': 14000,
19
- 'Outreach Channel': 'LinkedIn + Email',
20
- 'Next Action': 'Send partner economics one-pager',
21
- 'Next Action Date': '2026-07-24',
22
- 'Last Touch Date': '2026-07-22',
23
- }),
24
- prospect('Maya Chen', 'Agent Ops Weekly', 'AI Creator', 'Replied', 'P0', 91, {
25
- Email: 'maya@agentopsweekly.example',
26
- LinkedIn: 'https://linkedin.com/in/maya-chen',
27
- Website: 'https://agentopsweekly.example',
28
- Source: 'Newsletter discovery',
29
- 'Audience Size': 38000,
30
- 'Monthly Traffic': 22000,
31
- 'Outreach Channel': 'Email',
32
- 'Next Action': 'Share creator demo kit',
33
- 'Next Action Date': '2026-07-24',
34
- 'Last Touch Date': '2026-07-23',
35
- }),
36
- prospect('Noah Williams', 'Automate Better', 'SEO Publisher', 'Ready for Outreach', 'P1', 88, {
37
- Email: 'noah@automatebetter.example',
38
- Website: 'https://automatebetter.example',
39
- Source: 'DataForSEO: Zapier alternatives',
40
- 'Monthly Traffic': 76000,
41
- 'Enrichment Status': 'Verified',
42
- 'Outreach Channel': 'Email',
43
- 'Next Action': 'Approve comparison-page pitch',
44
- 'Next Action Date': '2026-07-25',
45
- }),
46
- prospect('Sofia Rossi', 'RevOps Circle', 'Community Educator', 'Qualified', 'P1', 86, {
47
- Email: 'sofia@revopscircle.example',
48
- LinkedIn: 'https://linkedin.com/in/sofia-rossi',
49
- Source: 'Community operator list',
50
- 'Audience Size': 14500,
51
- 'Outreach Channel': 'LinkedIn',
52
- 'Next Action': 'Enrich sponsor history',
53
- 'Next Action Date': '2026-07-25',
54
- }),
55
- prospect('Theo Martin', 'Notis customer', 'Customer Advocate', 'Activated', 'P0', 97, {
56
- Email: 'theo@example.com',
57
- Source: 'Rewardful + product usage',
58
- 'Outreach Channel': 'Email',
59
- 'Referred Signups': 19,
60
- 'Activated Referrals': 7,
61
- 'Attributed MRR': 1680,
62
- 'Last Touch Date': '2026-07-21',
63
- }),
64
- prospect('Lena Fischer', 'StackPilot', 'Integration Partner', 'Applied', 'P0', 92, {
65
- Email: 'lena@stackpilot.example',
66
- LinkedIn: 'https://linkedin.com/in/lena-fischer',
67
- Website: 'https://stackpilot.example',
68
- Source: 'Integration overlap analysis',
69
- 'Audience Size': 21000,
70
- 'Monthly Traffic': 41000,
71
- 'Next Action': 'Confirm co-marketing launch date',
72
- 'Next Action Date': '2026-07-28',
73
- }),
74
- prospect('Sam Patel', 'SaaS Growth Lab', 'Affiliate Marketplace', 'Contacted', 'P1', 82, {
75
- Email: 'sam@saasgrowthlab.example',
76
- Website: 'https://saasgrowthlab.example',
77
- Source: 'PartnerStack marketplace',
78
- 'Audience Size': 18000,
79
- 'Monthly Traffic': 33000,
80
- 'Next Action': 'Follow up with use-case proof',
81
- 'Next Action Date': '2026-07-27',
82
- 'Last Touch Date': '2026-07-22',
83
- }),
84
- prospect('Priya Shah', 'Nocode Founders', 'Community Educator', 'New', 'P2', 71, {
85
- LinkedIn: 'https://linkedin.com/in/priya-shah',
86
- Source: 'LinkedIn event speakers',
87
- 'Audience Size': 9700,
88
- 'Next Action': 'Verify audience fit',
89
- 'Next Action Date': '2026-07-26',
90
- }),
91
- prospect('Eli Brooks', 'AI Workflow School', 'AI Creator', 'Researching', 'P1', 78, {
92
- Website: 'https://aiworkflowschool.example',
93
- Source: 'YouTube discovery',
94
- 'Audience Size': 62000,
95
- 'Monthly Traffic': 12000,
96
- 'Enrichment Status': 'Pending',
97
- 'Next Action': 'Find verified business email',
98
- 'Next Action Date': '2026-07-24',
99
- }),
100
- prospect('Jordan Lee', 'OpsCraft', 'Automation Agency', 'Qualified', 'P1', 84, {
101
- Email: 'jordan@opscraft.example',
102
- LinkedIn: 'https://linkedin.com/in/jordan-lee',
103
- Source: 'Make Partner Directory',
104
- 'Audience Size': 5400,
105
- 'Next Action': 'Review recent client verticals',
106
- 'Next Action Date': '2026-07-25',
107
- }),
108
- prospect('Camille Laurent', 'Productive AI', 'SEO Publisher', 'Activated', 'P0', 90, {
109
- Email: 'camille@productiveai.example',
110
- Website: 'https://productiveai.example',
111
- Source: 'DataForSEO: AI automation tools',
112
- 'Monthly Traffic': 92000,
113
- 'Referred Signups': 31,
114
- 'Activated Referrals': 11,
115
- 'Attributed MRR': 2940,
116
- 'Last Touch Date': '2026-07-20',
117
- }),
118
- prospect('Marcus Reed', 'Cloud Workflows', 'Integration Partner', 'Nurture', 'P2', 69, {
119
- Email: 'marcus@cloudworkflows.example',
120
- Source: 'Integration directory',
121
- 'Monthly Traffic': 28000,
122
- 'Next Action': 'Revisit after API launch',
123
- 'Next Action Date': '2026-09-01',
124
- }),
125
- prospect('Nina Okafor', 'Growth Operators', 'Affiliate Marketplace', 'Disqualified', 'P3', 38, {
126
- Email: 'nina@growthoperators.example',
127
- Source: 'impact.com marketplace',
128
- 'Audience Size': 120000,
129
- Notes: 'Audience is primarily consumer coupons; no B2B SaaS fit.',
130
- }),
131
- prospect('Owen King', 'Notis customer', 'Customer Advocate', 'Contacted', 'P1', 80, {
132
- Email: 'owen@example.com',
133
- Source: 'Product usage: 25 successful workflows',
134
- 'Next Action': 'Invite to advocate cohort',
135
- 'Next Action Date': '2026-07-26',
136
- 'Last Touch Date': '2026-07-23',
137
- }),
138
- ];
139
-
140
- declare global {
141
- interface Window {
142
- __AFFILIATE_PROSPECTS_RUNTIME__?: NotisRuntime;
143
- }
144
- }
145
-
146
- export function installMockRuntime(initialRoute: Route = 'dashboard'): NotisRuntime {
147
- const runtime: NotisRuntime = {
148
- app: {
149
- id: 'dev-affiliate-prospects',
150
- name: 'Affiliate Prospects',
151
- icon: 'phosphor:users-three',
152
- description: 'Local development preview.',
153
- },
154
- route: routeDescriptor(initialRoute),
155
- databases: [],
156
- context: {},
157
- listTools: async () => [
158
- {
159
- name: 'LOCAL_NOTIS_DATABASE_QUERY',
160
- inputSchema: { type: 'object', properties: { database_slug: { type: 'string' } } },
161
- },
162
- ],
163
- callTool: async <TResult = unknown>(name: string, args?: Record<string, unknown>): Promise<TResult> => {
164
- if (name !== 'LOCAL_NOTIS_DATABASE_QUERY') {
165
- throw new Error(`Tool calls unavailable in preview (${name}).`);
166
- }
167
- const slug = typeof args?.database_slug === 'string' ? args.database_slug : '';
168
- return { documents: slug === 'affiliate_prospects_1' ? PROSPECTS : [] } as TResult;
169
- },
170
- queryDatabase: async ({ databaseSlug }) => ({
171
- documents: databaseSlug === 'affiliate_prospects_1' ? PROSPECTS : [],
172
- }),
173
- upsertDocument: async () => {
174
- throw new Error('Document writes are disabled in the local review fixture.');
175
- },
176
- request: async () => {
177
- throw new Error('Backend requests unavailable in preview.');
178
- },
179
- navigate: (payload) => {
180
- if (payload.kind !== 'route' || typeof payload.path !== 'string') return;
181
- const hashByPath: Record<string, string> = {
182
- '/': '#/',
183
- '/prospects': '#/prospects',
184
- '/segments': '#/segments',
185
- };
186
- const hash = hashByPath[payload.path];
187
- if (hash) window.location.hash = hash;
188
- },
189
- registerTopBarSearch: () => {},
190
- setTopBarSearchValue: () => {},
191
- setTopBarSearchLoading: () => {},
192
- };
193
- window.__AFFILIATE_PROSPECTS_RUNTIME__ = runtime;
194
- return runtime;
195
- }
196
-
197
- export function setMockRoute(route: Route) {
198
- if (window.__AFFILIATE_PROSPECTS_RUNTIME__) {
199
- window.__AFFILIATE_PROSPECTS_RUNTIME__.route = routeDescriptor(route);
200
- }
201
- }
202
-
203
- function prospect(
204
- name: string,
205
- company: string,
206
- segment: string,
207
- status: string,
208
- priority: string,
209
- fitScore: number,
210
- extra: Record<string, unknown>,
211
- ): MockDocument {
212
- return {
213
- id: `prospect-${name.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`,
214
- title: name,
215
- properties: {
216
- Name: name,
217
- Company: company,
218
- Segment: segment,
219
- Status: status,
220
- Priority: priority,
221
- 'Fit Score': fitScore,
222
- 'Enrichment Status': 'Not started',
223
- 'Outreach Channel': '',
224
- 'Audience Size': 0,
225
- 'Monthly Traffic': 0,
226
- 'Referred Signups': 0,
227
- 'Activated Referrals': 0,
228
- 'Attributed MRR': 0,
229
- 'Opted Out': false,
230
- ...extra,
231
- },
232
- };
233
- }
234
-
235
- function routeDescriptor(route: Route) {
236
- const meta = {
237
- dashboard: { path: '/', name: 'Dashboard', icon: 'phosphor:squares-four', default: true },
238
- prospects: { path: '/prospects', name: 'Prospects', icon: 'phosphor:users', default: false },
239
- segments: { path: '/segments', name: 'Segments', icon: 'phosphor:circles-three-plus', default: false },
240
- }[route];
241
- return { slug: route, ...meta, parentSlug: null, collection: null };
242
- }
@@ -1,51 +0,0 @@
1
- import type { Config } from 'tailwindcss';
2
- import tailwindAnimate from 'tailwindcss-animate';
3
-
4
- const config: Config = {
5
- darkMode: ['class'],
6
- content: [
7
- './app/**/*.{ts,tsx}',
8
- './components/**/*.{ts,tsx}',
9
- './lib/**/*.{ts,tsx}',
10
- ],
11
- theme: {
12
- extend: {
13
- colors: {
14
- border: 'hsl(var(--border))',
15
- background: 'hsl(var(--background))',
16
- foreground: 'hsl(var(--foreground))',
17
- destructive: {
18
- DEFAULT: 'hsl(var(--destructive))',
19
- foreground: 'hsl(var(--destructive-foreground))',
20
- },
21
- muted: {
22
- DEFAULT: 'hsl(var(--muted))',
23
- foreground: 'hsl(var(--muted-foreground))',
24
- },
25
- primary: {
26
- DEFAULT: 'hsl(var(--primary))',
27
- foreground: 'hsl(var(--primary-foreground))',
28
- },
29
- accent: {
30
- DEFAULT: 'hsl(var(--accent))',
31
- foreground: 'hsl(var(--accent-foreground))',
32
- },
33
- card: {
34
- DEFAULT: 'hsl(var(--card))',
35
- foreground: 'hsl(var(--card-foreground))',
36
- },
37
- },
38
- borderRadius: {
39
- lg: 'var(--radius)',
40
- md: 'calc(var(--radius) - 2px)',
41
- sm: 'calc(var(--radius) - 4px)',
42
- },
43
- fontFamily: {
44
- mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'monospace'],
45
- },
46
- },
47
- },
48
- plugins: [tailwindAnimate],
49
- };
50
-
51
- export default config;
@@ -1,23 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2017",
4
- "lib": ["dom", "dom.iterable", "esnext"],
5
- "allowJs": true,
6
- "skipLibCheck": true,
7
- "strict": true,
8
- "noEmit": true,
9
- "esModuleInterop": true,
10
- "module": "esnext",
11
- "moduleResolution": "bundler",
12
- "preserveSymlinks": true,
13
- "resolveJsonModule": true,
14
- "isolatedModules": true,
15
- "jsx": "react-jsx",
16
- "types": ["vite/client", "node"],
17
- "paths": {
18
- "@/*": ["./*"]
19
- }
20
- },
21
- "include": ["**/*.ts", "**/*.tsx"],
22
- "exclude": ["node_modules", "dist"]
23
- }