@notis_ai/cli 0.2.0-beta.1792662829286.1 → 0.2.0-beta.1792679782834.1
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 +1 -1
- package/dist/agent-hooks/notis-agent-hook.mjs +1 -1
- package/dist/base-skills/notis-spaces/.notis-base-skill.json +1 -1
- package/dist/base-skills/notis-spaces/SKILL.md +4 -2
- package/dist/base-skills/notis-spaces/references/design.md +1 -0
- package/dist/base-skills/notis-spaces/references/release.md +3 -1
- package/dist/base-skills/notis-spaces/references/sdk.md +9 -0
- package/dist/base-skills/notis-spaces/references/store.md +111 -0
- package/dist/sdk/src/ui/icons.tsx +8 -0
- package/dist/space-harness/host.js +129 -70
- package/dist/space-sdk/dist/{chunk-RGU3Q4P3.js → chunk-LOZCVBHW.js} +1 -1
- package/dist/space-sdk/dist/index.js +1 -1
- package/dist/space-sdk/dist/ui.js +7 -7
- package/dist/space-sdk/src/tailwind-candidates.d.ts +142 -0
- package/dist/space-sdk/src/ui/gallery/AttachmentGallery.d.ts +53 -0
- package/dist/space-sdk/src/ui/gallery/ImageViewer.d.ts +27 -0
- package/dist/space-sdk/src/ui/gallery/galleryWords.d.ts +95 -0
- package/dist/space-sdk/src/ui/gallery/index.d.ts +5 -0
- package/dist/space-sdk/src/ui/index.d.ts +1 -0
- package/dist/space-sdk/src/ui/list/ListReader.d.ts +11 -0
- package/dist/space-sdk/src/ui/list/Row.d.ts +19 -1
- package/dist/space-sdk/src/ui/list/index.d.ts +3 -3
- package/dist/space-sdk/src/words/shell.ts +2 -0
- package/dist/view-renderer/dist/host.js +200 -141
- package/dist/view-renderer/src/dom.js +32 -0
- package/dist/view-renderer/src/renderer.js +50 -15
- package/package.json +3 -3
- package/skills/notis-spaces/cli.md +1 -1
- package/src/command-specs/spaces.js +1 -1
package/README.md
CHANGED
|
@@ -581,7 +581,7 @@ Examples:
|
|
|
581
581
|
|
|
582
582
|
Publish a Space and its sub-Spaces as the next Store version.
|
|
583
583
|
|
|
584
|
-
When to use: Share a Space as an installable template: team listings publish at once, public ones wait for review.
|
|
584
|
+
When to use: Share a Space you own as an installable template: team listings publish at once, public ones wait for review. Notis runs the same safety scan and Owner check as the submission page and explains any refusal.
|
|
585
585
|
|
|
586
586
|
Options:
|
|
587
587
|
- `--channel <team|public>` — Where to publish.
|
|
@@ -42999,7 +42999,7 @@ var spacesCommandSpecs = [
|
|
|
42999
42999
|
{
|
|
43000
43000
|
command_path: ["spaces", "store", "publish"],
|
|
43001
43001
|
summary: "Publish a Space and its sub-Spaces as the next Store version.",
|
|
43002
|
-
when_to_use: "Share a Space as an installable template: team listings publish at once, public ones wait for review.",
|
|
43002
|
+
when_to_use: "Share a Space you own as an installable template: team listings publish at once, public ones wait for review. Notis runs the same safety scan and Owner check as the submission page and explains any refusal.",
|
|
43003
43003
|
args_schema: { arguments: [idArgument], options: [
|
|
43004
43004
|
{ flags: "--channel <team|public>", description: "Where to publish." },
|
|
43005
43005
|
{ flags: "--metadata <json>", description: "Listing name, tagline, description, category, icon, accent." },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"schema":1,"stamp":
|
|
1
|
+
{"schema":1,"stamp":1792677351,"commit":"771883529c1d8ea5c48ead21c09b868da2362b87"}
|
|
@@ -4,7 +4,7 @@ description: Explain Notis Spaces, sharing, resource links and lifecycle; build
|
|
|
4
4
|
feature_flag: spaces
|
|
5
5
|
mcp_resource: true
|
|
6
6
|
mcp_tool_patterns: ["LOCAL_NOTIS_MANAGE_SPACE", "LOCAL_NOTIS_FIND_VIEWS", "LOCAL_NOTIS_RENDER_VIEW"]
|
|
7
|
-
mcp_references: ["references/release.md", "references/architecture.md", "references/design.md", "references/sdk.md", "references/views.md", "references/memory.md", "references/troubleshooting.md", "references/reading.md", "references/context.md", "references/reports.md"]
|
|
7
|
+
mcp_references: ["references/release.md", "references/architecture.md", "references/design.md", "references/sdk.md", "references/views.md", "references/memory.md", "references/troubleshooting.md", "references/reading.md", "references/context.md", "references/reports.md", "references/store.md"]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Notis Spaces
|
|
@@ -84,6 +84,7 @@ If your last action created the Space, archive it through the lifecycle tool.
|
|
|
84
84
|
| Data hooks, record pages and the toolkit pieces | [SDK](references/sdk.md) |
|
|
85
85
|
| Explain resources, sharing and lifecycle | [Platform boundaries](references/architecture.md) |
|
|
86
86
|
| Diagnose a failed check or release | [Troubleshooting](references/troubleshooting.md) |
|
|
87
|
+
| Publish a Space or its update in the Store | [Store publishing](references/store.md) |
|
|
87
88
|
|
|
88
89
|
Use ordinary native data tools when they answer the question. For what a page
|
|
89
90
|
actually displays, resolve its current link and render the deployed view.
|
|
@@ -188,7 +189,8 @@ conflicts require a fresh pull and merge. Use the Skill writer for renaming.
|
|
|
188
189
|
Sites are standalone, scoped view websites, not memberships. They have no agent,
|
|
189
190
|
Skill, automation, upload or collaborative editor authority. Store installations
|
|
190
191
|
are independent copies with three-way updates. Publishing to a Store is separate
|
|
191
|
-
from deploying an installed Space and requires the user's explicit authority
|
|
192
|
+
from deploying an installed Space and requires the user's explicit authority;
|
|
193
|
+
you prepare it and only the submission page's Publish button publishes.
|
|
192
194
|
|
|
193
195
|
## Reports, HTML and context
|
|
194
196
|
|
|
@@ -19,6 +19,7 @@ Space's data, and change only what the Space needs (the four rungs in
|
|
|
19
19
|
| One record as the page | `DocumentPage` (see [SDK](sdk.md#first-party-record-components)). Pick its `width` for the page: `standard` (the default) is a centred 900 px reading column for a page read as text, `wide` (1200 px) or `full` for a record that is a working surface such as a wide table or board |
|
|
20
20
|
| A form or settings page | `Section kind="form"`, `Button`, `NativeSelect`, `SegmentedControl`, `Notice`, `EmptyState` |
|
|
21
21
|
| A list on your own layout | `useListKeys`, `useSelection`, `Row`, `SelectionBar`, `Panels` |
|
|
22
|
+
| Files or pictures attached to an item, or a picture to open full screen | `AttachmentGallery` (opens `ImageViewer` on its images); `ImageViewer` alone for one picture ([SDK](sdk.md#toolkit-pieces)) |
|
|
22
23
|
|
|
23
24
|
Floating UI comes from `Menu`, `Popover` and `Tooltip`; they open inside the
|
|
24
25
|
Space and pick up its theme. Open as Side, Center or Full belongs to the list
|
|
@@ -81,7 +81,9 @@ a new revision. Source restoration does not revert user data or provider effects
|
|
|
81
81
|
|
|
82
82
|
## Publication privacy and portability gate
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
When the user asks Notis to publish, follow [Store publishing](store.md): you
|
|
85
|
+
prepare a submission and the user publishes from its page. This gate applies to
|
|
86
|
+
an explicitly authorized direct CLI publication:
|
|
85
87
|
|
|
86
88
|
1. Review the complete snapshot: source, listing text and icon, schema, selected
|
|
87
89
|
starter rows, linked Skills/helpers and automations. Exclude personal data, account
|
|
@@ -114,6 +114,15 @@ rather than from a copy.
|
|
|
114
114
|
sparkline `null` is a gap. `PeriodPicker` without the `custom` preset offers
|
|
115
115
|
presets only.
|
|
116
116
|
- **Floating**: `Menu`, `Popover`, `Tooltip`.
|
|
117
|
+
- **Files and pictures**: `AttachmentGallery` and `ImageViewer`, the ones
|
|
118
|
+
Notis conversations use. `AttachmentGallery` draws a row of file cards
|
|
119
|
+
(`items`: `url`, `name`, `type` or `kind`, `size`, `thumbnailUrl`); an
|
|
120
|
+
image card opens `ImageViewer` on the gallery's images (zoom, pan, arrows,
|
|
121
|
+
copy, download, Escape), and any other card goes to `onOpen` (a new tab by
|
|
122
|
+
default). `renderOpener` swaps a card's opener, `itemAction` adds a corner
|
|
123
|
+
button, `viewerActions` adds viewer buttons (class `nui-viewer-btn`) and
|
|
124
|
+
`onNotice` hears copy and download results. Use `ImageViewer` alone for a
|
|
125
|
+
picture that opens full screen. Do not build your own lightbox.
|
|
117
126
|
- **Blocks**: `Section`, `Badge`, `Button`, `ToggleGroup`, `SegmentedControl`,
|
|
118
127
|
`NativeSelect`, `EmptyState`, `Notice`, `Metric`. A page is a stack of
|
|
119
128
|
`Section`s, full width and without boxes: `kind` is `bar` (period and
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Store publishing
|
|
2
|
+
|
|
3
|
+
Use this when the user asks to publish a Space, or an update to one, in the
|
|
4
|
+
Store. You prepare everything; the user chooses where it goes and presses
|
|
5
|
+
Publish on the submission page. Store publication stays separate from deploying
|
|
6
|
+
the installed Space ([Delivery](release.md)).
|
|
7
|
+
|
|
8
|
+
## Never publish for the user
|
|
9
|
+
|
|
10
|
+
There is no agent publish operation, and you never press, simulate or script
|
|
11
|
+
the Publish button. Only the page's Publish button publishes, after the user
|
|
12
|
+
picks Team or Public there. Asking you to publish means: prepare the submission
|
|
13
|
+
and send the page link. A team listing goes live as soon as the user presses
|
|
14
|
+
Publish; a public listing goes to the sandbox reviewer, and Notis messages the
|
|
15
|
+
user with its result.
|
|
16
|
+
|
|
17
|
+
## The flow
|
|
18
|
+
|
|
19
|
+
All steps use `LOCAL_NOTIS_MANAGE_SPACE`. Each answer is the submission view:
|
|
20
|
+
status, listing text, locales, sample rows and counts, screenshots, findings,
|
|
21
|
+
`can_publish`, `blocked_reason` and `link`.
|
|
22
|
+
|
|
23
|
+
1. **Prepare.** Call `store_prepare {space_id, request_id}` with the root of the
|
|
24
|
+
tree to publish and a stable request ID. Notis copies the tree into the
|
|
25
|
+
user's hidden Store review Space (the test copy, automations paused), pins
|
|
26
|
+
the source revision, takes screenshots and runs the safety scan. Retry with
|
|
27
|
+
the same request ID; never prepare twice to recover a lost answer.
|
|
28
|
+
2. **Write the listing** with `store_submission_update {submission_id, metadata,
|
|
29
|
+
locales}`: name, tagline, description, category, icon and accent in
|
|
30
|
+
`metadata` (English), and the French name, tagline and description in
|
|
31
|
+
`locales.fr`. Say what the Space does for the person who installs it, from
|
|
32
|
+
its views, databases and Skills. Write French as natural French (tu), not a
|
|
33
|
+
word-for-word translation. No personal names, account details, customer or
|
|
34
|
+
company data from the source.
|
|
35
|
+
3. **Write sample rows** with `store_submission_update {submission_id,
|
|
36
|
+
sample_rows}` (see below), then read the screenshots. Pass
|
|
37
|
+
`retake_screenshots: true` after sample rows or listing text change what the
|
|
38
|
+
views show.
|
|
39
|
+
4. **Handle the findings** (see below): ask about privacy, fix the rest in the
|
|
40
|
+
source Space, and list every fix.
|
|
41
|
+
5. **Send the link.** When `can_publish` is true, give the user the page
|
|
42
|
+
`link`, one short line on what is ready, the fixes you made and their answers.
|
|
43
|
+
If it stays false, say what still blocks it from `blocked_reason` and what
|
|
44
|
+
they can do.
|
|
45
|
+
|
|
46
|
+
## Sample rows
|
|
47
|
+
|
|
48
|
+
- Up to 8 rows per database, keyed by database key: `{database_key:
|
|
49
|
+
[{key, properties, body}]}`. Use only properties in that database's schema; a
|
|
50
|
+
relation lists the `key` of another row in the same sample set. `body` is
|
|
51
|
+
optional plain text (one paragraph per line); `key` is optional short text.
|
|
52
|
+
- Realistic and wholly synthetic: plausible titles, dates, amounts and states
|
|
53
|
+
that show every main view working (a few statuses, a spread of dates, at
|
|
54
|
+
least one row in each group a view shows).
|
|
55
|
+
- Never a real person's name, email address, phone number, company, address or
|
|
56
|
+
account identifier, and never content copied or paraphrased from the user's
|
|
57
|
+
own rows, notes, contacts or history. Use invented first names only when a
|
|
58
|
+
field needs a person ("Alex", "Camille"), and no contact details at all.
|
|
59
|
+
- Sample rows exist only in the test copy and the published version. They never
|
|
60
|
+
enter the source Space. Installs start with them, and the installer removes
|
|
61
|
+
all of them with one click; updates never bring them back.
|
|
62
|
+
|
|
63
|
+
## Findings
|
|
64
|
+
|
|
65
|
+
Each finding has `id`, `check`, `severity` (`red` or `amber`), `privacy`,
|
|
66
|
+
`where`, `message`, `fix` and `status`. Publish needs no open red finding and no
|
|
67
|
+
unanswered privacy question.
|
|
68
|
+
|
|
69
|
+
**Privacy.** A finding with `privacy: true` is a candidate, not yet a question.
|
|
70
|
+
Judge whether it carries a real privacy risk for the publisher or for people in
|
|
71
|
+
their data: an outside host that would receive installers' data, an integration
|
|
72
|
+
or MCP call that reads private accounts, a read of Spaces outside the published
|
|
73
|
+
tree, a sharing change, personal data in the listing, screenshots or samples. A
|
|
74
|
+
candidate with no real risk is treated like any other finding. For each real
|
|
75
|
+
risk, ask the user one plain question naming what and where, with two choices:
|
|
76
|
+
|
|
77
|
+
- **Remove**: take it out of what is published.
|
|
78
|
+
- **Keep**: publish it as it is; Notis adds your note to the listing so
|
|
79
|
+
installers see it.
|
|
80
|
+
|
|
81
|
+
Record their answer with `store_finding_answer {submission_id, finding_id,
|
|
82
|
+
answer: 'remove'|'keep', note, user_words}`. `user_words` are the user's own
|
|
83
|
+
words; `note` is the short listing sentence for a Keep, written in plain words.
|
|
84
|
+
Never answer a privacy question for the user.
|
|
85
|
+
|
|
86
|
+
**Everything else.** Fix each non-privacy red finding in the source Space
|
|
87
|
+
through the normal release path: pull, change, build, verify, deploy, read back
|
|
88
|
+
([Delivery](release.md)). Then call `store_prepare` again for the same Space
|
|
89
|
+
with a new request ID, so the open submission pins the new revision and scans
|
|
90
|
+
again. List every fix for the user: what was found, where, and what you changed.
|
|
91
|
+
A finding you cannot fix keeps Publish blocked; say so plainly. Amber findings
|
|
92
|
+
need no fix; mention the ones an installer would notice.
|
|
93
|
+
|
|
94
|
+
Test chats about the submission run on the test copy only; never write sample
|
|
95
|
+
rows, listing text or fixes for the listing into the source Space's data.
|
|
96
|
+
|
|
97
|
+
## Updates
|
|
98
|
+
|
|
99
|
+
Publishing an update follows the same flow: `store_prepare` on the same root
|
|
100
|
+
creates a new submission on the same listing, and Publish adds a new version to
|
|
101
|
+
it. Never create a second listing, a copy of the Space or a new Space to ship an
|
|
102
|
+
update. Installs that differ only in listing text or screenshots update
|
|
103
|
+
themselves; installs of a version that changes code or databases show an
|
|
104
|
+
Update available card and update when their owner chooses.
|
|
105
|
+
|
|
106
|
+
## Status
|
|
107
|
+
|
|
108
|
+
Read the submission with `store_submission_read {submission_id}`. `ready` means
|
|
109
|
+
the page can publish; `in_review` means the public review is running and Notis
|
|
110
|
+
will message the user with the result; `published` is live; `rejected` lists what
|
|
111
|
+
to fix, which starts again from step 4 with a new `store_prepare`.
|
|
@@ -55,6 +55,14 @@ const SHAPES: Record<string, Shape> = {
|
|
|
55
55
|
'check-circle-fill': <g><circle {...F} cx="8" cy="8" r="6.5" /><path d="M5 8.2l2 2 4-4" fill="none" stroke="hsl(var(--background))" strokeWidth={1.5} strokeLinecap="round" strokeLinejoin="round" /></g>,
|
|
56
56
|
'minus-circle': <g {...S}><circle cx="8" cy="8" r="6" /><path d="M5.5 8h5" /></g>,
|
|
57
57
|
'x-circle-fill': <g><circle {...F} cx="8" cy="8" r="6.5" /><path d="M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4" fill="none" stroke="hsl(var(--background))" strokeWidth={1.5} strokeLinecap="round" /></g>,
|
|
58
|
+
'magnifying-glass-plus': <path {...S} d="M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4M7 5v4" />,
|
|
59
|
+
'magnifying-glass-minus': <path {...S} d="M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4" />,
|
|
60
|
+
'download-simple': <path {...S} d="M8 2.5v7.5M4.5 6.5L8 10l3.5-3.5M2.5 10v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3" />,
|
|
61
|
+
link: <path {...S} d="M6.8 9.2l2.4-2.4M7.6 4.6l1.2-1.2a2.8 2.8 0 014 4l-1.2 1.2M8.4 11.4l-1.2 1.2a2.8 2.8 0 01-4-4l1.2-1.2" />,
|
|
62
|
+
file: <path {...S} d="M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3" />,
|
|
63
|
+
'file-image': <g {...S}><path d="M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3" /><path d="M3.5 12l3-3 2 2 1.5-1.5 2.5 2.5" /><circle cx="6.5" cy="6.75" r=".75" /></g>,
|
|
64
|
+
'file-video': <g {...S}><path d="M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3" /><path d="M6.5 8v3.5L9.5 9.75z" /></g>,
|
|
65
|
+
'file-audio': <g {...S}><path d="M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3" /><path d="M6 9.5v1.5h1.25L9 12.25v-4.5L7.25 9H6M10.5 8.5a1.8 1.8 0 010 2.5" /></g>,
|
|
58
66
|
};
|
|
59
67
|
|
|
60
68
|
export function hasIcon(name: string): boolean {
|