repoview 0.6.0 → 0.6.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/CHANGELOG.md +34 -0
- package/DEVELOPMENT.md +14 -0
- package/README.md +35 -0
- package/dist/cli.js +256 -26
- package/dist/cli.js.map +1 -1
- package/dist/gist-router.js +153 -0
- package/dist/gist-router.js.map +1 -0
- package/dist/gists.js +130 -0
- package/dist/gists.js.map +1 -0
- package/dist/reload.js +27 -8
- package/dist/reload.js.map +1 -1
- package/dist/repo-context.js +9 -2
- package/dist/repo-context.js.map +1 -1
- package/dist/repo-router.js +10 -1
- package/dist/repo-router.js.map +1 -1
- package/dist/server.js +9 -3
- package/dist/server.js.map +1 -1
- package/dist/views.js +148 -1
- package/dist/views.js.map +1 -1
- package/package.json +1 -1
- package/public/app.css +31 -0
- package/public/app.js +23 -2
- package/public/gist.js +60 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,40 @@
|
|
|
3
3
|
All notable changes to this project are documented here. This project adheres to
|
|
4
4
|
[Semantic Versioning](https://semver.org/).
|
|
5
5
|
|
|
6
|
+
## 0.6.1 — 2026-06-27
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- **Ephemeral gists.** Publish an arbitrary file (usually Markdown) to a running
|
|
10
|
+
session and get a shareable preview URL — for agents that generate a doc and
|
|
11
|
+
want the user to read it.
|
|
12
|
+
- `POST /api/gists` `{content, filename?, title?, ttlSeconds?}` → `{id, url, rawUrl, expiresAt}`
|
|
13
|
+
- `GET /gist/:id` (rendered preview), `GET /gist/:id/raw`, `GET /gists` (list)
|
|
14
|
+
- **Editable & deletable** (GitHub-gist-shaped): `PATCH /api/gists/:id`,
|
|
15
|
+
`DELETE /api/gists/:id`, `GET /api/gists` (JSON list), an `/gist/:id/edit`
|
|
16
|
+
form, and Edit/Delete buttons on the preview page.
|
|
17
|
+
- CLI: `repoview gist <file>` (create) plus `gist edit <id> [file]`,
|
|
18
|
+
`gist delete <id>`, `gist list` — all also work via `--url` against a remote
|
|
19
|
+
server. Create/edit read from a file or stdin.
|
|
20
|
+
- Gists are **in memory only** (don't survive a restart) and expire after a TTL
|
|
21
|
+
(default 24h, clamped 1m–7d); capped at 1 MB / 500 gists.
|
|
22
|
+
- **`REPOVIEW_BASE_URL`** env var sets the absolute origin used in returned gist
|
|
23
|
+
URLs (so a remotely-running server returns clickable links). Falls back to the
|
|
24
|
+
request `Host` header.
|
|
25
|
+
- A **Gists** link in the top bar (and on the session page) → the `/gists` list.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- **Scoped live reload.** A page now reloads only for changes relevant to it: a
|
|
29
|
+
file view reloads on its exact file, a directory view on its direct children,
|
|
30
|
+
and repo-wide views (diff, broken-links) on any change. Previously any edit
|
|
31
|
+
reloaded every open page of that repo. Gist/session pages no longer live-reload
|
|
32
|
+
(their content is static), which also removes spurious reloads of open gist
|
|
33
|
+
tabs when the default repo changed.
|
|
34
|
+
- **Rewrote `--help`** to be comprehensive and agent-friendly: documents the
|
|
35
|
+
daemon lifecycle (first run is the foreground server; later runs exit), all
|
|
36
|
+
subcommands and their daemon/`--repo` requirements, the HTTP control + gist API
|
|
37
|
+
with example payloads, the page map, and env vars (incl. that
|
|
38
|
+
`REPOVIEW_BASE_URL` is read by the server, not the client).
|
|
39
|
+
|
|
6
40
|
## 0.6.0 — 2026-06-04
|
|
7
41
|
|
|
8
42
|
### Added
|
package/DEVELOPMENT.md
CHANGED
|
@@ -10,6 +10,7 @@ This doc collects the “how it works” details so `README.md` can stay product
|
|
|
10
10
|
- `src/repo-context.ts`: per-repo runtime state (git info, gitignore matcher, link scanner, reload hub, file watcher)
|
|
11
11
|
- `src/repo-router.ts`: the per-repo routes (`/tree`, `/blob`, `/raw`, `/diff`, `/review`, `/events`, …) as a router that resolves `/r/:repoId` → a per-repo child router
|
|
12
12
|
- `src/net.ts`: loopback helpers (control-endpoint guard, bind-host check)
|
|
13
|
+
- `src/gists.ts` / `src/gist-router.ts`: in-memory ephemeral gist store (TTL, expiry sweeper) and its routes
|
|
13
14
|
- `src/types.ts`: shared interfaces (`RepoContext`, `Session`/`RepoSummary`, `GitInfo`, `MarkdownRenderer`, `LinkScanner`, …)
|
|
14
15
|
- `src/git.ts` / `src/paths.ts` / `src/format.ts` / `src/csv.ts` / `src/reload.ts`: extracted helpers (git CLI, path safety, byte/date formatting, CSV parsing, SSE reload hub)
|
|
15
16
|
- `src/markdown.ts`: Markdown rendering + link/image rewriting (repo-prefixed) + sanitization
|
|
@@ -69,6 +70,19 @@ Session-level routes:
|
|
|
69
70
|
- `GET /api/session`: session signature + repo list (also the join handshake)
|
|
70
71
|
- `GET /api/repos`, `POST /api/repos`, `DELETE /api/repos/:id`, `POST /api/shutdown`: control API (mutations are loopback-only)
|
|
71
72
|
|
|
73
|
+
Gist routes (ephemeral published files, in-memory, default 24h TTL):
|
|
74
|
+
- `GET /api/gists`: list gists as JSON
|
|
75
|
+
- `POST /api/gists`: publish `{content, filename?, title?, ttlSeconds?}` → `{id, url, rawUrl, expiresAt}`
|
|
76
|
+
- `PATCH /api/gists/:id`: edit `{content?, filename?, title?, ttlSeconds?}` → updated gist
|
|
77
|
+
- `DELETE /api/gists/:id`: delete
|
|
78
|
+
- `GET /gist/:id`: rendered preview (Markdown or highlighted code) with Edit/Delete
|
|
79
|
+
- `GET /gist/:id/edit`: edit form
|
|
80
|
+
- `GET /gist/:id/raw`: raw source
|
|
81
|
+
- `GET /gists`: list of active gists
|
|
82
|
+
|
|
83
|
+
`REPOVIEW_BASE_URL` sets the absolute origin used in returned gist URLs (falls
|
|
84
|
+
back to the request `Host` header).
|
|
85
|
+
|
|
72
86
|
## Link rewriting rules
|
|
73
87
|
|
|
74
88
|
`src/markdown.ts` rewrites relative Markdown links so they stay inside the repo UI:
|
package/README.md
CHANGED
|
@@ -69,6 +69,41 @@ Use `--port` to run independent sessions side by side.
|
|
|
69
69
|
> the `/session` page is read-only for remote viewers. Use `--host 127.0.0.1` to
|
|
70
70
|
> keep a session fully local.
|
|
71
71
|
|
|
72
|
+
## Gists (ephemeral file previews)
|
|
73
|
+
|
|
74
|
+
Publish an arbitrary file (usually Markdown) to a running session and get a
|
|
75
|
+
shareable preview URL — handy for agents that generate a doc and want the user to
|
|
76
|
+
read it. Gists live **in memory only** (they don't survive a restart) and expire
|
|
77
|
+
after a TTL (default **24h**).
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
repoview gist NOTES.md --title "Release plan" # prints a preview URL
|
|
81
|
+
cat report.md | repoview gist --filename report.md # from stdin
|
|
82
|
+
repoview gist out.md --ttl 2h # custom TTL (1m–7d)
|
|
83
|
+
repoview gist edit <id> NOTES.md # replace content
|
|
84
|
+
repoview gist delete <id> # delete
|
|
85
|
+
repoview gist list # list active gists
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Gists are **editable and deletable** (like GitHub gists): the preview page has
|
|
89
|
+
Edit/Delete buttons, and the HTTP API supports `PATCH`/`DELETE /api/gists/:id`.
|
|
90
|
+
|
|
91
|
+
Or over HTTP (e.g. from a remote agent):
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
curl -X POST "$BASE/api/gists" -H 'content-type: application/json' \
|
|
95
|
+
-d '{"content":"# Hi","filename":"hi.md","ttlSeconds":3600}'
|
|
96
|
+
# → { "url": "…/gist/<id>", "rawUrl": "…/gist/<id>/raw", "expiresAt": "…" }
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
All gists are listed at **`/gists`** (linked from the top bar) so the user can
|
|
100
|
+
always find them. Set **`REPOVIEW_BASE_URL`** so a remotely-running server returns
|
|
101
|
+
absolute, clickable URLs:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
REPOVIEW_BASE_URL=https://repoview.example.com repoview --host 0.0.0.0
|
|
105
|
+
```
|
|
106
|
+
|
|
72
107
|
## Why
|
|
73
108
|
|
|
74
109
|
- Keep GitHub as a remote, not your developer portal.
|
package/dist/cli.js
CHANGED
|
@@ -5,38 +5,84 @@ import { startServer } from "./server.js";
|
|
|
5
5
|
import { handleReviewCommand } from "./review-cli.js";
|
|
6
6
|
function printHelp() {
|
|
7
7
|
// Keep this in sync with README.md
|
|
8
|
-
process.stdout.write(`repoview
|
|
8
|
+
process.stdout.write(`repoview — browse local Git repos as a GitHub-like website, and publish
|
|
9
|
+
ephemeral file previews ("gists"). Built to be driven by humans and agents.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
the same port
|
|
12
|
-
daemon
|
|
11
|
+
SESSION MODEL (like tmux)
|
|
12
|
+
Invocations on the same port share ONE session (daemon). The FIRST run starts
|
|
13
|
+
the daemon and KEEPS RUNNING in the foreground (it is the server). LATER runs
|
|
14
|
+
on that port just register their repo and exit 0 immediately. So you never have
|
|
15
|
+
to remember a port per repo. Each repo is served at /r/<id>/...
|
|
16
|
+
Default port: 7376. Use --port for independent sessions.
|
|
17
|
+
Agent tip: background the first run (e.g. \`repoview … &\` or nohup); once it
|
|
18
|
+
prints "listening:", the daemon is up and all other commands below will work.
|
|
13
19
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
START / JOIN A SESSION
|
|
21
|
+
repoview [--repo PATH] [--host HOST] [--port N] [--no-watch]
|
|
22
|
+
If no daemon is on --port: becomes the daemon (blocks/foreground).
|
|
23
|
+
If a daemon is already there: registers the repo, prints its URL, exits 0.
|
|
17
24
|
|
|
18
|
-
Options:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-h, --help Show this help
|
|
25
|
+
Options:
|
|
26
|
+
--repo <path> Repo root (default: $REPO_ROOT or current dir)
|
|
27
|
+
--host <host> Bind address (default: 0.0.0.0; use 127.0.0.1 for local-only)
|
|
28
|
+
--port <port> Session port (default: 7376)
|
|
29
|
+
--no-watch Disable live reload for this repo
|
|
30
|
+
-h, --help Show this help
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
repoview ls
|
|
28
|
-
repoview rm <id|path>
|
|
29
|
-
repoview stop
|
|
32
|
+
MANAGE THE SESSION (require a running daemon on --port)
|
|
33
|
+
repoview ls List repos: "<id> <branch> <path>" + each URL
|
|
34
|
+
repoview rm <id|path> Unregister a repo
|
|
35
|
+
repoview stop Shut the session daemon down
|
|
30
36
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
repoview
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
repoview
|
|
37
|
+
GISTS (ephemeral file previews; default TTL 24h, gone on restart, editable)
|
|
38
|
+
Need a running daemon on --port (or --url for a remote server's API).
|
|
39
|
+
repoview gist <file> [--title "T"] [--ttl 24h] [--filename name.md] [--url URL]
|
|
40
|
+
Publish; prints ONE line: the URL.
|
|
41
|
+
cat report.md | repoview gist --filename report.md Publish from stdin
|
|
42
|
+
repoview gist edit <id> [file] [--title] [--filename] [--ttl] Update a gist
|
|
43
|
+
repoview gist delete <id> Delete a gist
|
|
44
|
+
repoview gist list List gists
|
|
45
|
+
--ttl accepts 30m/24h/7d/seconds (1m–7d). --title is the page/list label
|
|
46
|
+
only; the rendered H1 comes from the file's own first Markdown heading.
|
|
37
47
|
|
|
38
|
-
|
|
39
|
-
REPO_ROOT
|
|
48
|
+
CODE REVIEW THREADS (pure filesystem, NO daemon — operate on a repo's .repoview/)
|
|
49
|
+
Add --repo <path> to EVERY review command (default: $REPO_ROOT or cwd — NOT the
|
|
50
|
+
session's served repo). --port/--host are ignored here.
|
|
51
|
+
repoview review new --repo R --title "Title" Create (prints id)
|
|
52
|
+
repoview review post --repo R <id> --role agent --body "…" Post a message
|
|
53
|
+
repoview review post --repo R <id> --role agent --file F Post from file/stdin
|
|
54
|
+
repoview review read --repo R <id> Print thread JSON
|
|
55
|
+
repoview review list --repo R List threads (JSON)
|
|
56
|
+
|
|
57
|
+
HTTP API (for agents / remote use — base = http://<host>:<port>)
|
|
58
|
+
GET /api/session {app, version, repos:[{id,name,path,branch}]}
|
|
59
|
+
GET /api/repos {repos:[…]}
|
|
60
|
+
POST /api/repos {path, watch?} → {id, url} (localhost only)
|
|
61
|
+
DELETE /api/repos/:id → {ok} (localhost only)
|
|
62
|
+
POST /api/shutdown → {ok} (localhost only)
|
|
63
|
+
GET /api/gists {gists:[{id,filename,title,url,expiresAt}]}
|
|
64
|
+
POST /api/gists {content, filename?, title?, ttlSeconds?}
|
|
65
|
+
→ {id, url, rawUrl, expiresAt}
|
|
66
|
+
PATCH /api/gists/:id {content?, filename?, title?, ttlSeconds?} → gist
|
|
67
|
+
DELETE /api/gists/:id → {ok}
|
|
68
|
+
Examples:
|
|
69
|
+
curl -s $BASE/api/session
|
|
70
|
+
curl -s -X POST $BASE/api/gists -H 'content-type: application/json' \\
|
|
71
|
+
-d '{"content":"# Hi","filename":"hi.md","ttlSeconds":3600}'
|
|
72
|
+
|
|
73
|
+
PAGES
|
|
74
|
+
/ → default repo /session manage repos (add/remove)
|
|
75
|
+
/r/<id>/tree/ browse a repo /gists list of active gists
|
|
76
|
+
/r/<id>/diff working-tree diff /gist/<id> a gist preview (+ /raw)
|
|
77
|
+
/r/<id>/review/ review threads
|
|
78
|
+
|
|
79
|
+
ENVIRONMENT
|
|
80
|
+
REPO_ROOT Default repo when --repo is omitted
|
|
81
|
+
HOST, PORT Default bind host / session port
|
|
82
|
+
REPOVIEW_BASE_URL Absolute origin used in returned gist URLs. Read by the
|
|
83
|
+
SERVER/daemon at request time — set it when STARTING the
|
|
84
|
+
daemon, not on the gist client. Falls back to the request
|
|
85
|
+
Host header. (e.g. when the server runs remotely)
|
|
40
86
|
`);
|
|
41
87
|
}
|
|
42
88
|
function parseArgs(argv) {
|
|
@@ -165,6 +211,185 @@ async function runSubcommand(sub, args, base, port, host) {
|
|
|
165
211
|
printHelp();
|
|
166
212
|
return 1;
|
|
167
213
|
}
|
|
214
|
+
/** Parse "24h" / "30m" / "7d" / "3600" into seconds. */
|
|
215
|
+
function parseDuration(text) {
|
|
216
|
+
const m = String(text).trim().match(/^(\d+)\s*([smhd]?)$/i);
|
|
217
|
+
if (!m)
|
|
218
|
+
return undefined;
|
|
219
|
+
const n = Number(m[1]);
|
|
220
|
+
const unit = m[2].toLowerCase();
|
|
221
|
+
const mult = unit === "d" ? 86400 : unit === "h" ? 3600 : unit === "m" ? 60 : 1;
|
|
222
|
+
return n * mult;
|
|
223
|
+
}
|
|
224
|
+
function parseGistArgs(args) {
|
|
225
|
+
const flags = {};
|
|
226
|
+
const positional = [];
|
|
227
|
+
for (let i = 0; i < args.length; i++) {
|
|
228
|
+
const v = args[i];
|
|
229
|
+
if (v === "--title")
|
|
230
|
+
flags.title = args[++i];
|
|
231
|
+
else if (v === "--ttl")
|
|
232
|
+
flags.ttl = args[++i];
|
|
233
|
+
else if (v === "--filename")
|
|
234
|
+
flags.filename = args[++i];
|
|
235
|
+
else if (v === "--url")
|
|
236
|
+
flags.url = args[++i];
|
|
237
|
+
else
|
|
238
|
+
positional.push(v);
|
|
239
|
+
}
|
|
240
|
+
return { flags, positional };
|
|
241
|
+
}
|
|
242
|
+
/** Read content from a file path, else stdin if piped, else undefined. */
|
|
243
|
+
async function readGistContent(file) {
|
|
244
|
+
if (file) {
|
|
245
|
+
const fs = await import("node:fs/promises");
|
|
246
|
+
return fs.readFile(file, "utf8");
|
|
247
|
+
}
|
|
248
|
+
if (!process.stdin.isTTY) {
|
|
249
|
+
const chunks = [];
|
|
250
|
+
for await (const chunk of process.stdin)
|
|
251
|
+
chunks.push(chunk);
|
|
252
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
253
|
+
}
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
function ttlSecondsFrom(flags) {
|
|
257
|
+
if (!flags.ttl)
|
|
258
|
+
return undefined;
|
|
259
|
+
const s = parseDuration(flags.ttl);
|
|
260
|
+
if (s == null) {
|
|
261
|
+
process.stderr.write(`Invalid --ttl: ${flags.ttl} (use e.g. 30m, 24h, 7d)\n`);
|
|
262
|
+
return null; // signal error
|
|
263
|
+
}
|
|
264
|
+
return s;
|
|
265
|
+
}
|
|
266
|
+
function gistTarget(flags, localBase) {
|
|
267
|
+
return flags.url ? flags.url.replace(/\/+$/, "") : localBase;
|
|
268
|
+
}
|
|
269
|
+
function noSession(target) {
|
|
270
|
+
process.stderr.write(`No repoview session at ${target}. Start one with \`repoview\` first, or pass --url.\n`);
|
|
271
|
+
return 1;
|
|
272
|
+
}
|
|
273
|
+
async function runGist(restArgs, localBase) {
|
|
274
|
+
const sub = restArgs[0];
|
|
275
|
+
if (sub === "edit")
|
|
276
|
+
return runGistEdit(restArgs.slice(1), localBase);
|
|
277
|
+
if (sub === "delete" || sub === "rm")
|
|
278
|
+
return runGistDelete(restArgs.slice(1), localBase);
|
|
279
|
+
if (sub === "list" || sub === "ls")
|
|
280
|
+
return runGistList(restArgs.slice(1), localBase);
|
|
281
|
+
return runGistCreate(sub === "create" ? restArgs.slice(1) : restArgs, localBase);
|
|
282
|
+
}
|
|
283
|
+
async function runGistCreate(args, localBase) {
|
|
284
|
+
const { flags, positional } = parseGistArgs(args);
|
|
285
|
+
const file = positional[0];
|
|
286
|
+
const content = await readGistContent(file);
|
|
287
|
+
if (!content || !content.trim()) {
|
|
288
|
+
process.stderr.write("Error: no content (pass a file or pipe via stdin)\n");
|
|
289
|
+
return 1;
|
|
290
|
+
}
|
|
291
|
+
const ttlSeconds = ttlSecondsFrom(flags);
|
|
292
|
+
if (ttlSeconds === null)
|
|
293
|
+
return 1;
|
|
294
|
+
const filename = flags.filename || (file ? path.basename(file) : "gist.md");
|
|
295
|
+
const target = gistTarget(flags, localBase);
|
|
296
|
+
let result;
|
|
297
|
+
try {
|
|
298
|
+
result = (await fetchJson(`${target}/api/gists`, {
|
|
299
|
+
method: "POST",
|
|
300
|
+
headers: { "Content-Type": "application/json" },
|
|
301
|
+
body: JSON.stringify({ content, filename, title: flags.title, ttlSeconds }),
|
|
302
|
+
}));
|
|
303
|
+
}
|
|
304
|
+
catch (e) {
|
|
305
|
+
process.stderr.write(`Error: ${e.message}\n`);
|
|
306
|
+
return 1;
|
|
307
|
+
}
|
|
308
|
+
if (!result)
|
|
309
|
+
return noSession(target);
|
|
310
|
+
process.stdout.write(`${result.url}\n`);
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
async function runGistEdit(args, localBase) {
|
|
314
|
+
const { flags, positional } = parseGistArgs(args);
|
|
315
|
+
const id = positional[0];
|
|
316
|
+
if (!id) {
|
|
317
|
+
process.stderr.write("Usage: repoview gist edit <id> [file] [--title] [--filename] [--ttl]\n");
|
|
318
|
+
return 1;
|
|
319
|
+
}
|
|
320
|
+
const content = await readGistContent(positional[1]);
|
|
321
|
+
const ttlSeconds = ttlSecondsFrom(flags);
|
|
322
|
+
if (ttlSeconds === null)
|
|
323
|
+
return 1;
|
|
324
|
+
const body = {};
|
|
325
|
+
if (content !== undefined)
|
|
326
|
+
body.content = content;
|
|
327
|
+
if (flags.filename !== undefined)
|
|
328
|
+
body.filename = flags.filename;
|
|
329
|
+
if (flags.title !== undefined)
|
|
330
|
+
body.title = flags.title;
|
|
331
|
+
if (ttlSeconds !== undefined)
|
|
332
|
+
body.ttlSeconds = ttlSeconds;
|
|
333
|
+
if (Object.keys(body).length === 0) {
|
|
334
|
+
process.stderr.write("Nothing to update (pass new content, --title, --filename, or --ttl)\n");
|
|
335
|
+
return 1;
|
|
336
|
+
}
|
|
337
|
+
const target = gistTarget(flags, localBase);
|
|
338
|
+
let result;
|
|
339
|
+
try {
|
|
340
|
+
result = (await fetchJson(`${target}/api/gists/${encodeURIComponent(id)}`, {
|
|
341
|
+
method: "PATCH",
|
|
342
|
+
headers: { "Content-Type": "application/json" },
|
|
343
|
+
body: JSON.stringify(body),
|
|
344
|
+
}));
|
|
345
|
+
}
|
|
346
|
+
catch (e) {
|
|
347
|
+
process.stderr.write(`Error: ${e.message}\n`);
|
|
348
|
+
return 1;
|
|
349
|
+
}
|
|
350
|
+
if (!result)
|
|
351
|
+
return noSession(target);
|
|
352
|
+
process.stdout.write(`${result.url}\n`);
|
|
353
|
+
return 0;
|
|
354
|
+
}
|
|
355
|
+
async function runGistDelete(args, localBase) {
|
|
356
|
+
const { flags, positional } = parseGistArgs(args);
|
|
357
|
+
const id = positional[0];
|
|
358
|
+
if (!id) {
|
|
359
|
+
process.stderr.write("Usage: repoview gist delete <id>\n");
|
|
360
|
+
return 1;
|
|
361
|
+
}
|
|
362
|
+
const target = gistTarget(flags, localBase);
|
|
363
|
+
try {
|
|
364
|
+
const result = await fetchJson(`${target}/api/gists/${encodeURIComponent(id)}`, {
|
|
365
|
+
method: "DELETE",
|
|
366
|
+
});
|
|
367
|
+
if (!result)
|
|
368
|
+
return noSession(target);
|
|
369
|
+
}
|
|
370
|
+
catch (e) {
|
|
371
|
+
process.stderr.write(`Error: ${e.message}\n`);
|
|
372
|
+
return 1;
|
|
373
|
+
}
|
|
374
|
+
process.stdout.write(`Deleted ${id}\n`);
|
|
375
|
+
return 0;
|
|
376
|
+
}
|
|
377
|
+
async function runGistList(args, localBase) {
|
|
378
|
+
const { flags } = parseGistArgs(args);
|
|
379
|
+
const target = gistTarget(flags, localBase);
|
|
380
|
+
const result = (await fetchJson(`${target}/api/gists`));
|
|
381
|
+
if (!result)
|
|
382
|
+
return noSession(target);
|
|
383
|
+
const gists = result.gists || [];
|
|
384
|
+
if (!gists.length) {
|
|
385
|
+
process.stdout.write("(no active gists)\n");
|
|
386
|
+
return 0;
|
|
387
|
+
}
|
|
388
|
+
for (const g of gists) {
|
|
389
|
+
process.stdout.write(`${g.id.padEnd(14)} ${(g.title || g.filename).padEnd(28)} ${g.url || ""}\n`);
|
|
390
|
+
}
|
|
391
|
+
return 0;
|
|
392
|
+
}
|
|
168
393
|
const parsed = parseArgs(process.argv.slice(2));
|
|
169
394
|
const { repo, port: portArg, host: hostArg, watch, help } = parsed;
|
|
170
395
|
if (help) {
|
|
@@ -189,6 +414,11 @@ if (["ls", "rm", "stop"].includes(parsed.rest[0])) {
|
|
|
189
414
|
const code = await runSubcommand(parsed.rest[0], parsed, base, port, host);
|
|
190
415
|
process.exit(code);
|
|
191
416
|
}
|
|
417
|
+
// Publish an ephemeral gist to the session daemon.
|
|
418
|
+
if (parsed.rest[0] === "gist") {
|
|
419
|
+
const code = await runGist(parsed.rest.slice(1), base);
|
|
420
|
+
process.exit(code);
|
|
421
|
+
}
|
|
192
422
|
const repoRoot = repo ?? process.env.REPO_ROOT ?? process.cwd();
|
|
193
423
|
const repoRootAbs = path.resolve(repoRoot);
|
|
194
424
|
async function joinExisting() {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { renderGistPage, renderGistEditPage, renderGistListPage, renderErrorPage, } from "./views.js";
|
|
4
|
+
const ID_RE = /^[A-Za-z0-9_-]+$/;
|
|
5
|
+
const MD_EXT = new Set([".md", ".markdown", ".mdown", ".mkd", ".mkdn"]);
|
|
6
|
+
/** Resolve the absolute base URL for returned gist links. */
|
|
7
|
+
function resolveBaseUrl(req, baseUrlEnv) {
|
|
8
|
+
if (baseUrlEnv)
|
|
9
|
+
return baseUrlEnv.replace(/\/+$/, "");
|
|
10
|
+
const host = req.get("host");
|
|
11
|
+
if (host)
|
|
12
|
+
return `${req.protocol}://${host}`;
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Routes for ephemeral gists: `POST /api/gists` (publish, open so remote agents
|
|
17
|
+
* can use it), `GET /gist/:id` (preview), `GET /gist/:id/raw`, and `GET /gists`
|
|
18
|
+
* (the list page).
|
|
19
|
+
*/
|
|
20
|
+
export function createGistRouter({ store, md, baseUrlEnv }) {
|
|
21
|
+
const router = express.Router();
|
|
22
|
+
router.post("/api/gists", express.json({ limit: "2mb" }), (req, res) => {
|
|
23
|
+
try {
|
|
24
|
+
const { content, filename, title, ttlSeconds } = req.body ?? {};
|
|
25
|
+
const ttlMs = typeof ttlSeconds === "number" && Number.isFinite(ttlSeconds) && ttlSeconds > 0
|
|
26
|
+
? ttlSeconds * 1000
|
|
27
|
+
: undefined;
|
|
28
|
+
const gist = store.create({ content, filename, title, ttlMs });
|
|
29
|
+
const base = resolveBaseUrl(req, baseUrlEnv);
|
|
30
|
+
res.status(201).json({
|
|
31
|
+
id: gist.id,
|
|
32
|
+
filename: gist.filename,
|
|
33
|
+
title: gist.title,
|
|
34
|
+
url: `${base}/gist/${gist.id}`,
|
|
35
|
+
rawUrl: `${base}/gist/${gist.id}/raw`,
|
|
36
|
+
createdAt: new Date(gist.createdAt).toISOString(),
|
|
37
|
+
expiresAt: new Date(gist.expiresAt).toISOString(),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
const err = e;
|
|
42
|
+
res.status(err.statusCode || 500).json({ error: err.message });
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
router.patch("/api/gists/:id", express.json({ limit: "2mb" }), (req, res) => {
|
|
46
|
+
if (!ID_RE.test(req.params.id)) {
|
|
47
|
+
return res.status(400).json({ error: "Invalid gist id" });
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const { content, filename, title, ttlSeconds } = req.body ?? {};
|
|
51
|
+
const ttlMs = typeof ttlSeconds === "number" && Number.isFinite(ttlSeconds) && ttlSeconds > 0
|
|
52
|
+
? ttlSeconds * 1000
|
|
53
|
+
: undefined;
|
|
54
|
+
const gist = store.update(req.params.id, { content, filename, title, ttlMs });
|
|
55
|
+
if (!gist)
|
|
56
|
+
return res.status(404).json({ error: "Gist not found or expired" });
|
|
57
|
+
const base = resolveBaseUrl(req, baseUrlEnv);
|
|
58
|
+
res.json({
|
|
59
|
+
id: gist.id,
|
|
60
|
+
filename: gist.filename,
|
|
61
|
+
title: gist.title,
|
|
62
|
+
url: `${base}/gist/${gist.id}`,
|
|
63
|
+
rawUrl: `${base}/gist/${gist.id}/raw`,
|
|
64
|
+
expiresAt: new Date(gist.expiresAt).toISOString(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
const err = e;
|
|
69
|
+
res.status(err.statusCode || 500).json({ error: err.message });
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
router.get("/api/gists", (req, res) => {
|
|
73
|
+
const base = resolveBaseUrl(req, baseUrlEnv);
|
|
74
|
+
res.json({
|
|
75
|
+
gists: store.list().map((g) => ({
|
|
76
|
+
id: g.id,
|
|
77
|
+
filename: g.filename,
|
|
78
|
+
title: g.title,
|
|
79
|
+
url: `${base}/gist/${g.id}`,
|
|
80
|
+
rawUrl: `${base}/gist/${g.id}/raw`,
|
|
81
|
+
createdAt: new Date(g.createdAt).toISOString(),
|
|
82
|
+
expiresAt: new Date(g.expiresAt).toISOString(),
|
|
83
|
+
})),
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
router.delete("/api/gists/:id", (req, res) => {
|
|
87
|
+
if (!ID_RE.test(req.params.id)) {
|
|
88
|
+
return res.status(400).json({ error: "Invalid gist id" });
|
|
89
|
+
}
|
|
90
|
+
if (!store.delete(req.params.id)) {
|
|
91
|
+
return res.status(404).json({ error: "Gist not found" });
|
|
92
|
+
}
|
|
93
|
+
res.json({ ok: true, id: req.params.id });
|
|
94
|
+
});
|
|
95
|
+
router.get("/gists", (req, res) => {
|
|
96
|
+
res.send(renderGistListPage({ gists: store.list() }));
|
|
97
|
+
});
|
|
98
|
+
router.get("/gist/:id/edit", (req, res) => {
|
|
99
|
+
if (!ID_RE.test(req.params.id)) {
|
|
100
|
+
return res.status(400).send(renderErrorPage({
|
|
101
|
+
title: "Error",
|
|
102
|
+
message: "Invalid gist id",
|
|
103
|
+
repoBase: "",
|
|
104
|
+
repos: [],
|
|
105
|
+
currentRepoId: "",
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
const gist = store.get(req.params.id);
|
|
109
|
+
if (!gist) {
|
|
110
|
+
return res.status(404).send(renderGistListPage({
|
|
111
|
+
gists: store.list(),
|
|
112
|
+
notice: "That gist has expired or does not exist.",
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
res.send(renderGistEditPage({ gist }));
|
|
116
|
+
});
|
|
117
|
+
router.get("/gist/:id/raw", (req, res) => {
|
|
118
|
+
if (!ID_RE.test(req.params.id)) {
|
|
119
|
+
return res.status(400).type("text/plain").send("Invalid gist id");
|
|
120
|
+
}
|
|
121
|
+
const gist = store.get(req.params.id);
|
|
122
|
+
if (!gist) {
|
|
123
|
+
return res.status(404).type("text/plain").send("Gist not found or expired");
|
|
124
|
+
}
|
|
125
|
+
res.type("text/plain; charset=utf-8").send(gist.content);
|
|
126
|
+
});
|
|
127
|
+
router.get("/gist/:id", (req, res) => {
|
|
128
|
+
if (!ID_RE.test(req.params.id)) {
|
|
129
|
+
return res.status(400).send(renderErrorPage({
|
|
130
|
+
title: "Error",
|
|
131
|
+
message: "Invalid gist id",
|
|
132
|
+
repoBase: "",
|
|
133
|
+
repos: [],
|
|
134
|
+
currentRepoId: "",
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
const gist = store.get(req.params.id);
|
|
138
|
+
if (!gist) {
|
|
139
|
+
return res.status(404).send(renderGistListPage({
|
|
140
|
+
gists: store.list(),
|
|
141
|
+
notice: "That gist has expired or does not exist.",
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
const ext = path.posix.extname(gist.filename).toLowerCase();
|
|
145
|
+
const isMarkdown = MD_EXT.has(ext);
|
|
146
|
+
const html = isMarkdown
|
|
147
|
+
? md.render(gist.content, { baseDirPosix: "", repoBase: "" })
|
|
148
|
+
: md.renderCodeBlock(gist.content, { languageHint: ext ? ext.slice(1) : "" });
|
|
149
|
+
res.send(renderGistPage({ gist, html, isMarkdown }));
|
|
150
|
+
});
|
|
151
|
+
return router;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=gist-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gist-router.js","sourceRoot":"","sources":["../src/gist-router.ts"],"names":[],"mappings":"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"}
|