@notis_ai/cli 0.2.5 → 0.2.7

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 (157) hide show
  1. package/README.md +33 -9
  2. package/dist/scaffolds/notis-affiliate-prospects/CHANGELOG.md +7 -0
  3. package/dist/scaffolds/notis-affiliate-prospects/README.md +20 -0
  4. package/dist/scaffolds/notis-affiliate-prospects/app/globals.css +42 -0
  5. package/dist/scaffolds/notis-affiliate-prospects/app/layout.tsx +7 -0
  6. package/dist/scaffolds/notis-affiliate-prospects/app/page.tsx +248 -0
  7. package/dist/scaffolds/notis-affiliate-prospects/app/prospects/page.tsx +134 -0
  8. package/dist/scaffolds/notis-affiliate-prospects/app/segments/page.tsx +108 -0
  9. package/dist/scaffolds/notis-affiliate-prospects/components/ui/card.tsx +35 -0
  10. package/dist/scaffolds/notis-affiliate-prospects/components.json +20 -0
  11. package/dist/scaffolds/notis-affiliate-prospects/index.html +12 -0
  12. package/dist/scaffolds/notis-affiliate-prospects/lib/affiliate-data.ts +218 -0
  13. package/dist/scaffolds/notis-affiliate-prospects/lib/demo-prospects.ts +52 -0
  14. package/dist/scaffolds/notis-affiliate-prospects/lib/notis-tools.ts +100 -0
  15. package/dist/scaffolds/notis-affiliate-prospects/lib/utils.ts +25 -0
  16. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-1.png +0 -0
  17. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-2.png +0 -0
  18. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-3.png +0 -0
  19. package/dist/scaffolds/notis-affiliate-prospects/metadata/screenshot-fixtures.json +187 -0
  20. package/dist/scaffolds/notis-affiliate-prospects/notis.config.ts +65 -0
  21. package/dist/scaffolds/notis-affiliate-prospects/package.json +32 -0
  22. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/package.json +32 -0
  23. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/components/MultiSelectActionBar.tsx +273 -0
  24. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  25. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  26. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/config.ts +90 -0
  27. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useBackend.ts +41 -0
  28. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useMultiSelect.ts +503 -0
  29. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useNotis.ts +34 -0
  30. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  31. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useTool.ts +64 -0
  32. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useTools.ts +56 -0
  33. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  34. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/hooks/useUpsertDocument.ts +50 -0
  35. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/index.ts +54 -0
  36. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/provider.tsx +43 -0
  37. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/runtime.ts +161 -0
  38. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/styles.css +38 -0
  39. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/ui.ts +15 -0
  40. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/src/vite.ts +56 -0
  41. package/dist/scaffolds/notis-affiliate-prospects/packages/sdk/tsconfig.json +15 -0
  42. package/dist/scaffolds/notis-affiliate-prospects/postcss.config.mjs +6 -0
  43. package/dist/scaffolds/notis-affiliate-prospects/src/dev-main.tsx +72 -0
  44. package/dist/scaffolds/notis-affiliate-prospects/src/mock-runtime.ts +242 -0
  45. package/dist/scaffolds/notis-affiliate-prospects/tailwind.config.ts +51 -0
  46. package/dist/scaffolds/notis-affiliate-prospects/tsconfig.json +23 -0
  47. package/dist/scaffolds/notis-affiliate-prospects/vite.config.ts +11 -0
  48. package/dist/scaffolds/notis-database/CHANGELOG.md +5 -0
  49. package/dist/scaffolds/notis-database/notis.config.ts +0 -1
  50. package/dist/scaffolds/notis-database/src/mock-runtime.ts +1 -0
  51. package/dist/scaffolds/notis-journal/CHANGELOG.md +25 -0
  52. package/dist/scaffolds/notis-journal/app/globals.css +37 -0
  53. package/dist/scaffolds/notis-journal/app/insights/page.tsx +513 -0
  54. package/dist/scaffolds/notis-journal/app/journal-core.tsx +362 -0
  55. package/dist/scaffolds/notis-journal/app/journal-ui.tsx +337 -0
  56. package/dist/scaffolds/notis-journal/app/layout.tsx +6 -0
  57. package/dist/scaffolds/notis-journal/app/page.tsx +485 -0
  58. package/dist/scaffolds/notis-journal/components/ui/badge.tsx +28 -0
  59. package/dist/scaffolds/notis-journal/components/ui/button.tsx +53 -0
  60. package/dist/scaffolds/notis-journal/components/ui/card.tsx +56 -0
  61. package/dist/scaffolds/notis-journal/components.json +20 -0
  62. package/dist/scaffolds/notis-journal/index.html +12 -0
  63. package/dist/scaffolds/notis-journal/lib/utils.ts +6 -0
  64. package/dist/scaffolds/notis-journal/metadata/screenshot-1.png +0 -0
  65. package/dist/scaffolds/notis-journal/metadata/screenshot-2.png +0 -0
  66. package/dist/scaffolds/notis-journal/metadata/screenshot-3.png +0 -0
  67. package/dist/scaffolds/notis-journal/metadata/screenshot-4.png +0 -0
  68. package/dist/scaffolds/notis-journal/metadata/screenshot-5.png +0 -0
  69. package/dist/scaffolds/notis-journal/metadata/screenshot-6.png +0 -0
  70. package/dist/scaffolds/notis-journal/metadata/screenshot-fixtures.json +132 -0
  71. package/dist/scaffolds/notis-journal/notis.config.ts +93 -0
  72. package/dist/scaffolds/notis-journal/package.json +34 -0
  73. package/dist/scaffolds/notis-journal/packages/sdk/package.json +36 -0
  74. package/dist/scaffolds/notis-journal/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  75. package/dist/scaffolds/notis-journal/packages/sdk/src/components/Markdown.tsx +60 -0
  76. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectActionBar.tsx +278 -0
  77. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectCheckbox.tsx +91 -0
  78. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectDragOverlay.tsx +39 -0
  79. package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +145 -0
  80. package/dist/scaffolds/notis-journal/packages/sdk/src/documents.ts +229 -0
  81. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useBackend.ts +41 -0
  82. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  83. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocument.ts +78 -0
  84. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocuments.ts +121 -0
  85. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useMultiSelect.ts +539 -0
  86. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotis.ts +34 -0
  87. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotisNavigation.ts +49 -0
  88. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTool.ts +64 -0
  89. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTools.ts +56 -0
  90. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTopBarSearch.ts +73 -0
  91. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useUpsertDocument.ts +95 -0
  92. package/dist/scaffolds/notis-journal/packages/sdk/src/index.ts +83 -0
  93. package/dist/scaffolds/notis-journal/packages/sdk/src/provider.tsx +43 -0
  94. package/dist/scaffolds/notis-journal/packages/sdk/src/runtime.ts +220 -0
  95. package/dist/scaffolds/notis-journal/packages/sdk/src/styles.css +186 -0
  96. package/dist/scaffolds/notis-journal/packages/sdk/src/ui.ts +15 -0
  97. package/dist/scaffolds/notis-journal/packages/sdk/src/vite.ts +56 -0
  98. package/dist/scaffolds/notis-journal/packages/sdk/tsconfig.json +15 -0
  99. package/dist/scaffolds/notis-journal/postcss.config.mjs +8 -0
  100. package/dist/scaffolds/notis-journal/skills/journal-onboarding/SKILL.md +120 -0
  101. package/dist/scaffolds/notis-journal/src/dev-main.tsx +58 -0
  102. package/dist/scaffolds/notis-journal/src/mock-runtime.ts +197 -0
  103. package/dist/scaffolds/notis-journal/tailwind.config.ts +58 -0
  104. package/dist/scaffolds/notis-journal/tsconfig.json +23 -0
  105. package/dist/scaffolds/notis-journal/vite.config.ts +10 -0
  106. package/dist/scaffolds/notis-notes/CHANGELOG.md +5 -0
  107. package/dist/scaffolds/notis-notes/app/page.tsx +17 -373
  108. package/dist/scaffolds/notis-notes/notis.config.ts +0 -1
  109. package/dist/scaffolds/notis-random/CHANGELOG.md +5 -0
  110. package/dist/scaffolds/notis-random/notis.config.ts +0 -1
  111. package/dist/scaffolds/notis-random/src/mock-runtime.ts +1 -0
  112. package/dist/scaffolds.json +22 -0
  113. package/package.json +3 -3
  114. package/skills/notis-apps/SKILL.md +43 -5
  115. package/skills/notis-apps/cli.md +22 -6
  116. package/skills/notis-cli/SKILL.md +20 -2
  117. package/skills/notis-query/cli.md +1 -1
  118. package/src/cli.js +8 -1
  119. package/src/command-specs/apps.js +307 -36
  120. package/src/command-specs/diagnostics.js +674 -0
  121. package/src/command-specs/helpers.js +4 -1
  122. package/src/command-specs/index.js +7 -1
  123. package/src/command-specs/meta.js +8 -2
  124. package/src/command-specs/smoke.js +386 -0
  125. package/src/command-specs/tools.js +237 -44
  126. package/src/runtime/agent-browser.js +204 -21
  127. package/src/runtime/app-changelog.js +79 -0
  128. package/src/runtime/app-dev-server.js +21 -4
  129. package/src/runtime/app-dev-sessions.js +99 -1
  130. package/src/runtime/app-platform.js +197 -18
  131. package/src/runtime/assets/store-screenshot-dark.png +0 -0
  132. package/src/runtime/desktop-auth.js +93 -0
  133. package/src/runtime/output.js +12 -1
  134. package/src/runtime/profiles.js +72 -16
  135. package/src/runtime/store-screenshot.js +138 -0
  136. package/src/runtime/transport.js +24 -82
  137. package/template/.harness/index.html.tmpl +128 -6
  138. package/template/CHANGELOG.md +5 -0
  139. package/template/app/page.tsx +11 -41
  140. package/template/notis.config.ts +0 -1
  141. package/template/package-lock.json +4137 -0
  142. package/template/package.json +1 -0
  143. package/template/packages/sdk/package.json +4 -0
  144. package/template/packages/sdk/src/components/DocumentEditor.tsx +93 -0
  145. package/template/packages/sdk/src/components/Markdown.tsx +60 -0
  146. package/template/packages/sdk/src/components/MultiSelectActionBar.tsx +7 -2
  147. package/template/packages/sdk/src/config.ts +74 -0
  148. package/template/packages/sdk/src/documents.ts +229 -0
  149. package/template/packages/sdk/src/hooks/useDatabaseSchema.ts +85 -0
  150. package/template/packages/sdk/src/hooks/useDocument.ts +78 -0
  151. package/template/packages/sdk/src/hooks/useDocuments.ts +121 -0
  152. package/template/packages/sdk/src/hooks/useMultiSelect.ts +38 -2
  153. package/template/packages/sdk/src/hooks/useUpsertDocument.ts +54 -9
  154. package/template/packages/sdk/src/index.ts +30 -1
  155. package/template/packages/sdk/src/runtime.ts +76 -17
  156. package/template/packages/sdk/src/styles.css +148 -0
  157. /package/{template → dist/scaffolds/notis-affiliate-prospects}/packages/sdk/src/hooks/useDatabase.ts +0 -0
@@ -32,6 +32,7 @@ npx --package @notis_ai/cli@latest -- notis apps create
32
32
  npx --package @notis_ai/cli@latest -- notis apps link
33
33
  npx --package @notis_ai/cli@latest -- notis apps pull
34
34
  npx --package @notis_ai/cli@latest -- notis apps deploy
35
+ npx --package @notis_ai/cli@latest -- notis apps publish --confirm-ready
35
36
  npx --package @notis_ai/cli@latest -- notis apps doctor
36
37
  ```
37
38
 
@@ -47,13 +48,17 @@ npx --package @notis_ai/cli@latest -- notis apps ...
47
48
  - Build standard pages in `app/`. Do not write raw `views/<slug>/index.js` files.
48
49
  - Keep navigation in `notis.config.ts` `routes`; each route needs a stable `slug`.
49
50
  - Reference existing databases by slug in `notis.config.ts`; do not assume deploy creates databases automatically.
51
+ - Every native database is owned by exactly one app. Creating one with `LOCAL_NOTIS_DATABASE_UPSERT_DATABASE` requires the owning app's slug or id in the `app` argument (create the app first with `LOCAL_NOTIS_CREATE_APP` if needed); deleting an app deletes its databases and their documents.
50
52
  - Declare runtime tool access in `notis.config.ts` `tools`.
51
53
  - Use `@notis/sdk` hooks instead of direct runtime access.
52
54
  - Do not rely on `window.__NOTIS_RUNTIME__` or portal-owned DOM hooks.
53
55
  - `npx --package @notis_ai/cli@latest -- notis apps deploy` updates an installed app. It does not publish to the public App Store.
54
56
  - **Local development first; deploy is user-gated.** Iterate with `apps dev` and hand off for the **user** to test in the desktop **Local development** sidebar group. Do not run `apps create` / `apps deploy` on your own — a clean build/verify is not permission to deploy. Deploy only when the user has tested the local build and explicitly asks. Finishing a build without deploying is the expected outcome.
55
57
  - **Installed app links are explicit.** A mounted dev session updates an installed app only when the checkout is linked by app id in `.notis/state.json` and the active dev-session registry mirrors that id. Name or slug matches may be suggestions, never update targets.
56
- - Public or team App Store publishing is a Portal review flow.
58
+ - **Store submission is separately user-gated.** Run `apps publish --confirm-ready` only after the user explicitly confirms the current App Details page is ready. Deploy that exact approved state first; never infer Store approval from a deploy request.
59
+ - **Bump `notisAppVersion` for every Store update.** `package.json` must contain a semver `notisAppVersion`; increment it beyond the currently published registry version before deploying an update.
60
+ - **Keep release history in one root `CHANGELOG.md`.** Put the newest entry first and use `## [Release title] - YYYY-MM-DD`, or `{PR_MERGE_DATE}` before publication. Do not add new `versionNotes` fields to `notis.config.ts`. App Details reads **What’s New** and **Version History** from the deployed package manifest; the Store reads the latest published snapshot, so unpublished workspace edits never change it. The manifest exposes `package.json` `notisAppVersion` as the package version shown in App Details.
61
+ - Public submissions still use the registry review flow; the CLI invokes the same authenticated submission endpoint as App Details.
57
62
  - Use Phosphor icon names with the `phosphor:` prefix. Do not use emoji icons.
