@dotobokuri/fleet-console 1.51.0 → 1.52.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.
Files changed (71) hide show
  1. package/AGENTS.md +10 -5
  2. package/README.md +10 -8
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.mjs +8473 -8345
  5. package/dist/client/assets/{_baseUniq-DFtleNrY.js → _baseUniq-CYpcPDgB.js} +1 -1
  6. package/dist/client/assets/{arc-CZWcxz4p.js → arc-BuehZLUz.js} +1 -1
  7. package/dist/client/assets/{architectureDiagram-Q4EWVU46-CoLGMUbn.js → architectureDiagram-Q4EWVU46-Bqn18zpp.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-DXYQGD6D-d4tcUrvS.js → blockDiagram-DXYQGD6D-DmtLdC53.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-AHTNJAMY-CcDJVtsE.js → c4Diagram-AHTNJAMY-BEBhZ5GG.js} +1 -1
  10. package/dist/client/assets/channel-BQlgz3sc.js +1 -0
  11. package/dist/client/assets/{chunk-4BX2VUAB-BxQcCCSB.js → chunk-4BX2VUAB-B8PizWjA.js} +1 -1
  12. package/dist/client/assets/{chunk-4TB4RGXK-C1iJwPC-.js → chunk-4TB4RGXK-C1ofR8zt.js} +1 -1
  13. package/dist/client/assets/{chunk-55IACEB6-Du7lkUwv.js → chunk-55IACEB6-CbKQ3d6C.js} +1 -1
  14. package/dist/client/assets/{chunk-EDXVE4YY-Chblko53.js → chunk-EDXVE4YY-DU-bru4J.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-B4fgWiDf.js → chunk-FMBD7UC4-DD9GbN05.js} +1 -1
  16. package/dist/client/assets/{chunk-OYMX7WX6-BXyyJDJI.js → chunk-OYMX7WX6-DZKa6Wtf.js} +1 -1
  17. package/dist/client/assets/{chunk-QZHKN3VN-BXAPpxgc.js → chunk-QZHKN3VN-fK2o17Jf.js} +1 -1
  18. package/dist/client/assets/{chunk-YZCP3GAM-BuEMjN4I.js → chunk-YZCP3GAM-z-7p86Bc.js} +1 -1
  19. package/dist/client/assets/classDiagram-6PBFFD2Q-CQs4cWly.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-HSJHXN6E-CQs4cWly.js +1 -0
  21. package/dist/client/assets/clone-B5bOHdOg.js +1 -0
  22. package/dist/client/assets/{cose-bilkent-S5V4N54A-Bk4ys4DX.js → cose-bilkent-S5V4N54A-x5L9kNFv.js} +1 -1
  23. package/dist/client/assets/{dagre-KV5264BT-8e2uOIAZ.js → dagre-KV5264BT-944maqqT.js} +1 -1
  24. package/dist/client/assets/{diagram-5BDNPKRD-BUaee6EH.js → diagram-5BDNPKRD-PV4GQ8C6.js} +1 -1
  25. package/dist/client/assets/{diagram-G4DWMVQ6-Y0F_eev2.js → diagram-G4DWMVQ6-GcoFZYg0.js} +1 -1
  26. package/dist/client/assets/{diagram-MMDJMWI5-DeqlMgQv.js → diagram-MMDJMWI5-8cIlnSEJ.js} +1 -1
  27. package/dist/client/assets/{diagram-TYMM5635-DqtnAuqr.js → diagram-TYMM5635-BlIMSlQ5.js} +1 -1
  28. package/dist/client/assets/{erDiagram-SMLLAGMA-BBGN7fOL.js → erDiagram-SMLLAGMA-KjlbhDy3.js} +1 -1
  29. package/dist/client/assets/{flowDiagram-DWJPFMVM-C0WwXtcb.js → flowDiagram-DWJPFMVM-DqYNn08z.js} +1 -1
  30. package/dist/client/assets/{ganttDiagram-T4ZO3ILL-D00_-gLK.js → ganttDiagram-T4ZO3ILL-BplrlRlU.js} +1 -1
  31. package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-D9-J9LVn.js → gitGraphDiagram-UUTBAWPF-CISgtHAu.js} +1 -1
  32. package/dist/client/assets/{graph-DbpxB806.js → graph-DaTRgbvC.js} +1 -1
  33. package/dist/client/assets/index-DVQ5EO_a.css +1 -0
  34. package/dist/client/assets/index-alR6ElCr.js +479 -0
  35. package/dist/client/assets/{infoDiagram-42DDH7IO-CoV_lg2_.js → infoDiagram-42DDH7IO-BbFeDUi-.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-DV9-YHTX.js → ishikawaDiagram-UXIWVN3A-BQTo9ri4.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-VCZTEJTY-CFY3HNeL.js → journeyDiagram-VCZTEJTY-CiRkOhp8.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-6JOO6SKY-BsN5X8OC.js → kanban-definition-6JOO6SKY-IIn_MSzy.js} +1 -1
  39. package/dist/client/assets/{layout-EvZfc466.js → layout-Cr58D4FS.js} +1 -1
  40. package/dist/client/assets/{linear-ConFN_kQ.js → linear-DNaIPcgl.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-q1Rp6XrX.js → mermaid.core-Dq_ukAsT.js} +4 -4
  42. package/dist/client/assets/{min-CgGOD4w3.js → min-DpLyTgPW.js} +1 -1
  43. package/dist/client/assets/{mindmap-definition-QFDTVHPH-CLvM_zrO.js → mindmap-definition-QFDTVHPH-C2DLYGq2.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-DEJITSTG-Bw7QTbiY.js → pieDiagram-DEJITSTG-C3Cxmz-n.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-34T5L4WZ-CJZW6aCq.js → quadrantDiagram-34T5L4WZ-CEdmiODY.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-MS252O5E-CMUb9ODK.js → requirementDiagram-MS252O5E-B-Vj0Wyw.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-XADWPNL6-DnjQJPPQ.js → sankeyDiagram-XADWPNL6-CyvEd7TA.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-FGHM5R23-BQLWPMCP.js → sequenceDiagram-FGHM5R23-B2MiPHOT.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-FHFEXIEX-CYUxN4zL.js → stateDiagram-FHFEXIEX-Dsa-VSCx.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-BKHWSGsO.js +1 -0
  51. package/dist/client/assets/{timeline-definition-GMOUNBTQ-DakKVVdc.js → timeline-definition-GMOUNBTQ-B9p0xkPR.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-DHZGUBPP-CjJALOSl.js → vennDiagram-DHZGUBPP-DeU4CNd8.js} +1 -1
  53. package/dist/client/assets/{wardley-RL74JXVD-DNN6iyI_.js → wardley-RL74JXVD-BQyG38I_.js} +1 -1
  54. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-CuoFFC8W.js → wardleyDiagram-NUSXRM2D-DjrdDkEs.js} +1 -1
  55. package/dist/client/assets/{xychartDiagram-5P7HB3ND-CLeb77Ra.js → xychartDiagram-5P7HB3ND-CG0KUfn_.js} +1 -1
  56. package/dist/client/index.html +2 -2
  57. package/dist/fleet-plugins/ledger/routes.mjs +40 -16487
  58. package/dist/fleet-plugins/quota/routes.mjs +352 -95
  59. package/dist/fleet-plugins/repository/routes.mjs +63 -7
  60. package/dist/fleet-plugins/scuttlebutt/routes.mjs +4954 -6895
  61. package/dist/fleet-plugins/skills/routes.mjs +58 -16505
  62. package/dist/fleet-plugins/terminal/routes.mjs +22555 -33426
  63. package/dist/fleet.mjs +54671 -0
  64. package/package.json +6 -4
  65. package/dist/client/assets/channel-BkjngaUP.js +0 -1
  66. package/dist/client/assets/classDiagram-6PBFFD2Q-Bcn4Byd0.js +0 -1
  67. package/dist/client/assets/classDiagram-v2-HSJHXN6E-Bcn4Byd0.js +0 -1
  68. package/dist/client/assets/clone-HJ2xLTt3.js +0 -1
  69. package/dist/client/assets/index-BhOzl99v.css +0 -1
  70. package/dist/client/assets/index-Bnx3O7Op.js +0 -482
  71. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-BqJUiDHN.js +0 -1
