@thxgg/steward 0.1.17 → 0.1.19
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/.env.example +0 -6
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{BlTKcjLJ.js → BCiXS3ZV.js} +2 -2
- package/.output/public/_nuxt/BfUfZSFp.js +60 -0
- package/.output/public/_nuxt/{BMdjSp24.js → BfV4oCiT.js} +1 -1
- package/.output/public/_nuxt/{BSZqAKg4.js → Bs6UO7IT.js} +1 -1
- package/.output/public/_nuxt/C9AsKFSQ.js +1 -0
- package/.output/public/_nuxt/{BdjPva1I.js → C9jB6HQI.js} +1 -1
- package/.output/public/_nuxt/CCruYste.js +3 -0
- package/.output/public/_nuxt/CIIE0-WR.js +1 -0
- package/.output/public/_nuxt/{By7gAVcL.js → Cg4hnDua.js} +1 -1
- package/.output/public/_nuxt/CwdD8083.js +30 -0
- package/.output/public/_nuxt/{4r0X30JV.js → D2RLSKEu.js} +1 -1
- package/.output/public/_nuxt/{CbkpNvIu.js → D30YtxUg.js} +1 -1
- package/.output/public/_nuxt/{Beeir9iR.js → DEekox9p.js} +1 -1
- package/.output/public/_nuxt/{nX8Sf7cz.js → DddVAa3N.js} +1 -1
- package/.output/public/_nuxt/{Bh3vsUvl.js → MO41rxll.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/627332c0-2e14-4849-8cac-e350f64ed513.json +1 -0
- package/.output/public/_nuxt/entry.Dp3jx0Yw.css +1 -0
- package/.output/public/_nuxt/f7vKgp5U.js +1 -0
- package/.output/public/_nuxt/xc3v2JZH.js +1 -0
- package/.output/server/chunks/_/git-api.mjs +1 -1
- package/.output/server/chunks/_/prd-service.mjs +177 -12
- package/.output/server/chunks/_/prd-service.mjs.map +1 -1
- package/.output/server/chunks/_/repos.mjs +272 -0
- package/.output/server/chunks/_/repos.mjs.map +1 -0
- package/.output/server/chunks/_/task-graph.mjs +19 -16
- package/.output/server/chunks/_/task-graph.mjs.map +1 -1
- package/.output/server/chunks/_/watcher.mjs +11 -35
- package/.output/server/chunks/_/watcher.mjs.map +1 -1
- package/.output/server/chunks/build/{Detail-MGwP_u2d.mjs → Detail-BcQGdJY5.mjs} +112 -46
- package/.output/server/chunks/build/Detail-BcQGdJY5.mjs.map +1 -0
- package/.output/server/chunks/build/{_prd_-C-Aj4fVa.mjs → _prd_-CD_Bds_B.mjs} +80 -7
- package/.output/server/chunks/build/_prd_-CD_Bds_B.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{default-Cao5eO80.mjs → default-BKKgG7HJ.mjs} +220 -24
- package/.output/server/chunks/build/default-BKKgG7HJ.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-Bf6kdO80.mjs +1 -1
- package/.output/server/chunks/build/error-500-D_bcARXN.mjs +1 -1
- package/.output/server/chunks/build/{index-ljj9uTXI.mjs → index-DE1tjHAd.mjs} +3 -4
- package/.output/server/chunks/build/index-DE1tjHAd.mjs.map +1 -0
- package/.output/server/chunks/build/nuxt-link-SvT1nf8Z.mjs +1 -1
- package/.output/server/chunks/build/{repo-graph-EuhMeFt7.mjs → repo-graph-CBfhpnd5.mjs} +25 -12
- package/.output/server/chunks/build/repo-graph-CBfhpnd5.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +14 -14
- package/.output/server/chunks/build/styles.mjs +2 -2
- package/.output/server/chunks/build/{usePrd-f7ylhIqs.mjs → usePrd-hXZOmvAv.mjs} +113 -9
- package/.output/server/chunks/build/usePrd-hXZOmvAv.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1051 -1365
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/api/browse.get.mjs +24 -6
- package/.output/server/chunks/routes/api/browse.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +3 -2
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +22 -8
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs +20 -11
- package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs +27 -3
- package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/archive.post.mjs +93 -0
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/archive.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs +4 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs +4 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs +4 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs +27 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/runtime.get.mjs +2 -2
- package/.output/server/chunks/routes/api/state-migration/status.get.mjs +21 -0
- package/.output/server/chunks/routes/api/state-migration/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/watch.get.mjs +3 -2
- package/.output/server/chunks/routes/api/watch.get.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/index.mjs +2 -2
- package/.output/server/package.json +1 -1
- package/README.md +5 -7
- package/dist/host/src/api/repos.js +0 -2
- package/dist/host/src/api/state.js +1 -7
- package/dist/host/src/index.js +2 -7
- package/dist/host/src/ui.js +2 -7
- package/dist/server/utils/db.js +15 -0
- package/dist/server/utils/prd-archive.js +53 -0
- package/dist/server/utils/prd-service.js +27 -11
- package/dist/server/utils/prd-state.js +11 -122
- package/dist/server/utils/repos.js +14 -4
- package/dist/server/utils/state-migration.js +225 -0
- package/dist/server/utils/state-schema.js +181 -4
- package/dist/server/utils/task-graph.js +21 -14
- package/package.json +1 -1
- package/.output/public/_nuxt/CbJfCtEa.js +0 -1
- package/.output/public/_nuxt/CmhLcqDu.js +0 -1
- package/.output/public/_nuxt/DC6iPLz1.js +0 -30
- package/.output/public/_nuxt/DD--ojY9.js +0 -3
- package/.output/public/_nuxt/DhKWRjCh.js +0 -60
- package/.output/public/_nuxt/builds/meta/f3f42dbd-d501-442b-871c-3d06157e7aa1.json +0 -1
- package/.output/public/_nuxt/c1sXju8w.js +0 -1
- package/.output/public/_nuxt/eGCjCghR.js +0 -1
- package/.output/public/_nuxt/entry.LcDOtJnR.css +0 -1
- package/.output/server/chunks/build/Detail-MGwP_u2d.mjs.map +0 -1
- package/.output/server/chunks/build/_prd_-C-Aj4fVa.mjs.map +0 -1
- package/.output/server/chunks/build/default-Cao5eO80.mjs.map +0 -1
- package/.output/server/chunks/build/index-ByZO4Bvq.mjs +0 -76
- package/.output/server/chunks/build/index-ByZO4Bvq.mjs.map +0 -1
- package/.output/server/chunks/build/index-ljj9uTXI.mjs.map +0 -1
- package/.output/server/chunks/build/repo-graph-EuhMeFt7.mjs.map +0 -1
- package/.output/server/chunks/build/usePrd-f7ylhIqs.mjs.map +0 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import { promises, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve, isAbsolute, join, basename, relative, dirname } from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { b as dbRun, h as dbAll, e as dbGet } from '../nitro/nitro.mjs';
|
|
6
|
+
|
|
7
|
+
function findPackageRoot(startDir) {
|
|
8
|
+
let currentDir = startDir;
|
|
9
|
+
while (true) {
|
|
10
|
+
if (existsSync(join(currentDir, "package.json"))) {
|
|
11
|
+
return currentDir;
|
|
12
|
+
}
|
|
13
|
+
const parentDir = dirname(currentDir);
|
|
14
|
+
if (parentDir === currentDir) {
|
|
15
|
+
return startDir;
|
|
16
|
+
}
|
|
17
|
+
currentDir = parentDir;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function normalizePathSlashes(path) {
|
|
21
|
+
return path.replaceAll("\\", "/");
|
|
22
|
+
}
|
|
23
|
+
function isPathWithin(basePath, candidatePath) {
|
|
24
|
+
const relativePath = relative(resolve(basePath), resolve(candidatePath));
|
|
25
|
+
return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute(relativePath);
|
|
26
|
+
}
|
|
27
|
+
const PACKAGE_ROOT = findPackageRoot(dirname(fileURLToPath(globalThis._importMeta_.url)));
|
|
28
|
+
const LEGACY_REPOS_FILE = join(PACKAGE_ROOT, "server", "data", "repos.json");
|
|
29
|
+
let legacyImportPromise = null;
|
|
30
|
+
function serializeGitRepos(gitRepos) {
|
|
31
|
+
return gitRepos && gitRepos.length > 0 ? JSON.stringify(gitRepos) : null;
|
|
32
|
+
}
|
|
33
|
+
function parseGitRepos(repoPath, gitReposJson) {
|
|
34
|
+
if (!gitReposJson) {
|
|
35
|
+
return void 0;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(gitReposJson);
|
|
39
|
+
if (!Array.isArray(parsed)) {
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
const repoRoot = resolve(repoPath);
|
|
43
|
+
const validRepos = /* @__PURE__ */ new Map();
|
|
44
|
+
for (const item of parsed) {
|
|
45
|
+
if (!item || typeof item !== "object") {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const relativePath = item.relativePath;
|
|
49
|
+
const name = item.name;
|
|
50
|
+
if (!relativePath || !name) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const normalizedRelativePath = normalizePathSlashes(relativePath).replace(/^\.\//, "");
|
|
54
|
+
if (!normalizedRelativePath || normalizedRelativePath === ".") {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const absolutePath = resolve(repoRoot, normalizedRelativePath);
|
|
58
|
+
if (!isPathWithin(repoRoot, absolutePath)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
validRepos.set(normalizedRelativePath, {
|
|
62
|
+
relativePath: normalizedRelativePath,
|
|
63
|
+
absolutePath,
|
|
64
|
+
name
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return validRepos.size > 0 ? Array.from(validRepos.values()) : void 0;
|
|
68
|
+
} catch {
|
|
69
|
+
return void 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function rowToRepo(row) {
|
|
73
|
+
const gitRepos = parseGitRepos(row.path, row.git_repos_json);
|
|
74
|
+
return {
|
|
75
|
+
id: row.id,
|
|
76
|
+
name: row.name,
|
|
77
|
+
path: row.path,
|
|
78
|
+
addedAt: row.added_at,
|
|
79
|
+
...gitRepos && { gitRepos }
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function isLegacyRepoConfig(value) {
|
|
83
|
+
if (!value || typeof value !== "object") {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const repo = value;
|
|
87
|
+
return typeof repo.id === "string" && typeof repo.name === "string" && typeof repo.path === "string" && typeof repo.addedAt === "string";
|
|
88
|
+
}
|
|
89
|
+
async function importLegacyReposIfNeeded() {
|
|
90
|
+
if (legacyImportPromise) {
|
|
91
|
+
return legacyImportPromise;
|
|
92
|
+
}
|
|
93
|
+
legacyImportPromise = (async () => {
|
|
94
|
+
var _a;
|
|
95
|
+
const row = await dbGet("SELECT COUNT(*) as count FROM repos");
|
|
96
|
+
if (((_a = row == null ? void 0 : row.count) != null ? _a : 0) > 0) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
let legacyRepos;
|
|
100
|
+
try {
|
|
101
|
+
const content = await promises.readFile(LEGACY_REPOS_FILE, "utf-8");
|
|
102
|
+
legacyRepos = JSON.parse(content);
|
|
103
|
+
} catch {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!Array.isArray(legacyRepos) || legacyRepos.length === 0) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
for (const candidate of legacyRepos) {
|
|
110
|
+
if (!isLegacyRepoConfig(candidate)) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const repo = candidate;
|
|
114
|
+
await dbRun(
|
|
115
|
+
`
|
|
116
|
+
INSERT INTO repos (id, name, path, added_at, git_repos_json)
|
|
117
|
+
VALUES (?, ?, ?, ?, ?)
|
|
118
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
119
|
+
name = excluded.name,
|
|
120
|
+
path = excluded.path,
|
|
121
|
+
added_at = excluded.added_at,
|
|
122
|
+
git_repos_json = excluded.git_repos_json
|
|
123
|
+
`,
|
|
124
|
+
[repo.id, repo.name, repo.path, repo.addedAt, serializeGitRepos(repo.gitRepos)]
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
await promises.unlink(LEGACY_REPOS_FILE);
|
|
129
|
+
} catch {
|
|
130
|
+
}
|
|
131
|
+
})();
|
|
132
|
+
return legacyImportPromise;
|
|
133
|
+
}
|
|
134
|
+
async function getRepos() {
|
|
135
|
+
await importLegacyReposIfNeeded();
|
|
136
|
+
const rows = await dbAll("SELECT id, name, path, added_at, git_repos_json FROM repos ORDER BY added_at ASC");
|
|
137
|
+
return rows.map(rowToRepo);
|
|
138
|
+
}
|
|
139
|
+
async function addRepo(path, name) {
|
|
140
|
+
await importLegacyReposIfNeeded();
|
|
141
|
+
const resolvedPath = resolve(path);
|
|
142
|
+
const existing = await dbGet("SELECT id FROM repos WHERE path = ?", [resolvedPath]);
|
|
143
|
+
if (existing) {
|
|
144
|
+
throw new Error("Repository already added");
|
|
145
|
+
}
|
|
146
|
+
const gitRepos = await discoverGitRepos(resolvedPath);
|
|
147
|
+
const repo = {
|
|
148
|
+
id: randomUUID(),
|
|
149
|
+
name: name || basename(resolvedPath),
|
|
150
|
+
path: resolvedPath,
|
|
151
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
152
|
+
...gitRepos.length > 0 && { gitRepos }
|
|
153
|
+
};
|
|
154
|
+
await dbRun(
|
|
155
|
+
"INSERT INTO repos (id, name, path, added_at, git_repos_json) VALUES (?, ?, ?, ?, ?)",
|
|
156
|
+
[repo.id, repo.name, repo.path, repo.addedAt, serializeGitRepos(repo.gitRepos)]
|
|
157
|
+
);
|
|
158
|
+
return repo;
|
|
159
|
+
}
|
|
160
|
+
async function getRepoById(id) {
|
|
161
|
+
await importLegacyReposIfNeeded();
|
|
162
|
+
const row = await dbGet(
|
|
163
|
+
"SELECT id, name, path, added_at, git_repos_json FROM repos WHERE id = ?",
|
|
164
|
+
[id]
|
|
165
|
+
);
|
|
166
|
+
return row ? rowToRepo(row) : void 0;
|
|
167
|
+
}
|
|
168
|
+
async function updateRepoGitRepos(id, gitRepos) {
|
|
169
|
+
await importLegacyReposIfNeeded();
|
|
170
|
+
const result = await dbRun(
|
|
171
|
+
"UPDATE repos SET git_repos_json = ? WHERE id = ?",
|
|
172
|
+
[serializeGitRepos(gitRepos), id]
|
|
173
|
+
);
|
|
174
|
+
return result.changes > 0;
|
|
175
|
+
}
|
|
176
|
+
async function removeRepo(id) {
|
|
177
|
+
await importLegacyReposIfNeeded();
|
|
178
|
+
const result = await dbRun("DELETE FROM repos WHERE id = ?", [id]);
|
|
179
|
+
return result.changes > 0;
|
|
180
|
+
}
|
|
181
|
+
const IGNORED_DIRS = /* @__PURE__ */ new Set([
|
|
182
|
+
"node_modules",
|
|
183
|
+
".git",
|
|
184
|
+
"vendor",
|
|
185
|
+
"dist",
|
|
186
|
+
"build",
|
|
187
|
+
".next",
|
|
188
|
+
".nuxt",
|
|
189
|
+
"__pycache__",
|
|
190
|
+
".venv",
|
|
191
|
+
"venv",
|
|
192
|
+
"target",
|
|
193
|
+
// Rust
|
|
194
|
+
"Pods"
|
|
195
|
+
// iOS
|
|
196
|
+
]);
|
|
197
|
+
async function isGitRepo(dirPath) {
|
|
198
|
+
try {
|
|
199
|
+
const gitPath = join(dirPath, ".git");
|
|
200
|
+
const stats = await promises.stat(gitPath);
|
|
201
|
+
return stats.isDirectory() || stats.isFile();
|
|
202
|
+
} catch {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function discoverGitRepos(basePath, maxDepth = 4) {
|
|
207
|
+
const resolvedBase = resolve(basePath);
|
|
208
|
+
if (await isGitRepo(resolvedBase)) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const discovered = [];
|
|
212
|
+
async function scanDirectory(dirPath, currentDepth) {
|
|
213
|
+
if (currentDepth > maxDepth) return;
|
|
214
|
+
try {
|
|
215
|
+
const entries = await promises.readdir(dirPath, { withFileTypes: true });
|
|
216
|
+
for (const entry of entries) {
|
|
217
|
+
if (!entry.isDirectory()) continue;
|
|
218
|
+
if (IGNORED_DIRS.has(entry.name)) continue;
|
|
219
|
+
const fullPath = join(dirPath, entry.name);
|
|
220
|
+
if (await isGitRepo(fullPath)) {
|
|
221
|
+
const relativePath = relative(resolvedBase, fullPath);
|
|
222
|
+
discovered.push({
|
|
223
|
+
relativePath,
|
|
224
|
+
absolutePath: fullPath,
|
|
225
|
+
name: entry.name
|
|
226
|
+
});
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
await scanDirectory(fullPath, currentDepth + 1);
|
|
230
|
+
}
|
|
231
|
+
} catch {
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
await scanDirectory(resolvedBase, 1);
|
|
235
|
+
return discovered;
|
|
236
|
+
}
|
|
237
|
+
async function validateRepoPath(path) {
|
|
238
|
+
const trimmedPath = path.trim();
|
|
239
|
+
if (trimmedPath.length === 0) {
|
|
240
|
+
return { valid: false, error: "Path is required" };
|
|
241
|
+
}
|
|
242
|
+
if (trimmedPath.length > 4096) {
|
|
243
|
+
return { valid: false, error: "Path is too long" };
|
|
244
|
+
}
|
|
245
|
+
if (trimmedPath.includes("\0")) {
|
|
246
|
+
return { valid: false, error: "Path contains invalid characters" };
|
|
247
|
+
}
|
|
248
|
+
const isWindowsAbsolutePath = /^[A-Za-z]:[\\/]/.test(trimmedPath);
|
|
249
|
+
if (!isAbsolute(trimmedPath) && !isWindowsAbsolutePath) {
|
|
250
|
+
return { valid: false, error: "Path must be absolute" };
|
|
251
|
+
}
|
|
252
|
+
const resolvedPath = resolve(trimmedPath);
|
|
253
|
+
try {
|
|
254
|
+
const stats = await promises.stat(resolvedPath);
|
|
255
|
+
if (!stats.isDirectory()) {
|
|
256
|
+
return { valid: false, error: "Path is not a directory" };
|
|
257
|
+
}
|
|
258
|
+
const hasPrdDir = await promises.stat(join(resolvedPath, "docs", "prd")).then(() => true).catch(() => false);
|
|
259
|
+
if (!hasPrdDir) {
|
|
260
|
+
return {
|
|
261
|
+
valid: false,
|
|
262
|
+
error: "Directory does not appear to be a valid PRD repository (missing docs/prd directory)"
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
return { valid: true };
|
|
266
|
+
} catch {
|
|
267
|
+
return { valid: false, error: "Directory does not exist" };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export { getRepoById as a, addRepo as b, discoverGitRepos as d, getRepos as g, removeRepo as r, updateRepoGitRepos as u, validateRepoPath as v };
|
|
272
|
+
//# sourceMappingURL=repos.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos.mjs","sources":["../../../../server/utils/repos.ts"],"names":["fs"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { promises } from 'node:fs';
|
|
2
|
-
import {
|
|
3
|
-
import { b as resolvePrdMarkdownPath } from './prd-service.mjs';
|
|
2
|
+
import { g as getPrdStateSummaries, b as getPrdArchiveMap, c as getPrdState, d as resolvePrdMarkdownPath } from './prd-service.mjs';
|
|
4
3
|
|
|
5
4
|
const NODE_SEPARATOR = "::";
|
|
6
5
|
const MISSING_PREFIX = "missing";
|
|
@@ -141,7 +140,6 @@ function buildGraphFromInputs(inputs) {
|
|
|
141
140
|
}
|
|
142
141
|
async function buildPrdGraph(repo, prdSlug) {
|
|
143
142
|
var _a;
|
|
144
|
-
await migrateLegacyStateForRepo(repo);
|
|
145
143
|
const [state, prdName] = await Promise.all([
|
|
146
144
|
getPrdState(repo.id, prdSlug),
|
|
147
145
|
resolvePrdName(repo, prdSlug)
|
|
@@ -163,24 +161,29 @@ async function buildPrdGraph(repo, prdSlug) {
|
|
|
163
161
|
stats: graph.stats
|
|
164
162
|
};
|
|
165
163
|
}
|
|
166
|
-
async function buildRepoGraph(repo) {
|
|
167
|
-
|
|
168
|
-
await
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
164
|
+
async function buildRepoGraph(repo, options = {}) {
|
|
165
|
+
const includeArchived = options.includeArchived === true;
|
|
166
|
+
const [summaries, archiveMap] = await Promise.all([
|
|
167
|
+
getPrdStateSummaries(repo.id),
|
|
168
|
+
getPrdArchiveMap(repo.id)
|
|
169
|
+
]);
|
|
170
|
+
const slugs = [...summaries.keys()].filter((slug) => includeArchived || !archiveMap.has(slug)).sort((a, b) => a.localeCompare(b));
|
|
171
|
+
const inputs = (await Promise.all(slugs.map(async (slug) => {
|
|
172
|
+
var _a;
|
|
173
|
+
const [state, prdName] = await Promise.all([
|
|
174
|
+
getPrdState(repo.id, slug),
|
|
175
|
+
resolvePrdName(repo, slug)
|
|
176
|
+
]);
|
|
174
177
|
const tasks = (_a = state == null ? void 0 : state.tasks) == null ? void 0 : _a.tasks;
|
|
175
178
|
if (!Array.isArray(tasks)) {
|
|
176
|
-
|
|
179
|
+
return null;
|
|
177
180
|
}
|
|
178
|
-
|
|
181
|
+
return {
|
|
179
182
|
prdSlug: slug,
|
|
180
|
-
prdName
|
|
183
|
+
prdName,
|
|
181
184
|
tasks
|
|
182
|
-
}
|
|
183
|
-
}
|
|
185
|
+
};
|
|
186
|
+
}))).filter((input) => input !== null);
|
|
184
187
|
const graph = buildGraphFromInputs(inputs);
|
|
185
188
|
return {
|
|
186
189
|
scope: "repo",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-graph.mjs","sources":["../../../../server/utils/task-graph.ts"],"names":["fs"],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-graph.mjs","sources":["../../../../server/utils/task-graph.ts"],"names":["fs"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { join, basename, relative, resolve, isAbsolute } from 'node:path';
|
|
2
2
|
import chokidar from 'chokidar';
|
|
3
|
-
import {
|
|
3
|
+
import { f as emitChange } from '../nitro/nitro.mjs';
|
|
4
|
+
import { g as getRepos } from './repos.mjs';
|
|
4
5
|
|
|
5
6
|
let watcher = null;
|
|
6
7
|
let watchedPaths = [];
|
|
@@ -12,24 +13,22 @@ function isPathWithin(basePath, candidatePath) {
|
|
|
12
13
|
return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute(relativePath);
|
|
13
14
|
}
|
|
14
15
|
function getRepoIdFromPath(filePath, repos) {
|
|
16
|
+
let matchedRepo = null;
|
|
15
17
|
for (const repo of repos) {
|
|
16
|
-
if (isPathWithin(repo.path, filePath)) {
|
|
17
|
-
|
|
18
|
+
if (!isPathWithin(repo.path, filePath)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (!matchedRepo || resolve(repo.path).length > resolve(matchedRepo.path).length) {
|
|
22
|
+
matchedRepo = repo;
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
|
-
return null;
|
|
25
|
+
return (matchedRepo == null ? void 0 : matchedRepo.id) || null;
|
|
21
26
|
}
|
|
22
27
|
function getCategoryFromPath(filePath) {
|
|
23
28
|
const normalizedPath = toPosixPath(filePath);
|
|
24
29
|
if (normalizedPath.includes("/docs/prd/") && normalizedPath.endsWith(".md")) {
|
|
25
30
|
return "prd";
|
|
26
31
|
}
|
|
27
|
-
if (normalizedPath.includes("/.claude/state/") && normalizedPath.endsWith("tasks.json")) {
|
|
28
|
-
return "tasks";
|
|
29
|
-
}
|
|
30
|
-
if (normalizedPath.includes("/.claude/state/") && normalizedPath.endsWith("progress.json")) {
|
|
31
|
-
return "progress";
|
|
32
|
-
}
|
|
33
32
|
return null;
|
|
34
33
|
}
|
|
35
34
|
async function initWatcher() {
|
|
@@ -40,10 +39,7 @@ async function initWatcher() {
|
|
|
40
39
|
if (repos.length === 0) {
|
|
41
40
|
return;
|
|
42
41
|
}
|
|
43
|
-
watchedPaths = repos.
|
|
44
|
-
join(repo.path, "docs", "prd"),
|
|
45
|
-
join(repo.path, ".claude", "state")
|
|
46
|
-
]);
|
|
42
|
+
watchedPaths = repos.map((repo) => join(repo.path, "docs", "prd"));
|
|
47
43
|
watcher = chokidar.watch(watchedPaths, {
|
|
48
44
|
ignoreInitial: true,
|
|
49
45
|
persistent: true,
|
|
@@ -52,14 +48,7 @@ async function initWatcher() {
|
|
|
52
48
|
stabilityThreshold: 200,
|
|
53
49
|
pollInterval: 100
|
|
54
50
|
},
|
|
55
|
-
|
|
56
|
-
ignored: (path) => {
|
|
57
|
-
if (path.includes(".claude")) {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
const fileName = basename(path);
|
|
61
|
-
return fileName.startsWith(".") && fileName !== ".claude";
|
|
62
|
-
},
|
|
51
|
+
ignored: (path) => basename(path).startsWith("."),
|
|
63
52
|
followSymlinks: true
|
|
64
53
|
});
|
|
65
54
|
watcher.on("error", (error) => {
|
|
@@ -75,19 +64,6 @@ async function initWatcher() {
|
|
|
75
64
|
if (!repoId || !category) {
|
|
76
65
|
return;
|
|
77
66
|
}
|
|
78
|
-
if (category === "tasks" || category === "progress") {
|
|
79
|
-
const repo = repos2.find((candidate) => candidate.id === repoId);
|
|
80
|
-
if (repo) {
|
|
81
|
-
try {
|
|
82
|
-
await migrateLegacyStateForRepo(repo, {
|
|
83
|
-
cleanupLegacyFiles: false,
|
|
84
|
-
minFileAgeMs: 0
|
|
85
|
-
});
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.warn("[watcher] Failed to sync legacy state:", error);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
67
|
emitChange({
|
|
92
68
|
type: eventType,
|
|
93
69
|
path: toPosixPath(filePath),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.mjs","sources":["../../../../server/utils/watcher.ts"],"names":["repos"],"mappings":"
|
|
1
|
+
{"version":3,"file":"watcher.mjs","sources":["../../../../server/utils/watcher.ts"],"names":["repos"],"mappings":"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"}
|