58
63
  - Prefer scaffolded shadcn components and portal theme tokens over custom visual systems.
59
64
 
@@ -90,8 +95,14 @@ npx --package @notis_ai/cli@latest -- notis apps screenshot
90
95
  npx --package @notis_ai/cli@latest -- notis apps verify
91
96
  ```
92
97
 
93
- `notis apps screenshot` renders each route in a headless harness and writes
94
- `metadata/screenshot-N.png` (2000x1250, 16:10). Apps are icon-led like Raycast:
98
+ Declare 3–6 screenshots in `notis.config.ts`, each with a `path`, descriptive
99
+ `alt`, and optional `route`/`scenario`/`focus`/`theme`. Use `focus` to crop to a
100
+ real app root instead of empty browser canvas, and use `theme: 'light'` or
101
+ `theme: 'dark'` for a matching Portal render and Store frame. Paired light/dark
102
+ entries may reuse the same route and scenario. `notis apps screenshot` renders
103
+ those configured states in a headless harness and writes exact 2000x1250 PNGs
104
+ under `metadata/`, using the deterministic Store presentation by default. Use
105
+ `--raw` only for an unframed diagnostic capture. Apps are icon-led like Raycast:
95
106
  the app icon represents the app everywhere, so there is no cover image — only
96
107
  these screenshots. Re-run after changing routes or UI; it overwrites the set and
97
108
  drops stale files. Use `--routes home,history` to capture a subset.
@@ -103,6 +114,12 @@ npx --package @notis_ai/cli@latest -- notis apps create "My App" .
103
114
  npx --package @notis_ai/cli@latest -- notis apps deploy
104
115
  ```
