@heyditto/cli 2.13.0 → 2.14.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 +26 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/dittoconfig/commands.d.ts +8 -0
- package/dist/dittoconfig/commands.js +198 -0
- package/dist/dittoconfig/commands.js.map +1 -0
- package/dist/dittoconfig/load.d.ts +26 -0
- package/dist/dittoconfig/load.js +449 -0
- package/dist/dittoconfig/load.js.map +1 -0
- package/dist/dittoconfig/types.d.ts +102 -0
- package/dist/dittoconfig/types.js +24 -0
- package/dist/dittoconfig/types.js.map +1 -0
- package/dist/teleport/catalog.d.ts +47 -0
- package/dist/teleport/catalog.js +106 -0
- package/dist/teleport/catalog.js.map +1 -0
- package/dist/teleport/commands.js +28 -0
- package/dist/teleport/commands.js.map +1 -1
- package/dist/teleport/push.js +24 -1
- package/dist/teleport/push.js.map +1 -1
- package/dist/teleport/types.d.ts +25 -2
- package/dist/teleport/types.js +19 -5
- package/dist/teleport/types.js.map +1 -1
- package/dist/teleport/workspace.d.ts +117 -0
- package/dist/teleport/workspace.js +373 -0
- package/dist/teleport/workspace.js.map +1 -0
- package/dist/teleport/worktree.d.ts +1 -1
- package/dist/teleport/worktree.js +4 -4
- package/dist/teleport/worktree.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { DittoConfigSummary } from "../dittoconfig/types.js";
|
|
2
|
+
export type ProjectKind = "repo" | "worktree" | "project";
|
|
3
|
+
export interface DiscoveredProject {
|
|
4
|
+
/** "/"-joined path relative to the workspace root; "." for the root itself. */
|
|
5
|
+
relPath: string;
|
|
6
|
+
kind: ProjectKind;
|
|
7
|
+
/** Nearest enclosing repository (relPath) for a non-repo project; equals relPath for repos. */
|
|
8
|
+
repo: string | null;
|
|
9
|
+
types: string[];
|
|
10
|
+
labels: string[];
|
|
11
|
+
/** Project-relative regenerable directories from the catalog. */
|
|
12
|
+
artifacts: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface SymlinkNote {
|
|
15
|
+
relPath: string;
|
|
16
|
+
target: string;
|
|
17
|
+
status: "kept" | "escapes-root" | "cycle" | "dangling";
|
|
18
|
+
}
|
|
19
|
+
export interface WorkspaceDiscovery {
|
|
20
|
+
root: string;
|
|
21
|
+
/** "repo" when the root itself is a repository, else "folder". */
|
|
22
|
+
kind: "repo" | "folder";
|
|
23
|
+
projects: DiscoveredProject[];
|
|
24
|
+
repos: string[];
|
|
25
|
+
symlinks: SymlinkNote[];
|
|
26
|
+
/** Root entries (files or directories) that belong to no discovered project. */
|
|
27
|
+
unrelated: string[];
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface DiscoverOptions {
|
|
31
|
+
/** Maximum depth below the root to look for projects (repos, worktrees, manifests). */
|
|
32
|
+
maxDepth?: number;
|
|
33
|
+
/** Stop scanning after this many directories and report `truncated`. */
|
|
34
|
+
maxDirs?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Discovers the coding projects under a root: Git repositories and worktrees,
|
|
38
|
+
* nested projects (a package inside a monorepo), and language manifests, with
|
|
39
|
+
* their relative layout preserved. The root itself need not be a repository.
|
|
40
|
+
* Symlinks are recorded but never followed; dependency trees are never entered.
|
|
41
|
+
*/
|
|
42
|
+
export declare function discoverWorkspace(rootInput: string, opts?: DiscoverOptions): Promise<WorkspaceDiscovery>;
|
|
43
|
+
export interface ExcludeRule {
|
|
44
|
+
/** Gitignore-style pattern as fed to isExcluded (path-anchored when it contains "/"). */
|
|
45
|
+
pattern: string;
|
|
46
|
+
source: "builtin" | "catalog" | "config";
|
|
47
|
+
/** Human reason, e.g. "Node: node_modules is regenerable (npm install)". */
|
|
48
|
+
reason: string;
|
|
49
|
+
bytes: number;
|
|
50
|
+
files: number;
|
|
51
|
+
}
|
|
52
|
+
export interface RepoPlan {
|
|
53
|
+
relPath: string;
|
|
54
|
+
kind: ProjectKind;
|
|
55
|
+
/** Nested projects inside this repo (relative to the repo). */
|
|
56
|
+
projects: Array<{
|
|
57
|
+
relPath: string;
|
|
58
|
+
types: string[];
|
|
59
|
+
labels: string[];
|
|
60
|
+
}>;
|
|
61
|
+
rules: ExcludeRule[];
|
|
62
|
+
/** Forced back in by .ditto include. */
|
|
63
|
+
includes: string[];
|
|
64
|
+
/** Effective exclude patterns handed to capture (repo-relative). */
|
|
65
|
+
excludes: string[];
|
|
66
|
+
/** Artifact directories that are git-tracked: excluded from the working tree but their bytes stay in history. */
|
|
67
|
+
trackedArtifacts: string[];
|
|
68
|
+
includedBytes: number;
|
|
69
|
+
includedFiles: number;
|
|
70
|
+
excludedBytes: number;
|
|
71
|
+
excludedFiles: number;
|
|
72
|
+
/** The included-file walk hit its cap: included bytes are a lower bound and unscanned files may exist. */
|
|
73
|
+
estimatePartial: boolean;
|
|
74
|
+
/** Sizing excluded directories hit its cap: excluded bytes are a lower bound. Never blocks an offload. */
|
|
75
|
+
excludedEstimatePartial: boolean;
|
|
76
|
+
dittoConfig?: DittoConfigSummary;
|
|
77
|
+
/** Repo-relative files the effective `.ditto/` configuration was read from (manifest provenance). */
|
|
78
|
+
dittoConfigSources?: string[];
|
|
79
|
+
configWarnings: string[];
|
|
80
|
+
}
|
|
81
|
+
export interface CapturePlan {
|
|
82
|
+
root: string;
|
|
83
|
+
kind: "repo" | "folder";
|
|
84
|
+
repos: RepoPlan[];
|
|
85
|
+
symlinks: SymlinkNote[];
|
|
86
|
+
unrelated: string[];
|
|
87
|
+
conflicts: string[];
|
|
88
|
+
truncated: boolean;
|
|
89
|
+
totals: {
|
|
90
|
+
includedBytes: number;
|
|
91
|
+
excludedBytes: number;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export interface PlanOptions extends DiscoverOptions {
|
|
95
|
+
/** Cap on files visited per repo while estimating bytes; beyond it estimates are marked partial. */
|
|
96
|
+
maxEstimateFiles?: number;
|
|
97
|
+
/** Skip the byte estimate (push only needs the rules); counts stay zero. Default true. */
|
|
98
|
+
estimate?: boolean;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Builds the capture plan: per repository, the detected project types, the
|
|
102
|
+
* effective exclusion rules (built-in, per-type catalog scoped to the project's
|
|
103
|
+
* path, `.ditto/` overrides) with byte estimates and reasons, tracked-artifact
|
|
104
|
+
* flags, symlink notes and unrelated root entries. Nothing is uploaded.
|
|
105
|
+
*/
|
|
106
|
+
export declare function planCapture(rootInput: string, opts?: PlanOptions): Promise<CapturePlan>;
|
|
107
|
+
export interface OffloadBlocker {
|
|
108
|
+
path: string;
|
|
109
|
+
reason: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Files beneath a proposed deletion root that a capture would not preserve:
|
|
113
|
+
* root entries outside every discovered project, and symlinks that leave the
|
|
114
|
+
* workspace. Regenerable exclusions are not blockers (they are approved
|
|
115
|
+
* omissions); everything else unknown is.
|
|
116
|
+
*/
|
|
117
|
+
export declare function offloadBlockers(plan: CapturePlan): Promise<OffloadBlocker[]>;
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { lstat, readdir, readlink, realpath, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { PROJECT_TYPES, artifactDirs, detectTypesDetailed } from "./catalog.js";
|
|
4
|
+
import { git, isGitRepo } from "./git.js";
|
|
5
|
+
import { DEFAULT_EXCLUDES, isExcluded } from "./types.js";
|
|
6
|
+
import { DittoConfigNotFound, loadDittoConfig, summarize } from "../dittoconfig/load.js";
|
|
7
|
+
/** Directories never entered while looking for projects (their contents are dependencies, not projects). */
|
|
8
|
+
const NEVER_DESCEND = new Set(["node_modules", ".git", ".venv", "venv", "__pycache__", ".hg", ".svn"]);
|
|
9
|
+
/**
|
|
10
|
+
* Discovers the coding projects under a root: Git repositories and worktrees,
|
|
11
|
+
* nested projects (a package inside a monorepo), and language manifests, with
|
|
12
|
+
* their relative layout preserved. The root itself need not be a repository.
|
|
13
|
+
* Symlinks are recorded but never followed; dependency trees are never entered.
|
|
14
|
+
*/
|
|
15
|
+
export async function discoverWorkspace(rootInput, opts = {}) {
|
|
16
|
+
const maxDepth = opts.maxDepth ?? 4;
|
|
17
|
+
const maxDirs = opts.maxDirs ?? 20_000;
|
|
18
|
+
const resolved = path.resolve(rootInput);
|
|
19
|
+
const info = await stat(resolved).catch(() => undefined);
|
|
20
|
+
if (!info?.isDirectory())
|
|
21
|
+
throw new Error(`not a directory: ${resolved}`);
|
|
22
|
+
const root = await realpath(resolved).catch(() => resolved);
|
|
23
|
+
const projects = [];
|
|
24
|
+
const symlinks = [];
|
|
25
|
+
const seenDirs = new Set();
|
|
26
|
+
let dirsVisited = 0;
|
|
27
|
+
let truncated = false;
|
|
28
|
+
const visit = async (dir, depth, repo, activeTypes) => {
|
|
29
|
+
if (dirsVisited++ > maxDirs) {
|
|
30
|
+
truncated = true;
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const real = await realpath(dir).catch(() => dir);
|
|
34
|
+
if (seenDirs.has(real))
|
|
35
|
+
return false;
|
|
36
|
+
seenDirs.add(real);
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const names = new Set(entries.map((e) => e.name));
|
|
45
|
+
const rel = toRel(root, dir);
|
|
46
|
+
let kind = null;
|
|
47
|
+
if (names.has(".git")) {
|
|
48
|
+
const dotGit = entries.find((e) => e.name === ".git");
|
|
49
|
+
kind = dotGit?.isDirectory() ? "repo" : "worktree";
|
|
50
|
+
}
|
|
51
|
+
// A suffix-only match (a stray .py file) inside a project that already has
|
|
52
|
+
// that type is source, not a nested project; a marker file always is one.
|
|
53
|
+
const types = detectTypesDetailed(names)
|
|
54
|
+
.filter((m) => m.byMarker || !activeTypes.has(m.type.id))
|
|
55
|
+
.map((m) => m.type);
|
|
56
|
+
const thisRepo = kind ? rel : repo;
|
|
57
|
+
let found = false;
|
|
58
|
+
if (kind || types.length > 0) {
|
|
59
|
+
projects.push({
|
|
60
|
+
relPath: rel,
|
|
61
|
+
kind: kind ?? "project",
|
|
62
|
+
repo: thisRepo,
|
|
63
|
+
types: types.map((t) => t.id),
|
|
64
|
+
labels: types.map((t) => t.label),
|
|
65
|
+
artifacts: artifactDirs(types),
|
|
66
|
+
});
|
|
67
|
+
found = true;
|
|
68
|
+
}
|
|
69
|
+
if (depth >= maxDepth)
|
|
70
|
+
return found;
|
|
71
|
+
const nextActive = new Set([...activeTypes, ...types.map((t) => t.id)]);
|
|
72
|
+
const artifactSet = new Set(artifactDirs(types).map((a) => a.split("/")[0]));
|
|
73
|
+
for (const e of entries) {
|
|
74
|
+
if (e.isSymbolicLink()) {
|
|
75
|
+
symlinks.push(await classifySymlink(root, path.join(dir, e.name), seenDirs));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!e.isDirectory())
|
|
79
|
+
continue;
|
|
80
|
+
if (NEVER_DESCEND.has(e.name) || artifactSet.has(e.name))
|
|
81
|
+
continue;
|
|
82
|
+
if (e.name.startsWith(".") && e.name !== ".ditto")
|
|
83
|
+
continue;
|
|
84
|
+
const childFound = await visit(path.join(dir, e.name), depth + 1, thisRepo, nextActive);
|
|
85
|
+
found = found || childFound;
|
|
86
|
+
}
|
|
87
|
+
return found;
|
|
88
|
+
};
|
|
89
|
+
await visit(root, 0, null, new Set());
|
|
90
|
+
projects.sort((a, b) => a.relPath.localeCompare(b.relPath));
|
|
91
|
+
const repos = projects.filter((p) => p.kind !== "project").map((p) => p.relPath);
|
|
92
|
+
const rootIsRepo = projects.some((p) => p.relPath === "." && p.kind !== "project");
|
|
93
|
+
// Root entries that no project claims: documents and unknown files the user
|
|
94
|
+
// would lose if the whole parent folder were offloaded. A symlink whose target
|
|
95
|
+
// stays inside the workspace is preserved by the target's capture, so it does
|
|
96
|
+
// not count; one that leaves the workspace does.
|
|
97
|
+
const unrelated = [];
|
|
98
|
+
if (!rootIsRepo) {
|
|
99
|
+
const claimed = new Set(projects.map((p) => p.relPath.split("/")[0]));
|
|
100
|
+
const keptLinks = new Set(symlinks.filter((s) => s.status === "kept" || s.status === "cycle").map((s) => s.relPath));
|
|
101
|
+
for (const e of await readdir(root, { withFileTypes: true })) {
|
|
102
|
+
if (e.name === ".ditto" || e.name === ".DS_Store")
|
|
103
|
+
continue;
|
|
104
|
+
if (claimed.has(e.name) || keptLinks.has(e.name))
|
|
105
|
+
continue;
|
|
106
|
+
unrelated.push(e.name + (e.isDirectory() ? "/" : ""));
|
|
107
|
+
}
|
|
108
|
+
unrelated.sort();
|
|
109
|
+
}
|
|
110
|
+
return { root, kind: rootIsRepo ? "repo" : "folder", projects, repos, symlinks, unrelated, truncated };
|
|
111
|
+
}
|
|
112
|
+
async function classifySymlink(root, linkPath, seenDirs) {
|
|
113
|
+
const rel = toRel(root, linkPath);
|
|
114
|
+
let target = "";
|
|
115
|
+
try {
|
|
116
|
+
target = await readlink(linkPath);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return { relPath: rel, target, status: "dangling" };
|
|
120
|
+
}
|
|
121
|
+
const abs = path.resolve(path.dirname(linkPath), target);
|
|
122
|
+
let real;
|
|
123
|
+
try {
|
|
124
|
+
real = await realpath(abs);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return { relPath: rel, target, status: "dangling" };
|
|
128
|
+
}
|
|
129
|
+
if (!real.startsWith(root + path.sep) && real !== root)
|
|
130
|
+
return { relPath: rel, target, status: "escapes-root" };
|
|
131
|
+
if (seenDirs.has(real) || real === root || path.dirname(linkPath).startsWith(real + path.sep))
|
|
132
|
+
return { relPath: rel, target, status: "cycle" };
|
|
133
|
+
return { relPath: rel, target, status: "kept" };
|
|
134
|
+
}
|
|
135
|
+
function toRel(root, p) {
|
|
136
|
+
const rel = path.relative(root, p).split(path.sep).join("/");
|
|
137
|
+
return rel === "" ? "." : rel;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Builds the capture plan: per repository, the detected project types, the
|
|
141
|
+
* effective exclusion rules (built-in, per-type catalog scoped to the project's
|
|
142
|
+
* path, `.ditto/` overrides) with byte estimates and reasons, tracked-artifact
|
|
143
|
+
* flags, symlink notes and unrelated root entries. Nothing is uploaded.
|
|
144
|
+
*/
|
|
145
|
+
export async function planCapture(rootInput, opts = {}) {
|
|
146
|
+
const discovery = await discoverWorkspace(rootInput, opts);
|
|
147
|
+
const conflicts = [];
|
|
148
|
+
const repos = [];
|
|
149
|
+
for (const repoRel of discovery.repos) {
|
|
150
|
+
const repoDir = repoRel === "." ? discovery.root : path.join(discovery.root, repoRel);
|
|
151
|
+
const nested = discovery.projects.filter((p) => p.repo === repoRel);
|
|
152
|
+
const rules = DEFAULT_EXCLUDES.map((pattern) => ({ pattern, source: "builtin", reason: "built-in: secrets, caches and build output never travel", bytes: 0, files: 0 }));
|
|
153
|
+
for (const p of nested) {
|
|
154
|
+
const base = p.relPath === repoRel ? "" : toRepoRel(repoRel, p.relPath) + "/";
|
|
155
|
+
for (const t of p.types) {
|
|
156
|
+
const type = PROJECT_TYPES.find((x) => x.id === t);
|
|
157
|
+
for (const a of type.artifacts) {
|
|
158
|
+
rules.push({ pattern: `${base}${a}/`, source: "catalog", reason: `${type.label}: ${a} is regenerable`, bytes: 0, files: 0 });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let eff;
|
|
163
|
+
let dittoConfig;
|
|
164
|
+
let dittoConfigSources;
|
|
165
|
+
const configWarnings = [];
|
|
166
|
+
try {
|
|
167
|
+
eff = await loadDittoConfig(repoDir, { workspaceDir: discovery.kind === "folder" ? discovery.root : undefined });
|
|
168
|
+
dittoConfig = summarize(eff);
|
|
169
|
+
dittoConfigSources = [...new Set(Object.values(eff.sources).map((s) => s.path).filter((p) => !!p))]
|
|
170
|
+
.map((p) => toRel(repoDir, p))
|
|
171
|
+
.sort();
|
|
172
|
+
configWarnings.push(...eff.warnings);
|
|
173
|
+
for (const ex of eff.config.teleport.exclude ?? [])
|
|
174
|
+
rules.push({ pattern: ex, source: "config", reason: ".ditto/config.toml teleport.exclude", bytes: 0, files: 0 });
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
if (!(err instanceof DittoConfigNotFound))
|
|
178
|
+
conflicts.push(`${repoRel}: ${err.message}`);
|
|
179
|
+
}
|
|
180
|
+
const includes = eff?.config.teleport.include ?? [];
|
|
181
|
+
// Dedupe patterns; when a built-in and a catalog/config rule name the same
|
|
182
|
+
// pattern, keep the more specific reason (config > catalog > builtin).
|
|
183
|
+
const rank = { config: 0, catalog: 1, builtin: 2 };
|
|
184
|
+
const byPattern = new Map();
|
|
185
|
+
for (const r of rules) {
|
|
186
|
+
const prev = byPattern.get(r.pattern);
|
|
187
|
+
if (!prev || rank[r.source] < rank[prev.source])
|
|
188
|
+
byPattern.set(r.pattern, r);
|
|
189
|
+
}
|
|
190
|
+
const uniqueRules = [...byPattern.values()];
|
|
191
|
+
const excludes = uniqueRules.map((r) => r.pattern).filter((p) => !includes.some((inc) => samePattern(inc, p)));
|
|
192
|
+
const est = opts.estimate === false
|
|
193
|
+
? { includedBytes: 0, includedFiles: 0, excludedBytes: 0, excludedFiles: 0, partial: false, excludedPartial: false }
|
|
194
|
+
: await estimate(repoDir, uniqueRules, includes, opts.maxEstimateFiles ?? 250_000);
|
|
195
|
+
const trackedArtifacts = [];
|
|
196
|
+
if (isGitRepo(repoDir)) {
|
|
197
|
+
for (const r of uniqueRules.filter((r) => r.source === "catalog")) {
|
|
198
|
+
const dir = r.pattern.replace(/\/$/, "");
|
|
199
|
+
const tracked = git(["ls-files", "--error-unmatch", "--", dir], repoDir);
|
|
200
|
+
if (tracked.ok && tracked.stdout.trim())
|
|
201
|
+
trackedArtifacts.push(dir);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
repos.push({
|
|
205
|
+
relPath: repoRel,
|
|
206
|
+
kind: nested.find((p) => p.relPath === repoRel)?.kind ?? "repo",
|
|
207
|
+
projects: nested.map((p) => ({ relPath: p.relPath === repoRel ? "." : toRepoRel(repoRel, p.relPath), types: p.types, labels: p.labels })),
|
|
208
|
+
rules: uniqueRules,
|
|
209
|
+
includes,
|
|
210
|
+
excludes,
|
|
211
|
+
trackedArtifacts,
|
|
212
|
+
includedBytes: est.includedBytes,
|
|
213
|
+
includedFiles: est.includedFiles,
|
|
214
|
+
excludedBytes: est.excludedBytes,
|
|
215
|
+
excludedFiles: est.excludedFiles,
|
|
216
|
+
estimatePartial: est.partial,
|
|
217
|
+
excludedEstimatePartial: est.excludedPartial,
|
|
218
|
+
dittoConfig,
|
|
219
|
+
dittoConfigSources,
|
|
220
|
+
configWarnings,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
for (const s of discovery.symlinks) {
|
|
224
|
+
if (s.status === "escapes-root")
|
|
225
|
+
conflicts.push(`${s.relPath} → ${s.target}: symlink leaves the workspace; not followed`);
|
|
226
|
+
if (s.status === "cycle")
|
|
227
|
+
conflicts.push(`${s.relPath} → ${s.target}: symlink cycle; not followed`);
|
|
228
|
+
}
|
|
229
|
+
if (discovery.truncated)
|
|
230
|
+
conflicts.push("scan truncated: too many directories; narrow the root or raise the limit");
|
|
231
|
+
return {
|
|
232
|
+
root: discovery.root,
|
|
233
|
+
kind: discovery.kind,
|
|
234
|
+
repos,
|
|
235
|
+
symlinks: discovery.symlinks,
|
|
236
|
+
unrelated: discovery.unrelated,
|
|
237
|
+
conflicts,
|
|
238
|
+
truncated: discovery.truncated,
|
|
239
|
+
totals: {
|
|
240
|
+
includedBytes: repos.reduce((n, r) => n + r.includedBytes, 0),
|
|
241
|
+
excludedBytes: repos.reduce((n, r) => n + r.excludedBytes, 0),
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function toRepoRel(repoRel, projectRel) {
|
|
246
|
+
return repoRel === "." ? projectRel : projectRel.slice(repoRel.length + 1);
|
|
247
|
+
}
|
|
248
|
+
function samePattern(a, b) {
|
|
249
|
+
return a.replace(/\/$/, "") === b.replace(/\/$/, "");
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Walks the working tree once, attributing every file to the first matching rule
|
|
253
|
+
* (or to "included"). Files inside excluded directories have their own budget: a
|
|
254
|
+
* huge node_modules makes the excluded total a lower bound, never the included
|
|
255
|
+
* scan (and so an offload) partial.
|
|
256
|
+
*/
|
|
257
|
+
async function estimate(repoDir, rules, includes, maxFiles) {
|
|
258
|
+
const out = { includedBytes: 0, includedFiles: 0, excludedBytes: 0, excludedFiles: 0, partial: false, excludedPartial: false };
|
|
259
|
+
let visited = 0;
|
|
260
|
+
let excludedVisited = 0;
|
|
261
|
+
const walk = async (dir) => {
|
|
262
|
+
let entries;
|
|
263
|
+
try {
|
|
264
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
for (const e of entries) {
|
|
270
|
+
if (e.name === ".git")
|
|
271
|
+
continue;
|
|
272
|
+
const abs = path.join(dir, e.name);
|
|
273
|
+
const rel = path.relative(repoDir, abs).split(path.sep).join("/");
|
|
274
|
+
if (e.isSymbolicLink())
|
|
275
|
+
continue;
|
|
276
|
+
if (++visited > maxFiles) {
|
|
277
|
+
out.partial = true;
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const forced = includes.some((inc) => isExcluded(rel, [inc]) || rel === inc.replace(/\/$/, ""));
|
|
281
|
+
const rule = forced ? undefined : rules.find((r) => isExcluded(rel + (e.isDirectory() ? "/x" : ""), [r.pattern]));
|
|
282
|
+
if (e.isDirectory()) {
|
|
283
|
+
if (rule) {
|
|
284
|
+
const size = await sizeOf(abs, () => ++excludedVisited > maxFiles);
|
|
285
|
+
rule.bytes += size.bytes;
|
|
286
|
+
rule.files += size.files;
|
|
287
|
+
out.excludedBytes += size.bytes;
|
|
288
|
+
out.excludedFiles += size.files;
|
|
289
|
+
if (size.partial)
|
|
290
|
+
out.excludedPartial = true;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
await walk(abs);
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const s = await lstat(abs).catch(() => undefined);
|
|
297
|
+
const size = s?.size ?? 0;
|
|
298
|
+
if (rule) {
|
|
299
|
+
rule.bytes += size;
|
|
300
|
+
rule.files += 1;
|
|
301
|
+
out.excludedBytes += size;
|
|
302
|
+
out.excludedFiles += 1;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
out.includedBytes += size;
|
|
306
|
+
out.includedFiles += 1;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
await walk(repoDir);
|
|
311
|
+
return out;
|
|
312
|
+
}
|
|
313
|
+
async function sizeOf(dir, over) {
|
|
314
|
+
let bytes = 0;
|
|
315
|
+
let files = 0;
|
|
316
|
+
let partial = false;
|
|
317
|
+
const walk = async (d) => {
|
|
318
|
+
let entries;
|
|
319
|
+
try {
|
|
320
|
+
entries = await readdir(d, { withFileTypes: true });
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
for (const e of entries) {
|
|
326
|
+
if (partial)
|
|
327
|
+
return;
|
|
328
|
+
if (over()) {
|
|
329
|
+
partial = true;
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const abs = path.join(d, e.name);
|
|
333
|
+
if (e.isSymbolicLink())
|
|
334
|
+
continue;
|
|
335
|
+
if (e.isDirectory()) {
|
|
336
|
+
await walk(abs);
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
const s = await lstat(abs).catch(() => undefined);
|
|
340
|
+
bytes += s?.size ?? 0;
|
|
341
|
+
files += 1;
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
await walk(dir);
|
|
345
|
+
return { bytes, files, partial };
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Files beneath a proposed deletion root that a capture would not preserve:
|
|
349
|
+
* root entries outside every discovered project, and symlinks that leave the
|
|
350
|
+
* workspace. Regenerable exclusions are not blockers (they are approved
|
|
351
|
+
* omissions); everything else unknown is.
|
|
352
|
+
*/
|
|
353
|
+
export async function offloadBlockers(plan) {
|
|
354
|
+
const out = new Map();
|
|
355
|
+
const add = (b) => {
|
|
356
|
+
if (!out.has(b.path))
|
|
357
|
+
out.set(b.path, b);
|
|
358
|
+
};
|
|
359
|
+
for (const s of plan.symlinks) {
|
|
360
|
+
if (s.status === "escapes-root")
|
|
361
|
+
add({ path: s.relPath, reason: `symlink to ${s.target} outside the workspace` });
|
|
362
|
+
}
|
|
363
|
+
for (const u of plan.unrelated)
|
|
364
|
+
add({ path: u, reason: "not part of any discovered project; it would be lost" });
|
|
365
|
+
for (const r of plan.repos) {
|
|
366
|
+
if (r.estimatePartial)
|
|
367
|
+
add({ path: r.relPath, reason: "capture estimate is partial; scan the repository fully before offloading" });
|
|
368
|
+
}
|
|
369
|
+
if (plan.truncated)
|
|
370
|
+
add({ path: ".", reason: "discovery was truncated; some projects may be unaccounted for" });
|
|
371
|
+
return [...out.values()].sort((a, b) => a.path.localeCompare(b.path));
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/teleport/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ export interface WorktreeCapture {
|
|
|
10
10
|
* paths and anything git ignores (unless force-included). This is the dirty
|
|
11
11
|
* state a plain clone would not reproduce.
|
|
12
12
|
*/
|
|
13
|
-
export declare function dirtyPaths(repoDir: string, ignoredIncludes?: string[]): string[];
|
|
13
|
+
export declare function dirtyPaths(repoDir: string, ignoredIncludes?: string[], excludes?: readonly string[]): string[];
|
|
14
14
|
export declare function pickCompression(): Compression;
|
|
15
15
|
/** Tars the given repo-relative paths into `outFile`, compressed. Empty list → null. */
|
|
16
16
|
export declare function captureWorktree(repoDir: string, paths: string[], outFile: string, compression?: Compression): Promise<WorktreeCapture | null>;
|
|
@@ -10,7 +10,7 @@ import { DEFAULT_EXCLUDES, isExcluded } from "./types.js";
|
|
|
10
10
|
* paths and anything git ignores (unless force-included). This is the dirty
|
|
11
11
|
* state a plain clone would not reproduce.
|
|
12
12
|
*/
|
|
13
|
-
export function dirtyPaths(repoDir, ignoredIncludes = []) {
|
|
13
|
+
export function dirtyPaths(repoDir, ignoredIncludes = [], excludes = DEFAULT_EXCLUDES) {
|
|
14
14
|
const modified = git(["diff", "--name-only", "HEAD"], repoDir);
|
|
15
15
|
const untracked = git(["ls-files", "--others", "--exclude-standard"], repoDir);
|
|
16
16
|
const set = new Set();
|
|
@@ -19,7 +19,7 @@ export function dirtyPaths(repoDir, ignoredIncludes = []) {
|
|
|
19
19
|
continue;
|
|
20
20
|
for (const raw of out.stdout.split("\n")) {
|
|
21
21
|
const p = raw.trim();
|
|
22
|
-
if (p && !isExcluded(p))
|
|
22
|
+
if (p && !isExcluded(p, excludes))
|
|
23
23
|
set.add(p);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -29,7 +29,7 @@ export function dirtyPaths(repoDir, ignoredIncludes = []) {
|
|
|
29
29
|
if (all.ok)
|
|
30
30
|
for (const raw of all.stdout.split("\n")) {
|
|
31
31
|
const p = raw.trim();
|
|
32
|
-
if (p && !isExcluded(p))
|
|
32
|
+
if (p && !isExcluded(p, excludes))
|
|
33
33
|
set.add(p);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -38,7 +38,7 @@ export function dirtyPaths(repoDir, ignoredIncludes = []) {
|
|
|
38
38
|
if (forced.ok)
|
|
39
39
|
for (const raw of forced.stdout.split("\n")) {
|
|
40
40
|
const p = raw.trim();
|
|
41
|
-
if (p && !isExcluded(p,
|
|
41
|
+
if (p && !isExcluded(p, excludes.filter((e) => !matchesForce(pattern, e))))
|
|
42
42
|
set.add(p);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/teleport/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/G,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAoB,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS5E;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,kBAA4B,EAAE;
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/teleport/worktree.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heyditto/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.14.0",
|
|
4
4
|
"description": "Ditto Memory CLI — save, search, fetch, and traverse the Ditto memory graph from the shell.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"bugs": "https://github.com/ditto-assistant/ditto-app/issues/1212",
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
43
|
-
"commander": "^15.0.0"
|
|
43
|
+
"commander": "^15.0.0",
|
|
44
|
+
"smol-toml": "^1.8.0"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@semantic-release/commit-analyzer": "^13.0.1",
|