@jpkme/diff-review 0.1.16 → 0.1.18

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 (154) hide show
  1. package/README.md +22 -14
  2. package/bin/diff-review.mjs +220 -29
  3. package/lib/acp.mjs +86 -10
  4. package/lib/agent-login.mjs +848 -36
  5. package/lib/agent-login.test.mjs +538 -0
  6. package/lib/agents.mjs +0 -39
  7. package/lib/agents.test.mjs +17 -24
  8. package/lib/extract-cache.test.mjs +162 -162
  9. package/lib/git.mjs +25 -9
  10. package/lib/model-label.mjs +20 -4
  11. package/lib/model-label.test.mjs +15 -2
  12. package/lib/prompt.mjs +12 -10
  13. package/lib/prompt.test.mjs +12 -0
  14. package/lib/review-meta.mjs +11 -3
  15. package/lib/review-meta.test.mjs +19 -2
  16. package/lib/review-prep.mjs +63 -63
  17. package/lib/validate.mjs +1 -1
  18. package/lib/wait-output.test.mjs +1 -1
  19. package/package.json +2 -2
  20. package/web/build/client/_app/immutable/assets/0.DdOl5Uve.css +1 -0
  21. package/web/build/client/_app/immutable/assets/0.DdOl5Uve.css.br +0 -0
  22. package/web/build/client/_app/immutable/assets/0.DdOl5Uve.css.gz +0 -0
  23. package/web/build/client/_app/immutable/assets/2.CQmxVXnC.css +1 -0
  24. package/web/build/client/_app/immutable/assets/2.CQmxVXnC.css.br +0 -0
  25. package/web/build/client/_app/immutable/assets/2.CQmxVXnC.css.gz +0 -0
  26. package/web/build/client/_app/immutable/assets/3.BVJgADrM.css +1 -0
  27. package/web/build/client/_app/immutable/assets/3.BVJgADrM.css.br +0 -0
  28. package/web/build/client/_app/immutable/assets/3.BVJgADrM.css.gz +0 -0
  29. package/web/build/client/_app/immutable/assets/storage.Ztmr3s84.css +1 -0
  30. package/web/build/client/_app/immutable/assets/storage.Ztmr3s84.css.br +0 -0
  31. package/web/build/client/_app/immutable/assets/storage.Ztmr3s84.css.gz +0 -0
  32. package/web/build/client/_app/immutable/chunks/{cYiFfRa3.js → -cMMFbSG.js} +1 -1
  33. package/web/build/client/_app/immutable/chunks/-cMMFbSG.js.br +2 -0
  34. package/web/build/client/_app/immutable/chunks/-cMMFbSG.js.gz +0 -0
  35. package/web/build/client/_app/immutable/chunks/0vBZPdKl.js +215 -0
  36. package/web/build/client/_app/immutable/chunks/0vBZPdKl.js.br +0 -0
  37. package/web/build/client/_app/immutable/chunks/0vBZPdKl.js.gz +0 -0
  38. package/web/build/client/_app/immutable/chunks/B-2kfLeA.js +1 -0
  39. package/web/build/client/_app/immutable/chunks/B-2kfLeA.js.br +0 -0
  40. package/web/build/client/_app/immutable/chunks/B-2kfLeA.js.gz +0 -0
  41. package/web/build/client/_app/immutable/chunks/{DHO7NTh1.js → BMoYpzpA.js} +2 -2
  42. package/web/build/client/_app/immutable/chunks/BMoYpzpA.js.br +0 -0
  43. package/web/build/client/_app/immutable/chunks/BMoYpzpA.js.gz +0 -0
  44. package/web/build/client/_app/immutable/chunks/{CXhIC34H.js → DA0YnpGR.js} +3 -3
  45. package/web/build/client/_app/immutable/chunks/DA0YnpGR.js.br +0 -0
  46. package/web/build/client/_app/immutable/chunks/DA0YnpGR.js.gz +0 -0
  47. package/web/build/client/_app/immutable/entry/app.CT6P0WMK.js +2 -0
  48. package/web/build/client/_app/immutable/entry/app.CT6P0WMK.js.br +0 -0
  49. package/web/build/client/_app/immutable/entry/app.CT6P0WMK.js.gz +0 -0
  50. package/web/build/client/_app/immutable/entry/start.U0TDB-jm.js +1 -0
  51. package/web/build/client/_app/immutable/entry/start.U0TDB-jm.js.br +0 -0
  52. package/web/build/client/_app/immutable/entry/start.U0TDB-jm.js.gz +0 -0
  53. package/web/build/client/_app/immutable/nodes/0.ii5weUjH.js +1 -0
  54. package/web/build/client/_app/immutable/nodes/0.ii5weUjH.js.br +0 -0
  55. package/web/build/client/_app/immutable/nodes/0.ii5weUjH.js.gz +0 -0
  56. package/web/build/client/_app/immutable/nodes/1.CM10dYkJ.js +1 -0
  57. package/web/build/client/_app/immutable/nodes/1.CM10dYkJ.js.br +2 -0
  58. package/web/build/client/_app/immutable/nodes/1.CM10dYkJ.js.gz +0 -0
  59. package/web/build/client/_app/immutable/nodes/2.B1LHk3LQ.js +12 -0
  60. package/web/build/client/_app/immutable/nodes/2.B1LHk3LQ.js.br +0 -0
  61. package/web/build/client/_app/immutable/nodes/2.B1LHk3LQ.js.gz +0 -0
  62. package/web/build/client/_app/immutable/nodes/3.BQOdjQBQ.js +340 -0
  63. package/web/build/client/_app/immutable/nodes/3.BQOdjQBQ.js.br +0 -0
  64. package/web/build/client/_app/immutable/nodes/3.BQOdjQBQ.js.gz +0 -0
  65. package/web/build/client/_app/version.json +1 -1
  66. package/web/build/client/_app/version.json.br +0 -0
  67. package/web/build/client/_app/version.json.gz +0 -0
  68. package/web/build/handler.js +3 -3
  69. package/web/build/index.js +3 -3
  70. package/web/build/server/chunks/0-BUdytb9b.js +11 -0
  71. package/web/build/server/chunks/{0-D7NSxn1-.js.map → 0-BUdytb9b.js.map} +1 -1
  72. package/web/build/server/chunks/1-DRokSBkY.js +7 -0
  73. package/web/build/server/chunks/{1-DboYz8Fw.js.map → 1-DRokSBkY.js.map} +1 -1
  74. package/web/build/server/chunks/2-BxyzaJTR.js +7 -0
  75. package/web/build/server/chunks/2-BxyzaJTR.js.map +1 -0
  76. package/web/build/server/chunks/3-D8o0VWkj.js +7 -0
  77. package/web/build/server/chunks/{3-DgJ_LmTL.js.map → 3-D8o0VWkj.js.map} +1 -1
  78. package/web/build/server/chunks/{_server.ts-CP5cRLhW.js → _server.ts-kax5Szn0.js} +5 -4
  79. package/web/build/server/chunks/_server.ts-kax5Szn0.js.map +1 -0
  80. package/web/build/server/chunks/_server.ts-vS3A9t3f.js +123 -0
  81. package/web/build/server/chunks/_server.ts-vS3A9t3f.js.map +1 -0
  82. package/web/build/server/chunks/{agent-sessions-2XGojSJ_.js → agent-sessions-BArYLTW6.js} +1023 -135
  83. package/web/build/server/chunks/agent-sessions-BArYLTW6.js.map +1 -0
  84. package/web/build/server/chunks/{git-review-jZ_JJYfv.js → git-review-hZSqk_1P.js} +54 -21
  85. package/web/build/server/chunks/{git-review-jZ_JJYfv.js.map → git-review-hZSqk_1P.js.map} +1 -1
  86. package/web/build/server/chunks/{handler-B_8yUXji.js → handler-DbFqzg7l.js} +3 -3
  87. package/web/build/server/chunks/{handler-B_8yUXji.js.map → handler-DbFqzg7l.js.map} +1 -1
  88. package/web/build/server/chunks/{hooks.server-rF_eBCff.js → hooks.server-BEl7rVad.js} +4 -3
  89. package/web/build/server/chunks/{hooks.server-rF_eBCff.js.map → hooks.server-BEl7rVad.js.map} +1 -1
  90. package/web/build/server/chunks/{index.js-CGw8_Q7V.js → index.js-BB9DZBdR.js} +4 -4
  91. package/web/build/server/chunks/index.js-BB9DZBdR.js.map +1 -0
  92. package/web/build/server/chunks/manifest.js-Dk6YX1jw.js +65 -0
  93. package/web/build/server/chunks/manifest.js-Dk6YX1jw.js.map +1 -0
  94. package/web/build/server/chunks/{remote-1g4ayag-BMpjk8UD.js → remote-1g4ayag-Bz1vj8X1.js} +6 -6
  95. package/web/build/server/chunks/remote-1g4ayag-Bz1vj8X1.js.map +1 -0
  96. package/web/build/server/chunks/{remote-wh6t6j-dYLCg8ks.js → remote-wh6t6j-DSwM3S9h.js} +44 -10
  97. package/web/build/server/chunks/remote-wh6t6j-DSwM3S9h.js.map +1 -0
  98. package/web/build/server/chunks/{validate-Da6e71V3.js → validate-CXjTRGnR.js} +34 -17
  99. package/web/build/server/chunks/validate-CXjTRGnR.js.map +1 -0
  100. package/web/build/client/_app/immutable/assets/0.BKRG1f36.css +0 -1
  101. package/web/build/client/_app/immutable/assets/0.BKRG1f36.css.br +0 -0
  102. package/web/build/client/_app/immutable/assets/0.BKRG1f36.css.gz +0 -0
  103. package/web/build/client/_app/immutable/assets/2.C4whE4xz.css +0 -1
  104. package/web/build/client/_app/immutable/assets/2.C4whE4xz.css.br +0 -0
  105. package/web/build/client/_app/immutable/assets/2.C4whE4xz.css.gz +0 -0
  106. package/web/build/client/_app/immutable/assets/3.DB-bJJq2.css +0 -1
  107. package/web/build/client/_app/immutable/assets/3.DB-bJJq2.css.br +0 -0
  108. package/web/build/client/_app/immutable/assets/3.DB-bJJq2.css.gz +0 -0
  109. package/web/build/client/_app/immutable/assets/storage.BxR6930R.css +0 -1
  110. package/web/build/client/_app/immutable/assets/storage.BxR6930R.css.br +0 -0
  111. package/web/build/client/_app/immutable/assets/storage.BxR6930R.css.gz +0 -0
  112. package/web/build/client/_app/immutable/chunks/BLMWhW3J.js +0 -1
  113. package/web/build/client/_app/immutable/chunks/BLMWhW3J.js.br +0 -1
  114. package/web/build/client/_app/immutable/chunks/BLMWhW3J.js.gz +0 -0
  115. package/web/build/client/_app/immutable/chunks/CXhIC34H.js.br +0 -0
  116. package/web/build/client/_app/immutable/chunks/CXhIC34H.js.gz +0 -0
  117. package/web/build/client/_app/immutable/chunks/DHO7NTh1.js.br +0 -0
  118. package/web/build/client/_app/immutable/chunks/DHO7NTh1.js.gz +0 -0
  119. package/web/build/client/_app/immutable/chunks/DpxY75GB.js +0 -215
  120. package/web/build/client/_app/immutable/chunks/DpxY75GB.js.br +0 -0
  121. package/web/build/client/_app/immutable/chunks/DpxY75GB.js.gz +0 -0
  122. package/web/build/client/_app/immutable/chunks/cYiFfRa3.js.br +0 -1
  123. package/web/build/client/_app/immutable/chunks/cYiFfRa3.js.gz +0 -0
  124. package/web/build/client/_app/immutable/entry/app.CCv57mvp.js +0 -2
  125. package/web/build/client/_app/immutable/entry/app.CCv57mvp.js.br +0 -0
  126. package/web/build/client/_app/immutable/entry/app.CCv57mvp.js.gz +0 -0
  127. package/web/build/client/_app/immutable/entry/start.B012TSbW.js +0 -1
  128. package/web/build/client/_app/immutable/entry/start.B012TSbW.js.br +0 -1
  129. package/web/build/client/_app/immutable/entry/start.B012TSbW.js.gz +0 -0
  130. package/web/build/client/_app/immutable/nodes/0.slrnBioC.js +0 -1
  131. package/web/build/client/_app/immutable/nodes/0.slrnBioC.js.br +0 -0
  132. package/web/build/client/_app/immutable/nodes/0.slrnBioC.js.gz +0 -0
  133. package/web/build/client/_app/immutable/nodes/1.Bs5JdO4l.js +0 -1
  134. package/web/build/client/_app/immutable/nodes/1.Bs5JdO4l.js.br +0 -0
  135. package/web/build/client/_app/immutable/nodes/1.Bs5JdO4l.js.gz +0 -0
  136. package/web/build/client/_app/immutable/nodes/2.D5ULH3EX.js +0 -10
  137. package/web/build/client/_app/immutable/nodes/2.D5ULH3EX.js.br +0 -0
  138. package/web/build/client/_app/immutable/nodes/2.D5ULH3EX.js.gz +0 -0
  139. package/web/build/client/_app/immutable/nodes/3.hjzQQgyj.js +0 -173
  140. package/web/build/client/_app/immutable/nodes/3.hjzQQgyj.js.br +0 -0
  141. package/web/build/client/_app/immutable/nodes/3.hjzQQgyj.js.gz +0 -0
  142. package/web/build/server/chunks/0-D7NSxn1-.js +0 -11
  143. package/web/build/server/chunks/1-DboYz8Fw.js +0 -7
  144. package/web/build/server/chunks/2-B7LX817Q.js +0 -7
  145. package/web/build/server/chunks/2-B7LX817Q.js.map +0 -1
  146. package/web/build/server/chunks/3-DgJ_LmTL.js +0 -7
  147. package/web/build/server/chunks/_server.ts-CP5cRLhW.js.map +0 -1
  148. package/web/build/server/chunks/agent-sessions-2XGojSJ_.js.map +0 -1
  149. package/web/build/server/chunks/index.js-CGw8_Q7V.js.map +0 -1
  150. package/web/build/server/chunks/manifest.js-CImZFS6G.js +0 -58
  151. package/web/build/server/chunks/manifest.js-CImZFS6G.js.map +0 -1
  152. package/web/build/server/chunks/remote-1g4ayag-BMpjk8UD.js.map +0 -1
  153. package/web/build/server/chunks/remote-wh6t6j-dYLCg8ks.js.map +0 -1
  154. package/web/build/server/chunks/validate-Da6e71V3.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { e as error, g as get_request_store, b as stringify_remote_arg, M as MUTATIVE_METHODS, w as with_request_store, c as create_remote_key, n as noop, H as HttpError, S as SvelteKitError, h as handle_error_and_jsonify } from './index.js-CGw8_Q7V.js';
2
- import { i as isOutputFilename, a as assertGitRepo, l as locateReviewFile, d as decodePayload, e as ensureReviewDir, c as companionPaths, r as reviewDir, b as branchTips, m as makeOutputFilename, f as loadBranchDiff, g as git, F as FINDING_RESOLUTION_KINDS, h as FINDING_CLASSES, j as FINDING_SEVERITIES, k as FINDING_KINDS, G as GROUP_KINDS, W as WHY_SOURCES, B as BLOCK_OPS, S as SKIP_REASONS, n as fingerprint, o as listBranches, p as getRemoteUrl, t as tryResolveGitRoot, s as showFileLines } from './validate-Da6e71V3.js';
1
+ import { e as error, g as get_request_store, b as stringify_remote_arg, M as MUTATIVE_METHODS, w as with_request_store, c as create_remote_key, n as noop, H as HttpError, S as SvelteKitError, h as handle_error_and_jsonify } from './index.js-BB9DZBdR.js';
2
+ import { i as isOutputFilename, l as locateReviewFile, d as decodePayload, a as assertGitRepo, e as ensureReviewDir, c as companionPaths, r as reviewDir, b as branchTips, m as makeOutputFilename, f as loadBranchDiff, t as tryResolveGitRoot, g as git, F as FINDING_RESOLUTION_KINDS, h as FINDING_CLASSES, j as FINDING_SEVERITIES, k as FINDING_KINDS, G as GROUP_KINDS, W as WHY_SOURCES, B as BLOCK_OPS, S as SKIP_REASONS, n as fingerprint, o as listBranches, p as getRemoteUrl, s as showFileLines } from './validate-CXjTRGnR.js';
3
3
  import { readFileSync, writeFileSync, existsSync, mkdtempSync, rmSync, mkdirSync, statSync, readdirSync } from 'node:fs';
