@shipwithai/loopnote 0.0.0-stage → 2.0.0-bootstrap.0
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/LICENSE +21 -0
- package/README.md +202 -2
- package/THIRD_PARTY_NOTICES.md +580 -0
- package/dist/bin/loopnote.mjs +5 -0
- package/dist/cli/confirm.js +38 -0
- package/dist/cli/picker.js +342 -0
- package/dist/cli/request.js +120 -0
- package/dist/cli/run.js +970 -0
- package/dist/contracts/api.js +640 -0
- package/dist/contracts/comparison.js +178 -0
- package/dist/contracts/draft.js +606 -0
- package/dist/contracts/request.js +124 -0
- package/dist/domain/anchor.js +122 -0
- package/dist/domain/comparison-key.js +51 -0
- package/dist/domain/errors.js +43 -0
- package/dist/domain/path-bytes.js +82 -0
- package/dist/domain/product-identity.js +66 -0
- package/dist/domain/source.js +4 -0
- package/dist/draft/mutate-draft.js +87 -0
- package/dist/export/render-review-markdown.js +163 -0
- package/dist/export/review-export.js +273 -0
- package/dist/git/availability.js +92 -0
- package/dist/git/candidates.js +413 -0
- package/dist/git/comparison.js +263 -0
- package/dist/git/exact-patch.js +702 -0
- package/dist/git/ignore-status.js +23 -0
- package/dist/git/inventory.js +160 -0
- package/dist/git/numstat.js +111 -0
- package/dist/git/objects.js +95 -0
- package/dist/git/raw-diff.js +84 -0
- package/dist/git/repository.js +144 -0
- package/dist/git/runner.js +145 -0
- package/dist/git/selector-drift.js +169 -0
- package/dist/git/standalone-resolution.js +174 -0
- package/dist/git/worktree-content.js +97 -0
- package/dist/git/worktree-inventory.js +391 -0
- package/dist/native/directory_exchange.node +0 -0
- package/dist/server/app.js +171 -0
- package/dist/server/attached-completion.js +85 -0
- package/dist/server/capabilities.js +1572 -0
- package/dist/server/draft-loader.js +134 -0
- package/dist/server/draft-recovery.js +5 -0
- package/dist/server/draft-store.js +380 -0
- package/dist/server/export-store.js +291 -0
- package/dist/server/gitignore-capability.js +197 -0
- package/dist/server/image-content.js +101 -0
- package/dist/server/lifecycle.js +72 -0
- package/dist/server/native-exchange-capability.js +45 -0
- package/dist/server/patch-snapshot.js +500 -0
- package/dist/server/routes.js +418 -0
- package/dist/server/security.js +123 -0
- package/dist/server/snapshot-fs.js +58 -0
- package/dist/server/support-client.js +76 -0
- package/dist/server/support-store.js +194 -0
- package/dist/server/worktree-snapshot.js +553 -0
- package/dist/web/assets/abap-08VXUWAP.js +1 -0
- package/dist/web/assets/apex-BWPQTe0t.js +1 -0
- package/dist/web/assets/azcli-Bc_sGQ0U.js +1 -0
- package/dist/web/assets/bat-i0X4ZdIN.js +1 -0
- package/dist/web/assets/bicep-B5-_aFwp.js +2 -0
- package/dist/web/assets/cameligo-DMUM7wLl.js +1 -0
- package/dist/web/assets/clojure-Cm7r79vr.js +1 -0
- package/dist/web/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/dist/web/assets/coffee-Ba7i2nA0.js +1 -0
- package/dist/web/assets/cpp-C7h46wYY.js +1 -0
- package/dist/web/assets/csharp-BKxtCVv1.js +1 -0
- package/dist/web/assets/csp-bTuwJoIa.js +1 -0
- package/dist/web/assets/css-DIMkf-bt.js +3 -0
- package/dist/web/assets/css.worker-yKcq13f2.js +89 -0
- package/dist/web/assets/cssMode-CpBTfhMg.js +1 -0
- package/dist/web/assets/cypher-CVaqCwHa.js +1 -0
- package/dist/web/assets/dart-onAF5SnQ.js +1 -0
- package/dist/web/assets/dockerfile-DZFCIeNp.js +1 -0
- package/dist/web/assets/ecl-D05T4iGw.js +1 -0
- package/dist/web/assets/editor.worker-tytyn86m.js +26 -0
- package/dist/web/assets/elixir-6RTg0lbw.js +1 -0
- package/dist/web/assets/flow9-C5_-GSwl.js +1 -0
- package/dist/web/assets/freemarker2-skQ63wb7.js +3 -0
- package/dist/web/assets/fsharp-C8Ef5oNN.js +1 -0
- package/dist/web/assets/go-C-y9NEjX.js +1 -0
- package/dist/web/assets/graphql-fmXr3nnJ.js +1 -0
- package/dist/web/assets/handlebars-CqvPAZY8.js +1 -0
- package/dist/web/assets/hcl-CpzslTdj.js +1 -0
- package/dist/web/assets/html-BDAqstpo.js +1 -0
- package/dist/web/assets/html.worker-DSJ9zmd7.js +502 -0
- package/dist/web/assets/htmlMode-BRYA3pnT.js +1 -0
- package/dist/web/assets/index-CCeYBqPo.js +1111 -0
- package/dist/web/assets/index-CRj9ojWJ.css +1 -0
- package/dist/web/assets/ini-sBoK_t0W.js +1 -0
- package/dist/web/assets/java-BEtHBSE6.js +1 -0
- package/dist/web/assets/javascript-1Ywytw67.js +1 -0
- package/dist/web/assets/json.worker-Oa9UrkKE.js +58 -0
- package/dist/web/assets/jsonMode-AO1C_0kX.js +7 -0
- package/dist/web/assets/julia-Bri6UV-V.js +1 -0
- package/dist/web/assets/kotlin-BOotOW0E.js +1 -0
- package/dist/web/assets/less-B9JPFI3C.js +2 -0
- package/dist/web/assets/lexon-CfSJPG6W.js +1 -0
- package/dist/web/assets/liquid-CkkqyyGc.js +1 -0
- package/dist/web/assets/lspLanguageFeatures-CYOFEMZp.js +4 -0
- package/dist/web/assets/lua-CsQS60Ue.js +1 -0
- package/dist/web/assets/m3-D-oSqn_W.js +1 -0
- package/dist/web/assets/markdown-Cimd5fb3.js +1 -0
- package/dist/web/assets/mdx-Bd3Wlfqw.js +1 -0
- package/dist/web/assets/mips-CIPQ_RoX.js +1 -0
- package/dist/web/assets/msdax-DauUninz.js +1 -0
- package/dist/web/assets/mysql-SOo6toE5.js +1 -0
- package/dist/web/assets/objective-c-FvmIjYaQ.js +1 -0
- package/dist/web/assets/pascal-DrH0SRf2.js +1 -0
- package/dist/web/assets/pascaligo-D-ptJ9y-.js +1 -0
- package/dist/web/assets/perl-oz_6vUea.js +1 -0
- package/dist/web/assets/pgsql-DTj74zXo.js +1 -0
- package/dist/web/assets/php-nr791fC2.js +1 -0
- package/dist/web/assets/pla-CopQ2nXW.js +1 -0
- package/dist/web/assets/postiats-43DmfD33.js +1 -0
- package/dist/web/assets/powerquery-D3hlyOfw.js +1 -0
- package/dist/web/assets/powershell-DmHpPYUd.js +1 -0
- package/dist/web/assets/protobuf-C531GsRP.js +2 -0
- package/dist/web/assets/pug-Z5eAx3Zn.js +1 -0
- package/dist/web/assets/python-CET4IumD.js +1 -0
- package/dist/web/assets/qsharp-DkqhCAOL.js +1 -0
- package/dist/web/assets/r-BwWrilGY.js +1 -0
- package/dist/web/assets/razor-d-reaHeT.js +1 -0
- package/dist/web/assets/redis-ClamHrr6.js +1 -0
- package/dist/web/assets/redshift-DT7zqm-g.js +1 -0
- package/dist/web/assets/restructuredtext-BYgofb2h.js +1 -0
- package/dist/web/assets/ruby-DezsRK8O.js +1 -0
- package/dist/web/assets/rust-DdL9SqIa.js +1 -0
- package/dist/web/assets/sb-CcwsVR0C.js +1 -0
- package/dist/web/assets/scala-DHpiXF5c.js +1 -0
- package/dist/web/assets/scheme-BeGwcela.js +1 -0
- package/dist/web/assets/scss-gp-XZpBa.js +3 -0
- package/dist/web/assets/shell-CC2rA5mh.js +1 -0
- package/dist/web/assets/solidity-BEEn4gHE.js +1 -0
- package/dist/web/assets/sophia-CRfGWb83.js +1 -0
- package/dist/web/assets/sparql-D_Lu-MrJ.js +1 -0
- package/dist/web/assets/sql-NEE52Syq.js +1 -0
- package/dist/web/assets/st-DbInun42.js +1 -0
- package/dist/web/assets/swift-Bxkupp3x.js +1 -0
- package/dist/web/assets/systemverilog-Bz4Y3fRF.js +1 -0
- package/dist/web/assets/tcl-DISqw1ZD.js +1 -0
- package/dist/web/assets/ts.worker-BtjBFNHX.js +67734 -0
- package/dist/web/assets/tsMode-DLxSAtkD.js +11 -0
- package/dist/web/assets/twig-De2hgUGE.js +1 -0
- package/dist/web/assets/typescript-DprEVA-S.js +1 -0
- package/dist/web/assets/typespec-B8J7ngcE.js +1 -0
- package/dist/web/assets/vb-DV3o63ZY.js +1 -0
- package/dist/web/assets/wgsl-DpFanUEy.js +298 -0
- package/dist/web/assets/xml-B7ZwKOhJ.js +1 -0
- package/dist/web/assets/yaml-OQ9Asg7B.js +1 -0
- package/dist/web/index.html +14 -0
- package/package.json +87 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alessandro Magionami & Manuel Salvatore Martone
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,203 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Loopnote
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Loopnote is local review for any agent-produced artifact — code, plans, decisions, docs — in a pull-request-style workspace, without publishing a branch, worktree, or patch. Review a pinned Git comparison, uncommitted work, or standalone files; leave durable feedback; export it for an agent or teammate to use.
|
|
4
|
+
|
|
5
|
+
Published as **`@shipwithai/loopnote`**; command **`loopnote`**.
|
|
6
|
+
|
|
7
|
+
Stable releases are published on npm. Each stable release's registry bytes, provenance attestation, and global, `npx`, and marketplace installation paths are verified during release acceptance before publishing. Source and the sole support channel are the public [Ship-With-AI/loopnote](https://github.com/Ship-With-AI/loopnote) repository and its [Issues tracker](https://github.com/Ship-With-AI/loopnote/issues).
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
You need:
|
|
12
|
+
|
|
13
|
+
- Node.js 24 or later
|
|
14
|
+
- npm
|
|
15
|
+
- Git 2.43.0 or later
|
|
16
|
+
- A non-bare Git worktree containing at least one commit for the repository you want to review
|
|
17
|
+
- For the recommended skill route, one of the supported coding agents: Claude Code, Codex, Pi, or OMP
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
Loopnote is two independently installed, independently MIT-licensed pieces:
|
|
22
|
+
|
|
23
|
+
| Piece | What it is | Where it comes from |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `loopnote` CLI | The review application: Git grounding, diff, browser workspace, persistence, export | npm package `@shipwithai/loopnote` |
|
|
26
|
+
| Loopnote skill | The recommended entry point, driving the CLI from your coding agent | `ship-with-ai` collection in [Ship-With-AI/skills](https://github.com/Ship-With-AI/skills) |
|
|
27
|
+
|
|
28
|
+
**Installing the skill is the recommended way to get Loopnote into your workflow.** Your agent then resolves the ordered base and head, launches the CLI in its native agent protocol, supervises the session while you review, and reports the canonical result — no hand-built request JSON and no manual process supervision.
|
|
29
|
+
|
|
30
|
+
The skill does not install the application. It never installs, upgrades, `npx`-substitutes, or builds the CLI: it runs a compatibility check first and stops with the exact install command when no compatible CLI is present. Install the CLI once, then install the skill.
|
|
31
|
+
|
|
32
|
+
### 1. Install the CLI
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
npm install --global @shipwithai/loopnote
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Confirm the command is on your `PATH`:
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
loopnote --version
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The skill accepts stable Loopnote versions `>=2.0.0 <3.0.0` and rejects prereleases.
|
|
45
|
+
|
|
46
|
+
### 2. Install the skill in your agent
|
|
47
|
+
|
|
48
|
+
**Claude Code** — native collection:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
/plugin marketplace add Ship-With-AI/skills
|
|
52
|
+
/plugin install ship-with-ai@ship-with-ai-skills
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Invoke `/ship-with-ai:loopnote`. A selectively installed standalone copy in `.claude/skills/loopnote` is invoked as `/loopnote`.
|
|
56
|
+
|
|
57
|
+
**OMP** — native collection:
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
omp plugin marketplace add Ship-With-AI/skills
|
|
61
|
+
omp plugin install --scope project ship-with-ai@ship-with-ai-skills
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Invoke `/skill:loopnote`.
|
|
65
|
+
|
|
66
|
+
**Codex** — selective placement into the project's `.agents/skills/loopnote`:
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
npx skills add Ship-With-AI/skills --skill loopnote -a codex
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Invoke `$loopnote`, or select Loopnote from `/skills`.
|
|
73
|
+
|
|
74
|
+
**Pi** — selective placement into the project's `.pi/skills/loopnote`:
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
npx skills add Ship-With-AI/skills --skill loopnote -a pi
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Invoke `/skill:loopnote` in a trusted project with skill commands enabled.
|
|
81
|
+
|
|
82
|
+
Of these four routes, only the OMP marketplace installation was exercised during release acceptance. The Claude Code, Codex, and Pi routes follow the collection's documented installation conventions and remain unexercised.
|
|
83
|
+
|
|
84
|
+
### 3. Ask your agent for a review
|
|
85
|
+
|
|
86
|
+
From the repository you want to review, ask for the comparison in plain language — for example, “review my feature branch against `main` with Loopnote”. The skill resolves full pinned commit OIDs, sends the merge base as the base, launches the CLI, gives you the loopback URL, and waits. Review in the browser as described below, then press **Finish**; the agent reads the canonical result and reports the summary and open comments without editing your code.
|
|
87
|
+
|
|
88
|
+
### Use the CLI without a skill
|
|
89
|
+
|
|
90
|
+
The CLI is fully usable on its own. Install it globally as above, or run it in the repository you want to review:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
npx --yes @shipwithai/loopnote
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Neither path requires a Loopnote source checkout or local build. Launching `loopnote` with an interactive terminal starts the picker described next; piping a request into it uses the agent protocol documented in [Review changes from a coding agent](#review-changes-from-a-coding-agent).
|
|
97
|
+
|
|
98
|
+
## Start a review
|
|
99
|
+
|
|
100
|
+
This is the interactive terminal route. If you use the Loopnote skill, your agent performs this launch for you with pinned OIDs and hands you the review URL.
|
|
101
|
+
|
|
102
|
+
### Review a committed range
|
|
103
|
+
|
|
104
|
+
Change to the Git worktree whose local branches or registered worktrees you want to loopnote, then run:
|
|
105
|
+
|
|
106
|
+
```sh
|
|
107
|
+
cd /path/to/repository-to-review
|
|
108
|
+
loopnote
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Loopnote asks you to choose the **base**, then the **head**, from searchable lists of local branches and registered worktrees, and opens the browser workspace at a loopback URL. For the full walkthrough — merge-base selection, the dirty-worktree note, and the confirmation screen — see [docs/usage.md](docs/usage.md#starting-a-review).
|
|
112
|
+
|
|
113
|
+
### Review uncommitted changes
|
|
114
|
+
|
|
115
|
+
Review staged, unstaged, or the full working tree against `HEAD` directly, with no Base/Head selection:
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
loopnote --worktree
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Use `--staged` or `--unstaged` instead to narrow the comparison, or `--base <ref>` to compare against a ref other than `HEAD`. Uncommitted reviews freeze a snapshot when the session starts; use **Refresh** in the browser to capture current bytes without losing saved comments. Full flag reference: [docs/usage.md](docs/usage.md#flags-and-arguments).
|
|
122
|
+
|
|
123
|
+
### Review standalone files
|
|
124
|
+
|
|
125
|
+
Review named files or globs directly, with no Base/Head selection:
|
|
126
|
+
|
|
127
|
+
```sh
|
|
128
|
+
loopnote src/example.ts docs/*.md
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Each file renders full-width in a single pane rather than as a two-sided diff. Full reference: [docs/usage.md](docs/usage.md#standalone-file-review).
|
|
132
|
+
|
|
133
|
+
### Toggle Markdown rendering
|
|
134
|
+
|
|
135
|
+
For Markdown files, use the **Source** and **Rendered** buttons in the file toolbar to switch between the raw text diff and a rendered preview; line comments work in either mode.
|
|
136
|
+
|
|
137
|
+
## Review changes from a coding agent
|
|
138
|
+
|
|
139
|
+
**The Loopnote skill is the recommended way to use this protocol**; it builds the request, supervises the process, and consumes the canonical result for you. See [Install](#install).
|
|
140
|
+
|
|
141
|
+
To script the protocol directly, pipe a JSON request to `loopnote` and redirect `stdout` to a file:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
node --input-type=module -e '
|
|
145
|
+
const request = {
|
|
146
|
+
kind: "loopnote.review-request",
|
|
147
|
+
schemaVersion: 1,
|
|
148
|
+
mode: "revisions",
|
|
149
|
+
revisions: {
|
|
150
|
+
base: "0123456789abcdef0123456789abcdef01234567",
|
|
151
|
+
head: "89abcdef0123456789abcdef0123456789abcdef",
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
process.stdout.write(JSON.stringify(request));
|
|
155
|
+
' | loopnote > agent-review.json
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
For the exact-patch mode, the full flag reference, and the protocol's isolation/persistence guarantees, see [docs/usage.md](docs/usage.md#agent-request-protocol).
|
|
159
|
+
|
|
160
|
+
## Stop Loopnote
|
|
161
|
+
|
|
162
|
+
Return to the terminal where you launched `loopnote` and press `Ctrl+C`. This stops the local loopback server.
|
|
163
|
+
|
|
164
|
+
## Keyboard shortcuts
|
|
165
|
+
|
|
166
|
+
Visible controls remain available for every action. These shortcuts are additional ways to work:
|
|
167
|
+
|
|
168
|
+
| Action | Shortcut |
|
|
169
|
+
| --- | --- |
|
|
170
|
+
| Previous file | Alt+Shift+[ |
|
|
171
|
+
| Next file | Alt+Shift+] |
|
|
172
|
+
| Previous change | Shift+F7 |
|
|
173
|
+
| Next change | F7 |
|
|
174
|
+
| Add or focus a comment on the current line | Option+Enter on macOS; Alt+Enter on Windows and Linux |
|
|
175
|
+
| Add the comment | Command+Enter on macOS; Ctrl+Enter on Windows and Linux |
|
|
176
|
+
| Discard or close the composer | Escape |
|
|
177
|
+
| Move through controls | Tab and Shift+Tab |
|
|
178
|
+
| Move in the file tree; open a file | Arrow keys; Enter |
|
|
179
|
+
| Open Monaco accessibility help | Alt+F1 |
|
|
180
|
+
|
|
181
|
+
## File limits
|
|
182
|
+
|
|
183
|
+
Loopnote reviews regular UTF-8 text files only. Each inspected blob side must be at most 1,048,576 bytes (1 MiB).
|
|
184
|
+
|
|
185
|
+
Binary, non-UTF-8, oversized, symlink, submodule, and unsupported mode/type entries stay visible but are not reviewable. Missing-object cases (missing objects) are separately unavailable rather than unsupported file kinds. Loopnote does not separately detect arbitrary generated source files. Its own `.loopnote/` internal output is always excluded from the review inventory.
|
|
186
|
+
|
|
187
|
+
## Upgrading from Cumpa
|
|
188
|
+
|
|
189
|
+
Loopnote is the renamed continuation of Cumpa. If a `.cumpa/` directory exists from a 1.x install, the drafts and exports stored there are not readable by 2.0.0 and are not migrated. `.cumpa/` is excluded from Loopnote's review file inventory and never appears as reviewable or comparable content. `.cumpa/` is no longer used and can be deleted. Voluntary support status carries over automatically on first run; no action is required.
|
|
190
|
+
|
|
191
|
+
## License and independent notices
|
|
192
|
+
|
|
193
|
+
Loopnote is open source under the [MIT License](LICENSE). You may use, copy, modify, distribute, sublicense, and sell copies, including in commercial products, provided you retain the required copyright and permission notices. The software is provided without warranty.
|
|
194
|
+
|
|
195
|
+
Required independent grants and attributions remain in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). The application and the separately distributed marketplace skill use MIT; third-party components retain their own licenses and notices.
|
|
196
|
+
|
|
197
|
+
## Voluntary support
|
|
198
|
+
|
|
199
|
+
Support is optional and feature-neutral: review and export do not require payment. Supporting Loopnote does not purchase extra review capabilities or a service, maintenance, update or support commitment.
|
|
200
|
+
|
|
201
|
+
## Problems and questions
|
|
202
|
+
|
|
203
|
+
Report problems and ask questions in [Loopnote Issues](https://github.com/Ship-With-AI/loopnote/issues), for both the CLI and the skill.
|