@notis_ai/cli 0.2.1 → 0.2.3
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 +106 -170
- package/config/notis_app_boundary_rules.json +50 -0
- package/dist/scaffolds/notis-database/app/globals.css +44 -0
- package/dist/scaffolds/notis-database/app/layout.tsx +6 -0
- package/dist/scaffolds/notis-database/app/page.tsx +1091 -0
- package/dist/scaffolds/notis-database/components/ui/badge.tsx +28 -0
- package/dist/scaffolds/notis-database/components/ui/button.tsx +53 -0
- package/dist/scaffolds/notis-database/components/ui/card.tsx +56 -0
- package/dist/scaffolds/notis-database/components/ui/table.tsx +120 -0
- package/dist/scaffolds/notis-database/components.json +20 -0
- package/dist/scaffolds/notis-database/index.html +12 -0
- package/dist/scaffolds/notis-database/lib/types.ts +134 -0
- package/dist/scaffolds/notis-database/lib/utils.ts +6 -0
- package/dist/scaffolds/notis-database/metadata/cover.png +0 -0
- package/dist/scaffolds/notis-database/metadata/screenshot-1.png +0 -0
- package/dist/scaffolds/notis-database/metadata/screenshot-2.png +0 -0
- package/dist/scaffolds/notis-database/metadata/screenshot-3.png +0 -0
- package/dist/scaffolds/notis-database/notis.config.ts +27 -0
- package/dist/scaffolds/notis-database/package.json +31 -0
- package/dist/scaffolds/notis-database/postcss.config.mjs +8 -0
- package/dist/scaffolds/notis-database/src/dev-main.tsx +23 -0
- package/dist/scaffolds/notis-database/src/mock-runtime.ts +557 -0
- package/dist/scaffolds/notis-database/tailwind.config.ts +59 -0
- package/dist/scaffolds/notis-database/tsconfig.json +23 -0
- package/dist/scaffolds/notis-database/vite.config.ts +22 -0
- package/dist/scaffolds/notis-notes/app/globals.css +3 -0
- package/dist/scaffolds/notis-notes/app/layout.tsx +6 -0
- package/dist/scaffolds/notis-notes/app/page.tsx +2168 -0
- package/dist/scaffolds/notis-notes/components/ui/badge.tsx +28 -0
- package/dist/scaffolds/notis-notes/components/ui/button.tsx +53 -0
- package/dist/scaffolds/notis-notes/components/ui/card.tsx +56 -0
- package/dist/scaffolds/notis-notes/components.json +20 -0
- package/dist/scaffolds/notis-notes/lib/utils.ts +6 -0
- package/dist/scaffolds/notis-notes/metadata/cover.png +0 -0
- package/dist/scaffolds/notis-notes/metadata/screenshot-1.png +0 -0
- package/dist/scaffolds/notis-notes/metadata/screenshot-2.png +0 -0
- package/dist/scaffolds/notis-notes/metadata/screenshot-3.png +0 -0
- package/dist/scaffolds/notis-notes/notis.config.ts +36 -0
- package/dist/scaffolds/notis-notes/package.json +31 -0
- package/dist/scaffolds/notis-notes/postcss.config.mjs +8 -0
- package/dist/scaffolds/notis-notes/tailwind.config.ts +58 -0
- package/dist/scaffolds/notis-notes/tsconfig.json +23 -0
- package/dist/scaffolds/notis-notes/vite.config.ts +10 -0
- package/dist/scaffolds/notis-random/README.md +33 -0
- package/dist/scaffolds/notis-random/app/globals.css +11 -0
- package/dist/scaffolds/notis-random/app/history/page.tsx +66 -0
- package/dist/scaffolds/notis-random/app/layout.tsx +7 -0
- package/dist/scaffolds/notis-random/app/page.tsx +222 -0
- package/dist/scaffolds/notis-random/index.html +12 -0
- package/dist/scaffolds/notis-random/lib/notis-tools.ts +109 -0
- package/dist/scaffolds/notis-random/lib/rng.ts +42 -0
- package/dist/scaffolds/notis-random/lib/roll-record.ts +102 -0
- package/dist/scaffolds/notis-random/lib/utils.ts +25 -0
- package/dist/scaffolds/notis-random/metadata/cover.png +0 -0
- package/dist/scaffolds/notis-random/metadata/screenshot-1.png +0 -0
- package/dist/scaffolds/notis-random/metadata/screenshot-2.png +0 -0
- package/dist/scaffolds/notis-random/metadata/screenshot-3.png +0 -0
- package/dist/scaffolds/notis-random/notis.config.ts +43 -0
- package/dist/scaffolds/notis-random/package.json +32 -0
- package/dist/scaffolds/notis-random/postcss.config.mjs +6 -0
- package/dist/scaffolds/notis-random/src/dev-main.tsx +70 -0
- package/dist/scaffolds/notis-random/src/mock-runtime.ts +128 -0
- package/dist/scaffolds/notis-random/tailwind.config.ts +43 -0
- package/dist/scaffolds/notis-random/tsconfig.json +23 -0
- package/dist/scaffolds/notis-random/vite.config.ts +11 -0
- package/dist/scaffolds.json +36 -0
- package/package.json +8 -3
- package/skills/notis-apps/SKILL.md +162 -0
- package/skills/notis-apps/cli.md +208 -0
- package/skills/notis-cli/SKILL.md +260 -0
- package/skills/notis-query/cli.md +39 -0
- package/src/cli.js +31 -3
- package/src/command-specs/apps.js +248 -56
- package/src/command-specs/helpers.js +72 -104
- package/src/command-specs/index.js +0 -6
- package/src/command-specs/meta.js +14 -13
- package/src/command-specs/tools.js +196 -115
- package/src/runtime/app-boundary-validator.js +65 -14
- package/src/runtime/app-dev-server.js +32 -4
- package/src/runtime/app-platform.js +404 -24
- package/src/runtime/profiles.js +12 -6
- package/src/runtime/transport.js +124 -39
- package/template/.harness/index.html.tmpl +1 -50
- package/template/app/page.tsx +41 -6
- package/template/metadata/cover.png +0 -0
- package/template/metadata/screenshot-1.png +0 -0
- package/template/metadata/screenshot-2.png +0 -0
- package/template/metadata/screenshot-3.png +0 -0
- package/template/notis.config.ts +10 -6
- package/template/package.json +2 -2
- package/template/packages/{notis-sdk → sdk}/package.json +6 -0
- package/template/packages/{notis-sdk → sdk}/src/components/MultiSelectActionBar.tsx +2 -1
- package/template/packages/{notis-sdk → sdk}/src/components/MultiSelectCheckbox.tsx +2 -2
- package/template/packages/{notis-sdk → sdk}/src/components/MultiSelectDragOverlay.tsx +2 -2
- package/template/packages/{notis-sdk → sdk}/src/config.ts +1 -1
- package/template/packages/{notis-sdk → sdk}/src/hooks/useDatabase.ts +1 -13
- package/template/packages/{notis-sdk → sdk}/src/hooks/useMultiSelect.ts +4 -3
- package/template/packages/{notis-sdk → sdk}/src/hooks/useNotis.ts +4 -3
- package/template/packages/{notis-sdk → sdk}/src/hooks/useNotisNavigation.ts +3 -3
- package/template/packages/{notis-sdk → sdk}/src/hooks/useTool.ts +22 -7
- package/template/packages/{notis-sdk → sdk}/src/hooks/useUpsertDocument.ts +0 -8
- package/template/packages/{notis-sdk → sdk}/src/index.ts +2 -15
- package/template/packages/{notis-sdk → sdk}/src/provider.tsx +1 -1
- package/template/packages/{notis-sdk → sdk}/src/runtime.ts +5 -26
- package/src/command-specs/auth.js +0 -178
- package/src/command-specs/db.js +0 -163
- package/template/packages/notis-sdk/src/helpers.ts +0 -131
- package/template/packages/notis-sdk/src/hooks/useAppState.ts +0 -50
- package/template/packages/notis-sdk/src/hooks/useCollectionItem.ts +0 -58
- package/template/packages/notis-sdk/src/hooks/useDocument.ts +0 -61
- /package/template/packages/{notis-sdk → sdk}/src/hooks/useBackend.ts +0 -0
- /package/template/packages/{notis-sdk → sdk}/src/hooks/useTools.ts +0 -0
- /package/template/packages/{notis-sdk → sdk}/src/hooks/useTopBarSearch.ts +0 -0
- /package/template/packages/{notis-sdk → sdk}/src/styles.css +0 -0
- /package/template/packages/{notis-sdk → sdk}/src/ui.ts +0 -0
- /package/template/packages/{notis-sdk → sdk}/src/vite.ts +0 -0
- /package/template/packages/{notis-sdk → sdk}/tsconfig.json +0 -0
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useCallback, useState } from 'react';
|
|
4
|
-
import { useNotisRuntime } from '../provider';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Persist app-level state per user per app using localStorage.
|
|
8
|
-
*
|
|
9
|
-
* ```tsx
|
|
10
|
-
* const [order, setOrder] = useAppState<string[]>('task-order', []);
|
|
11
|
-
* ```
|
|
12
|
-
*
|
|
13
|
-
* State is scoped by `app.id` so different apps don't collide.
|
|
14
|
-
* Falls back to defaultValue when localStorage is unavailable.
|
|
15
|
-
*/
|
|
16
|
-
export function useAppState<T>(key: string, defaultValue: T): [T, (value: T | ((prev: T) => T)) => void] {
|
|
17
|
-
const runtime = useNotisRuntime();
|
|
18
|
-
const appId = runtime?.app?.id || '_unknown';
|
|
19
|
-
const storageKey = `notis-app-state:${appId}:${key}`;
|
|
20
|
-
|
|
21
|
-
const [value, setValueInternal] = useState<T>(() => {
|
|
22
|
-
if (typeof window === 'undefined') return defaultValue;
|
|
23
|
-
try {
|
|
24
|
-
const stored = localStorage.getItem(storageKey);
|
|
25
|
-
if (stored !== null) return JSON.parse(stored) as T;
|
|
26
|
-
} catch {
|
|
27
|
-
// Ignore parse errors or storage unavailable
|
|
28
|
-
}
|
|
29
|
-
return defaultValue;
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const setValue = useCallback(
|
|
33
|
-
(newValue: T | ((prev: T) => T)) => {
|
|
34
|
-
setValueInternal((prev) => {
|
|
35
|
-
const resolved = typeof newValue === 'function'
|
|
36
|
-
? (newValue as (prev: T) => T)(prev)
|
|
37
|
-
: newValue;
|
|
38
|
-
try {
|
|
39
|
-
localStorage.setItem(storageKey, JSON.stringify(resolved));
|
|
40
|
-
} catch {
|
|
41
|
-
// Ignore quota errors
|
|
42
|
-
}
|
|
43
|
-
return resolved;
|
|
44
|
-
});
|
|
45
|
-
},
|
|
46
|
-
[storageKey],
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
return [value, setValue];
|
|
50
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
4
|
-
import { useNotisRuntime } from '../provider';
|
|
5
|
-
import type { CollectionItem } from '../runtime';
|
|
6
|
-
|
|
7
|
-
interface UseCollectionResult {
|
|
8
|
-
/** Items in the collection (from the bound database). */
|
|
9
|
-
items: CollectionItem[];
|
|
10
|
-
loading: boolean;
|
|
11
|
-
error: Error | null;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* List collection items for the current route. Only meaningful on routes
|
|
16
|
-
* that have a `collection` binding in `notis.config.ts`.
|
|
17
|
-
*
|
|
18
|
-
* ```tsx
|
|
19
|
-
* const { items, loading } = useCollectionItems();
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export function useCollectionItems(): UseCollectionResult {
|
|
23
|
-
const runtime = useNotisRuntime();
|
|
24
|
-
const [items, setItems] = useState<CollectionItem[]>([]);
|
|
25
|
-
const [loading, setLoading] = useState(true);
|
|
26
|
-
const [error, setError] = useState<Error | null>(null);
|
|
27
|
-
|
|
28
|
-
useEffect(() => {
|
|
29
|
-
if (!runtime) {
|
|
30
|
-
setLoading(false);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let cancelled = false;
|
|
35
|
-
setLoading(true);
|
|
36
|
-
|
|
37
|
-
runtime
|
|
38
|
-
.listCollectionItems()
|
|
39
|
-
.then((result) => {
|
|
40
|
-
if (!cancelled) {
|
|
41
|
-
setItems(result.items);
|
|
42
|
-
setLoading(false);
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
.catch((err) => {
|
|
46
|
-
if (!cancelled) {
|
|
47
|
-
setError(err instanceof Error ? err : new Error(String(err)));
|
|
48
|
-
setLoading(false);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
return () => {
|
|
53
|
-
cancelled = true;
|
|
54
|
-
};
|
|
55
|
-
}, [runtime]);
|
|
56
|
-
|
|
57
|
-
return { items, loading, error };
|
|
58
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
4
|
-
import { useNotisRuntime } from '../provider';
|
|
5
|
-
import type { DocumentRecord } from '../runtime';
|
|
6
|
-
|
|
7
|
-
interface UseDocumentResult {
|
|
8
|
-
document: DocumentRecord | null;
|
|
9
|
-
loading: boolean;
|
|
10
|
-
error: Error | null;
|
|
11
|
-
refetch: () => void;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Fetch a single document by ID.
|
|
16
|
-
*
|
|
17
|
-
* ```tsx
|
|
18
|
-
* const { document, loading } = useDocument(documentId);
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
export function useDocument(documentId: string | null | undefined): UseDocumentResult {
|
|
22
|
-
const runtime = useNotisRuntime();
|
|
23
|
-
const [document, setDocument] = useState<DocumentRecord | null>(null);
|
|
24
|
-
const [loading, setLoading] = useState(true);
|
|
25
|
-
const [error, setError] = useState<Error | null>(null);
|
|
26
|
-
const [fetchKey, setFetchKey] = useState(0);
|
|
27
|
-
|
|
28
|
-
const refetch = useCallback(() => setFetchKey((k) => k + 1), []);
|
|
29
|
-
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
if (!runtime || !documentId) {
|
|
32
|
-
setLoading(false);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
let cancelled = false;
|
|
37
|
-
setLoading(true);
|
|
38
|
-
setError(null);
|
|
39
|
-
|
|
40
|
-
runtime
|
|
41
|
-
.getDocument({ documentId })
|
|
42
|
-
.then((result) => {
|
|
43
|
-
if (!cancelled) {
|
|
44
|
-
setDocument(result);
|
|
45
|
-
setLoading(false);
|
|
46
|
-
}
|
|
47
|
-
})
|
|
48
|
-
.catch((err) => {
|
|
49
|
-
if (!cancelled) {
|
|
50
|
-
setError(err instanceof Error ? err : new Error(String(err)));
|
|
51
|
-
setLoading(false);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
return () => {
|
|
56
|
-
cancelled = true;
|
|
57
|
-
};
|
|
58
|
-
}, [runtime, documentId, fetchKey]);
|
|
59
|
-
|
|
60
|
-
return { document, loading, error, refetch };
|
|
61
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|