@@ -36,6 +36,7 @@ var GitExecutorError = class extends Error {
36
36
  var DEFAULT_TIMEOUT_MS = 3e4;
37
37
  var DEFAULT_MAX_BUFFER = 8 * 1024 * 1024;
38
38
  var STDERR_MAX_BUFFER = 1024 * 1024;
39
+ var PROBE_TIMEOUT_MS = 5e3;
39
40
  var GIT_HARDENING_PREFIX = ["-c", "core.fsmonitor=false", "--no-optional-locks"];
40
41
  function sanitizeGitEnvironment(environment) {
41
42
  const sanitized = {};
@@ -130,8 +131,13 @@ function runGit(args, opts) {
130
131
  resolve({ stdout: stdout2, stderr, truncated, stderrTruncated });
131
132
  return;
132
133
  }
133
- const isNoRepo = stderr.toLowerCase().includes("not a git repository");
134
- reject(new GitExecutorError(isNoRepo ? "no_git_repo" : "non_zero_exit", stderr, code ?? void 0));
134
+ if (stderr.toLowerCase().includes("not a git repository")) {
135
+ reject(new GitExecutorError("no_git_repo", stderr, code ?? void 0));
136
+ return;
137
+ }
138
+ isInsideRepository(opts.cwd).then((inside) => {
139
+ reject(new GitExecutorError(inside ? "non_zero_exit" : "no_git_repo", stderr, code ?? void 0));
140
+ });
135
141
  return;
136
142
  }
137
143
  const stdout = Buffer.concat(stdoutChunks).toString("utf8");
@@ -139,6 +145,40 @@ function runGit(args, opts) {
139
145
  });