105
116
 
117
+ 6. **Only after the user explicitly confirms App Details is ready for Store review**, submit the deployed version:
118
+
119
+ ```bash
120
+ npx --package @notis_ai/cli@latest -- notis apps publish --confirm-ready
121
+ ```
122
+
106
123
  or:
107
124
 
108
125
  ```bash
@@ -116,6 +133,7 @@ Expected project shape:
116
133
 
117
134
  ```text
118
135
  notis.config.ts
136
+ CHANGELOG.md # complete Store release history, newest entry first
119
137
  vite.config.ts
120
138
  app/
121
139
  components/
@@ -123,18 +141,38 @@ metadata/ # screenshot-N.png only — generated by `notis apps screensh
123
141
  .notis/output/
124
142
  ```
125
143
 
126
- `metadata/` holds listing screenshots (`screenshot-1.png`, `screenshot-2.png`,
127
- …). There is no `cover.png`: apps are icon-led like Raycast and the icon set in
144
+ `metadata/` holds 3–6 listing screenshots (`screenshot-1.png`, `screenshot-2.png`,
145
+ …). Each must be an exact 2000x1250 PNG no larger than 2 MB, with descriptive
146
+ alt text declared in `notis.config.ts`. There is no `cover.png`: apps are icon-led like Raycast and the icon set in
128
147
  `notis.config.ts` represents the app in the Store. Generate screenshots with
129
148
  `notis apps screenshot` rather than authoring PNGs by hand.
130
149
 
131
150
  `notis.config.ts` owns:
132
151
 
133
152
  - app metadata: name, title, description, icon, accent, categories, tagline
153
+ - listing screenshots: stable path, alt text, and optional capture route/scenario/focus/theme
134
154
  - database slug references
135
155
  - route definitions
136
156
  - tool access
137
157
 
158
+ `CHANGELOG.md` owns Store release copy. Keep all releases in that single file:
159
+
160
+ ```markdown
161
+ # My App Changelog
162
+
163
+ ## [A Better Workflow] - {PR_MERGE_DATE}
164
+
165
+ - Added a faster daily workflow.
166
+
167
+ ## [Initial Release] - 2026-07-01
168
+
169
+ - Published the first version.
170
+ ```
171
+
172
+ Store publication is blocked until the deployed manifest contains at least one
173
+ valid entry. Ordinary local development and deployment still work when an app
174
+ is not being prepared for the Store.
175
+
138
176
  **Icon & accent.** Set `icon` to a `phosphor:<name>` value (e.g. `phosphor:dice-five`) or `metadata/icon.png`. When `icon` is unset, the app shows its **two-letter initials** everywhere (store, sidebar, app details). `accent` optionally pins the avatar color to one of `blue | violet | emerald | amber | rose | sky | fuchsia | teal`; when unset a stable color is derived automatically from the app id. Both flow from `notis.config.ts` through deploy onto the app row and listing, and can also be changed later with the `update_app` tool (`{ "icon": "phosphor:...", "accent": "emerald" }`).
139
177
 
140
178
  Example:
@@ -137,9 +137,9 @@ Examples:
137
137
 
138
138
  ### `npx --package @notis_ai/cli@latest -- notis apps verify [dir]`
139
139
 
140
- Headless render smoke each route in a stub-runtime harness.
140
+ Validate every route and the production Store listing contract.
141
141
 
142
- When to use: After notis apps build, before deploy. Catches render-time crashes and missing runtime calls that the build step cannot detect.
142
+ When to use: After notis apps screenshot, before deploy. Catches render-time crashes, missing runtime calls, and incomplete listing media that the build step cannot detect.
143
143
 
144
144
  Options:
145
145
  - `--routes <slugs>` — Comma-separated route slugs. Default: every route in manifest.
@@ -157,23 +157,25 @@ Examples:
157
157
 
158
158
  ### `npx --package @notis_ai/cli@latest -- notis apps screenshot [dir]`
159
159
 
160
- Capture listing screenshots of each route via the headless harness.
160
+ Capture configured listing route/scenario states via the headless harness.
161
161
 
162
- When to use: Generate metadata/screenshot-N.png for the App Store listing. Apps are icon-led (like Raycast) — there is no cover image, only these screenshots. Run before notis apps verify / deploy / publish.
162
+ When to use: Generate the 3–6 declared metadata/screenshot-N.png files for the App Store listing. Apps are icon-led (like Raycast) — there is no cover image, only these screenshots. Each screenshot may set a focus selector to remove empty canvas and a light or dark theme that also controls its Store frame. Run before notis apps verify / deploy / publish.
163
163
 
164
164
  Options:
165
- - `--routes <slugs>` — Comma-separated route slugs. Default: every route in manifest.
165
+ - `--routes <slugs>` — Comma-separated route slugs. Default: every configured screenshot state.
166
166
  - `--port <n>` — Loopback port. Default: auto-pick.
167
167
  - `--width <px>` — Viewport width. Default: 2000.
168
168
  - `--height <px>` — Viewport height. Default: 1250 (16:10).
169
169
  - `--output-dir <dir>` — Where to write screenshot-N.png. Default: metadata/.
170
170
  - `--mode <mode>` — stub | live. Default stub. Live renders against real data via the CLI JWT (requires a linked app), so screenshots show actual content instead of empty states.
171
+ - `--raw` — Write the unframed harness capture instead of the default Store presentation.
171
172
  - `--skip-build` — Skip notis apps build; reuse existing .notis/output/.
172
173
 
173
174
  Examples:
174
- - `npx --package @notis_ai/cli@latest -- notis apps screenshot`
175
+ - `npx --package @notis_ai/cli@latest -- notis apps screenshot # honors notis.config.ts screenshot scenarios`
175
176
  - `npx --package @notis_ai/cli@latest -- notis apps screenshot --routes home,history`