4
4
  import { spawnSync, execFileSync } from 'node:child_process';
5
5
  import { tmpdir, platform } from 'node:os';
@@ -1915,6 +1915,11 @@ function describeGitError(err) {
1915
1915
  }
1916
1916
  return err instanceof Error ? err.message : String(err);
1917
1917
  }
1918
+ /** Fallos de validación / repo inválido: se muestran en la UI, no como stack en la terminal. */
1919
+ function isExpectedGitUserError(err) {
1920
+ const message = describeGitError(err);
1921
+ return /Indicá la ruta absoluta/i.test(message) || /no es una ruta/i.test(message) || /No existe la carpeta/i.test(message) || /No es un repositorio git/i.test(message) || /no tiene commits/i.test(message) || /falta HEAD/i.test(message) || /not a git repository/i.test(message) || /ambiguous argument ['"]?HEAD['"]?/i.test(message) || /unknown revision or path not in the working tree/i.test(message);
1922
+ }
1918
1923
  function resolveSource(source, repo) {
1919
1924
  if (source === "local" || source === "url") return source;
1920
1925
  return looksLikeGitUrl(repo) ? "url" : "local";
@@ -1973,19 +1978,38 @@ function takePendingImport() {
1973
1978
  return null;
1974
1979
  }
1975
1980
  }
1981
+ function peekStr(value) {
1982
+ return typeof value === "string" ? value.trim() : "";
1983
+ }
1984
+ /** Lee meta liviana del JSON sin tirar; para enriquecer el botón de output detectado. */
1985
+ function peekReviewMeta(filePath) {
1986
+ try {
1987
+ const payload = decodePayload(readFileSync(filePath, "utf8"));
1988
+ const rec = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
1989
+ const nested = rec.meta && typeof rec.meta === "object" && !Array.isArray(rec.meta) ? rec.meta : {};
1990
+ const sessionRaw = nested.agentSession ?? rec.agentSession;
1991
+ const session = sessionRaw && typeof sessionRaw === "object" && !Array.isArray(sessionRaw) ? sessionRaw : {};
1992
+ const agent = peekStr(nested.agent ?? rec.agent) || void 0;
1993
+ const model = peekStr(nested.model ?? rec.model) || void 0;
1994
+ const generatedAt = peekStr(nested.generatedAt ?? rec.generatedAt) || void 0;
1995
+ const agentId = peekStr(session.agentId) || void 0;
1996
+ return {
1997
+ ...agent ? { agent } : {},
1998
+ ...model ? { model } : {},
1999
+ ...generatedAt ? { generatedAt } : {},
2000
+ ...agentId ? { agentId } : {}
2001
+ };
2002
+ } catch {
2003
+ return {};
2004
+ }
2005
+ }
1976
2006
  /**
1977
2007
  * Busca un JSON de review en `.diff-review/` o (formato viejo) en la raíz del repo local.
1978
2008
  * Prefiere `preferredName` si existe; si no, el más reciente que matchee el patrón.
1979
2009
  */
1980
2010
  function detectReviewOutput(repo, preferredName) {
1981
- const raw = String(repo || "").trim();
1982
- if (!raw || looksLikeGitUrl(raw)) return null;
1983
- let root;
1984
- try {
1985
- root = assertGitRepo(raw);
1986
- } catch {
1987
- return null;
1988
- }
2011
+ const root = resolveReviewRoot(repo);
2012
+ if (!root) return null;
1989
2013
  const preferred = String(preferredName || "").trim();
1990
2014
  if (preferred && isOutputFilename(preferred)) {
1991
2015
  const preferredPath = locateReviewFile(root, preferred);
@@ -1993,7 +2017,8 @@ function detectReviewOutput(repo, preferredName) {
1993
2017
  return {
1994
2018
  filename: preferred,
1995
2019
  path: preferredPath,
1996
- mtimeMs: statSync(preferredPath).mtimeMs
2020
+ mtimeMs: statSync(preferredPath).mtimeMs,
2021
+ ...peekReviewMeta(preferredPath)
1997
2022
  };
1998
2023
  } catch {}
1999
2024
  }
@@ -2014,24 +2039,32 @@ function detectReviewOutput(repo, preferredName) {
2014
2039
  if (!best || st.mtimeMs > best.mtimeMs) best = {
2015
2040
  filename: name,
2016
2041
  path: full,
2017
- mtimeMs: st.mtimeMs
2042
+ mtimeMs: st.mtimeMs,
2043
+ ...peekReviewMeta(full)
2018
2044
  };
2019
2045
  } catch {}
2020
2046
  }
2021
2047
  }
