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,43 @@
|
|
|
1
|
+
import { SessionRefusedError } from '../core/errors.js';
|
|
2
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
3
|
+
import { credentialsFor } from '../core/forge/credentials.js';
|
|
4
|
+
import { rebaseSession } from '../core/session/rebase.js';
|
|
5
|
+
import { resolveSession } from '../core/session/resolve.js';
|
|
6
|
+
export const requires = { store: 'required' };
|
|
7
|
+
/**
|
|
8
|
+
* write-lifecycle spec (*`ctxr session rebase` brings a session onto the
|
|
9
|
+
* default branch*): `3` with each conflicting path and both sides, leaving the
|
|
10
|
+
* rebase in progress for the agent to resolve; `0` when clean
|
|
11
|
+
* (bring-the-session-lifecycle-into-the-cli D3).
|
|
12
|
+
*/
|
|
13
|
+
export async function execute(env, store, opts) {
|
|
14
|
+
if (opts.continue === true && opts.abort === true) {
|
|
15
|
+
throw new SessionRefusedError(ExitCode.Usage, 'rebase_flags', 'Pass --continue or --abort, not both.');
|
|
16
|
+
}
|
|
17
|
+
const session = await resolveSession(env.git, store.root, store.config, opts.session, env.cwd);
|
|
18
|
+
const credentials = await credentialsFor(env, session.path);
|
|
19
|
+
const mode = opts.continue === true ? 'continue' : opts.abort === true ? 'abort' : 'start';
|
|
20
|
+
const result = await rebaseSession({ git: env.git, config: store.config, env: env.env, credentials }, session, mode);
|
|
21
|
+
const findings = result.conflicts.map((c) => ({
|
|
22
|
+
code: 'session.rebase_conflict',
|
|
23
|
+
severity: 'error',
|
|
24
|
+
message: `"${c.path}" conflicts: resolve it keeping both sides' meaning, then run \`ctxr session rebase ${result.session} --continue\`.`,
|
|
25
|
+
subject: c.path,
|
|
26
|
+
}));
|
|
27
|
+
const summary = result.outcome === 'conflict'
|
|
28
|
+
? [`Rebasing "${result.session}" onto ${result.onto} stopped on ${result.conflicts.length} conflict(s):`, ...result.conflicts.map((c) => ` ${c.path}`)].join('\n')
|
|
29
|
+
: result.outcome === 'aborted'
|
|
30
|
+
? `The rebase of "${result.session}" was aborted; it is back at ${result.head.slice(0, 7)}.`
|
|
31
|
+
: result.outcome === 'up-to-date'
|
|
32
|
+
? `"${result.session}" is already on ${result.onto}.`
|
|
33
|
+
: `"${result.session}" is rebased onto ${result.onto}, at ${result.head.slice(0, 7)}.`;
|
|
34
|
+
return {
|
|
35
|
+
exitCode: result.outcome === 'conflict' ? ExitCode.CheckFailed : ExitCode.Ok,
|
|
36
|
+
data: result,
|
|
37
|
+
findings,
|
|
38
|
+
humanSummary: summary,
|
|
39
|
+
storeRoot: store.root,
|
|
40
|
+
schemaVersion: store.config.schema_version,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=session-rebase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-rebase.js","sourceRoot":"","sources":["../../src/commands/session-rebase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
2
|
import type { RunEnv } from '../core/env.js';
|
|
3
|
+
import { type SessionIdentity } from '../core/approval/session-marker.js';
|
|
3
4
|
import type { Store } from '../core/store.js';
|
|
4
5
|
export declare const requires: CommandRequires;
|
|
5
6
|
export interface SessionStartData {
|
|
@@ -9,10 +10,17 @@ export interface SessionStartData {
|
|
|
9
10
|
fetched: boolean;
|
|
10
11
|
/** The normalized label this session was named with, or null when none was given. */
|
|
11
12
|
label: string | null;
|
|
13
|
+
/**
|
|
14
|
+
* approve-sessions-across-stores: the session this worktree belongs to — its home store's forge slug and the home
|
|
15
|
+
* session's branch. Null when the store has no `origin` to name it by.
|
|
16
|
+
*/
|
|
17
|
+
session: SessionIdentity | null;
|
|
12
18
|
}
|
|
13
19
|
export interface SessionStartOptions {
|
|
14
20
|
/** A short name for what the session is for; becomes part of the branch and worktree name. */
|
|
15
21
|
label?: string;
|
|
22
|
+
/** A live session of the store that mounts this one, by worktree name or branch: start a session joined to it. */
|
|
23
|
+
joins?: string;
|
|
16
24
|
}
|
|
17
25
|
/**
|
|
18
26
|
* write-lifecycle spec: "session start (an isolated git worktree off a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,EAA4D,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAGpI,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kHAAkH;IAClH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8BD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAiE3C"}
|
|
@@ -1,9 +1,39 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
1
2
|
import { ExitCode } from '../core/exit-codes.js';
|
|
2
|
-
import { SessionLabelUnusableError, SessionNameExistsError, SessionWorktreeRefusedError } from '../core/errors.js';
|
|
3
|
+
import { SessionLabelUnusableError, SessionNameExistsError, SessionRefusedError, SessionWorktreeRefusedError } from '../core/errors.js';
|
|
3
4
|
import { addWorktree, fetchOrigin, hasRemote } from '../core/git/worktree.js';
|
|
5
|
+
import { sessionWorktrees } from '../core/approval/sessions.js';
|
|
6
|
+
import { identityOfWorktree, joinedBranchName, joinedWorktreeName } from '../core/approval/session-marker.js';
|
|
4
7
|
import { findSessionWorktreeByLabel, generateSessionBranchName, sessionLabelSlug, worktreePathFor } from '../core/session.js';
|
|
8
|
+
import { mountingStoreOf } from '../core/shared-stores.js';
|
|
5
9
|
import { updateAdvisory } from '../core/version-check.js';
|
|
6
10
|
export const requires = { store: 'required' };
|
|
11
|
+
function refuse(reason, message, details = {}) {
|
|
12
|
+
return new SessionRefusedError(ExitCode.Usage, reason, message, details);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* write-lifecycle spec ("A session can join a session in the store that mounts
|
|
16
|
+
* this one"): the joined branch and worktree name, or a refusal naming why —
|
|
17
|
+
* decided before anything is fetched or created.
|
|
18
|
+
*/
|
|
19
|
+
async function joinTarget(env, store, joins) {
|
|
20
|
+
const mounting = await mountingStoreOf(store.root);
|
|
21
|
+
if (mounting === null) {
|
|
22
|
+
throw refuse('join_not_a_mount', `"${store.root}" is not a store that another store mounts under shared/, so it cannot join a session there.`, { joins });
|
|
23
|
+
}
|
|
24
|
+
const sessions = await sessionWorktrees(env.git, mounting.root, mounting.config);
|
|
25
|
+
const target = sessions.find((s) => s.name === joins || s.branch === joins);
|
|
26
|
+
if (target === undefined) {
|
|
27
|
+
throw refuse('join_unknown_session', `The store at "${mounting.root}" has no live session named "${joins}"; \`ctxr session list\` there names them.`, { joins, store: mounting.root });
|
|
28
|
+
}
|
|
29
|
+
const home = await identityOfWorktree(env.git, mounting.config, target.path, target.name, target.branch);
|
|
30
|
+
if (home === null) {
|
|
31
|
+
throw refuse('join_no_home_slug', `The store at "${mounting.root}" has no "origin" remote to name it by, so a session cannot join it.`, { joins });
|
|
32
|
+
}
|
|
33
|
+
const homePrefix = mounting.config.session.branch_prefix;
|
|
34
|
+
const prefix = store.config.session.branch_prefix;
|
|
35
|
+
return { branch: joinedBranchName(prefix, home, homePrefix), worktreeName: joinedWorktreeName(prefix, home, homePrefix), home };
|
|
36
|
+
}
|
|
7
37
|
/**
|
|
8
38
|
* write-lifecycle spec: "session start (an isolated git worktree off a
|
|
9
39
|
* freshly fetched default branch)." When no remote is configured (a purely
|
|
@@ -13,6 +43,10 @@ export const requires = { store: 'required' };
|
|
|
13
43
|
export async function execute(env, store, opts = {}) {
|
|
14
44
|
const git = env.git;
|
|
15
45
|
const defaultBranch = store.config.git.default_branch;
|
|
46
|
+
if (opts.joins !== undefined && opts.label !== undefined) {
|
|
47
|
+
throw refuse('join_with_label', 'A joined session takes its name from the session it joins, so it takes no label.', { joins: opts.joins });
|
|
48
|
+
}
|
|
49
|
+
const joined = opts.joins === undefined ? null : await joinTarget(env, store, opts.joins);
|
|
16
50
|
// Ahead of the fetch, so a label that can never work costs no network round
|
|
17
51
|
// trip and leaves nothing behind.
|
|
18
52
|
let labelSlug = null;
|
|
@@ -37,26 +71,32 @@ export async function execute(env, store, opts = {}) {
|
|
|
37
71
|
// when the remote exists but doesn't yet have this branch (e.g. nothing
|
|
38
72
|
// has been pushed yet) — both are honest, expected states, not errors.
|
|
39
73
|
startPoint = fetched ? `origin/${defaultBranch}` : defaultBranch;
|
|
40
|
-
const branch = generateSessionBranchName(store.config, new Date(), labelSlug ?? undefined);
|
|
41
|
-
const worktreeDir = worktreePathFor(store, branch);
|
|
74
|
+
const branch = joined?.branch ?? generateSessionBranchName(store.config, new Date(), labelSlug ?? undefined);
|
|
75
|
+
const worktreeDir = joined === null ? worktreePathFor(store, branch) : path.join(store.root, store.config.session.worktrees_path, joined.worktreeName);
|
|
42
76
|
// git decides whether the worktree can actually be created: the label scan
|
|
43
77
|
// above knows nothing about an unusable branch prefix, an occupied path, or a
|
|
44
78
|
// repository problem, and any of those is still the caller's problem to see (D7).
|
|
45
79
|
const added = await addWorktree(git, store.root, worktreeDir, branch, startPoint, { allowFailure: true });
|
|
46
80
|
if (added.exitCode !== 0)
|
|
47
81
|
throw new SessionWorktreeRefusedError(branch, worktreeDir, added.stderr);
|
|
82
|
+
const session = joined?.home ?? (await identityOfWorktree(git, store.config, worktreeDir, path.basename(worktreeDir), branch));
|
|
48
83
|
// cli-contract: the skill-path trigger for the release advisory — once per
|
|
49
84
|
// session, at the command the lifecycle skill names first, on a command that
|
|
50
85
|
// already reaches the network to fetch the default branch. Deliberately
|
|
51
86
|
// AFTER the worktree exists: the advisory cannot fail this command, so
|
|
52
87
|
// nothing it does may precede the work it is advising about.
|
|
53
88
|
const advisory = await updateAdvisory(env, store);
|
|
89
|
+
const lines = [`Session worktree at "${worktreeDir}" on branch "${branch}" (from ${startPoint}).`];
|
|
90
|
+
if (joined !== null)
|
|
91
|
+
lines.push(`It joins the session ${joined.home.branch} of ${joined.home.home}.`);
|
|
92
|
+
else if (session !== null)
|
|
93
|
+
lines.push(`Session ${session.branch} of ${session.home}.`);
|
|
54
94
|
return {
|
|
55
95
|
exitCode: ExitCode.Ok,
|
|
56
|
-
data: { worktree: worktreeDir, branch, startPoint, fetched, label: labelSlug },
|
|
96
|
+
data: { worktree: worktreeDir, branch, startPoint, fetched, label: labelSlug, session },
|
|
57
97
|
findings: advisory.findings,
|
|
58
98
|
notices: advisory.notice ? [advisory.notice] : undefined,
|
|
59
|
-
humanSummary:
|
|
99
|
+
humanSummary: lines.join('\n'),
|
|
60
100
|
storeRoot: store.root,
|
|
61
101
|
schemaVersion: store.config.schema_version,
|
|
62
102
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { RunEnv } from '../core/env.js';
|
|
3
|
+
import { type SessionStatus } from '../core/session/status.js';
|
|
4
|
+
import type { Store } from '../core/store.js';
|
|
5
|
+
export declare const requires: CommandRequires;
|
|
6
|
+
export interface SessionStatusOptions {
|
|
7
|
+
session?: string;
|
|
8
|
+
diff?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* write-lifecycle spec (*`ctxr session status` re-scans a session*): the
|
|
12
|
+
* re-scan before any plan and before submit, in one command
|
|
13
|
+
* (bring-the-session-lifecycle-into-the-cli D3). With no session named it
|
|
14
|
+
* reads the session containing the working directory, and is refused outside one.
|
|
15
|
+
*/
|
|
16
|
+
export declare function execute(env: RunEnv, store: Store, opts?: SessionStatusOptions): Promise<CommandOutcome<SessionStatus>>;
|
|
17
|
+
//# sourceMappingURL=session-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-status.d.ts","sourceRoot":"","sources":["../../src/commands/session-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAqBhI"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
2
|
+
import { credentialsFor } from '../core/forge/credentials.js';
|
|
3
|
+
import { resolveSession } from '../core/session/resolve.js';
|
|
4
|
+
import { sessionStatus } from '../core/session/status.js';
|
|
5
|
+
export const requires = { store: 'required' };
|
|
6
|
+
/**
|
|
7
|
+
* write-lifecycle spec (*`ctxr session status` re-scans a session*): the
|
|
8
|
+
* re-scan before any plan and before submit, in one command
|
|
9
|
+
* (bring-the-session-lifecycle-into-the-cli D3). With no session named it
|
|
10
|
+
* reads the session containing the working directory, and is refused outside one.
|
|
11
|
+
*/
|
|
12
|
+
export async function execute(env, store, opts = {}) {
|
|
13
|
+
const session = await resolveSession(env.git, store.root, store.config, opts.session, env.cwd);
|
|
14
|
+
const credentials = await credentialsFor(env, session.path);
|
|
15
|
+
const status = await sessionStatus({ git: env.git, config: store.config, env: env.env, credentials }, session, { diff: opts.diff });
|
|
16
|
+
const lines = [`${status.session} on ${status.branch}: ${status.uncommitted.length} uncommitted, ${status.ahead} commit(s) ahead of ${status.base}${status.fetched ? '' : ' (not fetched)'}`];
|
|
17
|
+
if (status.rebase_in_progress)
|
|
18
|
+
lines.push(`A rebase is in progress: \`ctxr session rebase ${status.session} --continue\` or \`--abort\`.`);
|
|
19
|
+
for (const change of status.uncommitted)
|
|
20
|
+
lines.push(`${change.status} ${change.path}`);
|
|
21
|
+
for (const commit of status.commits)
|
|
22
|
+
lines.push(`${commit.sha.slice(0, 7)} ${commit.subject}`);
|
|
23
|
+
if (status.diff_stat.committed !== '')
|
|
24
|
+
lines.push('', 'Committed:', status.diff_stat.committed);
|
|
25
|
+
if (status.diff_stat.uncommitted !== '')
|
|
26
|
+
lines.push('', 'Uncommitted:', status.diff_stat.uncommitted);
|
|
27
|
+
if (status.diff !== null && status.diff !== '')
|
|
28
|
+
lines.push('', status.diff.replace(/\n$/, ''));
|
|
29
|
+
return {
|
|
30
|
+
exitCode: ExitCode.Ok,
|
|
31
|
+
data: status,
|
|
32
|
+
findings: [],
|
|
33
|
+
humanSummary: lines.join('\n'),
|
|
34
|
+
storeRoot: store.root,
|
|
35
|
+
schemaVersion: store.config.schema_version,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=session-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-status.js","sourceRoot":"","sources":["../../src/commands/session-status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAsB,MAAM,2BAA2B,CAAC;AAG9E,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAO/D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAY,EAAE,IAAI,GAAyB,EAAE;IACtF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAEpI,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,CAAC,MAAM,iBAAiB,MAAM,CAAC,KAAK,uBAAuB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC9L,IAAI,MAAM,CAAC,kBAAkB;QAAE,KAAK,CAAC,IAAI,CAAC,kDAAkD,MAAM,CAAC,OAAO,+BAA+B,CAAC,CAAC;IAC3I,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/F,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAChG,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACtG,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAE/F,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { RunEnv } from '../core/env.js';
|
|
3
|
+
import { type SubmitResult } from '../core/session/submit.js';
|
|
4
|
+
import type { Store } from '../core/store.js';
|
|
5
|
+
export declare const requires: CommandRequires;
|
|
6
|
+
export interface SessionSubmitOptions {
|
|
7
|
+
session: string;
|
|
8
|
+
branch: string;
|
|
9
|
+
message: string;
|
|
10
|
+
title: string;
|
|
11
|
+
body?: string;
|
|
12
|
+
bodyFile?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* write-lifecycle spec (*`ctxr session submit` gates, commits, pushes and
|
|
16
|
+
* opens the pull request*): the request to submit is the consent, as it was
|
|
17
|
+
* when the skill ran `git push` and `gh pr create` itself, so the command adds
|
|
18
|
+
* no prompt (bring-the-session-lifecycle-into-the-cli, proposal Non-goals).
|
|
19
|
+
* Exit `0` with the pull request open, `3` when the gate or a later step
|
|
20
|
+
* stopped it, `2` for a refused argument (design.md D3).
|
|
21
|
+
*/
|
|
22
|
+
export declare function execute(env: RunEnv, store: Store, opts: SessionSubmitOptions): Promise<CommandOutcome<SubmitResult>>;
|
|
23
|
+
//# sourceMappingURL=session-submit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-submit.d.ts","sourceRoot":"","sources":["../../src/commands/session-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAyB1H"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { SessionRefusedError } from '../core/errors.js';
|
|
2
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
3
|
+
import { credentialsFor } from '../core/forge/credentials.js';
|
|
4
|
+
import { createGhForgeClient } from '../core/forge/github.js';
|
|
5
|
+
import { resolveSession } from '../core/session/resolve.js';
|
|
6
|
+
import { readBodyFile, submitSession } from '../core/session/submit.js';
|
|
7
|
+
export const requires = { store: 'required' };
|
|
8
|
+
/**
|
|
9
|
+
* write-lifecycle spec (*`ctxr session submit` gates, commits, pushes and
|
|
10
|
+
* opens the pull request*): the request to submit is the consent, as it was
|
|
11
|
+
* when the skill ran `git push` and `gh pr create` itself, so the command adds
|
|
12
|
+
* no prompt (bring-the-session-lifecycle-into-the-cli, proposal Non-goals).
|
|
13
|
+
* Exit `0` with the pull request open, `3` when the gate or a later step
|
|
14
|
+
* stopped it, `2` for a refused argument (design.md D3).
|
|
15
|
+
*/
|
|
16
|
+
export async function execute(env, store, opts) {
|
|
17
|
+
if ((opts.body === undefined) === (opts.bodyFile === undefined)) {
|
|
18
|
+
throw new SessionRefusedError(ExitCode.Usage, 'body_required', 'Give the pull request body with exactly one of --body or --body-file.', { step: 'arguments' });
|
|
19
|
+
}
|
|
20
|
+
const body = opts.body ?? (await readBodyFile(env.cwd, opts.bodyFile));
|
|
21
|
+
const session = await resolveSession(env.git, store.root, store.config, opts.session, env.cwd);
|
|
22
|
+
const credentials = await credentialsFor(env, session.path);
|
|
23
|
+
const forge = createGhForgeClient(session.path, credentials);
|
|
24
|
+
const result = await submitSession({ git: env.git, config: store.config, credentials, forge, env: env.env }, session, {
|
|
25
|
+
branch: opts.branch,
|
|
26
|
+
message: opts.message,
|
|
27
|
+
title: opts.title,
|
|
28
|
+
body,
|
|
29
|
+
});
|
|
30
|
+
const lines = [`Pull request #${result.pull_request.number} (${result.steps.pull_request}) for "${result.branch}": ${result.pull_request.url}`];
|
|
31
|
+
if (result.approval_url !== null)
|
|
32
|
+
lines.push(`Approval page: ${result.approval_url}`);
|
|
33
|
+
return {
|
|
34
|
+
exitCode: ExitCode.Ok,
|
|
35
|
+
data: result,
|
|
36
|
+
findings: [],
|
|
37
|
+
humanSummary: lines.join('\n'),
|
|
38
|
+
storeRoot: store.root,
|
|
39
|
+
schemaVersion: store.config.schema_version,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=session-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-submit.js","sourceRoot":"","sources":["../../src/commands/session-submit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAqB,MAAM,2BAA2B,CAAC;AAG3F,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAW/D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAY,EAAE,IAA0B;IACjF,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,mBAAmB,CAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,uEAAuE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACjK,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAS,CAAC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE;QACpH,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CAAC,iBAAiB,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IAChJ,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACtF,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { RunEnv } from '../core/env.js';
|
|
3
|
+
import type { Store } from '../core/store.js';
|
|
4
|
+
export declare const requires: CommandRequires;
|
|
5
|
+
export interface MountStatus {
|
|
6
|
+
name: string;
|
|
7
|
+
location: string;
|
|
8
|
+
url: string;
|
|
9
|
+
present: boolean;
|
|
10
|
+
/** Whether the mount's root holds a store configuration that loads. */
|
|
11
|
+
isStore: boolean;
|
|
12
|
+
/** Why it is not a store; null when it is, or when absent. */
|
|
13
|
+
reason: string | null;
|
|
14
|
+
branch: string | null;
|
|
15
|
+
commit: string | null;
|
|
16
|
+
/** Uncommitted changes to tracked files; null when there is no clone to ask. */
|
|
17
|
+
dirty: boolean | null;
|
|
18
|
+
}
|
|
19
|
+
export interface SharedStoresStatusData {
|
|
20
|
+
mounts: MountStatus[];
|
|
21
|
+
}
|
|
22
|
+
/** shared-stores spec: each mount's state, from the filesystem and local git only — no writes, no network. */
|
|
23
|
+
export declare function execute(env: RunEnv, store: Store): Promise<CommandOutcome<SharedStoresStatusData>>;
|
|
24
|
+
//# sourceMappingURL=shared-stores-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-status.d.ts","sourceRoot":"","sources":["../../src/commands/shared-stores-status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gFAAgF;IAChF,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAiCD,8GAA8G;AAC9G,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAYxG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
4
|
+
import { resolveMounts } from '../core/shared-stores.js';
|
|
5
|
+
export const requires = { store: 'required' };
|
|
6
|
+
async function statusOf(env, mount) {
|
|
7
|
+
const base = { name: mount.name, location: mount.location, url: mount.url };
|
|
8
|
+
if (mount.state === 'absent') {
|
|
9
|
+
return { ...base, present: false, isStore: false, reason: null, branch: null, commit: null, dirty: null };
|
|
10
|
+
}
|
|
11
|
+
const reason = mount.state === 'not_store' ? mount.reason : null;
|
|
12
|
+
if (!existsSync(path.join(mount.root, '.git'))) {
|
|
13
|
+
return { ...base, present: true, isStore: mount.state === 'present', reason, branch: null, commit: null, dirty: null };
|
|
14
|
+
}
|
|
15
|
+
const run = (args) => env.git.run(args, { cwd: mount.root, allowFailure: true });
|
|
16
|
+
const branch = (await run(['symbolic-ref', '--quiet', '--short', 'HEAD'])).stdout.trim();
|
|
17
|
+
const commit = await run(['rev-parse', '--verify', '--quiet', 'HEAD']);
|
|
18
|
+
const dirty = (await run(['status', '--porcelain', '--untracked-files=no'])).stdout.trim() !== '';
|
|
19
|
+
return {
|
|
20
|
+
...base,
|
|
21
|
+
present: true,
|
|
22
|
+
isStore: mount.state === 'present',
|
|
23
|
+
reason,
|
|
24
|
+
branch: branch === '' ? null : branch,
|
|
25
|
+
commit: commit.exitCode === 0 ? commit.stdout.trim() : null,
|
|
26
|
+
dirty,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function line(status) {
|
|
30
|
+
if (!status.present)
|
|
31
|
+
return `${status.location}: absent (run \`ctxr shared-stores sync\` to clone it)`;
|
|
32
|
+
const where = status.commit ? ` on ${status.branch ?? 'a detached HEAD'} at ${status.commit.slice(0, 7)}` : '';
|
|
33
|
+
const store = status.isStore ? '' : `, not a store (${status.reason})`;
|
|
34
|
+
return `${status.location}: present${where}${status.dirty ? ', with uncommitted changes' : ''}${store}`;
|
|
35
|
+
}
|
|
36
|
+
/** shared-stores spec: each mount's state, from the filesystem and local git only — no writes, no network. */
|
|
37
|
+
export async function execute(env, store) {
|
|
38
|
+
const mounts = await resolveMounts(store.root, store.config);
|
|
39
|
+
const statuses = [];
|
|
40
|
+
for (const mount of mounts)
|
|
41
|
+
statuses.push(await statusOf(env, mount));
|
|
42
|
+
return {
|
|
43
|
+
exitCode: ExitCode.Ok,
|
|
44
|
+
data: { mounts: statuses },
|
|
45
|
+
findings: [],
|
|
46
|
+
humanSummary: statuses.length === 0 ? 'This store declares no shared stores.' : statuses.map(line).join('\n'),
|
|
47
|
+
storeRoot: store.root,
|
|
48
|
+
schemaVersion: store.config.schema_version,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=shared-stores-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-status.js","sourceRoot":"","sources":["../../src/commands/shared-stores-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAmB,MAAM,0BAA0B,CAAC;AAG1E,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAqB/D,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,KAAiB;IACpD,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5E,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC5G,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzH,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,IAAuB,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAClG,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS;QAClC,MAAM;QACN,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACrC,MAAM,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QAC3D,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,MAAmB;IAC/B,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,wDAAwD,CAAC;IACvG,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,IAAI,iBAAiB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,MAAM,GAAG,CAAC;IACvE,OAAO,GAAG,MAAM,CAAC,QAAQ,YAAY,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AAC1G,CAAC;AAED,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAY;IACrD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC1B,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7G,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { RunEnv } from '../core/env.js';
|
|
3
|
+
import type { Store } from '../core/store.js';
|
|
4
|
+
export declare const requires: CommandRequires;
|
|
5
|
+
export type MountSyncOutcome = 'cloned' | 'fast_forwarded' | 'current' | 'left_alone' | 'failed';
|
|
6
|
+
export interface MountSyncResult {
|
|
7
|
+
name: string;
|
|
8
|
+
location: string;
|
|
9
|
+
outcome: MountSyncOutcome;
|
|
10
|
+
from: string | null;
|
|
11
|
+
to: string | null;
|
|
12
|
+
/** Why the mount was left alone or failed; null otherwise. */
|
|
13
|
+
reason: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface SharedStoresSyncData {
|
|
16
|
+
mounts: MountSyncResult[];
|
|
17
|
+
/** Whether this run added the `shared/` entry to the repository's local exclude file. */
|
|
18
|
+
excludeAdded: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* shared-stores spec: clone each declared mount that is absent, fast-forward
|
|
22
|
+
* each present one when that is safe, and report every mount. A mount with
|
|
23
|
+
* local work is a warning; one that cannot be cloned or fetched fails the run,
|
|
24
|
+
* after every other mount has been processed.
|
|
25
|
+
*/
|
|
26
|
+
export declare function execute(env: RunEnv, store: Store): Promise<CommandOutcome<SharedStoresSyncData>>;
|
|
27
|
+
//# sourceMappingURL=shared-stores-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-sync.d.ts","sourceRoot":"","sources":["../../src/commands/shared-stores-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;CACvB;AA8ED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,CA0BtG"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
5
|
+
import { fastForwardIfSafe } from '../core/git/fast-forward.js';
|
|
6
|
+
import { mainWorkingTreeRoot, resolveMounts, SHARED_STORES_DIR } from '../core/shared-stores.js';
|
|
7
|
+
export const requires = { store: 'required' };
|
|
8
|
+
/** The exclude line, anchored at the repository root so only the top-level `shared/` is ignored. */
|
|
9
|
+
const EXCLUDE_LINE = `/${SHARED_STORES_DIR}/`;
|
|
10
|
+
/**
|
|
11
|
+
* shared-stores spec (and the critique's second revision): the ignore entry goes
|
|
12
|
+
* in the repository's local exclude file — shared by every worktree through the
|
|
13
|
+
* common git directory — never in a tracked file, which would leave the
|
|
14
|
+
* canonical clone with an uncommitted change that blocks its own fast-forward.
|
|
15
|
+
*/
|
|
16
|
+
async function ensureLocalExclude(env, storeRoot) {
|
|
17
|
+
const common = await env.git.run(['rev-parse', '--git-common-dir'], { cwd: storeRoot });
|
|
18
|
+
const excludePath = path.join(path.resolve(storeRoot, common.stdout.trim()), 'info', 'exclude');
|
|
19
|
+
let current = '';
|
|
20
|
+
try {
|
|
21
|
+
current = await readFile(excludePath, 'utf8');
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (err.code !== 'ENOENT')
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
if (current.split('\n').some((line) => line.trim() === EXCLUDE_LINE))
|
|
28
|
+
return false;
|
|
29
|
+
await mkdir(path.dirname(excludePath), { recursive: true });
|
|
30
|
+
const separator = current === '' || current.endsWith('\n') ? '' : '\n';
|
|
31
|
+
await writeFile(excludePath, `${current}${separator}# ctxr: mounted stores (shared-stores)\n${EXCLUDE_LINE}\n`);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/** The branch a mount fast-forwards to: its own recorded default branch, else what its remote calls HEAD. */
|
|
35
|
+
async function mountDefaultBranch(env, mount) {
|
|
36
|
+
if (mount.state === 'present')
|
|
37
|
+
return mount.config.git.default_branch;
|
|
38
|
+
const remoteHead = await env.git.run(['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD'], { cwd: mount.root, allowFailure: true });
|
|
39
|
+
const ref = remoteHead.stdout.trim();
|
|
40
|
+
return remoteHead.exitCode === 0 && ref.startsWith('origin/') ? ref.slice('origin/'.length) : null;
|
|
41
|
+
}
|
|
42
|
+
async function syncMount(env, mount) {
|
|
43
|
+
const base = { name: mount.name, location: mount.location };
|
|
44
|
+
if (mount.state === 'absent') {
|
|
45
|
+
await mkdir(path.dirname(mount.root), { recursive: true });
|
|
46
|
+
const cloned = await env.git.run(['clone', '--quiet', mount.url, mount.root], { cwd: path.dirname(mount.root), allowFailure: true });
|
|
47
|
+
if (cloned.exitCode !== 0) {
|
|
48
|
+
return { ...base, outcome: 'failed', from: null, to: null, reason: `git clone failed: ${cloned.stderr.trim().split('\n')[0] ?? ''}` };
|
|
49
|
+
}
|
|
50
|
+
const head = await env.git.run(['rev-parse', 'HEAD'], { cwd: mount.root, allowFailure: true });
|
|
51
|
+
return { ...base, outcome: 'cloned', from: null, to: head.exitCode === 0 ? head.stdout.trim() : null, reason: null };
|
|
52
|
+
}
|
|
53
|
+
if (!existsSync(path.join(mount.root, '.git'))) {
|
|
54
|
+
return { ...base, outcome: 'left_alone', from: null, to: null, reason: `${mount.location} exists but is not a git clone` };
|
|
55
|
+
}
|
|
56
|
+
const fetched = await env.git.run(['fetch', '--quiet', 'origin'], { cwd: mount.root, allowFailure: true });
|
|
57
|
+
if (fetched.exitCode !== 0) {
|
|
58
|
+
return { ...base, outcome: 'failed', from: null, to: null, reason: `git fetch failed: ${fetched.stderr.trim().split('\n')[0] ?? ''}` };
|
|
59
|
+
}
|
|
60
|
+
const branch = await mountDefaultBranch(env, mount);
|
|
61
|
+
if (branch === null) {
|
|
62
|
+
return { ...base, outcome: 'left_alone', from: null, to: null, reason: 'its default branch could not be determined' };
|
|
63
|
+
}
|
|
64
|
+
const outcome = await fastForwardIfSafe((args) => env.git.run(args, { cwd: mount.root, allowFailure: true }), branch, 'the mount');
|
|
65
|
+
if (!outcome.synced)
|
|
66
|
+
return { ...base, outcome: 'left_alone', from: outcome.from, to: outcome.to, reason: outcome.reason };
|
|
67
|
+
return { ...base, outcome: outcome.from === outcome.to ? 'current' : 'fast_forwarded', from: outcome.from, to: outcome.to, reason: null };
|
|
68
|
+
}
|
|
69
|
+
function line(result) {
|
|
70
|
+
switch (result.outcome) {
|
|
71
|
+
case 'cloned':
|
|
72
|
+
return `${result.location}: cloned at ${result.to?.slice(0, 7) ?? 'unknown commit'}`;
|
|
73
|
+
case 'fast_forwarded':
|
|
74
|
+
return `${result.location}: fast-forwarded ${result.from?.slice(0, 7)}..${result.to?.slice(0, 7)}`;
|
|
75
|
+
case 'current':
|
|
76
|
+
return `${result.location}: already current`;
|
|
77
|
+
case 'left_alone':
|
|
78
|
+
return `${result.location}: left alone, ${result.reason}`;
|
|
79
|
+
case 'failed':
|
|
80
|
+
return `${result.location}: failed, ${result.reason}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* shared-stores spec: clone each declared mount that is absent, fast-forward
|
|
85
|
+
* each present one when that is safe, and report every mount. A mount with
|
|
86
|
+
* local work is a warning; one that cannot be cloned or fetched fails the run,
|
|
87
|
+
* after every other mount has been processed.
|
|
88
|
+
*/
|
|
89
|
+
export async function execute(env, store) {
|
|
90
|
+
const mainRoot = mainWorkingTreeRoot(store.root);
|
|
91
|
+
const mounts = await resolveMounts(store.root, store.config);
|
|
92
|
+
const excludeAdded = mounts.length > 0 ? await ensureLocalExclude(env, mainRoot) : false;
|
|
93
|
+
const results = [];
|
|
94
|
+
for (const mount of mounts)
|
|
95
|
+
results.push(await syncMount(env, mount));
|
|
96
|
+
const findings = [];
|
|
97
|
+
for (const result of results) {
|
|
98
|
+
if (result.outcome === 'left_alone') {
|
|
99
|
+
findings.push({ code: 'shared_stores.mount_left_alone', severity: 'warning', message: line(result), subject: result.location });
|
|
100
|
+
}
|
|
101
|
+
else if (result.outcome === 'failed') {
|
|
102
|
+
findings.push({ code: 'shared_stores.mount_unreachable', severity: 'error', message: line(result), subject: result.location });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const failed = results.some((r) => r.outcome === 'failed');
|
|
106
|
+
return {
|
|
107
|
+
exitCode: failed ? ExitCode.CheckFailed : ExitCode.Ok,
|
|
108
|
+
data: { mounts: results, excludeAdded },
|
|
109
|
+
findings,
|
|
110
|
+
humanSummary: results.length === 0 ? 'This store declares no shared stores.' : results.map(line).join('\n'),
|
|
111
|
+
storeRoot: store.root,
|
|
112
|
+
schemaVersion: store.config.schema_version,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=shared-stores-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-sync.js","sourceRoot":"","sources":["../../src/commands/shared-stores-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAqB1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAS/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CA4HrH"}
|