176
177
  - `npx --package @notis_ai/cli@latest -- notis apps screenshot --mode live # populated screenshots from real data`
178
+ - `npx --package @notis_ai/cli@latest -- notis apps screenshot --raw # diagnostic capture without Store framing`
177
179
 
178
180
  ### `npx --package @notis_ai/cli@latest -- notis apps link <app-id> [dir]`
179
181
 
@@ -216,6 +218,20 @@ Examples:
216
218
  - `npx --package @notis_ai/cli@latest -- notis apps deploy --app-id abc123`
217
219
  - `npx --package @notis_ai/cli@latest -- notis apps deploy --direct`
218
220
 
221
+ ### `npx --package @notis_ai/cli@latest -- notis apps publish [dir]`
222
+
223
+ Submit the deployed app for Store review.
224
+
225
+ When to use: After the user explicitly confirms the App Details page and Store listing are ready. Requires the current local project to match the latest deployed version.
226
+
227
+ Options:
228
+ - `--app-id <id>` — Override linked app ID.
229
+ - `--confirm-ready` — Confirm the user approved the current App Details page for Store submission.
230
+
231
+ Examples:
232
+ - `npx --package @notis_ai/cli@latest -- notis apps publish --confirm-ready`
233
+ - `npx --package @notis_ai/cli@latest -- notis apps publish ./my-app --confirm-ready`
234
+
219
235
  ### `npx --package @notis_ai/cli@latest -- notis apps doctor [dir]`
