@inharness-ai/claude4spec 1.0.11 → 1.0.13

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 (81) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/client/assets/{arc-C2bk_QpU.js → arc-E0e7X_zn.js} +1 -1
  3. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CvzXkhTv.js → architectureDiagram-3BPJPVTR-BzlqOVZv.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-GPEHLZMM-BdVNx639.js → blockDiagram-GPEHLZMM-BIQcApN7.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-AAUBKEIU-GsALRazP.js → c4Diagram-AAUBKEIU-CDU0V1yk.js} +1 -1
  6. package/dist/client/assets/channel-BqjILLUr.js +1 -0
  7. package/dist/client/assets/{chunk-2J33WTMH-DDokjOio.js → chunk-2J33WTMH-PtDSwC5f.js} +1 -1
  8. package/dist/client/assets/{chunk-4BX2VUAB-B_YcuTm8.js → chunk-4BX2VUAB-DTUPWrSO.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-xJ3wxfSN.js → chunk-55IACEB6-Cpd59xZT.js} +1 -1
  10. package/dist/client/assets/{chunk-727SXJPM-Burb3yd8.js → chunk-727SXJPM-C4DOvpJT.js} +1 -1
  11. package/dist/client/assets/{chunk-AQP2D5EJ-C9rR6gO6.js → chunk-AQP2D5EJ-CtjeHPBB.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-Dm7BhTp3.js → chunk-FMBD7UC4-CZA3OvVr.js} +1 -1
  13. package/dist/client/assets/{chunk-ND2GUHAM-CsNlOOp_.js → chunk-ND2GUHAM-Cbx6nQHm.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-BCmHzfVx.js → chunk-QZHKN3VN-3DunELI_.js} +1 -1
  15. package/dist/client/assets/classDiagram-4FO5ZUOK-LjT84-kK.js +1 -0
  16. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-LjT84-kK.js +1 -0
  17. package/dist/client/assets/{cose-bilkent-S5V4N54A-B6YZI-Gb.js → cose-bilkent-S5V4N54A-CKYJnuL7.js} +1 -1
  18. package/dist/client/assets/{dagre-BM42HDAG-DWY4jHpC.js → dagre-BM42HDAG-BrvRwrr_.js} +1 -1
  19. package/dist/client/assets/{diagram-2AECGRRQ-Copg3kuX.js → diagram-2AECGRRQ-BaVLuzcD.js} +1 -1
  20. package/dist/client/assets/{diagram-5GNKFQAL-CVmGVP62.js → diagram-5GNKFQAL-9Cu7Wa7J.js} +1 -1
  21. package/dist/client/assets/{diagram-KO2AKTUF-DeDhYbEo.js → diagram-KO2AKTUF-XKiCVdjO.js} +1 -1
  22. package/dist/client/assets/{diagram-LMA3HP47-BaclNUbX.js → diagram-LMA3HP47-DerecU5v.js} +1 -1
  23. package/dist/client/assets/{diagram-OG6HWLK6-2c0UdjS2.js → diagram-OG6HWLK6-BWcREvZ9.js} +1 -1
  24. package/dist/client/assets/{erDiagram-TEJ5UH35-sdiH7Dr_.js → erDiagram-TEJ5UH35-DU3BBQJY.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-I6XJVG4X-3qYkZRjo.js → flowDiagram-I6XJVG4X-DXO_IJeR.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-6RSMTGT7-j57OPIbM.js → ganttDiagram-6RSMTGT7-CXiFZEPx.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CZ5Wgihg.js → gitGraphDiagram-PVQCEYII-DHewdln-.js} +1 -1
  28. package/dist/client/assets/{index-v_d-wsnX.js → index-DD0GkjkG.js} +1 -1
  29. package/dist/client/assets/{index-Cw57I_bm.js → index-DT5g2AtL.js} +1 -1
  30. package/dist/client/assets/{index-CgWyzbtO.js → index-DcIG_8JB.js} +181 -181
  31. package/dist/client/assets/{infoDiagram-5YYISTIA-92O2HlAo.js → infoDiagram-5YYISTIA-CN40PAGW.js} +1 -1
  32. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-vESYChv7.js → ishikawaDiagram-YF4QCWOH-B8KsyuPk.js} +1 -1
  33. package/dist/client/assets/{journeyDiagram-JHISSGLW-ili7NI_B.js → journeyDiagram-JHISSGLW-BlEb3E_P.js} +1 -1
  34. package/dist/client/assets/{kanban-definition-UN3LZRKU-dLVbb5y7.js → kanban-definition-UN3LZRKU-B080CGS9.js} +1 -1
  35. package/dist/client/assets/{linear-CRY3U7pB.js → linear-D6Tg-IET.js} +1 -1
  36. package/dist/client/assets/{mermaid.core-CYorG2ZU.js → mermaid.core-DP18nW3T.js} +4 -4
  37. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DfUATrrd.js → mindmap-definition-RKZ34NQL-bfo7Qm5I.js} +1 -1
  38. package/dist/client/assets/{pieDiagram-4H26LBE5-DjF7gCzD.js → pieDiagram-4H26LBE5-ZsPztPu6.js} +1 -1
  39. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-_8BHPlRL.js → quadrantDiagram-W4KKPZXB-DKrTleIL.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DSj9pHkV.js → requirementDiagram-4Y6WPE33-D4YX8ZgG.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-irQ9C6cN.js → sankeyDiagram-5OEKKPKP-Bo-xm6Mc.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BZ7-oca3.js → sequenceDiagram-3UESZ5HK-CozgdKp6.js} +1 -1
  43. package/dist/client/assets/{stateDiagram-AJRCARHV-N6c5I2Sk.js → stateDiagram-AJRCARHV-CiK61MwV.js} +1 -1
  44. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C6-8M5Sb.js +1 -0
  45. package/dist/client/assets/{timeline-definition-PNZ67QCA-jYAKxj23.js → timeline-definition-PNZ67QCA-CgHoguI7.js} +1 -1
  46. package/dist/client/assets/{vennDiagram-CIIHVFJN-HoQPRkzJ.js → vennDiagram-CIIHVFJN-TY32dxQb.js} +1 -1
  47. package/dist/client/assets/{wardley-L42UT6IY-D6r8Awug.js → wardley-L42UT6IY-C6Q7VFwH.js} +1 -1
  48. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C_JUhYxS.js → wardleyDiagram-YWT4CUSO-nZLnVsQL.js} +1 -1
  49. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DgIYX2vi.js → xychartDiagram-2RQKCTM6-DHdYRHEr.js} +1 -1
  50. package/dist/client/index.html +1 -1
  51. package/dist/server/config.d.ts +12 -0
  52. package/dist/server/config.js +28 -1
  53. package/dist/server/config.js.map +1 -1
  54. package/dist/server/index.js +59 -4
  55. package/dist/server/index.js.map +1 -1
  56. package/dist/server/mcp/release-tools/index.d.ts +2 -0
  57. package/dist/server/mcp/release-tools/index.js +4 -1
  58. package/dist/server/mcp/release-tools/index.js.map +1 -1
  59. package/dist/server/routes/git.d.ts +9 -0
  60. package/dist/server/routes/git.js +21 -0
  61. package/dist/server/routes/git.js.map +1 -0
  62. package/dist/server/routes/releases.d.ts +2 -1
  63. package/dist/server/routes/releases.js +7 -3
  64. package/dist/server/routes/releases.js.map +1 -1
  65. package/dist/server/services/git.d.ts +62 -0
  66. package/dist/server/services/git.js +193 -0
  67. package/dist/server/services/git.js.map +1 -0
  68. package/dist/server/services/release-push.d.ts +3 -1
  69. package/dist/server/services/release-push.js +13 -2
  70. package/dist/server/services/release-push.js.map +1 -1
  71. package/dist/shared/entities.d.ts +12 -0
  72. package/dist/shared/entities.js.map +1 -1
  73. package/dist/shared/git.d.ts +33 -0
  74. package/dist/shared/git.js +9 -0
  75. package/dist/shared/git.js.map +1 -0
  76. package/dist/shared/release-push.d.ts +11 -0
  77. package/package.json +2 -2
  78. package/dist/client/assets/channel-C5L1x90J.js +0 -1
  79. package/dist/client/assets/classDiagram-4FO5ZUOK-EfPx1y8Y.js +0 -1
  80. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-EfPx1y8Y.js +0 -1
  81. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BhJycZQy.js +0 -1
