ctxr-cli 0.22.0 → 0.24.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 +7 -2
- 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/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 +6 -0
- package/dist/commands/publish-urls.d.ts.map +1 -1
- package/dist/commands/publish-urls.js +10 -1
- package/dist/commands/publish-urls.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +83 -5
- package/dist/commands/serve.js.map +1 -1
- 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/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 +43 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +105 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/git/exec.d.ts +10 -0
- package/dist/core/git/exec.d.ts.map +1 -1
- package/dist/core/git/exec.js +52 -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 +54 -0
- package/dist/core/graph/diff-block.js.map +1 -0
- package/dist/core/graph/diff-document.d.ts +37 -0
- package/dist/core/graph/diff-document.d.ts.map +1 -0
- package/dist/core/graph/diff-document.js +119 -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/core/skills.js +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +34 -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/conventions/baseline-conventions.md +6 -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.md +1 -0
- package/templates/graph/knowledge-changes/empty.md +1 -0
- package/templates/graph/knowledge-changes/review.md +4 -0
- package/templates/serve/diagrams.mjs +136 -0
- package/templates/serve/shell.html +1 -1
- package/templates/serve/style.css +27 -0
- package/templates/skills/ctxr-organize-audit.md +19 -0
- package/templates/skills/ctxr-publish.md +100 -45
- package/templates/skills/ctxr-research.md +106 -53
- package/templates/skills/ctxr-submit.md +24 -15
package/README.md
CHANGED
|
@@ -125,7 +125,7 @@ Every harness loads this file on every turn, so it is kept short. contexture's o
|
|
|
125
125
|
| `ctxr-session-capture` | What a finished session produced that is worth keeping |
|
|
126
126
|
| `ctxr-upgrade` | Whether to upgrade the installed CLI now, and asking before it does |
|
|
127
127
|
| `ctxr-second-opinion` | Whether a plan or a taste call needs three different model families, and how to weigh what they say |
|
|
128
|
-
| `ctxr-research` | How to research a question against real sources — perspectives, source tiers, contradictions,
|
|
128
|
+
| `ctxr-research` | How to research a question against real sources — a brief and findings ledger, perspectives, source tiers, contradictions, and every claim verified against a source it opened — with whatever web access the harness has |
|
|
129
129
|
|
|
130
130
|
Your house rules go in `.contexture/guidance/`.
|
|
131
131
|
|
|
@@ -309,10 +309,15 @@ The store's own `.contexture/guidance/mission.md` uses the same write path, but
|
|
|
309
309
|
ctxr publish gather --note <path> # or --under <prefix>, or --entity <name>
|
|
310
310
|
# -> "Page filing: <derived path>/<page-name>"
|
|
311
311
|
ctxr publish new <derived path>/comparison # scaffolds the page folder and its sibling README
|
|
312
|
+
ctxr publish stamp .contexture/publish/<derived path>/comparison # records the hash of the note the README leads with
|
|
312
313
|
ctxr publish check .contexture/publish/<derived path>/comparison/index.html
|
|
314
|
+
|
|
315
|
+
ctxr publish new --disposable agent-week # -> .contexture/publish/disposable/<today>-agent-week
|
|
313
316
|
```
|
|
314
317
|
|
|
315
|
-
|
|
318
|
+
A page has one of two lifespans, read from where it is filed. A **permanent** page is the rendered form of one note that keeps changing: its README leads with a wikilink to that note (a folder's hub note, for a page drawn from a folder), `ctxr publish stamp` records the note's hash beside the link, and `check` fails the page — and `ctxr lint` lists it — once the note changes, until somebody reviews the page, removes the marker and stamps again. A **disposable** page is built to understand something once; it lives under `disposable/<YYYY-MM-DD>-<name>`, dated by the command, is never revised after it lands, and `ctxr lint` lists it as a removal candidate after 30 days — removal is the operator's call, made through a reviewed pull request.
|
|
319
|
+
|
|
320
|
+
`gather` resolves a subject to its note set — never a hand-picked list, which is how an unintended note slips onto a page unnoticed — and derives where the page belongs from where the subject's own notes live, at whatever depth the store carries them to. So the published-pages navigation reads like the store rather than like one long list, and a subject's second page collects beside its first under one folder naming the subject; `gather` reports the page that move would displace, and moves nothing. `check` runs the structural gates: no external references, viewport meta, a print rule, provenance, the sibling README, script syntax, that the page is not filed flat at the publish root, and — by lifespan — a disposable page's dated shape or a permanent page's represented note and its recorded hash. Both `new` and `check` end by naming the address `ctxr serve` answers for the page — the preview route while the page is still in a session worktree, together with the published-pages address it takes once that work lands, so the page gets looked at while changing it is still cheap. What a page may *contain*, given who will read it, is a judgment `ctxr-publish` walks you through and no check can make.
|
|
316
321
|
|
|
317
322
|
→ `ctxr-publish`, plus the vendored `frontend-design` and `eli5` skills for the craft contexture supplies none of.
|
|
318
323
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ServedAtRoute } from '../core/browse/page-url.js';
|
|
2
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
3
|
+
import { type GraphDelta } from '../core/graph/diff.js';
|
|
4
|
+
import type { Store } from '../core/store.js';
|
|
5
|
+
export declare const requires: CommandRequires;
|
|
6
|
+
/** review-the-knowledge-diff (D9): an enum rather than a boolean, so a further form has room and `--json` stays the envelope switch. */
|
|
7
|
+
export declare const GRAPH_DIFF_FORMATS: readonly ['text', 'markdown'];
|
|
8
|
+
export type GraphDiffFormat = (typeof GRAPH_DIFF_FORMATS)[number];
|
|
9
|
+
export interface GraphDiffFlags {
|
|
10
|
+
since: string | undefined;
|
|
11
|
+
until: string | undefined;
|
|
12
|
+
format: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface GraphDiffData extends GraphDelta {
|
|
15
|
+
base_url_declared: boolean;
|
|
16
|
+
/** The review view of this session worktree, carrying the head id; null outside a worktree or with previews off. */
|
|
17
|
+
review: ServedAtRoute | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The flag checks, ahead of any store or git read, so a malformed invocation
|
|
21
|
+
* is refused with the usage code however the store is doing. Returns the
|
|
22
|
+
* format to render.
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkFlags(flags: GraphDiffFlags, jsonMode: boolean): GraphDiffFormat;
|
|
25
|
+
/**
|
|
26
|
+
* context-retrieval spec (review-the-knowledge-diff): the graph delta between
|
|
27
|
+
* the merge base of `--since` and the head, read from git's object store. It
|
|
28
|
+
* reports and gates nothing — no findings, and exit 0 whenever both sides
|
|
29
|
+
* could be read (D10). `--format markdown` makes the human output the
|
|
30
|
+
* knowledge-changes block and nothing else, so it can be pasted unchanged.
|
|
31
|
+
*/
|
|
32
|
+
export declare function execute(store: Store, flags: GraphDiffFlags, jsonMode?: boolean): Promise<CommandOutcome<GraphDiffData>>;
|
|
33
|
+
//# sourceMappingURL=graph-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-diff.d.ts","sourceRoot":"","sources":["../../src/commands/graph-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAM1E,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,wIAAwI;AACxI,eAAO,MAAM,kBAAkB,YAAI,MAAM,EAAE,UAAU,CAAU,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oHAAoH;IACpH,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,eAAe,CAMpF;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAqB3H"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { reviewServedAt } from '../core/browse/page-url.js';
|
|
2
|
+
import { GraphDiffFormatError, GraphDiffSinceRequiredError } from '../core/errors.js';
|
|
3
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
4
|
+
import { createExecFileGitRunner } from '../core/git/exec.js';
|
|
5
|
+
import { renderKnowledgeChangesBlock, reviewLines } from '../core/graph/diff-block.js';
|
|
6
|
+
import { renderDiffDocument } from '../core/graph/diff-document.js';
|
|
7
|
+
import { computeGraphDelta, resolveRange } from '../core/graph/diff.js';
|
|
8
|
+
export const requires = { store: 'required' };
|
|
9
|
+
/** review-the-knowledge-diff (D9): an enum rather than a boolean, so a further form has room and `--json` stays the envelope switch. */
|
|
10
|
+
export const GRAPH_DIFF_FORMATS = ['text', 'markdown'];
|
|
11
|
+
/**
|
|
12
|
+
* The flag checks, ahead of any store or git read, so a malformed invocation
|
|
13
|
+
* is refused with the usage code however the store is doing. Returns the
|
|
14
|
+
* format to render.
|
|
15
|
+
*/
|
|
16
|
+
export function checkFlags(flags, jsonMode) {
|
|
17
|
+
if (flags.since === undefined)
|
|
18
|
+
throw new GraphDiffSinceRequiredError();
|
|
19
|
+
const format = flags.format ?? 'text';
|
|
20
|
+
if (!GRAPH_DIFF_FORMATS.includes(format))
|
|
21
|
+
throw new GraphDiffFormatError(format, GRAPH_DIFF_FORMATS, false);
|
|
22
|
+
if (format === 'markdown' && jsonMode)
|
|
23
|
+
throw new GraphDiffFormatError(format, GRAPH_DIFF_FORMATS, true);
|
|
24
|
+
return format;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* context-retrieval spec (review-the-knowledge-diff): the graph delta between
|
|
28
|
+
* the merge base of `--since` and the head, read from git's object store. It
|
|
29
|
+
* reports and gates nothing — no findings, and exit 0 whenever both sides
|
|
30
|
+
* could be read (D10). `--format markdown` makes the human output the
|
|
31
|
+
* knowledge-changes block and nothing else, so it can be pasted unchanged.
|
|
32
|
+
*/
|
|
33
|
+
export async function execute(store, flags, jsonMode = false) {
|
|
34
|
+
const format = checkFlags(flags, jsonMode);
|
|
35
|
+
const git = createExecFileGitRunner();
|
|
36
|
+
const range = await resolveRange(git, store.root, flags.since, flags.until);
|
|
37
|
+
const delta = await computeGraphDelta(git, store.root, range, store.config);
|
|
38
|
+
const review = reviewServedAt(store, delta.head);
|
|
39
|
+
const baseUrlDeclared = store.config.serve?.base_url !== undefined;
|
|
40
|
+
const humanSummary = format === 'markdown'
|
|
41
|
+
? renderKnowledgeChangesBlock(delta, review).replace(/\n$/, '')
|
|
42
|
+
: [renderDiffDocument(delta).replace(/\n$/, ''), ...reviewLines(review)].join('\n');
|
|
43
|
+
return {
|
|
44
|
+
exitCode: ExitCode.Ok,
|
|
45
|
+
data: { ...delta, base_url_declared: baseUrlDeclared, review },
|
|
46
|
+
findings: [],
|
|
47
|
+
humanSummary,
|
|
48
|
+
storeRoot: store.root,
|
|
49
|
+
schemaVersion: store.config.schema_version,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=graph-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-diff.js","sourceRoot":"","sources":["../../src/commands/graph-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAsB,MAAM,4BAA4B,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AAGzF,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAE/D,wIAAwI;AACxI,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,UAAU,CAAU,CAAC;AAehE;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAqB,EAAE,QAAiB;IACjE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,2BAA2B,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IACtC,IAAI,CAAE,kBAAwC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACnI,IAAI,MAAM,KAAK,UAAU,IAAI,QAAQ;QAAE,MAAM,IAAI,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACxG,OAAO,MAAyB,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAY,EAAE,KAAqB,EAAE,QAAQ,GAAG,KAAK;IACjF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC;IAEnE,MAAM,YAAY,GAChB,MAAM,KAAK,UAAU;QACnB,CAAC,CAAC,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExF,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,EAAE;QAC9D,QAAQ,EAAE,EAAE;QACZ,YAAY;QACZ,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
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 PublishCheckFlags {
|
|
@@ -19,6 +20,11 @@ export interface PublishCheckData {
|
|
|
19
20
|
* which is the same verdict `checkPageLocation` reaches for such a file.
|
|
20
21
|
*/
|
|
21
22
|
served_at: ServedAt | null;
|
|
23
|
+
/**
|
|
24
|
+
* two-kinds-of-published-page: read from where the page is filed. Null for a
|
|
25
|
+
* file outside the configured publish path, which is not a page.
|
|
26
|
+
*/
|
|
27
|
+
lifespan: PageLifespan | null;
|
|
22
28
|
}
|
|
23
29
|
/**
|
|
24
30
|
* publish spec: the mechanized half of the page-checklist — every check
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-check.d.ts","sourceRoot":"","sources":["../../src/commands/publish-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,QAAQ,EAAoB,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;OAIG;IACH,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-check.d.ts","sourceRoot":"","sources":["../../src/commands/publish-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,QAAQ,EAAoB,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK1E,OAAO,EAAkC,KAAK,YAAY,EAAuB,MAAM,6BAA6B,CAAC;AAGrH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;OAIG;IACH,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAoKD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CA4D/G"}
|
|
@@ -4,7 +4,10 @@ import path from 'node:path';
|
|
|
4
4
|
import { pageServedAt, servedAtSentence } from '../core/browse/page-url.js';
|
|
5
5
|
import { PublishPageNotFoundError } from '../core/errors.js';
|
|
6
6
|
import { ExitCode } from '../core/exit-codes.js';
|
|
7
|
+
import { listNotes } from '../core/notes/list.js';
|
|
7
8
|
import { parseNoteText } from '../core/notes/parse.js';
|
|
9
|
+
import { DISPOSABLE_SEGMENT, lifespanOf, parseDisposableDate } from '../core/publish/lifespan.js';
|
|
10
|
+
import { assessRepresentation } from '../core/publish/represents.js';
|
|
8
11
|
import { checkScriptSyntax } from '../core/publish/script-check.js';
|
|
9
12
|
export const requires = { store: 'required' };
|
|
10
13
|
/** publish spec: the fixed tag list a tag-balance pass counts, matching the source convention's checker. */
|
|
@@ -65,6 +68,69 @@ function checkPageLocation(relativePath, publishPath) {
|
|
|
65
68
|
},
|
|
66
69
|
];
|
|
67
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* two-kinds-of-published-page D2: a disposable page sits exactly one level
|
|
73
|
+
* under the reserved segment, its name led by the date `publish new
|
|
74
|
+
* --disposable` stamped. Anything else filed under the segment — a permanent
|
|
75
|
+
* page placed there by hand, a nested folder — is disposable by location and
|
|
76
|
+
* fails here, so the misfiling is named without knowing the author's intent.
|
|
77
|
+
*/
|
|
78
|
+
function checkDisposableShape(relativePath, publishPath) {
|
|
79
|
+
const publishPrefix = publishPath.split(path.sep).join('/').replace(/\/+$/, '');
|
|
80
|
+
const pageFolder = path.posix.dirname(relativePath.slice(publishPrefix.length + 1));
|
|
81
|
+
const segments = pageFolder.split('/');
|
|
82
|
+
if (segments.length === 2 && segments[0] === DISPOSABLE_SEGMENT && parseDisposableDate(segments[1]) !== null)
|
|
83
|
+
return [];
|
|
84
|
+
return [
|
|
85
|
+
{
|
|
86
|
+
check: 'disposable-shape',
|
|
87
|
+
message: `a disposable page sits directly under "${publishPrefix}/${DISPOSABLE_SEGMENT}/" in a folder named "<YYYY-MM-DD>-<name>" with a real date; this one is at "${publishPrefix}/${pageFolder}"`,
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* two-kinds-of-published-page D4/D5: a permanent page names the one note it
|
|
93
|
+
* represents — its README's lead link — and records that note's hash, so a
|
|
94
|
+
* change to the note after the page was built is reported, not remembered.
|
|
95
|
+
*/
|
|
96
|
+
function checkRepresentation(readmeRaw, readmePath, notes) {
|
|
97
|
+
const representation = assessRepresentation(readmeRaw, readmePath, notes);
|
|
98
|
+
switch (representation.status) {
|
|
99
|
+
case 'no-link':
|
|
100
|
+
return [{ check: 'represented-note', message: 'the README names no note: lead its source notes with a wikilink to the one note this page represents' }];
|
|
101
|
+
case 'not-found':
|
|
102
|
+
return [{ check: 'represented-note', message: `the README's first wikilink names "${representation.target}", which no note in the store carries` }];
|
|
103
|
+
case 'ambiguous':
|
|
104
|
+
return [
|
|
105
|
+
{
|
|
106
|
+
check: 'represented-note',
|
|
107
|
+
message: `the README's first wikilink "${representation.target}" resolves to more than one note: ${representation.candidates.join(', ')}`,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
case 'not-stamped':
|
|
111
|
+
return [{ check: 'represented-note-hash', message: `not stamped: run "ctxr publish stamp" to record the hash of "${representation.note}"` }];
|
|
112
|
+
case 'stale':
|
|
113
|
+
return [
|
|
114
|
+
{
|
|
115
|
+
check: 'represented-note-hash',
|
|
116
|
+
message: `stale: "${representation.note}" has changed since the page was stamped — review the page against it, remove the marker, and stamp again`,
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
case 'current':
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* two-kinds-of-published-page: the summary names a failing check by its id,
|
|
125
|
+
* plus — for the hash check — which of its two reasons applies, because "not
|
|
126
|
+
* stamped" and "stale" ask the author for different things (stamp, versus
|
|
127
|
+
* review then remove the marker then stamp).
|
|
128
|
+
*/
|
|
129
|
+
function summaryLabel(failure) {
|
|
130
|
+
if (failure.check !== 'represented-note-hash')
|
|
131
|
+
return failure.check;
|
|
132
|
+
return `${failure.check} (${failure.message.startsWith('stale') ? 'stale' : 'not stamped'})`;
|
|
133
|
+
}
|
|
68
134
|
function checkProvenanceLine(html) {
|
|
69
135
|
const hasDate = /\d{4}-\d{2}-\d{2}/.test(html);
|
|
70
136
|
const hasReadmeLink = /href\s*=\s*["'][^"']*readme[^"']*["']/i.test(html);
|
|
@@ -127,6 +193,9 @@ export async function execute(store, flags) {
|
|
|
127
193
|
...checkTagBalance(html),
|
|
128
194
|
...checkPageLocation(relativePath, store.config.publish.path),
|
|
129
195
|
];
|
|
196
|
+
const lifespan = lifespanOf(relativePath, store.config.publish.path);
|
|
197
|
+
if (lifespan === 'disposable')
|
|
198
|
+
failures.push(...checkDisposableShape(relativePath, store.config.publish.path));
|
|
130
199
|
if (!existsSync(readmePath)) {
|
|
131
200
|
failures.push({ check: 'sibling-readme', message: `no sibling README at "${readmeRelativePath}"` });
|
|
132
201
|
}
|
|
@@ -136,19 +205,25 @@ export async function execute(store, flags) {
|
|
|
136
205
|
if (readmeNote.frontmatter?.kind !== undefined) {
|
|
137
206
|
failures.push({ check: 'readme-frontmatter', message: 'README declares a "kind" field — a page\'s kind is the folder name alone' });
|
|
138
207
|
}
|
|
208
|
+
if (lifespan === 'permanent') {
|
|
209
|
+
// Loaded once per run (tasks 4.1); the check still writes nothing.
|
|
210
|
+
const notes = await listNotes(store.root, store.config);
|
|
211
|
+
failures.push(...checkRepresentation(readmeRaw, readmeRelativePath, notes));
|
|
212
|
+
}
|
|
139
213
|
}
|
|
140
214
|
failures.push(...(await checkInlineScriptSyntax(html)));
|
|
141
215
|
// Reported on both exit paths: a page whose checks failed is exactly the one
|
|
142
216
|
// somebody needs to open, and naming its address gates nothing.
|
|
143
217
|
const servedAt = pageServedAt(store, relativePath);
|
|
144
218
|
const sentence = servedAtSentence(servedAt);
|
|
219
|
+
const lifespanTag = lifespan === null ? '' : ` (${lifespan})`;
|
|
145
220
|
return {
|
|
146
221
|
exitCode: failures.length === 0 ? ExitCode.Ok : ExitCode.CheckFailed,
|
|
147
|
-
data: { path: relativePath, passed: failures.length === 0, failures, served_at: servedAt },
|
|
222
|
+
data: { path: relativePath, passed: failures.length === 0, failures, served_at: servedAt, lifespan },
|
|
148
223
|
findings: [],
|
|
149
224
|
humanSummary: failures.length === 0
|
|
150
|
-
? `${relativePath}: all checks passed.${sentence}`
|
|
151
|
-
: `${relativePath}: ${failures.length} failing check(s): ${failures.map(
|
|
225
|
+
? `${relativePath}${lifespanTag}: all checks passed.${sentence}`
|
|
226
|
+
: `${relativePath}${lifespanTag}: ${failures.length} failing check(s): ${failures.map(summaryLabel).join(', ')}.${sentence}`,
|
|
152
227
|
storeRoot: store.root,
|
|
153
228
|
schemaVersion: store.config.schema_version,
|
|
154
229
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-check.js","sourceRoot":"","sources":["../../src/commands/publish-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAiB,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-check.js","sourceRoot":"","sources":["../../src/commands/publish-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAa,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAmC,MAAM,2BAA2B,CAAC;AAG1F,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAqB/D,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAY,EAAE,SAAiB;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,kGAAkG;AAClG,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAY,EAAE,MAAc;IACzE,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAEhG,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACnG,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,QAAuC,EAAE,OAAe;IAChF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;IAC5E,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;AAC5H,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAY,EAAE,KAAyB;IAChF,MAAM,KAAK,GAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,4BAA4B,EAAE,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,4BAA4B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IAE7F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC3B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAM,EAAE,CAAC,CAAC;YACvF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,KAAM,EAAE,KAAK,EAAE,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAK,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACzD,IAAI,IAAU,CAAC;YACf,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBAChG,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAO,CAAC,CAAC;YAClE,yEAAyE;YACzE,0EAA0E;YAC1E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAO,CAAC,EAAE,KAAK,EAAE,CAAC;QACtF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,gEAAgE,CAAC;
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGnG,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAuB/D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAY,EAAE,KAAwB;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACjG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7H,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3F,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,YAAY,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,QAAQ,KAAK,IAAI;QAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACtF,IAAI,QAAQ,KAAK,YAAY;QAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAE9F,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,GAAG,YAAY,YAAY,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,IAAI;QAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAEhF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,oBAAoB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IACxE,QAAQ,cAAc,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,SAAS;YACZ,MAAM,IAAI,wBAAwB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC9D,KAAK,WAAW;YACd,MAAM,IAAI,wBAAwB,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;QACvF,KAAK,WAAW;YACd,MAAM,IAAI,wBAAwB,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;IACtC,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;IAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,IAAsB,CAAC;IAC3B,IAAI,OAAe,CAAC;IACpB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACzC,MAAM,eAAe,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC7E,OAAO,GAAG,YAAY,cAAc,uBAAuB,IAAI,IAAI,CAAC;IACtE,CAAC;SAAM,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/C,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5F,OAAO,GAAG,IAAI,cAAc,6CAA6C,IAAI,qBAAqB,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACrE,OAAO;YACL,IAAI,cAAc,gBAAgB,IAAI,wDAAwD;gBAC9F,uEAAuE,CAAC;IAC5E,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI;QACJ,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,OAAO;QACrB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
|