220
236
 
221
237
  Check project health and readiness.
@@ -140,8 +140,9 @@ This is the main escape hatch for:
140
140
  - `npx --package @notis_ai/cli@latest -- notis tools exec <tool-name> --arguments '<json>'`
141
141
  6. If multiple independent calls are needed, use:
142
142
  - `npx --package @notis_ai/cli@latest -- notis tools exec-parallel '<json-array>'`
143
- 7. If the toolkit is not connected yet, generate the connection URL:
143
+ 7. If the toolkit is not connected yet, start its connection flow:
144
144
  - `npx --package @notis_ai/cli@latest -- notis tools link <toolkit>`
145
+ - For a revoked or invalid credential-based connection, reconnect with credential JSON on stdin: `npx --package @notis_ai/cli@latest -- notis tools link <toolkit> --reconnect --credentials -`
145
146
 
146
147
  ### Tool access rules
147
148
 
@@ -150,6 +151,8 @@ This is the main escape hatch for:
150
151
  - When you know the tool name but not the argument shape, use `npx --package @notis_ai/cli@latest -- notis tools describe` or `--get-schema` before execution.
151
152
  - Use `--dry-run` before mutating calls when you want schema validation without execution.
152
153
  - If a toolkit is missing, use `npx --package @notis_ai/cli@latest -- notis tools link <toolkit>` to start the connection flow.
154
+ - Use `--reconnect` to replace an existing connection. If multiple accounts exist, select one with `--connection-id <id>`.
155
+ - For API keys, basic auth, or other credential JSON, prefer `--credentials -` and pipe or redirect stdin. Avoid inline secrets because they can enter shell history and process listings.
153
156
 
154
157
  ### Toolkit mental model
155
158
 
@@ -202,6 +205,12 @@ Connect a missing toolkit:
202
205
  npx --package @notis_ai/cli@latest -- notis tools link github