140
146
  });
141
147
  }
148
+ function isInsideRepository(cwd) {
149
+ return new Promise((resolve) => {
150
+ let settled = false;
151
+ const done = (inside) => {
152
+ if (settled) return;
153
+ settled = true;
154
+ resolve(inside);
155
+ };
156
+ try {
157
+ const probeOptions = {
158
+ cwd,
159
+ env: sanitizeGitEnvironment(process.env),
160
+ stdio: "ignore",
161
+ shell: false
162
+ };
163
+ const probe = spawn("git", [...GIT_HARDENING_PREFIX, "rev-parse", "--git-dir"], withHidden(probeOptions));
164
+ const timer = setTimeout(() => {
165
+ probe.kill("SIGKILL");
166
+ done(true);
167
+ }, PROBE_TIMEOUT_MS);
168
+ timer.unref?.();
169
+ probe.on("error", () => {
170
+ clearTimeout(timer);
171
+ done(true);
172
+ });
173
+ probe.on("close", (code) => {
174
+ clearTimeout(timer);
175
+ done(code === 0);
176
+ });
177
+ } catch {
178
+ done(true);
179
+ }
180
+ });
181
+ }
142
182
  function isPathContained(root, candidate) {
143
183
  const relative = path3.relative(root, candidate);
144
184
  return relative === "" || !path3.isAbsolute(relative) && relative !== ".." && !relative.startsWith(`..${path3.sep}`);
@@ -1051,6 +1091,14 @@ async function handleRepositoryFetch(req, res, ctx) {
1051
1091
  var WORKTREE_SHA_RE = /^[0-9a-f]{40}$/;
1052
1092
  var CANONICAL_REF_RE = /^refs\/(?:heads|remotes|tags)\//;
1053
1093
  var REF_METACHAR_RE = /[~^:?*\[\\\s\x00-\x1f\x7f]/;
1094
+ var LOG_PRETTY_FORMAT = "--pretty=format:%x1e%H%x00%h%x00%s%x00%an%x00%ar%x00%at%x00%D%x00%P%x00%<(8,trunc)%b";
1095
+ var LOG_FIELD_COUNT = 9;
1096
+ var FULL_HASH_RE = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
1097
+ var LOG_ORDER_ARGS = { topo: "--topo-order", date: "--date-order" };
1098
+ function resolveLogOrder(requested) {
1099
+ if (requested === void 0) return "topo";
1100
+ return requested === "topo" || requested === "date" ? requested : null;
1101
+ }
1054
1102
  function isPlainObject7(value) {
1055
1103
  return typeof value === "object" && value !== null && !Array.isArray(value);
1056
1104
  }
@@ -1074,9 +1122,10 @@ function parseLogOutput(stdout) {
1074
1122
  const authorAt = Number.parseInt(fields[5] ?? "0", 10);
1075
1123
  const refsRaw = fields[6] ?? "";
1076
1124
  const parentsRaw = fields[7] ?? "";
1077
- if (!fullHash) continue;
1125
+ if (fields.length < LOG_FIELD_COUNT || !FULL_HASH_RE.test(fullHash)) continue;
1078
1126
  const refs = refsRaw.split(",").map((r) => r.trim()).filter(Boolean);
1079
1127
  const parents = parentsRaw.split(" ").map((p) => p.trim()).filter(Boolean);
1128
+ const hasBody = (fields[8] ?? "").trim() !== "";
1080
1129
  commits.push({
1081
1130
  shortHash,
1082
1131
  fullHash,
@@ -1086,7 +1135,8 @@ function parseLogOutput(stdout) {
1086
1135
  authorAt: Number.isFinite(authorAt) ? authorAt : 0,
1087
1136
  refs,
1088
1137
  parents,
1089
- onHead: true
1138
+ onHead: true,
1139
+ hasBody
1090
1140
  });
1091
1141
  }
1092
1142
  return commits;
@@ -1185,6 +1235,11 @@ async function handleRepositoryLog(req, res, ctx) {
1185
1235
  ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
1186
1236
  return;
1187
1237
  }
1238
+ const order = resolveLogOrder(body.order);
1239
+ if (order === null) {
1240
+ ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
1241
+ return;
1242
+ }
1188
1243
  const limit = body.limit === void 0 ? 200 : body.limit;
1189
1244
  const skip = body.skip === void 0 ? 0 : body.skip;
1190
1245
  if (!Number.isInteger(limit) || typeof limit !== "number" || limit < 1 || limit > 500 || !Number.isInteger(skip) || typeof skip !== "number" || skip < 0) {
@@ -1225,13 +1280,14 @@ async function handleRepositoryLog(req, res, ctx) {
1225
1280
  const [realGitCwd, realToplevel] = await Promise.all([normalizeWorktreePath(gitCwd), normalizeWorktreePath(currentWorktreePath)]);
1226
1281
  const scopePathspec = realToplevel !== "" && realGitCwd === realToplevel ? [] : ["."];
1227
1282
  const skipArg = skip > 0 ? [`--skip=${skip}`] : [];
1228
- const result = resolvedRef ? await runGit(["log", resolvedRef, "--date-order", "-n", String(limit + 1), ...skipArg, "--decorate=full", "--pretty=format:%x1e%H%x00%h%x00%s%x00%an%x00%ar%x00%at%x00%D%x00%P", "--", ...scopePathspec], { cwd: gitCwd }) : await runGit(
1283
+ const orderArg = LOG_ORDER_ARGS[order];
1284
+ const result = resolvedRef ? await runGit(["log", resolvedRef, orderArg, "-n", String(limit + 1), ...skipArg, "--decorate=full", LOG_PRETTY_FORMAT, "--", ...scopePathspec], { cwd: gitCwd }) : await runGit(
1229
1285
  // --all은 refs/stash·refs/notes까지 그래프에 유입시키므로 브랜치/태그/원격 + 현재 HEAD + 워크트리 HEAD로 한정한다
1230
- ["log", "--branches", "--tags", "--remotes", "--date-order", "-n", String(limit + 1), ...skipArg, "--decorate=full", "--pretty=format:%x1e%H%x00%h%x00%s%x00%an%x00%ar%x00%at%x00%D%x00%P", ...headRevs, ...worktreeRevs, "--", ...scopePathspec],
1286
+ ["log", "--branches", "--tags", "--remotes", orderArg, "-n", String(limit + 1), ...skipArg, "--decorate=full", LOG_PRETTY_FORMAT, ...headRevs, ...worktreeRevs, "--", ...scopePathspec],
1231
1287
  { cwd: gitCwd }
1232
1288
  );
1233
1289
  const parsedCommits = parseLogOutput(result.stdout);
1234
- const hasMore = parsedCommits.length > limit;
1290
+ const hasMore = parsedCommits.length > limit || result.truncated && parsedCommits.length > 0;
1235
1291
  const commits = annotateHeadReachability(parsedCommits.slice(0, limit), headRevList);
1236
1292
  ctx.host.http.writeJson(res, 200, { commits, checkouts, hasMore, ...result.truncated ? { truncated: true } : {} });
1237
1293
  } catch (error) {