@ai-dossier/cli 0.82.0 → 0.83.1

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.
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ /**
3
+ * Workspace layout of a target repo, read from its own workspace config (#801) instead of guessed
4
+ * from path shapes. `batch compose` ranks backfill by "shares a workspace package"; the old path
5
+ * heuristic (`…/packages/<x>/…` → `packages/<x>`, else the first path segment) collapsed every path
6
+ * outside `packages/` on imboard's nested layout (`main/packages/…`, `main/scripts/…`) into a
7
+ * pseudo-package `main` that nearly every issue "shared".
8
+ *
9
+ * Pure and dependency-light (only `yaml`): no `gh`, network or fs. The command layer supplies a
10
+ * {@link WorkspaceFileReader} over `gh api repos/<r>/contents/…` (target repo not local) or the
11
+ * local checkout, so discovery is unit-testable with an in-memory reader.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.parseWorkspaceConfig = parseWorkspaceConfig;
15
+ exports.discoverWorkspaceLayout = discoverWorkspaceLayout;
16
+ exports.packageOfPath = packageOfPath;
17
+ const yaml_1 = require("yaml");
18
+ /** Config files probed in each candidate directory, in precedence order. */
19
+ const CONFIG_FILES = ['pnpm-workspace.yaml', 'package.json', 'lerna.json'];
20
+ /** Top-level directories never probed for a nested workspace root — docs/tooling, not code roots. */
21
+ const SKIP_DIRS = new Set([
22
+ 'node_modules',
23
+ 'docs',
24
+ 'doc',
25
+ 'scripts',
26
+ 'test',
27
+ 'tests',
28
+ 'examples',
29
+ 'vendor',
30
+ 'dist',
31
+ 'build',
32
+ 'terraform',
33
+ 'infra',
34
+ ]);
35
+ /** Nested roots probed at most (each costs up to three `gh api` reads: pnpm, package.json, lerna). */
36
+ const MAX_PROBED_DIRS = 8;
37
+ /** Globs kept per root — the config is untrusted-ish network text, keep the output bounded. */
38
+ const MAX_GLOBS = 64;
39
+ /** Split declared patterns into includes and `!` excludes; drops non-strings, blanks, and `./` prefixes. */
40
+ function toPatterns(value) {
41
+ if (!Array.isArray(value))
42
+ return null;
43
+ const globs = [];
44
+ const excludes = [];
45
+ for (const raw of value) {
46
+ if (typeof raw !== 'string')
47
+ continue;
48
+ const trimmed = raw.trim().replace(/^\.\//, '').replace(/\/+$/, '');
49
+ if (trimmed === '' || trimmed === '!')
50
+ continue;
51
+ if (trimmed.startsWith('!'))
52
+ excludes.push(trimmed.slice(1).replace(/^\.\//, ''));
53
+ else
54
+ globs.push(trimmed);
55
+ }
56
+ return globs.length > 0
57
+ ? { globs: globs.slice(0, MAX_GLOBS), excludes: excludes.slice(0, MAX_GLOBS) }
58
+ : null;
59
+ }
60
+ /**
61
+ * Workspace patterns declared by one config file's text, or null when it declares none.
62
+ * `package.json` accepts both `workspaces: [...]` and the Yarn `workspaces: { packages: [...] }` shape.
63
+ */
64
+ function parseWorkspaceConfig(file, text) {
65
+ try {
66
+ if (file === 'pnpm-workspace.yaml') {
67
+ const doc = (0, yaml_1.parse)(text);
68
+ return toPatterns(doc?.packages);
69
+ }
70
+ const doc = JSON.parse(text);
71
+ if (file === 'lerna.json')
72
+ return toPatterns(doc?.packages);
73
+ const ws = doc?.workspaces;
74
+ return toPatterns(Array.isArray(ws) ? ws : ws?.packages);
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function probeRoot(prefix, reader) {
81
+ for (const file of CONFIG_FILES) {
82
+ const text = reader.readFile(prefix === '' ? file : `${prefix}/${file}`);
83
+ if (text === null)
84
+ continue;
85
+ const patterns = parseWorkspaceConfig(file, text);
86
+ if (patterns !== null)
87
+ return { prefix, file, ...patterns };
88
+ }
89
+ return null;
90
+ }
91
+ /**
92
+ * Find the workspace root(s) of a repo: the repo root when it declares workspaces, otherwise each
93
+ * top-level directory that does (imboard's `main/`). Null when no config is found anywhere — the
94
+ * caller then falls back to path heuristics and says so.
95
+ */
96
+ function discoverWorkspaceLayout(reader) {
97
+ const root = probeRoot('', reader);
98
+ if (root !== null)
99
+ return { roots: [root] };
100
+ const dirs = (reader.topLevelDirs() ?? [])
101
+ .filter((d) => !d.startsWith('.') && !SKIP_DIRS.has(d))
102
+ .sort()
103
+ .slice(0, MAX_PROBED_DIRS);
104
+ const roots = dirs.map((d) => probeRoot(d, reader)).filter((r) => r !== null);
105
+ return roots.length > 0 ? { roots } : null;
106
+ }
107
+ // --- path → package ----------------------------------------------------------------------------
108
+ /** One glob segment as a regex: `*` matches within the segment, everything else literally. */
109
+ function segmentMatches(pattern, segment) {
110
+ if (pattern === segment)
111
+ return true;
112
+ if (!pattern.includes('*'))
113
+ return false;
114
+ const re = pattern
115
+ .split('*')
116
+ .map((part) => part.replace(/[.+?^${}()|[\]\\]/g, '\\$&'))
117
+ .join('[^/]*');
118
+ return new RegExp(`^${re}$`).test(segment);
119
+ }
120
+ /**
121
+ * Number of leading path segments a glob claims as the package directory, or null when the path
122
+ * is not under it. A trailing `**` claims the first segment beneath its literal prefix; a `**`
123
+ * elsewhere is treated as `*` (package dirs are one level per pattern segment).
124
+ */
125
+ function globMatch(glob, segments) {
126
+ const parts = glob.split('/').filter((p) => p !== '');
127
+ let claimed = 0;
128
+ for (let i = 0; i < parts.length; i++) {
129
+ if (i >= segments.length)
130
+ return null;
131
+ if (parts[i] === '**') {
132
+ if (i === parts.length - 1)
133
+ return segments.length > i ? i + 1 : null;
134
+ claimed = i + 1;
135
+ continue;
136
+ }
137
+ if (!segmentMatches(parts[i], segments[i]))
138
+ return null;
139
+ claimed = i + 1;
140
+ }
141
+ return claimed;
142
+ }
143
+ /** A trailing segment that looks like a file, so `packages/README.md` is not read as package `README.md`. */
144
+ const FILE_LIKE_RE = /\.[A-Za-z0-9]{1,6}$/;
145
+ function packageDirIn(root, relative) {
146
+ let best = null;
147
+ for (const glob of root.globs) {
148
+ const n = globMatch(glob, relative);
149
+ if (n === null || (n === relative.length && FILE_LIKE_RE.test(relative[n - 1])))
150
+ continue;
151
+ if (best === null || n > best)
152
+ best = n;
153
+ }
154
+ if (best === null)
155
+ return null;
156
+ const dir = relative.slice(0, best);
157
+ for (const glob of root.excludes) {
158
+ if (globMatch(glob, dir) === dir.length)
159
+ return null;
160
+ }
161
+ return dir.join('/');
162
+ }
163
+ /**
164
+ * The declared workspace package a repo-relative path belongs to, or null when it is outside every
165
+ * declared workspace (root scripts, docs, CI — deliberately NOT a pseudo-package). A path may name
166
+ * the workspace root's directory (`main/packages/x/…`) or omit it (`packages/x/…`, how issue text
167
+ * usually spells it). With more than one root the package is prefixed with its root's directory.
168
+ */
169
+ function packageOfPath(path, layout) {
170
+ const segments = path
171
+ .replace(/^\.\//, '')
172
+ .split('/')
173
+ .filter((s) => s !== '');
174
+ const qualify = (root, dir) => layout.roots.length > 1 && root.prefix !== '' ? `${root.prefix}/${dir}` : dir;
175
+ // Pass 1: a root whose directory the path names. This wins outright, so root ORDER never
176
+ // matters (`main/packages/x` is `main`'s, even when another root's glob would also match it).
177
+ for (const root of layout.roots) {
178
+ const prefixSegments = root.prefix === '' ? [] : root.prefix.split('/');
179
+ if (prefixSegments.length === 0 || !prefixSegments.every((p, i) => segments[i] === p))
180
+ continue;
181
+ const dir = packageDirIn(root, segments.slice(prefixSegments.length));
182
+ if (dir !== null)
183
+ return qualify(root, dir);
184
+ }
185
+ // Pass 2: a root-relative spelling (`packages/x/…`, how issue text usually writes it). Ambiguous
186
+ // across roots (`a` and `b` both declare `packages/*`) means unknown, not "the first root".
187
+ const hits = layout.roots
188
+ .map((root) => [root, packageDirIn(root, segments)])
189
+ .filter((h) => h[1] !== null);
190
+ return hits.length === 1 ? qualify(hits[0][0], hits[0][1]) : null;
191
+ }
192
+ //# sourceMappingURL=workspace-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-layout.js","sourceRoot":"","sources":["../src/workspace-layout.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-dossier/cli",
3
- "version": "0.82.0",
3
+ "version": "0.83.1",
4
4
  "description": "Create, verify, sign, publish, and run dossiers — portable, signed, versioned skills for any LLM tool. The dossier ⇄ Claude Code skill bridge (install-skill / skill-export).",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {