@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.
- package/CHANGELOG.md +17 -0
- package/dist/client/assets/{arc-C2bk_QpU.js → arc-E0e7X_zn.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CvzXkhTv.js → architectureDiagram-3BPJPVTR-BzlqOVZv.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BdVNx639.js → blockDiagram-GPEHLZMM-BIQcApN7.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-GsALRazP.js → c4Diagram-AAUBKEIU-CDU0V1yk.js} +1 -1
- package/dist/client/assets/channel-BqjILLUr.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-DDokjOio.js → chunk-2J33WTMH-PtDSwC5f.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-B_YcuTm8.js → chunk-4BX2VUAB-DTUPWrSO.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-xJ3wxfSN.js → chunk-55IACEB6-Cpd59xZT.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-Burb3yd8.js → chunk-727SXJPM-C4DOvpJT.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-C9rR6gO6.js → chunk-AQP2D5EJ-CtjeHPBB.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-Dm7BhTp3.js → chunk-FMBD7UC4-CZA3OvVr.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-CsNlOOp_.js → chunk-ND2GUHAM-Cbx6nQHm.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BCmHzfVx.js → chunk-QZHKN3VN-3DunELI_.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-LjT84-kK.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-LjT84-kK.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-B6YZI-Gb.js → cose-bilkent-S5V4N54A-CKYJnuL7.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-DWY4jHpC.js → dagre-BM42HDAG-BrvRwrr_.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-Copg3kuX.js → diagram-2AECGRRQ-BaVLuzcD.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CVmGVP62.js → diagram-5GNKFQAL-9Cu7Wa7J.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DeDhYbEo.js → diagram-KO2AKTUF-XKiCVdjO.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BaclNUbX.js → diagram-LMA3HP47-DerecU5v.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-2c0UdjS2.js → diagram-OG6HWLK6-BWcREvZ9.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-sdiH7Dr_.js → erDiagram-TEJ5UH35-DU3BBQJY.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-3qYkZRjo.js → flowDiagram-I6XJVG4X-DXO_IJeR.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-j57OPIbM.js → ganttDiagram-6RSMTGT7-CXiFZEPx.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CZ5Wgihg.js → gitGraphDiagram-PVQCEYII-DHewdln-.js} +1 -1
- package/dist/client/assets/{index-v_d-wsnX.js → index-DD0GkjkG.js} +1 -1
- package/dist/client/assets/{index-Cw57I_bm.js → index-DT5g2AtL.js} +1 -1
- package/dist/client/assets/{index-CgWyzbtO.js → index-DcIG_8JB.js} +181 -181
- package/dist/client/assets/{infoDiagram-5YYISTIA-92O2HlAo.js → infoDiagram-5YYISTIA-CN40PAGW.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-vESYChv7.js → ishikawaDiagram-YF4QCWOH-B8KsyuPk.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-ili7NI_B.js → journeyDiagram-JHISSGLW-BlEb3E_P.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-dLVbb5y7.js → kanban-definition-UN3LZRKU-B080CGS9.js} +1 -1
- package/dist/client/assets/{linear-CRY3U7pB.js → linear-D6Tg-IET.js} +1 -1
- package/dist/client/assets/{mermaid.core-CYorG2ZU.js → mermaid.core-DP18nW3T.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-DfUATrrd.js → mindmap-definition-RKZ34NQL-bfo7Qm5I.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DjF7gCzD.js → pieDiagram-4H26LBE5-ZsPztPu6.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-_8BHPlRL.js → quadrantDiagram-W4KKPZXB-DKrTleIL.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DSj9pHkV.js → requirementDiagram-4Y6WPE33-D4YX8ZgG.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-irQ9C6cN.js → sankeyDiagram-5OEKKPKP-Bo-xm6Mc.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BZ7-oca3.js → sequenceDiagram-3UESZ5HK-CozgdKp6.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-N6c5I2Sk.js → stateDiagram-AJRCARHV-CiK61MwV.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C6-8M5Sb.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-jYAKxj23.js → timeline-definition-PNZ67QCA-CgHoguI7.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-HoQPRkzJ.js → vennDiagram-CIIHVFJN-TY32dxQb.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-D6r8Awug.js → wardley-L42UT6IY-C6Q7VFwH.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C_JUhYxS.js → wardleyDiagram-YWT4CUSO-nZLnVsQL.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DgIYX2vi.js → xychartDiagram-2RQKCTM6-DHdYRHEr.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/config.d.ts +12 -0
- package/dist/server/config.js +28 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/index.js +59 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/release-tools/index.d.ts +2 -0
- package/dist/server/mcp/release-tools/index.js +4 -1
- package/dist/server/mcp/release-tools/index.js.map +1 -1
- package/dist/server/routes/git.d.ts +9 -0
- package/dist/server/routes/git.js +21 -0
- package/dist/server/routes/git.js.map +1 -0
- package/dist/server/routes/releases.d.ts +2 -1
- package/dist/server/routes/releases.js +7 -3
- package/dist/server/routes/releases.js.map +1 -1
- package/dist/server/services/git.d.ts +62 -0
- package/dist/server/services/git.js +193 -0
- package/dist/server/services/git.js.map +1 -0
- package/dist/server/services/release-push.d.ts +3 -1
- package/dist/server/services/release-push.js +13 -2
- package/dist/server/services/release-push.js.map +1 -1
- package/dist/shared/entities.d.ts +12 -0
- package/dist/shared/entities.js.map +1 -1
- package/dist/shared/git.d.ts +33 -0
- package/dist/shared/git.js +9 -0
- package/dist/shared/git.js.map +1 -0
- package/dist/shared/release-push.d.ts +11 -0
- package/package.json +2 -2
- package/dist/client/assets/channel-C5L1x90J.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-EfPx1y8Y.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-EfPx1y8Y.js +0 -1
- 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":"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"}
|
|
@@ -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
|
-
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
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":"
|
|
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.
|
|
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.
|
|
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};
|