ctxr-cli 0.32.0 → 0.34.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 +15 -1
- package/dist/commands/archive.d.ts +5 -4
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +7 -7
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/catalog-show.d.ts +8 -0
- package/dist/commands/catalog-show.d.ts.map +1 -1
- package/dist/commands/catalog-show.js +29 -2
- package/dist/commands/catalog-show.js.map +1 -1
- package/dist/commands/context-gather.d.ts.map +1 -1
- package/dist/commands/context-gather.js +3 -2
- package/dist/commands/context-gather.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +4 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/graph-build.d.ts +4 -1
- package/dist/commands/graph-build.d.ts.map +1 -1
- package/dist/commands/graph-build.js +14 -5
- package/dist/commands/graph-build.js.map +1 -1
- package/dist/commands/land.d.ts +27 -7
- package/dist/commands/land.d.ts.map +1 -1
- package/dist/commands/land.js +307 -32
- package/dist/commands/land.js.map +1 -1
- package/dist/commands/publish-gather.d.ts.map +1 -1
- package/dist/commands/publish-gather.js +2 -3
- package/dist/commands/publish-gather.js.map +1 -1
- package/dist/commands/review-list.d.ts +19 -5
- package/dist/commands/review-list.d.ts.map +1 -1
- package/dist/commands/review-list.js +55 -6
- package/dist/commands/review-list.js.map +1 -1
- package/dist/commands/rollup-gather.d.ts.map +1 -1
- package/dist/commands/rollup-gather.js +2 -3
- package/dist/commands/rollup-gather.js.map +1 -1
- package/dist/commands/second-opinion.d.ts +33 -0
- package/dist/commands/second-opinion.d.ts.map +1 -0
- package/dist/commands/second-opinion.js +56 -0
- package/dist/commands/second-opinion.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +4 -0
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-discard.d.ts +18 -0
- package/dist/commands/session-discard.d.ts.map +1 -0
- package/dist/commands/session-discard.js +31 -0
- package/dist/commands/session-discard.js.map +1 -0
- package/dist/commands/session-list.d.ts +17 -6
- package/dist/commands/session-list.d.ts.map +1 -1
- package/dist/commands/session-list.js +31 -11
- package/dist/commands/session-list.js.map +1 -1
- package/dist/commands/session-rebase.d.ts +18 -0
- package/dist/commands/session-rebase.d.ts.map +1 -0
- package/dist/commands/session-rebase.js +43 -0
- package/dist/commands/session-rebase.js.map +1 -0
- package/dist/commands/session-start.d.ts +8 -0
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +45 -5
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session-status.d.ts +17 -0
- package/dist/commands/session-status.d.ts.map +1 -0
- package/dist/commands/session-status.js +38 -0
- package/dist/commands/session-status.js.map +1 -0
- package/dist/commands/session-submit.d.ts +23 -0
- package/dist/commands/session-submit.d.ts.map +1 -0
- package/dist/commands/session-submit.js +42 -0
- package/dist/commands/session-submit.js.map +1 -0
- package/dist/commands/shared-stores-status.d.ts +24 -0
- package/dist/commands/shared-stores-status.d.ts.map +1 -0
- package/dist/commands/shared-stores-status.js +51 -0
- package/dist/commands/shared-stores-status.js.map +1 -0
- package/dist/commands/shared-stores-sync.d.ts +27 -0
- package/dist/commands/shared-stores-sync.d.ts.map +1 -0
- package/dist/commands/shared-stores-sync.js +115 -0
- package/dist/commands/shared-stores-sync.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -4
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/schema.d.ts +16 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agents-doc.d.ts +10 -0
- package/dist/core/agents-doc.d.ts.map +1 -1
- package/dist/core/agents-doc.js +26 -1
- package/dist/core/agents-doc.js.map +1 -1
- package/dist/core/approval/decision.d.ts +39 -1
- package/dist/core/approval/decision.d.ts.map +1 -1
- package/dist/core/approval/decision.js +53 -6
- package/dist/core/approval/decision.js.map +1 -1
- package/dist/core/approval/session-group.d.ts +156 -0
- package/dist/core/approval/session-group.d.ts.map +1 -0
- package/dist/core/approval/session-group.js +359 -0
- package/dist/core/approval/session-group.js.map +1 -0
- package/dist/core/approval/session-marker.d.ts +79 -0
- package/dist/core/approval/session-marker.d.ts.map +1 -0
- package/dist/core/approval/session-marker.js +146 -0
- package/dist/core/approval/session-marker.js.map +1 -0
- package/dist/core/approval/store-forges.d.ts +15 -0
- package/dist/core/approval/store-forges.d.ts.map +1 -0
- package/dist/core/approval/store-forges.js +33 -0
- package/dist/core/approval/store-forges.js.map +1 -0
- package/dist/core/browse/approve.d.ts +8 -0
- package/dist/core/browse/approve.d.ts.map +1 -1
- package/dist/core/browse/approve.js +366 -48
- package/dist/core/browse/approve.js.map +1 -1
- package/dist/core/browse/link-resolver.d.ts +9 -4
- package/dist/core/browse/link-resolver.d.ts.map +1 -1
- package/dist/core/browse/link-resolver.js +12 -7
- package/dist/core/browse/link-resolver.js.map +1 -1
- package/dist/core/browse/review.d.ts +5 -0
- package/dist/core/browse/review.d.ts.map +1 -1
- package/dist/core/browse/review.js +8 -0
- package/dist/core/browse/review.js.map +1 -1
- package/dist/core/checks/integrity-checks.d.ts.map +1 -1
- package/dist/core/checks/integrity-checks.js +7 -1
- package/dist/core/checks/integrity-checks.js.map +1 -1
- package/dist/core/checks/manifest.d.ts.map +1 -1
- package/dist/core/checks/manifest.js +2 -0
- package/dist/core/checks/manifest.js.map +1 -1
- package/dist/core/checks/shared-stores-checks.d.ts +17 -0
- package/dist/core/checks/shared-stores-checks.d.ts.map +1 -0
- package/dist/core/checks/shared-stores-checks.js +84 -0
- package/dist/core/checks/shared-stores-checks.js.map +1 -0
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +21 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/forge/github.d.ts +14 -0
- package/dist/core/forge/github.d.ts.map +1 -1
- package/dist/core/forge/github.js +17 -0
- package/dist/core/forge/github.js.map +1 -1
- package/dist/core/git/fast-forward.d.ts +23 -0
- package/dist/core/git/fast-forward.d.ts.map +1 -0
- package/dist/core/git/fast-forward.js +38 -0
- package/dist/core/git/fast-forward.js.map +1 -0
- package/dist/core/git/repo.d.ts +11 -0
- package/dist/core/git/repo.d.ts.map +1 -1
- package/dist/core/git/repo.js +25 -0
- package/dist/core/git/repo.js.map +1 -1
- package/dist/core/graph/model.d.ts +27 -0
- package/dist/core/graph/model.d.ts.map +1 -1
- package/dist/core/graph/model.js +68 -2
- package/dist/core/graph/model.js.map +1 -1
- package/dist/core/graph/persist.d.ts.map +1 -1
- package/dist/core/graph/persist.js +3 -2
- package/dist/core/graph/persist.js.map +1 -1
- package/dist/core/mcp/sessions.d.ts +11 -14
- package/dist/core/mcp/sessions.d.ts.map +1 -1
- package/dist/core/mcp/sessions.js +23 -43
- package/dist/core/mcp/sessions.js.map +1 -1
- package/dist/core/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +5 -0
- package/dist/core/notes/list.js.map +1 -1
- package/dist/core/reconcile.d.ts.map +1 -1
- package/dist/core/reconcile.js +2 -1
- package/dist/core/reconcile.js.map +1 -1
- package/dist/core/retrieval/pass.d.ts.map +1 -1
- package/dist/core/retrieval/pass.js +5 -4
- package/dist/core/retrieval/pass.js.map +1 -1
- package/dist/core/rollup.d.ts.map +1 -1
- package/dist/core/rollup.js +2 -3
- package/dist/core/rollup.js.map +1 -1
- package/dist/core/root.d.ts.map +1 -1
- package/dist/core/root.js +33 -2
- package/dist/core/root.js.map +1 -1
- package/dist/core/second-opinion/environment.d.ts +21 -0
- package/dist/core/second-opinion/environment.d.ts.map +1 -0
- package/dist/core/second-opinion/environment.js +70 -0
- package/dist/core/second-opinion/environment.js.map +1 -0
- package/dist/core/second-opinion/judge.d.ts +29 -0
- package/dist/core/second-opinion/judge.d.ts.map +1 -0
- package/dist/core/second-opinion/judge.js +55 -0
- package/dist/core/second-opinion/judge.js.map +1 -0
- package/dist/core/second-opinion/launch.d.ts +16 -0
- package/dist/core/second-opinion/launch.d.ts.map +1 -0
- package/dist/core/second-opinion/launch.js +75 -0
- package/dist/core/second-opinion/launch.js.map +1 -0
- package/dist/core/second-opinion/lineup.d.ts +82 -0
- package/dist/core/second-opinion/lineup.d.ts.map +1 -0
- package/dist/core/second-opinion/lineup.js +113 -0
- package/dist/core/second-opinion/lineup.js.map +1 -0
- package/dist/core/second-opinion/modes.d.ts +98 -0
- package/dist/core/second-opinion/modes.d.ts.map +1 -0
- package/dist/core/second-opinion/modes.js +224 -0
- package/dist/core/second-opinion/modes.js.map +1 -0
- package/dist/core/second-opinion/prompts.d.ts +18 -0
- package/dist/core/second-opinion/prompts.d.ts.map +1 -0
- package/dist/core/second-opinion/prompts.js +65 -0
- package/dist/core/second-opinion/prompts.js.map +1 -0
- package/dist/core/session/commit.d.ts +29 -0
- package/dist/core/session/commit.d.ts.map +1 -0
- package/dist/core/session/commit.js +22 -0
- package/dist/core/session/commit.js.map +1 -0
- package/dist/core/session/discard.d.ts +24 -0
- package/dist/core/session/discard.d.ts.map +1 -0
- package/dist/core/session/discard.js +68 -0
- package/dist/core/session/discard.js.map +1 -0
- package/dist/core/session/list.d.ts +48 -0
- package/dist/core/session/list.d.ts.map +1 -0
- package/dist/core/session/list.js +55 -0
- package/dist/core/session/list.js.map +1 -0
- package/dist/core/session/rebase.d.ts +34 -0
- package/dist/core/session/rebase.d.ts.map +1 -0
- package/dist/core/session/rebase.js +87 -0
- package/dist/core/session/rebase.js.map +1 -0
- package/dist/core/session/remote.d.ts +80 -0
- package/dist/core/session/remote.d.ts.map +1 -0
- package/dist/core/session/remote.js +102 -0
- package/dist/core/session/remote.js.map +1 -0
- package/dist/core/session/resolve.d.ts +41 -0
- package/dist/core/session/resolve.d.ts.map +1 -0
- package/dist/core/session/resolve.js +109 -0
- package/dist/core/session/resolve.js.map +1 -0
- package/dist/core/session/status.d.ts +47 -0
- package/dist/core/session/status.d.ts.map +1 -0
- package/dist/core/session/status.js +55 -0
- package/dist/core/session/status.js.map +1 -0
- package/dist/core/session/submit.d.ts +67 -0
- package/dist/core/session/submit.d.ts.map +1 -0
- package/dist/core/session/submit.js +254 -0
- package/dist/core/session/submit.js.map +1 -0
- package/dist/core/shared-stores-location.d.ts +17 -0
- package/dist/core/shared-stores-location.d.ts.map +1 -0
- package/dist/core/shared-stores-location.js +22 -0
- package/dist/core/shared-stores-location.js.map +1 -0
- package/dist/core/shared-stores.d.ts +69 -0
- package/dist/core/shared-stores.d.ts.map +1 -0
- package/dist/core/shared-stores.js +100 -0
- package/dist/core/shared-stores.js.map +1 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +14 -10
- package/dist/core/skills.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +122 -6
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/templates/agents/shared-stores.md +11 -0
- package/templates/approve/copies-missing.md +1 -0
- package/templates/approve/elsewhere-heading.md +1 -0
- package/templates/approve/elsewhere-intro.md +1 -0
- package/templates/approve/homed-elsewhere.md +1 -0
- package/templates/approve/not-decider.md +1 -0
- package/templates/approve/part-heading.md +1 -0
- package/templates/approve/parts-changed.md +1 -0
- package/templates/approve/session-decision-note.md +1 -0
- package/templates/approve/session-intro.md +1 -0
- package/templates/approve/session-no-decision.md +1 -0
- package/templates/approve/store-unreachable.md +1 -0
- package/templates/land/resolver.md +2 -0
- package/templates/second-opinion/poll-answer.md +7 -0
- package/templates/second-opinion/taste-panel.md +14 -0
- package/templates/session/pages/bare-route.md +2 -0
- package/templates/session/pages/block.md +8 -0
- package/templates/session/pages/condition-preview.md +1 -0
- package/templates/session/pages/condition.md +1 -0
- package/templates/session/pages/moved.md +1 -0
- package/templates/session/pages/stops-working.md +1 -0
- package/templates/session/pages/table-head-preview.md +2 -0
- package/templates/session/pages/table-head.md +2 -0
- package/templates/skills/ctxr-capture-circleback/sweep.mjs +33 -6
- package/templates/skills/ctxr-capture-circleback.md +9 -6
- package/templates/skills/ctxr-connection-finding.md +4 -1
- package/templates/skills/ctxr-land.md +26 -7
- package/templates/skills/ctxr-placement.md +10 -0
- package/templates/skills/ctxr-rollup.md +3 -0
- package/templates/skills/ctxr-second-opinion.md +52 -36
- package/templates/skills/ctxr-session-lifecycle.md +60 -33
- package/templates/skills/ctxr-submit.md +65 -56
- package/templates/skills/ctxr-second-opinion/run.mjs +0 -542
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/critic-contract.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/lenses.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/architect.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/pragmatist.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/skeptic.md +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { readConfig } from '../../config/load.js';
|
|
4
|
+
import { MIGRATION_STEPS } from '../../config/migrations.js';
|
|
5
|
+
import * as doctorCommand from '../../commands/doctor.js';
|
|
6
|
+
import * as graphDiffCommand from '../../commands/graph-diff.js';
|
|
7
|
+
import { pageUrlsFor } from '../../commands/publish-urls.js';
|
|
8
|
+
import { baseRef } from '../approval/sessions.js';
|
|
9
|
+
import { findSessionMarker, identityOfWorktree, repositorySlug, sessionMarker, sessionRouteName } from '../approval/session-marker.js';
|
|
10
|
+
import { mountingStoreOf } from '../shared-stores.js';
|
|
11
|
+
import { ForgeRequestError } from '../forge/github.js';
|
|
12
|
+
import { ContextureError, SessionRefusedError } from '../errors.js';
|
|
13
|
+
import { ExitCode } from '../exit-codes.js';
|
|
14
|
+
import { hasRemote } from '../git/worktree.js';
|
|
15
|
+
import { packagedTemplate, substituteBlock } from '../templates.js';
|
|
16
|
+
import { commitStaged } from './commit.js';
|
|
17
|
+
import { firstLines, publishSession, remoteTip, SessionRemoteError } from './remote.js';
|
|
18
|
+
import { commitsAhead, rebaseInProgress } from './resolve.js';
|
|
19
|
+
/** A submit that stopped at a step; `details.step` names it and `details.completed` what ran before it. */
|
|
20
|
+
function stopped(exitCode, reason, step, completed, message, details = {}) {
|
|
21
|
+
return new SessionRefusedError(exitCode, reason, message, { step, completed, ...details });
|
|
22
|
+
}
|
|
23
|
+
/** The generated sections' headings, as the templates that write them spell them. */
|
|
24
|
+
function generatedHeadings() {
|
|
25
|
+
return [packagedTemplate('graph/knowledge-changes', 'block'), packagedTemplate('session/pages', 'block')].map((block) => block.split('\n')[0].replace(/^#+\s*/, ''));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* D2: the generated sections are the command's, so a body that already
|
|
29
|
+
* carries either heading — as a markdown heading or a bold line — is refused
|
|
30
|
+
* rather than appended to, and the section can be neither duplicated nor
|
|
31
|
+
* hand-edited.
|
|
32
|
+
*/
|
|
33
|
+
function headingInBody(body) {
|
|
34
|
+
for (const heading of generatedHeadings()) {
|
|
35
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
36
|
+
if (new RegExp(`^\\s*(?:#{1,6}\\s+|\\*\\*)${escaped}(?:\\*\\*)?\\s*:?\\s*$`, 'im').test(body))
|
|
37
|
+
return heading;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function under(file, prefix) {
|
|
42
|
+
const normalized = prefix.endsWith('/') ? prefix : `${prefix}/`;
|
|
43
|
+
return file.startsWith(normalized);
|
|
44
|
+
}
|
|
45
|
+
async function openWorktreeStore(session) {
|
|
46
|
+
return { root: session.storeRoot, config: await readConfig(session.storeRoot, MIGRATION_STEPS) };
|
|
47
|
+
}
|
|
48
|
+
function show(address) {
|
|
49
|
+
return `\`${address.url ?? address.route}\``;
|
|
50
|
+
}
|
|
51
|
+
function fill(text, values) {
|
|
52
|
+
return Object.entries(values).reduce((out, [token, value]) => out.replaceAll(`__${token}__`, () => value), text);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The Pages section, built from `ctxr publish urls`' report for the range —
|
|
56
|
+
* every value copied from it, never rebuilt from a path — or null when the
|
|
57
|
+
* report lists no page. The sentences are `templates/session/pages/`'s.
|
|
58
|
+
*/
|
|
59
|
+
export function renderPagesSection(pages, base, baseUrlDeclared) {
|
|
60
|
+
if (pages.length === 0)
|
|
61
|
+
return null;
|
|
62
|
+
const template = (name) => packagedTemplate('session/pages', name);
|
|
63
|
+
const previews = pages.some((p) => p.preview !== null);
|
|
64
|
+
const rows = pages.map((page) => {
|
|
65
|
+
let published = page.status === 'removed' ? fill(template('stops-working'), { ADDRESS: show(page.published) }) : show(page.published);
|
|
66
|
+
if (page.moved_from !== null)
|
|
67
|
+
published = fill(template('moved'), { ADDRESS: published, PATH: page.moved_from.path, OLD: show(page.moved_from.published) });
|
|
68
|
+
const cells = [`\`${page.path}\``, page.status, page.lifespan, ...(previews ? [page.preview === null ? '' : show(page.preview)] : []), published];
|
|
69
|
+
return `| ${cells.join(' | ')} |`;
|
|
70
|
+
});
|
|
71
|
+
let text = template('block').replaceAll('__BASE__', () => base);
|
|
72
|
+
text = substituteBlock(text, '__TABLE__', [...template(previews ? 'table-head-preview' : 'table-head').split('\n'), ...rows]);
|
|
73
|
+
text = substituteBlock(text, '__CONDITION__', template(previews ? 'condition-preview' : 'condition').split('\n'));
|
|
74
|
+
text = substituteBlock(text, '__BARE_ROUTE__', baseUrlDeclared ? [] : template('bare-route').split('\n'));
|
|
75
|
+
return text;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* D2: the body the pull request carries — the agent's, then the Pages section when there is one, then the Knowledge
|
|
79
|
+
* changes block verbatim, then (approve-sessions-across-stores) the session marker, last, when the session has an
|
|
80
|
+
* identity.
|
|
81
|
+
*/
|
|
82
|
+
async function pullBody(session, base, body, identity) {
|
|
83
|
+
const store = await openWorktreeStore(session);
|
|
84
|
+
const knowledge = (await graphDiffCommand.execute(store, { since: base, until: undefined, format: 'markdown' })).humanSummary;
|
|
85
|
+
const pages = renderPagesSection(await pageUrlsFor(store, [`${base}...HEAD`]), base, store.config.serve?.base_url !== undefined);
|
|
86
|
+
return [body.trim(), ...(pages === null ? [] : [pages]), knowledge, ...(identity === null ? [] : [sessionMarker(identity)])].join('\n\n');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The approval page for the session: the home store's, by the home session's name, for a session joined from a
|
|
90
|
+
* mount (approve-sessions-across-stores); otherwise this store's, by the worktree's name.
|
|
91
|
+
*/
|
|
92
|
+
async function sessionApprovalAddress(deps, session, identity) {
|
|
93
|
+
if (identity !== null) {
|
|
94
|
+
const mounting = await mountingStoreOf(session.path);
|
|
95
|
+
const ownSlug = await repositorySlug(deps.git, session.path);
|
|
96
|
+
if (mounting !== null && identity.home !== ownSlug)
|
|
97
|
+
return approvalAddress(mounting.config, sessionRouteName(identity));
|
|
98
|
+
}
|
|
99
|
+
return approvalAddress(deps.config, session.name);
|
|
100
|
+
}
|
|
101
|
+
export function approvalAddress(config, name) {
|
|
102
|
+
if (config.change_approval === undefined)
|
|
103
|
+
return null;
|
|
104
|
+
const route = `/approve/${encodeURIComponent(name)}/`;
|
|
105
|
+
const baseUrl = config.serve?.base_url;
|
|
106
|
+
return baseUrl === undefined ? route : `${baseUrl.replace(/\/+$/, '')}${route}`;
|
|
107
|
+
}
|
|
108
|
+
async function checkBranchName(deps, session, wanted) {
|
|
109
|
+
const { git } = deps;
|
|
110
|
+
const refuse = (reason, message) => stopped(ExitCode.Usage, reason, 'arguments', {}, message, { branch: wanted });
|
|
111
|
+
const format = await git.run(['check-ref-format', '--branch', wanted], { cwd: session.path, allowFailure: true });
|
|
112
|
+
if (format.exitCode !== 0 || wanted.startsWith('-'))
|
|
113
|
+
throw refuse('branch_invalid', `"${wanted}" is not a usable branch name.`);
|
|
114
|
+
if (wanted === deps.config.git.default_branch)
|
|
115
|
+
throw refuse('branch_is_default', `"${wanted}" is the default branch; a session is never pushed to it.`);
|
|
116
|
+
if (wanted === session.branch)
|
|
117
|
+
return;
|
|
118
|
+
const local = await git.run(['rev-parse', '--verify', '--quiet', `refs/heads/${wanted}`], { cwd: session.path, allowFailure: true });
|
|
119
|
+
if (local.exitCode === 0)
|
|
120
|
+
throw refuse('branch_taken', `A branch named "${wanted}" already exists in this repository; give this session another name.`);
|
|
121
|
+
if (await hasRemote(git, session.path)) {
|
|
122
|
+
let onRemote = null;
|
|
123
|
+
try {
|
|
124
|
+
onRemote = await remoteTip(deps, session.path, wanted);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
if (!(err instanceof SessionRemoteError))
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
if (onRemote !== null)
|
|
131
|
+
throw refuse('branch_taken', `The remote already has a branch named "${wanted}"; give this session another name.`);
|
|
132
|
+
}
|
|
133
|
+
// Renaming a branch whose pull request is open would strand that pull request and open a second one.
|
|
134
|
+
let pulls;
|
|
135
|
+
try {
|
|
136
|
+
pulls = await deps.forge.pullsForHead(session.branch);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
if (!(err instanceof ForgeRequestError))
|
|
140
|
+
throw err;
|
|
141
|
+
throw stopped(ExitCode.CheckFailed, 'forge_unreachable', 'arguments', {}, `The forge could not be read to check "${session.branch}" for an open pull request before renaming it (${firstLines(err.message, 2)}); nothing was done.`);
|
|
142
|
+
}
|
|
143
|
+
const open = pulls.find((p) => p.state === 'open');
|
|
144
|
+
if (open !== undefined) {
|
|
145
|
+
throw refuse('branch_has_pull_request', `"${session.name}" already has pull request #${open.number} open on branch "${session.branch}"; submit it again with --branch "${session.branch}".`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export async function submitSession(deps, session, input) {
|
|
149
|
+
const { git } = deps;
|
|
150
|
+
const cwd = session.path;
|
|
151
|
+
const run = (args) => git.run(args, { cwd, allowFailure: true });
|
|
152
|
+
for (const [name, value] of [['--message', input.message], ['--title', input.title], ['--body', input.body]]) {
|
|
153
|
+
if (value.trim() === '')
|
|
154
|
+
throw stopped(ExitCode.Usage, 'argument_empty', 'arguments', {}, `${name} cannot be empty.`);
|
|
155
|
+
}
|
|
156
|
+
// approve-sessions-across-stores: only the command writes the session marker, so an agent's body cannot claim a session.
|
|
157
|
+
const claimed = findSessionMarker(input.body);
|
|
158
|
+
if (claimed !== null) {
|
|
159
|
+
throw stopped(ExitCode.Usage, 'body_has_session_marker', 'arguments', {}, `The body carries a session marker (${claimed}), which \`ctxr session submit\` writes itself; leave it out of the body.`, { marker: claimed });
|
|
160
|
+
}
|
|
161
|
+
const heading = headingInBody(input.body);
|
|
162
|
+
if (heading !== null) {
|
|
163
|
+
throw stopped(ExitCode.Usage, 'body_has_generated_section', 'arguments', {}, `The body carries a "${heading}" section, which \`ctxr session submit\` writes itself; leave it out of the body.`, { heading });
|
|
164
|
+
}
|
|
165
|
+
if (await rebaseInProgress(git, cwd)) {
|
|
166
|
+
throw stopped(ExitCode.CheckFailed, 'rebase_in_progress', 'arguments', {}, `A rebase is in progress in "${session.name}"; finish it with \`ctxr session rebase ${session.name} --continue\` or undo it with \`ctxr session rebase ${session.name} --abort\`.`);
|
|
167
|
+
}
|
|
168
|
+
await checkBranchName(deps, session, input.branch);
|
|
169
|
+
// Read before any rename: a session started on a generated or joined branch keeps that identity after it is renamed.
|
|
170
|
+
const identity = await identityOfWorktree(git, deps.config, session.path, session.name, session.branch);
|
|
171
|
+
// Revision 2: the whole index, whoever staged it, is checked before anything is staged, so a refusal leaves it as it was.
|
|
172
|
+
const prefix = (await git.run(['rev-parse', '--show-prefix'], { cwd: session.storeRoot })).stdout.trim();
|
|
173
|
+
const derived = deps.config.derived.paths.map((p) => `${prefix}${p}`);
|
|
174
|
+
const indexed = (await run(['diff', '--cached', '--name-status', '--no-renames', '-z'])).stdout.split('\0');
|
|
175
|
+
const derivedStaged = [];
|
|
176
|
+
for (let i = 0; i + 1 < indexed.length; i += 2) {
|
|
177
|
+
if (indexed[i] !== 'D' && derived.some((d) => under(indexed[i + 1], d)))
|
|
178
|
+
derivedStaged.push(indexed[i + 1]);
|
|
179
|
+
}
|
|
180
|
+
if (derivedStaged.length > 0) {
|
|
181
|
+
throw stopped(ExitCode.CheckFailed, 'derived_path_staged', 'staged', {}, `${derivedStaged.map((p) => `"${p}"`).join(', ')} ${derivedStaged.length === 1 ? 'is' : 'are'} staged under a derived path, which is never committed; unstage ${derivedStaged.length === 1 ? 'it' : 'them'} with \`git restore --staged\` and submit again.`, { paths: derivedStaged });
|
|
182
|
+
}
|
|
183
|
+
const added = await run(['add', '-A', '--', ':/', ...derived.map((d) => `:(top,exclude)${d}`)]);
|
|
184
|
+
if (added.exitCode !== 0)
|
|
185
|
+
throw stopped(ExitCode.CheckFailed, 'stage_failed', 'staged', {}, `The session's changes could not be staged: ${added.stderr.trim()}`);
|
|
186
|
+
const staged = (await run(['diff', '--cached', '--name-only', '-z'])).stdout.split('\0').filter((p) => p !== '');
|
|
187
|
+
const completed = { staged };
|
|
188
|
+
const base = await baseRef(git, cwd, deps.config.git.default_branch);
|
|
189
|
+
if (staged.length === 0 && (await commitsAhead(git, cwd, base)) === 0) {
|
|
190
|
+
throw stopped(ExitCode.CheckFailed, 'nothing_to_submit', 'staged', completed, `"${session.name}" has no changes and no commits ahead of ${base}, so there is nothing to submit.`);
|
|
191
|
+
}
|
|
192
|
+
// D1, point 2: the gate is doctor's own store-scope pass, run against the worktree — no second validator.
|
|
193
|
+
// A store doctor cannot even read (a note with unparseable frontmatter) fails the gate as well.
|
|
194
|
+
const doctor = await openWorktreeStore(session)
|
|
195
|
+
.then((store) => doctorCommand.execute({ git }, store))
|
|
196
|
+
.catch((err) => {
|
|
197
|
+
if (err instanceof ContextureError)
|
|
198
|
+
return { exitCode: err.exitCode, findings: [err.finding] };
|
|
199
|
+
throw err;
|
|
200
|
+
});
|
|
201
|
+
if (doctor.exitCode !== ExitCode.Ok) {
|
|
202
|
+
const errors = doctor.findings.filter((f) => f.severity === 'error');
|
|
203
|
+
const listed = errors.slice(0, 5).map((f) => `${f.code}: ${f.message}`).join('; ');
|
|
204
|
+
throw stopped(ExitCode.CheckFailed, 'gate_failed', 'gate', completed, `\`ctxr doctor\` fails in "${session.name}", so nothing was committed: ${listed}${errors.length > 5 ? ` (and ${errors.length - 5} more)` : ''}`, { findings: errors });
|
|
205
|
+
}
|
|
206
|
+
completed.gate = 'pass';
|
|
207
|
+
completed.commit = null;
|
|
208
|
+
if (staged.length > 0) {
|
|
209
|
+
const committed = await commitStaged(git, cwd, deps.env, { ...deps.commit, message: input.message });
|
|
210
|
+
if (committed.exitCode !== 0) {
|
|
211
|
+
throw stopped(ExitCode.CheckFailed, 'commit_refused', 'commit', completed, `The commit was refused: ${`${committed.stdout}\n${committed.stderr}`.trim()}`);
|
|
212
|
+
}
|
|
213
|
+
completed.commit = (await run(['rev-parse', 'HEAD'])).stdout.trim();
|
|
214
|
+
}
|
|
215
|
+
let renamedFrom = null;
|
|
216
|
+
if (input.branch !== session.branch) {
|
|
217
|
+
const renamed = await run(['branch', '-m', input.branch]);
|
|
218
|
+
if (renamed.exitCode !== 0)
|
|
219
|
+
throw stopped(ExitCode.CheckFailed, 'rename_failed', 'branch', completed, `The branch could not be renamed to "${input.branch}": ${renamed.stderr.trim()}`);
|
|
220
|
+
renamedFrom = session.branch;
|
|
221
|
+
}
|
|
222
|
+
completed.branch = renamedFrom === null ? 'kept' : 'renamed';
|
|
223
|
+
const target = { path: cwd, branch: input.branch };
|
|
224
|
+
let published;
|
|
225
|
+
try {
|
|
226
|
+
published = await publishSession(deps, target, { title: input.title, body: await pullBody(session, base, input.body, identity) }, { update: true });
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
if (!(err instanceof SessionRemoteError))
|
|
230
|
+
throw err;
|
|
231
|
+
throw stopped(ExitCode.CheckFailed, err.step === 'push' ? 'push_failed' : 'pull_request_failed', err.step, completed, `${err.step === 'push' ? `The branch "${input.branch}" could not be pushed` : 'The branch is pushed, but its pull request could not be opened or updated'} (${err.detail}). Everything before this step is in place; run the same submit again to finish.`);
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
session: session.name,
|
|
235
|
+
worktree: cwd,
|
|
236
|
+
branch: input.branch,
|
|
237
|
+
renamed_from: renamedFrom,
|
|
238
|
+
head: (await run(['rev-parse', 'HEAD'])).stdout.trim(),
|
|
239
|
+
steps: { staged, gate: 'pass', commit: completed.commit, branch: completed.branch, push: published.push, pull_request: published.pullRequest },
|
|
240
|
+
pull_request: { number: published.pull.number, url: published.pull.url },
|
|
241
|
+
session_identity: identity,
|
|
242
|
+
approval_url: await sessionApprovalAddress(deps, session, identity),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** `--body-file`: the body read from a file, relative to `cwd`. */
|
|
246
|
+
export async function readBodyFile(cwd, file) {
|
|
247
|
+
try {
|
|
248
|
+
return await readFile(path.resolve(cwd, file), 'utf8');
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
throw stopped(ExitCode.Usage, 'body_file_unreadable', 'arguments', {}, `--body-file "${file}" cannot be read (${err.code ?? 'error'}).`, { file });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/core/session/submit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StoreConfig } from '../config/schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* mount-shared-stores: the fixed directory every mount sits under (D3, and the
|
|
4
|
+
* critique's first revision). Fixed rather than configurable because path links
|
|
5
|
+
* written into notes carry it, so it has to mean the same thing in every store.
|
|
6
|
+
*
|
|
7
|
+
* Kept apart from `shared-stores.ts` because note enumeration needs it, and
|
|
8
|
+
* `shared-stores.ts` itself enumerates notes.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SHARED_STORES_DIR = "shared";
|
|
11
|
+
/** A mount's store-relative location, `shared/<name>`. */
|
|
12
|
+
export declare function mountLocation(name: string): string;
|
|
13
|
+
/** Whether the store declares any mounts. A store with no `shared_stores` key behaves exactly as before. */
|
|
14
|
+
export declare function declaresSharedStores(config: StoreConfig): boolean;
|
|
15
|
+
/** Every declared mount's location: the owning-store scopes link resolution splits a read view by. */
|
|
16
|
+
export declare function mountScopes(config: StoreConfig): string[];
|
|
17
|
+
//# sourceMappingURL=shared-stores-location.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-location.d.ts","sourceRoot":"","sources":["../../src/core/shared-stores-location.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAEzD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mount-shared-stores: the fixed directory every mount sits under (D3, and the
|
|
3
|
+
* critique's first revision). Fixed rather than configurable because path links
|
|
4
|
+
* written into notes carry it, so it has to mean the same thing in every store.
|
|
5
|
+
*
|
|
6
|
+
* Kept apart from `shared-stores.ts` because note enumeration needs it, and
|
|
7
|
+
* `shared-stores.ts` itself enumerates notes.
|
|
8
|
+
*/
|
|
9
|
+
export const SHARED_STORES_DIR = 'shared';
|
|
10
|
+
/** A mount's store-relative location, `shared/<name>`. */
|
|
11
|
+
export function mountLocation(name) {
|
|
12
|
+
return `${SHARED_STORES_DIR}/${name}`;
|
|
13
|
+
}
|
|
14
|
+
/** Whether the store declares any mounts. A store with no `shared_stores` key behaves exactly as before. */
|
|
15
|
+
export function declaresSharedStores(config) {
|
|
16
|
+
return (config.shared_stores ?? []).length > 0;
|
|
17
|
+
}
|
|
18
|
+
/** Every declared mount's location: the owning-store scopes link resolution splits a read view by. */
|
|
19
|
+
export function mountScopes(config) {
|
|
20
|
+
return (config.shared_stores ?? []).map((mount) => mountLocation(mount.name));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=shared-stores-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-location.js","sourceRoot":"","sources":["../../src/core/shared-stores-location.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,iBAAiB,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { StoreConfig } from '../config/schema.js';
|
|
2
|
+
import { type GraphBuildResult } from './graph/model.js';
|
|
3
|
+
import { type Note } from './notes/list.js';
|
|
4
|
+
export { mainWorkingTreeRoot } from './git/repo.js';
|
|
5
|
+
export { SHARED_STORES_DIR, declaresSharedStores, mountLocation, mountScopes } from './shared-stores-location.js';
|
|
6
|
+
export type MountState = {
|
|
7
|
+
name: string;
|
|
8
|
+
url: string;
|
|
9
|
+
location: string;
|
|
10
|
+
root: string;
|
|
11
|
+
state: 'present';
|
|
12
|
+
config: StoreConfig;
|
|
13
|
+
} | {
|
|
14
|
+
name: string;
|
|
15
|
+
url: string;
|
|
16
|
+
location: string;
|
|
17
|
+
root: string;
|
|
18
|
+
state: 'absent';
|
|
19
|
+
} | {
|
|
20
|
+
name: string;
|
|
21
|
+
url: string;
|
|
22
|
+
location: string;
|
|
23
|
+
root: string;
|
|
24
|
+
state: 'not_store';
|
|
25
|
+
reason: string;
|
|
26
|
+
};
|
|
27
|
+
/** Every declared mount and whether it can join the read view, read from the main working tree. */
|
|
28
|
+
export declare function resolveMounts(storeRoot: string, config: StoreConfig): Promise<MountState[]>;
|
|
29
|
+
export interface ReadView {
|
|
30
|
+
/** The store's own notes, then each present mount's, every mounted path prefixed by its location. */
|
|
31
|
+
notes: Note[];
|
|
32
|
+
/** The location prefix of every mount that contributed notes; link resolution scopes by these. */
|
|
33
|
+
scopes: string[];
|
|
34
|
+
mounts: MountState[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* context-retrieval (mount-shared-stores): the store's own notes plus each
|
|
38
|
+
* present mount's, each admitted by the configuration of the store that owns
|
|
39
|
+
* it (D5). A store with no mounts gets exactly its own notes and no scopes.
|
|
40
|
+
*/
|
|
41
|
+
export declare function listReadView(storeRoot: string, config: StoreConfig): Promise<ReadView>;
|
|
42
|
+
/** The graph of a store's read view: the one build every caller that writes or compares the persisted graph uses. */
|
|
43
|
+
export declare function buildReadViewGraph(storeRoot: string, config: StoreConfig): Promise<{
|
|
44
|
+
graph: GraphBuildResult;
|
|
45
|
+
view: ReadView;
|
|
46
|
+
}>;
|
|
47
|
+
export interface UnavailableMount {
|
|
48
|
+
name: string;
|
|
49
|
+
location: string;
|
|
50
|
+
state: 'absent' | 'not_store';
|
|
51
|
+
reason?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Mounts a read view could not include, as report lines. */
|
|
54
|
+
export declare function unavailableMounts(mounts: readonly MountState[]): UnavailableMount[];
|
|
55
|
+
export interface MountingStore {
|
|
56
|
+
/** The main working tree of the store that declares this one as a mount. */
|
|
57
|
+
root: string;
|
|
58
|
+
config: StoreConfig;
|
|
59
|
+
/** The name it declares this store under. */
|
|
60
|
+
mountName: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* approve-sessions-across-stores: the store that mounts the store at
|
|
64
|
+
* `storeRoot`, when `storeRoot` is (or is a worktree of) a clone at
|
|
65
|
+
* `shared/<name>` of a store that declares a mount named `<name>`; null
|
|
66
|
+
* otherwise. Decided from the filesystem and that store's configuration alone.
|
|
67
|
+
*/
|
|
68
|
+
export declare function mountingStoreOf(storeRoot: string): Promise<MountingStore | null>;
|
|
69
|
+
//# sourceMappingURL=shared-stores.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores.d.ts","sourceRoot":"","sources":["../../src/core/shared-stores.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAElH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACpG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,mGAAmG;AACnG,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBjG;AAED,MAAM,WAAW,QAAQ;IACvB,qGAAqG;IACrG,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,kGAAkG;IAClG,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAe5F;AAED,qHAAqH;AACrH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAGrI;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAOnF;AAED,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAetF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { readConfig } from '../config/load.js';
|
|
4
|
+
import { mainWorkingTreeRoot } from './git/repo.js';
|
|
5
|
+
import { buildGraphFromNotes, graphBuildOptions } from './graph/model.js';
|
|
6
|
+
import { listNotes } from './notes/list.js';
|
|
7
|
+
import { CONFIG_FILE_NAME } from './root.js';
|
|
8
|
+
import { declaresSharedStores, mountLocation, mountScopes, SHARED_STORES_DIR as SHARED_STORES_DIR_NAME } from './shared-stores-location.js';
|
|
9
|
+
export { mainWorkingTreeRoot } from './git/repo.js';
|
|
10
|
+
export { SHARED_STORES_DIR, declaresSharedStores, mountLocation, mountScopes } from './shared-stores-location.js';
|
|
11
|
+
/** Every declared mount and whether it can join the read view, read from the main working tree. */
|
|
12
|
+
export async function resolveMounts(storeRoot, config) {
|
|
13
|
+
const mainRoot = mainWorkingTreeRoot(storeRoot);
|
|
14
|
+
const states = [];
|
|
15
|
+
for (const mount of config.shared_stores ?? []) {
|
|
16
|
+
const location = mountLocation(mount.name);
|
|
17
|
+
const root = path.join(mainRoot, ...location.split('/'));
|
|
18
|
+
const base = { name: mount.name, url: mount.url, location, root };
|
|
19
|
+
if (!existsSync(root)) {
|
|
20
|
+
states.push({ ...base, state: 'absent' });
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!existsSync(path.join(root, CONFIG_FILE_NAME))) {
|
|
24
|
+
states.push({ ...base, state: 'not_store', reason: `no ${CONFIG_FILE_NAME} at the mount's root` });
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
states.push({ ...base, state: 'present', config: await readConfig(root) });
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
states.push({ ...base, state: 'not_store', reason: err instanceof Error ? err.message : String(err) });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return states;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* context-retrieval (mount-shared-stores): the store's own notes plus each
|
|
38
|
+
* present mount's, each admitted by the configuration of the store that owns
|
|
39
|
+
* it (D5). A store with no mounts gets exactly its own notes and no scopes.
|
|
40
|
+
*/
|
|
41
|
+
export async function listReadView(storeRoot, config) {
|
|
42
|
+
const own = await listNotes(storeRoot, config);
|
|
43
|
+
if (!declaresSharedStores(config))
|
|
44
|
+
return { notes: own, scopes: [], mounts: [] };
|
|
45
|
+
const mounts = await resolveMounts(storeRoot, config);
|
|
46
|
+
const notes = [...own];
|
|
47
|
+
const scopes = [];
|
|
48
|
+
for (const mount of mounts) {
|
|
49
|
+
if (mount.state !== 'present')
|
|
50
|
+
continue;
|
|
51
|
+
scopes.push(mount.location);
|
|
52
|
+
for (const note of await listNotes(mount.root, mount.config)) {
|
|
53
|
+
notes.push({ ...note, path: `${mount.location}/${note.path}` });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { notes, scopes, mounts };
|
|
57
|
+
}
|
|
58
|
+
/** The graph of a store's read view: the one build every caller that writes or compares the persisted graph uses. */
|
|
59
|
+
export async function buildReadViewGraph(storeRoot, config) {
|
|
60
|
+
const view = await listReadView(storeRoot, config);
|
|
61
|
+
return { graph: buildGraphFromNotes(view.notes, { ...graphBuildOptions(config), scopes: mountScopes(config) }), view };
|
|
62
|
+
}
|
|
63
|
+
/** Mounts a read view could not include, as report lines. */
|
|
64
|
+
export function unavailableMounts(mounts) {
|
|
65
|
+
const unavailable = [];
|
|
66
|
+
for (const mount of mounts) {
|
|
67
|
+
if (mount.state === 'absent')
|
|
68
|
+
unavailable.push({ name: mount.name, location: mount.location, state: 'absent' });
|
|
69
|
+
else if (mount.state === 'not_store')
|
|
70
|
+
unavailable.push({ name: mount.name, location: mount.location, state: 'not_store', reason: mount.reason });
|
|
71
|
+
}
|
|
72
|
+
return unavailable;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* approve-sessions-across-stores: the store that mounts the store at
|
|
76
|
+
* `storeRoot`, when `storeRoot` is (or is a worktree of) a clone at
|
|
77
|
+
* `shared/<name>` of a store that declares a mount named `<name>`; null
|
|
78
|
+
* otherwise. Decided from the filesystem and that store's configuration alone.
|
|
79
|
+
*/
|
|
80
|
+
export async function mountingStoreOf(storeRoot) {
|
|
81
|
+
const clone = mainWorkingTreeRoot(storeRoot);
|
|
82
|
+
const sharedDir = path.dirname(clone);
|
|
83
|
+
if (path.basename(sharedDir) !== SHARED_STORES_DIR_NAME)
|
|
84
|
+
return null;
|
|
85
|
+
const root = path.dirname(sharedDir);
|
|
86
|
+
if (!existsSync(path.join(root, CONFIG_FILE_NAME)))
|
|
87
|
+
return null;
|
|
88
|
+
let config;
|
|
89
|
+
try {
|
|
90
|
+
config = await readConfig(root);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const mountName = path.basename(clone);
|
|
96
|
+
if (!(config.shared_stores ?? []).some((mount) => mount.name === mountName))
|
|
97
|
+
return null;
|
|
98
|
+
return { root, config, mountName };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=shared-stores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores.js","sourceRoot":"","sources":["../../src/core/shared-stores.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAyB,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,SAAS,EAAa,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE5I,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAOlH,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB,EAAE,MAAmB;IACxE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,sBAAsB,EAAE,CAAC,CAAC;YACnG,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,MAAmB;IACvE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,qHAAqH;AACrH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,MAAmB;IAC7E,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AACzH,CAAC;AASD,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,MAA6B;IAC7D,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;aAC3G,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACnJ,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAUD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,sBAAsB;QAAE,OAAO,IAAI,CAAC;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACzF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/core/skills.js
CHANGED
|
@@ -18,7 +18,9 @@ function skillTemplate(slug) {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* ship-a-cross-model-second-opinion-skill D1: an owned skill may carry
|
|
21
|
-
* packaged files beside its SKILL.md — a runner script, prompt fragments
|
|
21
|
+
* packaged files beside its SKILL.md — a runner script, prompt fragments
|
|
22
|
+
* (today only `ctxr-capture-circleback`; run-the-second-opinion-from-the-cli
|
|
23
|
+
* moved the second opinion's into the CLI) —
|
|
22
24
|
* authored under `templates/skills/<slug>/`, next to the body template
|
|
23
25
|
* `templates/skills/<slug>.md`. Read verbatim (they are code and prompt
|
|
24
26
|
* text, not store-rendered prose, so no `__TOKEN__` substitution) and in
|
|
@@ -193,7 +195,7 @@ const MISSION = {
|
|
|
193
195
|
const SUBMIT = {
|
|
194
196
|
file: 'ctxr-submit',
|
|
195
197
|
name: 'Submit',
|
|
196
|
-
description: 'End a working session — re-scan, capture once,
|
|
198
|
+
description: 'End a working session — re-scan, capture once, hold one unit, validate, and open the reviewed pull request with ctxr session submit, which gates, commits, pushes and writes the generated sections.',
|
|
197
199
|
body: (config) => skillTemplate('ctxr-submit').replaceAll('__DEFAULT_BRANCH__', config.git.default_branch).split('\n'),
|
|
198
200
|
};
|
|
199
201
|
const LAND = {
|
|
@@ -205,7 +207,7 @@ const LAND = {
|
|
|
205
207
|
const SESSION_LIFECYCLE = {
|
|
206
208
|
file: 'ctxr-session-lifecycle',
|
|
207
209
|
name: 'Session lifecycle',
|
|
208
|
-
description: 'Start a session worktree, re-scan before any plan, resolve conflicts, sequence multiple pull requests, and reclaim worktrees with
|
|
210
|
+
description: 'Start a session worktree, re-scan before any plan, resolve conflicts, sequence multiple pull requests, and reclaim worktrees with the ctxr session commands — the frame ctxr-submit and ctxr-land sit inside.',
|
|
209
211
|
body: (config) => skillTemplate('ctxr-session-lifecycle').replaceAll('__DEFAULT_BRANCH__', config.git.default_branch).split('\n'),
|
|
210
212
|
};
|
|
211
213
|
/** Where this store's operator-authored conventions live, for a skill to name by path. */
|
|
@@ -252,18 +254,20 @@ const PUBLISH = {
|
|
|
252
254
|
body: () => skillTemplate('ctxr-publish').split('\n'),
|
|
253
255
|
};
|
|
254
256
|
/**
|
|
255
|
-
* ship-a-cross-model-second-opinion-skill
|
|
256
|
-
*
|
|
257
|
-
* `
|
|
258
|
-
*
|
|
259
|
-
*
|
|
257
|
+
* ship-a-cross-model-second-opinion-skill, revised by
|
|
258
|
+
* run-the-second-opinion-from-the-cli D1 and D4: the skill is one file again.
|
|
259
|
+
* Its runner became `ctxr second-opinion` and its prompts package templates
|
|
260
|
+
* under `templates/second-opinion/`, so it carries no supporting files, and
|
|
261
|
+
* `ctxr update` prunes the `run.mjs`, `critic-contract.md`, `lenses.md` and
|
|
262
|
+
* `personas/` an earlier release left in a store. Named for the command
|
|
263
|
+
* group it drives, `ctxr second-opinion`; the judgment (when to critique,
|
|
264
|
+
* how to synthesize, what never to execute) stays in the skill.
|
|
260
265
|
*/
|
|
261
266
|
const SECOND_OPINION = {
|
|
262
267
|
file: 'ctxr-second-opinion',
|
|
263
268
|
name: 'Second opinion',
|
|
264
269
|
description: 'Get an independent critique of a plan, or a poll on a taste call, from three different model families run in parallel, and synthesize their answers without running the plan.',
|
|
265
|
-
body: (
|
|
266
|
-
supportingFiles: () => skillSupportingFiles('ctxr-second-opinion'),
|
|
270
|
+
body: () => skillTemplate('ctxr-second-opinion').split('\n'),
|
|
267
271
|
};
|
|
268
272
|
/**
|
|
269
273
|
* research-and-capture-identity: the research method, written against whatever
|