2022
2048
  return best;
2023
2049
  }
2024
- /** Lee y parsea un JSON de review de `.diff-review/` o la raíz del repo (solo nombres válidos). */
2025
- function readReviewOutput(repo, filename) {
2050
+ /** Raíz de carpeta para leer `.diff-review/` sin exigir `.git` (reload del viewer). */
2051
+ function resolveReviewRoot(repo) {
2026
2052
  const raw = String(repo || "").trim();
2027
- const name = basename(String(filename || "").trim());
2028
- if (!raw || !name || !isOutputFilename(name) || looksLikeGitUrl(raw)) return null;
2029
- let root;
2053
+ if (!raw || looksLikeGitUrl(raw)) return null;
2030
2054
  try {
2031
- root = assertGitRepo(raw);
2055
+ return assertGitRepo(raw);
2032
2056
  } catch {
2033
- return null;
2057
+ const resolved = resolve(raw);
2058
+ if (!existsSync(resolved)) return null;
2059
+ return tryResolveGitRoot(resolved) || resolved;
2034
2060
  }
2061
+ }
2062
+ /** Lee y parsea un JSON de review de `.diff-review/` o la raíz del repo (solo nombres válidos). */
2063
+ function readReviewOutput(repo, filename) {
2064
+ const name = basename(String(filename || "").trim());
2065
+ if (!name || !isOutputFilename(name)) return null;
2066
+ const root = resolveReviewRoot(repo);
2067
+ if (!root) return null;
2035
2068
  const filePath = locateReviewFile(root, name);
2036
2069
  if (!filePath) return null;
2037
2070
  try {
@@ -2170,5 +2203,5 @@ function hydrateReviewPayload(input) {
2170
2203
  return JSON.parse(JSON.stringify(doc));
2171
2204
  }
2172
2205
 
2173
- export { readReviewOutput as a, pickReviewJsonFile as b, command as c, describeGitError as d, loadLaunchRepoInfo as e, detectReviewOutput as f, loadFileLines as g, hydrateReviewPayload as h, loadRepoInfo as l, pickLocalFolder as p, query as q, resolveOutputName as r, takePendingImport as t, writeReviewOutput as w };
2174
- //# sourceMappingURL=git-review-jZ_JJYfv.js.map
2206
+ export { readReviewOutput as a, pickReviewJsonFile as b, command as c, describeGitError as d, loadLaunchRepoInfo as e, detectReviewOutput as f, loadFileLines as g, hydrateReviewPayload as h, isExpectedGitUserError as i, loadRepoInfo as l, pickLocalFolder as p, query as q, resolveOutputName as r, takePendingImport as t, writeReviewOutput as w };
2207
+ //# sourceMappingURL=git-review-hZSqk_1P.js.map