203
206
  ```
204
207
 
208
+ Reconnect a credential-based toolkit without putting the secret in shell history:
209
+
210
+ ```bash
211
+ npx --package @notis_ai/cli@latest -- notis tools link dataforseo --reconnect --credentials - < credentials.json
212
+ ```
213
+
205
214
  ## Native database access
206
215
 
207
216
  Native Notis databases are accessed through the generic tool workflow, not a first-class database command group. Use these canonical tool names:
@@ -209,7 +218,7 @@ Native Notis databases are accessed through the generic tool workflow, not a fir
209
218
  - `LOCAL_NOTIS_DATABASE_LIST_DATABASES` -- list databases accessible to the current profile
210
219
  - `LOCAL_NOTIS_DATABASE_GET_DATABASE` -- inspect read-only metadata and schema detail
211
220
  - `LOCAL_NOTIS_DATABASE_QUERY` -- query documents from a database
212
- - `LOCAL_NOTIS_DATABASE_UPSERT_DATABASE` -- create or update a database schema
221
+ - `LOCAL_NOTIS_DATABASE_UPSERT_DATABASE` -- create or update a database schema. Every database belongs to a Notis app: creation requires the owning app's slug or id in the `app` argument (create the app first with `LOCAL_NOTIS_CREATE_APP` if needed)
213
222
 
214
223
  Example workflow before building an app:
215
224
 
@@ -239,6 +248,15 @@ Most importantly: if you do not currently have the tool you need, especially for
239
248
 
240
249
  ## Troubleshooting
241
250
 
251
+ ### CLI returns `auth_expired`
252
+
253
+ Local CLI auth is renewed by Notis Desktop. In JSON/agent mode, follow the
254
+ first hint exactly: on macOS it is an executable `open -a 'Notis'` (or
255
+ `open -a 'Notis Beta'`) command when the owning desktop app is not running.
256
+ Wait for the app to restore the signed-in session, then rerun the original
257
+ command. Do not copy refresh tokens into commands or try to refresh the shared
258
+ desktop session yourself.
259
+
242
260
  ### Deploy fails with "network_error" or "fetch failed"
243
261
 
244
262
  The backend server at `http://localhost:3001` is not running. Solutions:
@@ -13,7 +13,7 @@ For CI, hosted agents, or internal scripts, pass a non-persisted token with `NOT
13
13
  - `LOCAL_NOTIS_DATABASE_LIST_DATABASES` — list native databases.
14
14
  - `LOCAL_NOTIS_DATABASE_GET_DATABASE` — inspect one database schema.
15
15
  - `LOCAL_NOTIS_DATABASE_QUERY` — query native database documents.
16
- - `LOCAL_NOTIS_DATABASE_UPSERT_DATABASE` — create or update database schema.
16
+ - `LOCAL_NOTIS_DATABASE_UPSERT_DATABASE` — create or update database schema. Creation requires the owning app's slug or id in the `app` argument (every database belongs to a Notis app).
17
17
 
18
18
  ## Workflow
19
19
 
package/src/cli.js CHANGED
@@ -68,6 +68,8 @@ function buildRuntime(globalOptions, spec) {
68
68
  ...runtime,
69
69
  cliVersion: CLI_VERSION,
70
70
  color: globalOptions.color !== false,
71
+ quiet: Boolean(globalOptions.quiet),
72
+ verbose: Boolean(globalOptions.verbose),
71
73
  workspacePath,
72
74
  };
73
75
  }
@@ -120,9 +122,14 @@ function attachSpec(program, parentMap, spec, specs) {
120
122
  process.exitCode = typeof exitCode === 'number' ? exitCode : 0;
121
123
  } catch (error) {
122
124
  const runtime = {
123
- ...resolveRuntimeProfile(globalOptions, { requireAuth: false }),
125
+ ...resolveRuntimeProfile(globalOptions, {
126
+ requireAuth: false,
127
+ includeDebugEntitlementOverride: false,
128
+ }),
124
129
  cliVersion: CLI_VERSION,
125
130
  color: globalOptions.color !== false,
131
+ quiet: Boolean(globalOptions.quiet),
132
+ verbose: Boolean(globalOptions.verbose),
126
133
  workspacePath,
127
134
  };
128
135
  const output = new OutputManager(runtime);