@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.
Files changed (29) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-hooks/notis-agent-hook.mjs +1 -1
  3. package/dist/base-skills/notis-spaces/.notis-base-skill.json +1 -1
  4. package/dist/base-skills/notis-spaces/SKILL.md +4 -2
  5. package/dist/base-skills/notis-spaces/references/design.md +1 -0
  6. package/dist/base-skills/notis-spaces/references/release.md +3 -1
  7. package/dist/base-skills/notis-spaces/references/sdk.md +9 -0
  8. package/dist/base-skills/notis-spaces/references/store.md +111 -0
  9. package/dist/sdk/src/ui/icons.tsx +8 -0
  10. package/dist/space-harness/host.js +129 -70
  11. package/dist/space-sdk/dist/{chunk-RGU3Q4P3.js → chunk-LOZCVBHW.js} +1 -1
  12. package/dist/space-sdk/dist/index.js +1 -1
  13. package/dist/space-sdk/dist/ui.js +7 -7
  14. package/dist/space-sdk/src/tailwind-candidates.d.ts +142 -0
  15. package/dist/space-sdk/src/ui/gallery/AttachmentGallery.d.ts +53 -0
  16. package/dist/space-sdk/src/ui/gallery/ImageViewer.d.ts +27 -0
  17. package/dist/space-sdk/src/ui/gallery/galleryWords.d.ts +95 -0
  18. package/dist/space-sdk/src/ui/gallery/index.d.ts +5 -0
  19. package/dist/space-sdk/src/ui/index.d.ts +1 -0
  20. package/dist/space-sdk/src/ui/list/ListReader.d.ts +11 -0
  21. package/dist/space-sdk/src/ui/list/Row.d.ts +19 -1
  22. package/dist/space-sdk/src/ui/list/index.d.ts +3 -3
  23. package/dist/space-sdk/src/words/shell.ts +2 -0
  24. package/dist/view-renderer/dist/host.js +200 -141
  25. package/dist/view-renderer/src/dom.js +32 -0
  26. package/dist/view-renderer/src/renderer.js +50 -15
  27. package/package.json +3 -3
  28. package/skills/notis-spaces/cli.md +1 -1
  29. 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":1792661200,"commit":"ff2a9f14ff6a63cb7fdd2fb65572946d33f72d0b"}
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
- Before an explicitly authorized Store publication:
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 {