@@ -0,0 +1,193 @@
1
+ /**
2
+ * M28 Git Sync — best-effort mirroring of claude4spec actions into the user's
3
+ * git repository. This service OWNS every `git` subprocess call (the only git
4
+ * shell-out in the server). All methods are best-effort: a missing/broken git,
5
+ * a missing repo, or a failed command never throws to the caller — it resolves
6
+ * to a non-throwing result shape.
7
+ *
8
+ * `detect()` answers "is `pagesDir` inside a worktree, and what does it look
9
+ * like". `commit()` / `push()` perform the two sync actions. `commitOnRelease()`
10
+ * / `pushOnPush()` are the gated entry points the hooks call: they read the
11
+ * (hot-reloaded) config flag, detect the repo, and either act or return `null`
12
+ * (flag off OR no repo).
13
+ *
14
+ * Spec: brief 0-1-37-to-0-1-38.md (M28).
15
+ */
16
+ import { execFile } from 'node:child_process';
17
+ import { promisify } from 'node:util';
18
+ import fs from 'node:fs';
19
+ import path from 'node:path';
20
+ import { configPath, readConfig } from '../config.js';
21
+ const pexec = promisify(execFile);
22
+ const NOT_DETECTED = {
23
+ detected: false,
24
+ rootPath: null,
25
+ remoteUrl: null,
26
+ branch: null,
27
+ isDirty: false,
28
+ };
29
+ export class GitService {
30
+ cwd;
31
+ pagesPath;
32
+ /**
33
+ * @param cwd project root (holds `.claude4spec/config.json`).
34
+ * @param pagesPath absolute path to the pages directory — the probe location
35
+ * for repo detection (a release may live in a sub-worktree).
36
+ */
37
+ constructor(cwd, pagesPath) {
38
+ this.cwd = cwd;
39
+ this.pagesPath = pagesPath;
40
+ }
41
+ /** Run `git <args>` in `dir`. Throws on non-zero exit or a missing binary. */
42
+ async git(args, dir) {
43
+ return pexec('git', args, { cwd: dir });
44
+ }
45
+ /**
46
+ * Probe `pagesDir` for a git worktree. Never throws — git missing (ENOENT),
47
+ * no repo, or `pagesDir` outside any worktree (exit 128) all map to
48
+ * `detected: false`.
49
+ */
50
+ async detect() {
51
+ let rootPath;
52
+ try {
53
+ const { stdout } = await this.git(['rev-parse', '--show-toplevel'], this.pagesPath);
54
+ rootPath = stdout.trim();
55
+ if (!rootPath)
56
+ return NOT_DETECTED;
57
+ }
58
+ catch {
59
+ return NOT_DETECTED;
60
+ }
61
+ // Inside a worktree — the remaining probes are individually best-effort.
62
+ const remoteUrl = await this.git(['remote', 'get-url', 'origin'], rootPath)
63
+ .then((r) => r.stdout.trim() || null)
64
+ .catch(() => null);
65
+ const branch = await this.git(['rev-parse', '--abbrev-ref', 'HEAD'], rootPath)
66
+ .then((r) => {
67
+ const b = r.stdout.trim();
68
+ // Detached HEAD reports the literal "HEAD" — surface as no branch.
69
+ return b && b !== 'HEAD' ? b : null;
70
+ })
71
+ .catch(() => null);
72
+ const isDirty = await this.git(['status', '--porcelain'], rootPath)
73
+ .then((r) => r.stdout.trim().length > 0)
74
+ .catch(() => false);
75
+ return { detected: true, rootPath, remoteUrl, branch, isDirty };
76
+ }
77
+ /**
78
+ * Stage `pagesDir` + `config.json` and commit. Assumes a repo is detected
79
+ * (callers gate via `commitOnRelease`). Returns `'skipped'` on detached HEAD,
80
+ * `'nothing-to-commit'` when nothing is staged, `'error'` on any git failure.
81
+ */
82
+ async commit(opts) {
83
+ const status = await this.detect();
84
+ if (!status.detected || !status.rootPath)
85
+ return { status: 'skipped' };
86
+ if (!status.branch)
87
+ return { status: 'skipped', message: 'detached HEAD' };
88
+ const root = status.rootPath;
89
+ // Canonicalize staging targets. pagesPath / configPath may be reached
90
+ // through a symlink (e.g. `.claude/skills/specyfikacja` → another repo's
91
+ // worktree). `git add` matches pathspecs lexically against the real worktree
92
+ // root, so an unresolved symlink path reads as "outside repository". Resolve
93
+ // to real paths and keep only those that actually live inside `root`.
94
+ const targets = [];
95
+ for (const p of [this.pagesPath, configPath(this.cwd)]) {
96
+ let real;
97
+ try {
98
+ real = fs.realpathSync(p);
99
+ }
100
+ catch {
101
+ continue; // missing path — nothing to stage from it
102
+ }
103
+ const rel = path.relative(root, real);
104
+ if (!rel.startsWith('..') && !path.isAbsolute(rel))
105
+ targets.push(real);
106
+ }
107
+ if (targets.length === 0) {
108
+ return {
109
+ status: 'skipped',
110
+ message: 'pages directory / config.json are outside the detected repository',
111
+ };
112
+ }
113
+ try {
114
+ await this.git(['add', '--', ...targets], root);
115
+ }
116
+ catch (err) {
117
+ return { status: 'error', message: errMessage(err) };
118
+ }
119
+ // `git diff --cached --quiet` exits 0 when nothing is staged, 1 otherwise.
120
+ try {
121
+ await this.git(['diff', '--cached', '--quiet'], root);
122
+ return { status: 'nothing-to-commit' };
123
+ }
124
+ catch {
125
+ // non-zero ⇒ there are staged changes; fall through to commit.
126
+ }
127
+ const message = opts.description ? `${opts.name}\n\n${opts.description}` : opts.name;
128
+ try {
129
+ await this.git(['commit', '-m', message], root);
130
+ return { status: 'committed' };
131
+ }
132
+ catch (err) {
133
+ return { status: 'error', message: errMessage(err) };
134
+ }
135
+ }
136
+ /**
137
+ * Push the current branch to its upstream. Assumes a repo is detected.
138
+ * `'nothing-to-push'` when git reports "Everything up-to-date", `'skipped'`
139
+ * on detached HEAD, `'error'` on a missing upstream or any other failure.
140
+ */
141
+ async push() {
142
+ const status = await this.detect();
143
+ if (!status.detected || !status.rootPath)
144
+ return { status: 'skipped' };
145
+ if (!status.branch)
146
+ return { status: 'skipped', message: 'detached HEAD' };
147
+ try {
148
+ const { stdout, stderr } = await this.git(['push'], status.rootPath);
149
+ if (/Everything up-to-date/i.test(`${stdout}\n${stderr}`)) {
150
+ return { status: 'nothing-to-push' };
151
+ }
152
+ return { status: 'pushed' };
153
+ }
154
+ catch (err) {
155
+ return { status: 'error', message: errMessage(err) };
156
+ }
157
+ }
158
+ /**
159
+ * Gated commit hook. `null` when commit-sync is off OR no repo detected;
160
+ * otherwise the `commit()` result. Reads config per-call (hot-reload).
161
+ */
162
+ async commitOnRelease(release) {
163
+ const config = readConfig(this.cwd);
164
+ if (!config.git?.syncCommitOnRelease)
165
+ return null;
166
+ const status = await this.detect();
167
+ if (!status.detected)
168
+ return null;
169
+ return this.commit(release);
170
+ }
171
+ /**
172
+ * Gated push hook. `null` when push-sync is off OR no repo detected;
173
+ * otherwise the `push()` result. Reads config per-call (hot-reload).
174
+ */
175
+ async pushOnPush() {
176
+ const config = readConfig(this.cwd);
177
+ if (!config.git?.syncPushOnPush)
178
+ return null;
179
+ const status = await this.detect();
180
+ if (!status.detected)
181
+ return null;
182
+ return this.push();
183
+ }
184
+ }
185
+ function errMessage(err) {
186
+ // execFile rejections carry the combined stderr; prefer it over the generic
187
+ // "Command failed" wrapper for a useful warning toast.
188
+ const stderr = err?.stderr?.trim();
189
+ if (stderr)
190
+ return stderr;
191
+ return err instanceof Error ? err.message : String(err);
192
+ }
193
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/server/services/git.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAOtD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAElC,MAAM,YAAY,GAAsB;IACtC,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,KAAK;CACf,CAAC;AAEF,MAAM,OAAO,UAAU;IAOX;IACA;IAPV;;;;OAIG;IACH,YACU,GAAW,EACX,SAAiB;QADjB,QAAG,GAAH,GAAG,CAAQ;QACX,cAAS,GAAT,SAAS,CAAQ;IACxB,CAAC;IAEJ,8EAA8E;IACtE,KAAK,CAAC,GAAG,CAAC,IAAc,EAAE,GAAW;QAC3C,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACpF,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ;gBAAE,OAAO,YAAY,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,yEAAyE;QACzE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;aACxE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;aACpC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAErB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;aAC3E,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1B,mEAAmE;YACnE,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAErB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC;aAChE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACvC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAEtB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,IAA2C;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE7B,sEAAsE;QACtE,yEAAyE;QACzE,6EAA6E;QAC7E,6EAA6E;QAC7E,sEAAsE;QACtE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvD,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,0CAA0C;YACtD,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,mEAAmE;aAC7E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;YAChD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrE,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC1D,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YACvC,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,OAA8C;QAClE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;CACF;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,4EAA4E;IAC5E,uDAAuD;IACvD,MAAM,MAAM,GAAI,GAA2B,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -15,13 +15,15 @@
15
15
  import type Database from 'better-sqlite3';
