ctxr-cli 0.23.0 → 0.25.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/README.md +65 -5
- package/dist/commands/graph-diff.d.ts +33 -0
- package/dist/commands/graph-diff.d.ts.map +1 -0
- package/dist/commands/graph-diff.js +52 -0
- package/dist/commands/graph-diff.js.map +1 -0
- package/dist/commands/land.d.ts +50 -0
- package/dist/commands/land.d.ts.map +1 -0
- package/dist/commands/land.js +414 -0
- package/dist/commands/land.js.map +1 -0
- package/dist/commands/publish-check.d.ts +6 -0
- package/dist/commands/publish-check.d.ts.map +1 -1
- package/dist/commands/publish-check.js +78 -3
- package/dist/commands/publish-check.js.map +1 -1
- package/dist/commands/publish-gather.d.ts.map +1 -1
- package/dist/commands/publish-gather.js +4 -1
- package/dist/commands/publish-gather.js.map +1 -1
- package/dist/commands/publish-new.d.ts +5 -0
- package/dist/commands/publish-new.d.ts.map +1 -1
- package/dist/commands/publish-new.js +30 -10
- package/dist/commands/publish-new.js.map +1 -1
- package/dist/commands/publish-stamp.d.ts +32 -0
- package/dist/commands/publish-stamp.d.ts.map +1 -0
- package/dist/commands/publish-stamp.js +78 -0
- package/dist/commands/publish-stamp.js.map +1 -0
- package/dist/commands/publish-urls.d.ts +13 -0
- package/dist/commands/publish-urls.d.ts.map +1 -1
- package/dist/commands/publish-urls.js +23 -6
- package/dist/commands/publish-urls.js.map +1 -1
- package/dist/commands/review-list.d.ts +34 -0
- package/dist/commands/review-list.d.ts.map +1 -0
- package/dist/commands/review-list.js +49 -0
- package/dist/commands/review-list.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -6
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +106 -9
- package/dist/commands/serve.js.map +1 -1
- package/dist/config/schema.d.ts +40 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +39 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/approval/decision.d.ts +73 -0
- package/dist/core/approval/decision.d.ts.map +1 -0
- package/dist/core/approval/decision.js +166 -0
- package/dist/core/approval/decision.js.map +1 -0
- package/dist/core/approval/file-diff.d.ts +32 -0
- package/dist/core/approval/file-diff.d.ts.map +1 -0
- package/dist/core/approval/file-diff.js +83 -0
- package/dist/core/approval/file-diff.js.map +1 -0
- package/dist/core/approval/identity.d.ts +34 -0
- package/dist/core/approval/identity.d.ts.map +1 -0
- package/dist/core/approval/identity.js +105 -0
- package/dist/core/approval/identity.js.map +1 -0
- package/dist/core/approval/landing-record.d.ts +17 -0
- package/dist/core/approval/landing-record.d.ts.map +1 -0
- package/dist/core/approval/landing-record.js +30 -0
- package/dist/core/approval/landing-record.js.map +1 -0
- package/dist/core/approval/resolver.d.ts +15 -0
- package/dist/core/approval/resolver.d.ts.map +1 -0
- package/dist/core/approval/resolver.js +41 -0
- package/dist/core/approval/resolver.js.map +1 -0
- package/dist/core/approval/sessions.d.ts +36 -0
- package/dist/core/approval/sessions.d.ts.map +1 -0
- package/dist/core/approval/sessions.js +76 -0
- package/dist/core/approval/sessions.js.map +1 -0
- package/dist/core/browse/approve.d.ts +45 -0
- package/dist/core/browse/approve.d.ts.map +1 -0
- package/dist/core/browse/approve.js +239 -0
- package/dist/core/browse/approve.js.map +1 -0
- package/dist/core/browse/diagram-assets.d.ts +15 -0
- package/dist/core/browse/diagram-assets.d.ts.map +1 -0
- package/dist/core/browse/diagram-assets.js +35 -0
- package/dist/core/browse/diagram-assets.js.map +1 -0
- package/dist/core/browse/page-url.d.ts +22 -0
- package/dist/core/browse/page-url.d.ts.map +1 -1
- package/dist/core/browse/page-url.js +31 -0
- package/dist/core/browse/page-url.js.map +1 -1
- package/dist/core/browse/render.d.ts +10 -1
- package/dist/core/browse/render.d.ts.map +1 -1
- package/dist/core/browse/render.js +23 -1
- package/dist/core/browse/render.js.map +1 -1
- package/dist/core/browse/review.d.ts +21 -0
- package/dist/core/browse/review.d.ts.map +1 -0
- package/dist/core/browse/review.js +52 -0
- package/dist/core/browse/review.js.map +1 -0
- package/dist/core/browse/templates.d.ts +4 -1
- package/dist/core/browse/templates.d.ts.map +1 -1
- package/dist/core/browse/templates.js +18 -2
- package/dist/core/browse/templates.js.map +1 -1
- package/dist/core/checks/organize-checks.d.ts +17 -0
- package/dist/core/checks/organize-checks.d.ts.map +1 -1
- package/dist/core/checks/organize-checks.js +116 -0
- package/dist/core/checks/organize-checks.js.map +1 -1
- package/dist/core/errors.d.ts +67 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +160 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/forge/credentials.d.ts +69 -0
- package/dist/core/forge/credentials.d.ts.map +1 -0
- package/dist/core/forge/credentials.js +197 -0
- package/dist/core/forge/credentials.js.map +1 -0
- package/dist/core/forge/github.d.ts +73 -0
- package/dist/core/forge/github.d.ts.map +1 -0
- package/dist/core/forge/github.js +101 -0
- package/dist/core/forge/github.js.map +1 -0
- package/dist/core/git/exec.d.ts +25 -0
- package/dist/core/git/exec.d.ts.map +1 -1
- package/dist/core/git/exec.js +100 -2
- package/dist/core/git/exec.js.map +1 -1
- package/dist/core/graph/diff-block.d.ts +6 -0
- package/dist/core/graph/diff-block.d.ts.map +1 -0
- package/dist/core/graph/diff-block.js +63 -0
- package/dist/core/graph/diff-block.js.map +1 -0
- package/dist/core/graph/diff-document.d.ts +38 -0
- package/dist/core/graph/diff-document.d.ts.map +1 -0
- package/dist/core/graph/diff-document.js +117 -0
- package/dist/core/graph/diff-document.js.map +1 -0
- package/dist/core/graph/diff.d.ts +123 -0
- package/dist/core/graph/diff.d.ts.map +1 -0
- package/dist/core/graph/diff.js +253 -0
- package/dist/core/graph/diff.js.map +1 -0
- package/dist/core/graph/tree.d.ts +24 -0
- package/dist/core/graph/tree.d.ts.map +1 -0
- package/dist/core/graph/tree.js +45 -0
- package/dist/core/graph/tree.js.map +1 -0
- package/dist/core/notes/list.d.ts +10 -0
- package/dist/core/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +35 -12
- package/dist/core/notes/list.js.map +1 -1
- package/dist/core/publish/filing.d.ts +12 -12
- package/dist/core/publish/filing.d.ts.map +1 -1
- package/dist/core/publish/filing.js +20 -18
- package/dist/core/publish/filing.js.map +1 -1
- package/dist/core/publish/lifespan.d.ts +37 -0
- package/dist/core/publish/lifespan.d.ts.map +1 -0
- package/dist/core/publish/lifespan.js +59 -0
- package/dist/core/publish/lifespan.js.map +1 -0
- package/dist/core/publish/represents.d.ts +72 -0
- package/dist/core/publish/represents.d.ts.map +1 -0
- package/dist/core/publish/represents.js +83 -0
- package/dist/core/publish/represents.js.map +1 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +60 -4
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -1
- package/templates/approve/approve-button.md +1 -0
- package/templates/approve/author-heading.md +1 -0
- package/templates/approve/author-note.md +1 -0
- package/templates/approve/comment-label.md +1 -0
- package/templates/approve/comment-required.md +1 -0
- package/templates/approve/commits-heading.md +1 -0
- package/templates/approve/decision-heading.md +1 -0
- package/templates/approve/decision-note.md +1 -0
- package/templates/approve/diff-binary.md +1 -0
- package/templates/approve/diff-empty.md +1 -0
- package/templates/approve/diff-heading.md +1 -0
- package/templates/approve/facts-heading.md +1 -0
- package/templates/approve/forge-unreachable.md +1 -0
- package/templates/approve/github-app-manifest.json +15 -0
- package/templates/approve/head-missing.md +1 -0
- package/templates/approve/index-empty.md +1 -0
- package/templates/approve/index-heading.md +1 -0
- package/templates/approve/index-intro.md +1 -0
- package/templates/approve/landed.md +1 -0
- package/templates/approve/moved-head.md +1 -0
- package/templates/approve/no-pull.md +1 -0
- package/templates/approve/not-open.md +1 -0
- package/templates/approve/pages-heading.md +1 -0
- package/templates/approve/pages-note.md +1 -0
- package/templates/approve/record-failed.md +1 -0
- package/templates/approve/request-changes-button.md +1 -0
- package/templates/approve/state-line.md +1 -0
- package/templates/conventions/baseline-conventions.md +6 -0
- package/templates/graph/knowledge-changes/archived-item.md +1 -0
- package/templates/graph/knowledge-changes/archived.md +1 -0
- package/templates/graph/knowledge-changes/bare-route.md +2 -0
- package/templates/graph/knowledge-changes/block.md +10 -0
- package/templates/graph/knowledge-changes/counts.md +1 -0
- package/templates/graph/knowledge-changes/dangling-item.md +1 -0
- package/templates/graph/knowledge-changes/dangling.md +1 -0
- package/templates/graph/knowledge-changes/empty.md +1 -0
- package/templates/graph/knowledge-changes/reason-ambiguous.md +1 -0
- package/templates/graph/knowledge-changes/reason-not_found.md +1 -0
- package/templates/graph/knowledge-changes/review.md +4 -0
- package/templates/graph/review/moved-head.md +1 -0
- package/templates/land/resolver.md +12 -0
- package/templates/serve/diagrams.mjs +136 -0
- package/templates/serve/shell.html +1 -1
- package/templates/serve/style.css +90 -0
- package/templates/skills/ctxr-land.md +37 -31
- package/templates/skills/ctxr-organize-audit.md +19 -0
- package/templates/skills/ctxr-publish.md +100 -45
- package/templates/skills/ctxr-second-opinion/run.mjs +28 -17
- package/templates/skills/ctxr-second-opinion.md +19 -14
- package/templates/skills/ctxr-session-lifecycle.md +9 -0
- package/templates/skills/ctxr-submit.md +28 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-gather.d.ts","sourceRoot":"","sources":["../../src/commands/publish-gather.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAgB,KAAK,MAAM,EAAsB,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,qGAAqG;IACrG,MAAM,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"publish-gather.d.ts","sourceRoot":"","sources":["../../src/commands/publish-gather.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAgB,KAAK,MAAM,EAAsB,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,qGAAqG;IACrG,MAAM,EAAE,MAAM,CAAC;CAChB;AA4FD;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAc9H"}
|
|
@@ -75,7 +75,10 @@ async function resolveNoteSet(env, store, flags) {
|
|
|
75
75
|
*/
|
|
76
76
|
function filingSummary(filing) {
|
|
77
77
|
if (filing.prefix === null) {
|
|
78
|
-
|
|
78
|
+
// two-kinds-of-published-page D2: the reservation is the second reason no path derives.
|
|
79
|
+
return filing.no_path_reason === 'reserved-segment'
|
|
80
|
+
? 'Page filing: none derives — the path would begin with "disposable/", a segment reserved for disposable pages.'
|
|
81
|
+
: 'Page filing: none derives — no folder path names this subject.';
|
|
79
82
|
}
|
|
80
83
|
const collected = filing.subject_segment === null ? '' : ', collected under the segment naming the subject';
|
|
81
84
|
const moves = filing.moves.length === 0 ? '' : `; ${filing.moves.length} existing page(s) belong there too`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-gather.js","sourceRoot":"","sources":["../../src/commands/publish-gather.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"publish-gather.js","sourceRoot":"","sources":["../../src/commands/publish-gather.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { type ServedAt } from '../core/browse/page-url.js';
|
|
2
2
|
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
3
|
+
import { type PageLifespan } from '../core/publish/lifespan.js';
|
|
3
4
|
import type { Store } from '../core/store.js';
|
|
4
5
|
export declare const requires: CommandRequires;
|
|
5
6
|
export interface PublishNewFlags {
|
|
6
7
|
slug: string;
|
|
8
|
+
/** two-kinds-of-published-page: scaffold under `disposable/<today>-<slug>` instead. */
|
|
9
|
+
disposable?: boolean;
|
|
7
10
|
}
|
|
8
11
|
export interface PublishNewData {
|
|
9
12
|
slug: string;
|
|
@@ -15,6 +18,8 @@ export interface PublishNewData {
|
|
|
15
18
|
* publish commands.
|
|
16
19
|
*/
|
|
17
20
|
served_at: ServedAt | null;
|
|
21
|
+
/** two-kinds-of-published-page: read from where the page was filed, never declared. */
|
|
22
|
+
lifespan: PageLifespan;
|
|
18
23
|
}
|
|
19
24
|
/**
|
|
20
25
|
* publish spec: fixes a page's identity once. Refuses a slug whose page name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-new.d.ts","sourceRoot":"","sources":["../../src/commands/publish-new.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,QAAQ,EAAoB,MAAM,4BAA4B,CAAC;AAE3F,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-new.d.ts","sourceRoot":"","sources":["../../src/commands/publish-new.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,QAAQ,EAAoB,MAAM,4BAA4B,CAAC;AAE3F,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAU1E,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,uFAAuF;IACvF,QAAQ,EAAE,YAAY,CAAC;CACxB;AAsFD;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CA6C3G"}
|
|
@@ -3,9 +3,10 @@ import { mkdir } from 'node:fs/promises';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { pageServedAt, servedAtSentence } from '../core/browse/page-url.js';
|
|
5
5
|
import { PUBLISH_INDEX_FILE } from '../core/browse/routes.js';
|
|
6
|
-
import { PublishInvalidSlugError, PublishReservedSlugError, PublishSlugExistsError } from '../core/errors.js';
|
|
6
|
+
import { PublishDisposableNameError, PublishDisposableSegmentReservedError, PublishInvalidSlugError, PublishReservedSlugError, PublishSlugExistsError, } from '../core/errors.js';
|
|
7
7
|
import { ExitCode } from '../core/exit-codes.js';
|
|
8
8
|
import { writeFileAtomic } from '../core/fs/atomic.js';
|
|
9
|
+
import { DISPOSABLE_SEGMENT } from '../core/publish/lifespan.js';
|
|
9
10
|
export const requires = { store: 'required' };
|
|
10
11
|
/** publish spec: reserved for frozen snapshots — a living page's own name must never collide with this shape. */
|
|
11
12
|
const RESERVED_SLUG_PATTERN = /^\d{4}-/;
|
|
@@ -97,28 +98,47 @@ function readmeSkeleton(slug, dateCreated) {
|
|
|
97
98
|
* directly, never by re-running this command.
|
|
98
99
|
*/
|
|
99
100
|
export async function execute(store, flags) {
|
|
101
|
+
const dateCreated = new Date().toISOString().slice(0, 10);
|
|
100
102
|
const segments = pageSegments(flags.slug);
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
let pagePath;
|
|
104
|
+
if (flags.disposable === true) {
|
|
105
|
+
// two-kinds-of-published-page D2: one segment, dated by the command. The
|
|
106
|
+
// dated naming the reservation sets aside for a frozen snapshot is exactly
|
|
107
|
+
// what this stamps, so a caller-supplied date is refused rather than doubled.
|
|
108
|
+
if (segments.length !== 1)
|
|
109
|
+
throw new PublishDisposableNameError(flags.slug, 'multi-segment');
|
|
110
|
+
if (RESERVED_SLUG_PATTERN.test(flags.slug))
|
|
111
|
+
throw new PublishDisposableNameError(flags.slug, 'dated');
|
|
112
|
+
pagePath = `${DISPOSABLE_SEGMENT}/${dateCreated}-${flags.slug}`;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// D2: the disposable segment has exactly one way in.
|
|
116
|
+
if (segments[0] === DISPOSABLE_SEGMENT)
|
|
117
|
+
throw new PublishDisposableSegmentReservedError(flags.slug);
|
|
118
|
+
// The final segment is the page's own identity; the ones before it are the
|
|
119
|
+
// directories it is filed under, which the reserved naming does not govern.
|
|
120
|
+
const finalSegment = segments[segments.length - 1];
|
|
121
|
+
if (RESERVED_SLUG_PATTERN.test(finalSegment)) {
|
|
122
|
+
throw new PublishReservedSlugError(flags.slug, finalSegment);
|
|
123
|
+
}
|
|
124
|
+
pagePath = flags.slug;
|
|
106
125
|
}
|
|
107
|
-
const
|
|
126
|
+
const pageName = pagePath.split('/').pop();
|
|
127
|
+
const relativePath = path.join(store.config.publish.path, pagePath).split(path.sep).join('/');
|
|
108
128
|
const absolutePath = path.join(store.root, relativePath);
|
|
109
129
|
if (existsSync(absolutePath)) {
|
|
110
130
|
throw new PublishSlugExistsError(flags.slug, relativePath);
|
|
111
131
|
}
|
|
112
|
-
const dateCreated = new Date().toISOString().slice(0, 10);
|
|
113
132
|
await mkdir(absolutePath, { recursive: true });
|
|
114
133
|
await writeFileAtomic(path.join(absolutePath, PUBLISH_INDEX_FILE), pageSkeleton(pageName, dateCreated));
|
|
115
134
|
await writeFileAtomic(path.join(absolutePath, 'README.md'), readmeSkeleton(pageName, dateCreated));
|
|
116
135
|
const servedAt = pageServedAt(store, `${relativePath}/${PUBLISH_INDEX_FILE}`);
|
|
136
|
+
const lifespan = flags.disposable === true ? 'disposable' : 'permanent';
|
|
117
137
|
return {
|
|
118
138
|
exitCode: ExitCode.Ok,
|
|
119
|
-
data: { slug: flags.slug, path: relativePath, served_at: servedAt },
|
|
139
|
+
data: { slug: flags.slug, path: relativePath, served_at: servedAt, lifespan },
|
|
120
140
|
findings: [],
|
|
121
|
-
humanSummary: `Created "${relativePath}".${servedAtSentence(servedAt)}`,
|
|
141
|
+
humanSummary: `Created "${relativePath}" (${lifespan}).${servedAtSentence(servedAt)}`,
|
|
122
142
|
storeRoot: store.root,
|
|
123
143
|
schemaVersion: store.config.schema_version,
|
|
124
144
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-new.js","sourceRoot":"","sources":["../../src/commands/publish-new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAiB,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,
|
|
1
|
+
{"version":3,"file":"publish-new.js","sourceRoot":"","sources":["../../src/commands/publish-new.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { Store } from '../core/store.js';
|
|
3
|
+
export declare const requires: CommandRequires;
|
|
4
|
+
export interface PublishStampFlags {
|
|
5
|
+
/** The page folder, or any file in it (its index page or README). */
|
|
6
|
+
path: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PublishStampData {
|
|
9
|
+
/** The page folder, store-relative. */
|
|
10
|
+
path: string;
|
|
11
|
+
/** The note the page represents, store-relative. */
|
|
12
|
+
note: string;
|
|
13
|
+
/** The represented note's current content hash. */
|
|
14
|
+
hash: string;
|
|
15
|
+
/**
|
|
16
|
+
* `stamped`: this run wrote the marker. `current` / `stale`: a marker was
|
|
17
|
+
* already there, matching or not, and nothing was written.
|
|
18
|
+
*/
|
|
19
|
+
status: 'stamped' | 'current' | 'stale';
|
|
20
|
+
/** The hash the existing marker records; null when this run wrote it. */
|
|
21
|
+
recorded: string | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* two-kinds-of-published-page D5: records the represented note's content hash
|
|
25
|
+
* as a `<!-- hash:… -->` marker on the README line holding the lead link —
|
|
26
|
+
* once. A marker already there is never overwritten, so confirming a page
|
|
27
|
+
* against a changed note takes reviewing it, removing the marker by hand, and
|
|
28
|
+
* stamping again: the catalog gloss's discipline. A disposable page is frozen
|
|
29
|
+
* and never stamped.
|
|
30
|
+
*/
|
|
31
|
+
export declare function execute(store: Store, flags: PublishStampFlags): Promise<CommandOutcome<PublishStampData>>;
|
|
32
|
+
//# sourceMappingURL=publish-stamp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-stamp.d.ts","sourceRoot":"","sources":["../../src/commands/publish-stamp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAO1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CA0D/G"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { existsSync, statSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { PublishPageNotFoundError, PublishStampRefusedError } from '../core/errors.js';
|
|
4
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
5
|
+
import { writeFileAtomic } from '../core/fs/atomic.js';
|
|
6
|
+
import { listNotes } from '../core/notes/list.js';
|
|
7
|
+
import { lifespanOf } from '../core/publish/lifespan.js';
|
|
8
|
+
import { appendHashMarker, assessRepresentation, readReadme } from '../core/publish/represents.js';
|
|
9
|
+
export const requires = { store: 'required' };
|
|
10
|
+
/**
|
|
11
|
+
* two-kinds-of-published-page D5: records the represented note's content hash
|
|
12
|
+
* as a `<!-- hash:… -->` marker on the README line holding the lead link —
|
|
13
|
+
* once. A marker already there is never overwritten, so confirming a page
|
|
14
|
+
* against a changed note takes reviewing it, removing the marker by hand, and
|
|
15
|
+
* stamping again: the catalog gloss's discipline. A disposable page is frozen
|
|
16
|
+
* and never stamped.
|
|
17
|
+
*/
|
|
18
|
+
export async function execute(store, flags) {
|
|
19
|
+
const absolute = path.isAbsolute(flags.path) ? flags.path : path.resolve(store.root, flags.path);
|
|
20
|
+
if (!existsSync(absolute))
|
|
21
|
+
throw new PublishPageNotFoundError(path.relative(store.root, absolute).split(path.sep).join('/'));
|
|
22
|
+
const pageDirectory = statSync(absolute).isDirectory() ? absolute : path.dirname(absolute);
|
|
23
|
+
const relativePage = path.relative(store.root, pageDirectory).split(path.sep).join('/');
|
|
24
|
+
const lifespan = lifespanOf(`${relativePage}/README.md`, store.config.publish.path);
|
|
25
|
+
if (lifespan === null)
|
|
26
|
+
throw new PublishStampRefusedError(relativePage, 'not-a-page');
|
|
27
|
+
if (lifespan === 'disposable')
|
|
28
|
+
throw new PublishStampRefusedError(relativePage, 'disposable');
|
|
29
|
+
const readmeAbsolute = path.join(pageDirectory, 'README.md');
|
|
30
|
+
const readmeRelative = `${relativePage}/README.md`;
|
|
31
|
+
const raw = await readReadme(readmeAbsolute);
|
|
32
|
+
if (raw === null)
|
|
33
|
+
throw new PublishStampRefusedError(relativePage, 'no-readme');
|
|
34
|
+
const notes = await listNotes(store.root, store.config);
|
|
35
|
+
const representation = assessRepresentation(raw, readmeRelative, notes);
|
|
36
|
+
switch (representation.status) {
|
|
37
|
+
case 'no-link':
|
|
38
|
+
throw new PublishStampRefusedError(relativePage, 'no-link');
|
|
39
|
+
case 'not-found':
|
|
40
|
+
throw new PublishStampRefusedError(relativePage, 'not-found', representation.target);
|
|
41
|
+
case 'ambiguous':
|
|
42
|
+
throw new PublishStampRefusedError(relativePage, 'ambiguous', representation.candidates.join(', '));
|
|
43
|
+
}
|
|
44
|
+
const { note, hash } = representation;
|
|
45
|
+
// `appendHashMarker` is the one guard against overwriting: it hands back an
|
|
46
|
+
// already-marked line unchanged, and an unchanged line is never written.
|
|
47
|
+
const lines = raw.split('\n');
|
|
48
|
+
const leadLine = lines[representation.lead.line];
|
|
49
|
+
const marked = appendHashMarker(leadLine, hash);
|
|
50
|
+
let data;
|
|
51
|
+
let summary;
|
|
52
|
+
if (marked !== leadLine) {
|
|
53
|
+
lines[representation.lead.line] = marked;
|
|
54
|
+
await writeFileAtomic(readmeAbsolute, lines.join('\n'));
|
|
55
|
+
data = { path: relativePage, note, hash, status: 'stamped', recorded: null };
|
|
56
|
+
summary = `Stamped "${readmeRelative}" with the hash of "${note}".`;
|
|
57
|
+
}
|
|
58
|
+
else if (representation.status === 'current') {
|
|
59
|
+
data = { path: relativePage, note, hash, status: 'current', recorded: representation.hash };
|
|
60
|
+
summary = `"${readmeRelative}" is already stamped and current against "${note}". Nothing written.`;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const recorded = representation.status === 'stale' ? representation.recorded : null;
|
|
64
|
+
data = { path: relativePage, note, hash, status: 'stale', recorded };
|
|
65
|
+
summary =
|
|
66
|
+
`"${readmeRelative}" is stale: "${note}" has changed since it was stamped. Nothing written — ` +
|
|
67
|
+
'review the page against the note, remove the marker, and stamp again.';
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
exitCode: ExitCode.Ok,
|
|
71
|
+
data,
|
|
72
|
+
findings: [],
|
|
73
|
+
humanSummary: summary,
|
|
74
|
+
storeRoot: store.root,
|
|
75
|
+
schemaVersion: store.config.schema_version,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=publish-stamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-stamp.js","sourceRoot":"","sources":["../../src/commands/publish-stamp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import { type PageLifespan } from '../core/publish/lifespan.js';
|
|
2
3
|
import type { Store } from '../core/store.js';
|
|
3
4
|
export declare const requires: CommandRequires;
|
|
4
5
|
export interface PublishUrlsFlags {
|
|
@@ -23,10 +24,22 @@ export interface PageUrlEntry {
|
|
|
23
24
|
path: string;
|
|
24
25
|
published: PageAddress;
|
|
25
26
|
} | null;
|
|
27
|
+
/**
|
|
28
|
+
* two-kinds-of-published-page: read from `path` — so a moved page carries
|
|
29
|
+
* the lifespan of where it moved to, and a removed one that of where it was.
|
|
30
|
+
*/
|
|
31
|
+
lifespan: PageLifespan;
|
|
26
32
|
}
|
|
27
33
|
export interface PublishUrlsData {
|
|
28
34
|
base_url_declared: boolean;
|
|
29
35
|
pages: PageUrlEntry[];
|
|
30
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* The pages a change set adds, modifies, moves or removes, with their addresses.
|
|
39
|
+
* `range` is the `git diff` revision argument(s); approve-from-the-review-page
|
|
40
|
+
* passes a session's base and the pull request's head, so the approval page and
|
|
41
|
+
* this command never disagree about a page.
|
|
42
|
+
*/
|
|
43
|
+
export declare function pageUrlsFor(store: Store, range: readonly string[]): Promise<PageUrlEntry[]>;
|
|
31
44
|
export declare function execute(store: Store, flags: PublishUrlsFlags): Promise<CommandOutcome<PublishUrlsData>>;
|
|
32
45
|
//# sourceMappingURL=publish-urls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-urls.d.ts","sourceRoot":"","sources":["../../src/commands/publish-urls.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,0EAA0E;IAC1E,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-urls.d.ts","sourceRoot":"","sources":["../../src/commands/publish-urls.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1E,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,0EAA0E;IAC1E,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D;;;OAGG;IACH,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAsGD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAIjG;AAMD,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAwB7G"}
|
|
@@ -3,6 +3,7 @@ import { PUBLISH_INDEX_FILE } from '../core/browse/routes.js';
|
|
|
3
3
|
import { PublishChangeSetRequiredError } from '../core/errors.js';
|
|
4
4
|
import { ExitCode } from '../core/exit-codes.js';
|
|
5
5
|
import { createExecFileGitRunner } from '../core/git/exec.js';
|
|
6
|
+
import { lifespanOf } from '../core/publish/lifespan.js';
|
|
6
7
|
export const requires = { store: 'required' };
|
|
7
8
|
/**
|
|
8
9
|
* publish spec (a change set's pages): `--name-status -M` with paths relative
|
|
@@ -10,8 +11,7 @@ export const requires = { store: 'required' };
|
|
|
10
11
|
* the same as one at it. Rename detection is what turns a subject-folder move
|
|
11
12
|
* into one entry rather than a removal plus an addition.
|
|
12
13
|
*/
|
|
13
|
-
async function readChanges(store,
|
|
14
|
-
const range = flags.staged ? ['--cached'] : [`${flags.since}...HEAD`];
|
|
14
|
+
async function readChanges(store, range) {
|
|
15
15
|
const { stdout } = await createExecFileGitRunner().run(['diff', '--name-status', '-M', '--relative', '-z', ...range, '--'], { cwd: store.root });
|
|
16
16
|
const fields = stdout.split('\0');
|
|
17
17
|
const changes = [];
|
|
@@ -60,6 +60,14 @@ function addressesOf(store, file) {
|
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
62
|
function entryFor(store, change) {
|
|
63
|
+
const entry = entryWithoutLifespan(store, change);
|
|
64
|
+
if (entry === null)
|
|
65
|
+
return null;
|
|
66
|
+
// Every entry's path is under the publish path (`addressesOf` answered for
|
|
67
|
+
// it), so the fallback is never taken; it keeps the type honest.
|
|
68
|
+
return { ...entry, lifespan: lifespanOf(`${entry.path}/${PUBLISH_INDEX_FILE}`, store.config.publish.path) ?? 'permanent' };
|
|
69
|
+
}
|
|
70
|
+
function entryWithoutLifespan(store, change) {
|
|
63
71
|
if (!isIndexFile(change.file) && !(change.from !== null && isIndexFile(change.from)))
|
|
64
72
|
return null;
|
|
65
73
|
const current = isIndexFile(change.file) && change.status !== 'removed' ? addressesOf(store, change.file) : null;
|
|
@@ -91,6 +99,17 @@ function entryFor(store, change) {
|
|
|
91
99
|
return null;
|
|
92
100
|
return { status: change.status, path: pageDir(change.file), ...current, moved_from: null };
|
|
93
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* The pages a change set adds, modifies, moves or removes, with their addresses.
|
|
104
|
+
* `range` is the `git diff` revision argument(s); approve-from-the-review-page
|
|
105
|
+
* passes a session's base and the pull request's head, so the approval page and
|
|
106
|
+
* this command never disagree about a page.
|
|
107
|
+
*/
|
|
108
|
+
export async function pageUrlsFor(store, range) {
|
|
109
|
+
return (await readChanges(store, range))
|
|
110
|
+
.map((change) => entryFor(store, change))
|
|
111
|
+
.filter((entry) => entry !== null);
|
|
112
|
+
}
|
|
94
113
|
function show(address) {
|
|
95
114
|
return address.url ?? address.route;
|
|
96
115
|
}
|
|
@@ -98,12 +117,10 @@ export async function execute(store, flags) {
|
|
|
98
117
|
const given = [...(flags.staged ? ['--staged'] : []), ...(flags.since !== undefined ? ['--since'] : [])];
|
|
99
118
|
if (given.length !== 1)
|
|
100
119
|
throw new PublishChangeSetRequiredError(given);
|
|
101
|
-
const pages =
|
|
102
|
-
.map((change) => entryFor(store, change))
|
|
103
|
-
.filter((entry) => entry !== null);
|
|
120
|
+
const pages = await pageUrlsFor(store, flags.staged ? ['--cached'] : [`${flags.since}...HEAD`]);
|
|
104
121
|
const baseUrlDeclared = store.config.serve?.base_url !== undefined;
|
|
105
122
|
const lines = pages.map((page) => {
|
|
106
|
-
const parts = [`${page.status} ${page.path}`];
|
|
123
|
+
const parts = [`${page.status} ${page.path} (${page.lifespan})`];
|
|
107
124
|
if (page.preview !== null)
|
|
108
125
|
parts.push(`preview ${show(page.preview)}`);
|
|
109
126
|
parts.push(page.status === 'removed' ? `stops working: ${show(page.published)}` : `published ${show(page.published)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-urls.js","sourceRoot":"","sources":["../../src/commands/publish-urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-urls.js","sourceRoot":"","sources":["../../src/commands/publish-urls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ReviewStateName } from '../core/approval/decision.js';
|
|
2
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
3
|
+
import type { RunEnv } from '../core/env.js';
|
|
4
|
+
import { type CredentialKind } from '../core/forge/credentials.js';
|
|
5
|
+
import { type ForgeClient } from '../core/forge/github.js';
|
|
6
|
+
import type { Store } from '../core/store.js';
|
|
7
|
+
export declare const requires: CommandRequires;
|
|
8
|
+
export interface ReviewEntry {
|
|
9
|
+
worktree: string;
|
|
10
|
+
branch: string;
|
|
11
|
+
pull_request: number;
|
|
12
|
+
url: string;
|
|
13
|
+
head: string;
|
|
14
|
+
state: ReviewStateName;
|
|
15
|
+
/** The person behind the latest decision, and when they made it; null while awaiting. */
|
|
16
|
+
decided_by: string | null;
|
|
17
|
+
decided_at: string | null;
|
|
18
|
+
/** The comment of a request for changes. */
|
|
19
|
+
comment: string | null;
|
|
20
|
+
/** Why landing stopped, for `blocked` and for a resolved conflict awaiting re-approval. */
|
|
21
|
+
landing_reason: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface ReviewListData {
|
|
24
|
+
/** Which kind of forge credential the command used; never the credential. */
|
|
25
|
+
credential: CredentialKind;
|
|
26
|
+
sessions: ReviewEntry[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* change-approval spec: each session pull request's decision state, read from
|
|
30
|
+
* the forge — the channel by which a decider's requested changes and a blocked
|
|
31
|
+
* landing reach an agent at session start (design.md D3).
|
|
32
|
+
*/
|
|
33
|
+
export declare function execute(env: RunEnv, store: Store, forge?: ForgeClient): Promise<CommandOutcome<ReviewListData>>;
|
|
34
|
+
//# sourceMappingURL=review-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-list.d.ts","sourceRoot":"","sources":["../../src/commands/review-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,yFAAyF;IACzF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,2FAA2F;IAC3F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAmCrH"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { sessionPulls } from '../core/approval/sessions.js';
|
|
2
|
+
import { ChangeApprovalNotDeclaredError } from '../core/errors.js';
|
|
3
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
4
|
+
import { credentialsFor } from '../core/forge/credentials.js';
|
|
5
|
+
import { createGhForgeClient } from '../core/forge/github.js';
|
|
6
|
+
export const requires = { store: 'required' };
|
|
7
|
+
/**
|
|
8
|
+
* change-approval spec: each session pull request's decision state, read from
|
|
9
|
+
* the forge — the channel by which a decider's requested changes and a blocked
|
|
10
|
+
* landing reach an agent at session start (design.md D3).
|
|
11
|
+
*/
|
|
12
|
+
export async function execute(env, store, forge) {
|
|
13
|
+
const approval = store.config.change_approval;
|
|
14
|
+
if (approval === undefined)
|
|
15
|
+
throw new ChangeApprovalNotDeclaredError('ctxr review list');
|
|
16
|
+
const client = forge ?? createGhForgeClient(store.root, await credentialsFor(env, store.root));
|
|
17
|
+
const pulls = await sessionPulls(env.git, store.root, store.config, client, approval.recording_login);
|
|
18
|
+
const sessions = pulls.map((p) => ({
|
|
19
|
+
worktree: p.name,
|
|
20
|
+
branch: p.branch,
|
|
21
|
+
pull_request: p.pull.number,
|
|
22
|
+
url: p.pull.url,
|
|
23
|
+
head: p.pull.headSha,
|
|
24
|
+
state: p.review.state,
|
|
25
|
+
decided_by: p.review.decision?.by ?? null,
|
|
26
|
+
decided_at: p.review.decision?.at ?? null,
|
|
27
|
+
comment: p.review.state === 'changes-requested' ? (p.review.decision?.comment ?? null) : null,
|
|
28
|
+
landing_reason: p.review.landing?.reason ?? null,
|
|
29
|
+
}));
|
|
30
|
+
const lines = sessions.map((s) => {
|
|
31
|
+
const parts = [`#${s.pull_request} ${s.worktree} ${s.state}`];
|
|
32
|
+
if (s.decided_by !== null)
|
|
33
|
+
parts.push(`by ${s.decided_by} at ${s.decided_at}`);
|
|
34
|
+
if (s.landing_reason !== null)
|
|
35
|
+
parts.push(`reason: ${s.landing_reason}`);
|
|
36
|
+
if (s.comment !== null)
|
|
37
|
+
parts.push(`comment: ${s.comment.replace(/\s+/g, ' ')}`);
|
|
38
|
+
return parts.join(' | ');
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
exitCode: ExitCode.Ok,
|
|
42
|
+
data: { credential: client.credential, sessions },
|
|
43
|
+
findings: [],
|
|
44
|
+
humanSummary: sessions.length === 0 ? 'No session has an open pull request.' : lines.join('\n'),
|
|
45
|
+
storeRoot: store.root,
|
|
46
|
+
schemaVersion: store.config.schema_version,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=review-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-list.js","sourceRoot":"","sources":["../../src/commands/review-list.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/serve.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
2
|
import type { RunEnv } from '../core/env.js';
|
|
3
3
|
import type { Store } from '../core/store.js';
|
|
4
|
+
import { type CredentialKind } from '../core/forge/credentials.js';
|
|
4
5
|
export declare const requires: CommandRequires;
|
|
5
6
|
export interface ServeFlags {
|
|
6
7
|
port: number;
|
|
@@ -11,6 +12,8 @@ export interface ServeData {
|
|
|
11
12
|
port: number;
|
|
12
13
|
host: string;
|
|
13
14
|
root: string;
|
|
15
|
+
/** The forge credential kind the approval routes use; null when the store declares no change approval. */
|
|
16
|
+
credential: CredentialKind | null;
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Defaults to loopback so an invocation with no `--host` keeps today's
|
|
@@ -22,11 +25,5 @@ export interface ServeData {
|
|
|
22
25
|
* caller's.
|
|
23
26
|
*/
|
|
24
27
|
export declare const DEFAULT_HOST = "127.0.0.1";
|
|
25
|
-
/**
|
|
26
|
-
* cli-contract spec (local-browsing-surface D5): resolves the moment the
|
|
27
|
-
* listener is ready, so `runCommand()` emits exactly one envelope before
|
|
28
|
-
* any request is served — the listener itself keeps the process alive
|
|
29
|
-
* afterward, with no change to how `run()`/`bin.ts` end.
|
|
30
|
-
*/
|
|
31
28
|
export declare function execute(env: RunEnv, store: Store, flags: ServeFlags): Promise<CommandOutcome<ServeData>>;
|
|
32
29
|
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAK9C,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGnF,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAiQxC,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CA4B9G"}
|