16
16
  import type { ReleaseService } from './release.js';
17
17
  import type { RemoteAuthService } from './remote-auth.js';
18
+ import type { GitService } from './git.js';
18
19
  import type { ReleasePushResponse } from '../../shared/release-push.js';
19
20
  export declare class ReleasePushService {
20
21
  private db;
21
22
  private releaseService;
22
23
  private remoteAuth;
24
+ private gitService;
23
25
  private cwd;
24
- constructor(db: Database.Database, releaseService: ReleaseService, remoteAuth: RemoteAuthService, cwd: string);
26
+ constructor(db: Database.Database, releaseService: ReleaseService, remoteAuth: RemoteAuthService, gitService: GitService, cwd: string);
25
27
  /**
26
28
  * Synchronous push of release N to the remote. Algorithm (brief §1.3):
27
29
  * gate → validate release → build bundle (M17) → transport (M24) → persist →
@@ -24,11 +24,13 @@ export class ReleasePushService {
24
24
  db;
25
25
  releaseService;
26
26
  remoteAuth;
27
+ gitService;
27
28
  cwd;
28
- constructor(db, releaseService, remoteAuth, cwd) {
29
+ constructor(db, releaseService, remoteAuth, gitService, cwd) {
29
30
  this.db = db;
30
31
  this.releaseService = releaseService;
31
32
  this.remoteAuth = remoteAuth;
33
+ this.gitService = gitService;
32
34
  this.cwd = cwd;
33
35
  }
34
36
  /**
@@ -120,7 +122,12 @@ export class ReleasePushService {
120
122
  status: 'success',
121
123
  errorMessage: null,
122
124
  });
123
- return this.getById(id);
125
+ // M28: best-effort git push AFTER the remote push succeeded. Non-fatal —
126
+ // a git failure surfaces as gitSync.status='error' (warning toast) and
127
+ // never alters the recorded push status. Attached to this synchronous
128
+ // response only; not persisted (getById() carries gitSync: null).
129
+ const gitSync = await this.gitService.pushOnPush();
130
+ return { ...this.getById(id), gitSync };
124
131
  }
125
132
  finally {
126
133
  // 6. ALWAYS clean up the bundle the consumer owns.
@@ -181,6 +188,10 @@ function toDto(row) {
181
188
  status: row.status === 'error' ? 'error' : 'success',
182
189
  errorMessage: row.error_message ?? undefined,
183
190
  pushedAt: row.pushed_at,
191
+ // M28: git push result is ephemeral advisory data — never persisted. Audit
192
+ // replay (getById/list*) always reports null; only the live POST response
193
+ // overrides this with the actual push outcome.
194
+ gitSync: null,
184
195
  };
185
196
  }
186
197
  //# sourceMappingURL=release-push.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"release-push.js","sourceRoot":"","sources":["../../../src/server/services/release-push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"release-push.js","sourceRoot":"","sources":["../../../src/server/services/release-push.ts"],"names":[],"mappings":"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"}
@@ -276,6 +276,18 @@ export interface ReleaseCountBreakdown {
276
276
  export interface ReleaseDetail extends Release {
277
277
  countBreakdown: ReleaseCountBreakdown;
278
278
  }
279
+ /**
280
+ * M28: body of `POST /api/releases` and the MCP `release_create` result.
281
+ * `ReleaseDetail` plus the best-effort `git commit` outcome — `null` when
282
+ * commit-sync is off or no repo was detected. Not persisted (no column on the
283
+ * `release` table); present only on the synchronous create response.
284
+ */
285
+ export interface CreateReleaseResponse extends ReleaseDetail {
286
+ gitSync?: {
287
+ status: 'committed' | 'nothing-to-commit' | 'skipped' | 'error';
288
+ message?: string;
289
+ } | null;
290
+ }
279
291
  export interface SpecSnapshotEntityRow {
280
292
  type: string;
281
293
  slug: string;
@@ -1 +1 @@
1
- {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/shared/entities.ts"],"names":[],"mappings":"AAkpBA,sEAAsE;AACtE,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,MAAM;IACN,cAAc;IACd,YAAY;IACZ,cAAc;IACd,mBAAmB;CACX,CAAC;AAiFX;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,MAAM;IACN,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,YAAY;CACJ,CAAC"}
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/shared/entities.ts"],"names":[],"mappings":"AA4pBA,sEAAsE;AACtE,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,MAAM;IACN,cAAc;IACd,YAAY;IACZ,cAAc;IACd,mBAAmB;CACX,CAAC;AAiFX;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,MAAM;IACN,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,YAAY;CACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * M28 Git Sync — DTOs shared between server and client.
3
+ *
4
+ * Git sync is best-effort: every operation wraps a missing/broken git in a
5
+ * non-throwing result. None of these shapes are persisted — the `gitSync`
6
+ * fields ride the synchronous create/push responses only (see brief 0.1.38).
7
+ */
8
+ /** Result of `gitService.detect()`, exposed by `GET /api/git/status`. */
9
+ export interface GitStatusResponse {
10
+ /** `true` when `pagesDir` is inside a git worktree and `git` is on PATH. */
11
+ detected: boolean;
12
+ /** Worktree root (`git rev-parse --show-toplevel`); `null` when not detected. */
13
+ rootPath: string | null;
14
+ /** URL of remote `origin`; `null` when no origin or not detected. */
15
+ remoteUrl: string | null;
16
+ /** Current branch; `null` when not detected or detached HEAD. */
17
+ branch: string | null;
18
+ /** `true` when `git status --porcelain` is non-empty. */
19
+ isDirty: boolean;
20
+ }
21
+ /** `'committed'` = success; `'nothing-to-commit'` = nothing staged (not an error);
22
+ * `'skipped'` = repo detected but commit could not run (e.g. detached HEAD);
23
+ * `'error'` = attempted and failed. */
24
+ export type GitCommitStatus = 'committed' | 'nothing-to-commit' | 'skipped' | 'error';
25
+ export type GitPushStatus = 'pushed' | 'nothing-to-push' | 'skipped' | 'error';
26
+ export interface GitCommitResult {
27
+ status: GitCommitStatus;
28
+ message?: string;
29
+ }
30
+ export interface GitPushResult {
31
+ status: GitPushStatus;
32
+ message?: string;
33
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * M28 Git Sync — DTOs shared between server and client.
3
+ *
4
+ * Git sync is best-effort: every operation wraps a missing/broken git in a
5
+ * non-throwing result. None of these shapes are persisted — the `gitSync`
6
+ * fields ride the synchronous create/push responses only (see brief 0.1.38).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/shared/git.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -43,6 +43,17 @@ export interface ReleasePushResponse {
43
43
  errorMessage?: string;
44
44
  /** ISO 8601. */
45
45
  pushedAt: string;
46
+ /**
47
+ * M28 Git Sync — outcome of the best-effort `git push` triggered when
48
+ * `config.git.syncPushOnPush` is on and a repo was detected; `null` when
49
+ * push-sync is off or no repo. Present ONLY on the synchronous
50
+ * `POST /api/release-pushes` response — `GET /api/release-pushes/:id`
51
+ * (audit replay) always returns `null` (this result is not persisted).
52
+ */
53
+ gitSync?: {
54
+ status: 'pushed' | 'nothing-to-push' | 'skipped' | 'error';
55
+ message?: string;
56
+ } | null;
46
57
  }
47
58
  /** Response of `GET /api/release-pushes`. */
48
59
  export interface ReleasePushListResponse {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inharness-ai/claude4spec",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "Plan the whole system before your agent writes a line of code. Local-first planning layer with structured entities and typed relations.",
5
5
  "license": "MIT",
6
6
  "author": "Mike Tomala <mike@inharness.ai>",
@@ -53,7 +53,7 @@
53
53
  "dependencies": {
54
54
  "@anthropic-ai/claude-agent-sdk": "^0.2.109",
55
55
  "@google/gemini-cli-core": "^0.42.0",
56
- "@inharness-ai/agent-adapters": "^0.6.2",
56
+ "@inharness-ai/agent-adapters": "^0.6.3",
57
57
  "@inharness-ai/agent-chat": "^0.3.0",
58
58
  "@modelcontextprotocol/sdk": "^1.29.0",
59
59
  "@monaco-editor/react": "^4.7.0",
@@ -1 +0,0 @@
1
- import{ai as o,aj as n}from"./mermaid.core-CYorG2ZU.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM-Burb3yd8.js";import{_ as i}from"./mermaid.core-CYorG2ZU.js";import"./chunk-FMBD7UC4-Dm7BhTp3.js";import"./chunk-ND2GUHAM-CsNlOOp_.js";import"./chunk-55IACEB6-xJ3wxfSN.js";import"./chunk-2J33WTMH-DDokjOio.js";import"./index-CgWyzbtO.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM-Burb3yd8.js";import{_ as i}from"./mermaid.core-CYorG2ZU.js";import"./chunk-FMBD7UC4-Dm7BhTp3.js";import"./chunk-ND2GUHAM-CsNlOOp_.js";import"./chunk-55IACEB6-xJ3wxfSN.js";import"./chunk-2J33WTMH-DDokjOio.js";import"./index-CgWyzbtO.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as e,b as r,a,S as s}from"./chunk-AQP2D5EJ-C9rR6gO6.js";import{_ as i}from"./mermaid.core-CYorG2ZU.js";import"./chunk-55IACEB6-xJ3wxfSN.js";import"./chunk-2J33WTMH-DDokjOio.js";import"./index-CgWyzbtO.js";var p={parser:a,get db(){return new s(2)},renderer:r,styles:e,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{p as diagram};