@planu/cli 0.81.1 → 0.83.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.
- package/dist/config/workers-registry.json +13 -0
- package/dist/engine/bdd-formatter.d.ts +22 -0
- package/dist/engine/bdd-formatter.d.ts.map +1 -0
- package/dist/engine/bdd-formatter.js +182 -0
- package/dist/engine/bdd-formatter.js.map +1 -0
- package/dist/engine/validator/dor-dod.d.ts.map +1 -1
- package/dist/engine/validator/dor-dod.js +33 -0
- package/dist/engine/validator/dor-dod.js.map +1 -1
- package/dist/engine/worker-config-loader.d.ts +48 -0
- package/dist/engine/worker-config-loader.d.ts.map +1 -0
- package/dist/engine/worker-config-loader.js +167 -0
- package/dist/engine/worker-config-loader.js.map +1 -0
- package/dist/engine/workers/handlers/auto-drift.d.ts +13 -0
- package/dist/engine/workers/handlers/auto-drift.d.ts.map +1 -0
- package/dist/engine/workers/handlers/auto-drift.js +178 -0
- package/dist/engine/workers/handlers/auto-drift.js.map +1 -0
- package/dist/engine/workers/index.d.ts +4 -0
- package/dist/engine/workers/index.d.ts.map +1 -1
- package/dist/engine/workers/index.js +3 -0
- package/dist/engine/workers/index.js.map +1 -1
- package/dist/engine/workers/worker-crash-recovery.d.ts +30 -0
- package/dist/engine/workers/worker-crash-recovery.d.ts.map +1 -0
- package/dist/engine/workers/worker-crash-recovery.js +115 -0
- package/dist/engine/workers/worker-crash-recovery.js.map +1 -0
- package/dist/engine/workers/worker-engine.d.ts +1 -1
- package/dist/engine/workers/worker-engine.d.ts.map +1 -1
- package/dist/engine/workers/worker-engine.js +13 -1
- package/dist/engine/workers/worker-engine.js.map +1 -1
- package/dist/engine/workers/worker-heartbeat.d.ts +34 -0
- package/dist/engine/workers/worker-heartbeat.d.ts.map +1 -0
- package/dist/engine/workers/worker-heartbeat.js +84 -0
- package/dist/engine/workers/worker-heartbeat.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/drift-cache-store.d.ts +40 -0
- package/dist/storage/drift-cache-store.d.ts.map +1 -0
- package/dist/storage/drift-cache-store.js +103 -0
- package/dist/storage/drift-cache-store.js.map +1 -0
- package/dist/storage/worker-metrics-store.d.ts +20 -0
- package/dist/storage/worker-metrics-store.d.ts.map +1 -0
- package/dist/storage/worker-metrics-store.js +103 -0
- package/dist/storage/worker-metrics-store.js.map +1 -0
- package/dist/tools/create-spec-hu/hu-body-generators.d.ts +2 -1
- package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
- package/dist/tools/create-spec-hu/hu-body-generators.js +16 -8
- package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
- package/dist/tools/create-spec-hu.d.ts +2 -1
- package/dist/tools/create-spec-hu.d.ts.map +1 -1
- package/dist/tools/create-spec-hu.js +3 -2
- package/dist/tools/create-spec-hu.js.map +1 -1
- package/dist/tools/create-spec.js +2 -2
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/git/github-issues-ops.d.ts +29 -0
- package/dist/tools/git/github-issues-ops.d.ts.map +1 -0
- package/dist/tools/git/github-issues-ops.js +349 -0
- package/dist/tools/git/github-issues-ops.js.map +1 -0
- package/dist/tools/manage-git.d.ts.map +1 -1
- package/dist/tools/manage-git.js +20 -0
- package/dist/tools/manage-git.js.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +6 -0
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/tools/safe-handler.d.ts.map +1 -1
- package/dist/tools/safe-handler.js +73 -2
- package/dist/tools/safe-handler.js.map +1 -1
- package/dist/tools/schemas/github.d.ts +1 -1
- package/dist/tools/schemas/lifecycle.d.ts +3 -0
- package/dist/tools/schemas/lifecycle.d.ts.map +1 -1
- package/dist/tools/schemas/lifecycle.js +4 -1
- package/dist/tools/schemas/lifecycle.js.map +1 -1
- package/dist/tools/update-status.d.ts.map +1 -1
- package/dist/tools/update-status.js +4 -2
- package/dist/tools/update-status.js.map +1 -1
- package/dist/types/common/tech-enums.d.ts +1 -1
- package/dist/types/common/tech-enums.d.ts.map +1 -1
- package/dist/types/git.d.ts +48 -0
- package/dist/types/git.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +2 -0
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/workers.d.ts +36 -0
- package/dist/types/workers.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/config/workers-registry.json +13 -0
- package/src/i18n/messages/en.json +14 -0
- package/src/i18n/messages/es.json +14 -0
- package/src/i18n/messages/pt.json +14 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ToolResult } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* import-issue: Read a GitHub issue and create a draft Planu spec from it.
|
|
4
|
+
*/
|
|
5
|
+
export declare function importFromGitHubIssue(args: {
|
|
6
|
+
projectId: string;
|
|
7
|
+
issueNumber: number;
|
|
8
|
+
repo?: string;
|
|
9
|
+
}): Promise<ToolResult>;
|
|
10
|
+
/**
|
|
11
|
+
* export-to-issue: Read a Planu spec and create a GitHub issue with ACs as checklist.
|
|
12
|
+
*/
|
|
13
|
+
export declare function exportSpecToGitHubIssue(args: {
|
|
14
|
+
projectId: string;
|
|
15
|
+
specId: string;
|
|
16
|
+
repo?: string;
|
|
17
|
+
}): Promise<ToolResult>;
|
|
18
|
+
/**
|
|
19
|
+
* sync-issue: Sync spec status with a GitHub issue.
|
|
20
|
+
* - spec.status=done → close the issue
|
|
21
|
+
* - spec.status=approved → post a comment on the issue
|
|
22
|
+
*/
|
|
23
|
+
export declare function syncSpecWithGitHubIssue(args: {
|
|
24
|
+
projectId: string;
|
|
25
|
+
specId: string;
|
|
26
|
+
issueNumber: number;
|
|
27
|
+
repo?: string;
|
|
28
|
+
}): Promise<ToolResult>;
|
|
29
|
+
//# sourceMappingURL=github-issues-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-issues-ops.d.ts","sourceRoot":"","sources":["../../../src/tools/git/github-issues-ops.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAQX,MAAM,sBAAsB,CAAC;AA8O9B;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,UAAU,CAAC,CA0DtB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,UAAU,CAAC,CAyDtB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,UAAU,CAAC,CAkEtB"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
// tools/git/github-issues-ops.ts — GitHub Issues ↔ Planu spec sync (SPEC-227)
|
|
2
|
+
// Uses native Node.js fetch (Node 22+). Requires GITHUB_TOKEN env var.
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { specStore } from '../../storage/index.js';
|
|
5
|
+
import { git, resolveProjectPath } from './git-helpers.js';
|
|
6
|
+
import { handleCreateSpec } from '../create-spec.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Constants
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
const GITHUB_API = 'https://api.github.com';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Auth helper
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/** Returns GITHUB_TOKEN or throws a descriptive error (token never logged). */
|
|
15
|
+
function requireToken() {
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/dot-notation -- env key with special chars
|
|
17
|
+
const token = process.env['GITHUB_TOKEN'];
|
|
18
|
+
if (!token) {
|
|
19
|
+
throw new Error('GITHUB_TOKEN is not set. ' +
|
|
20
|
+
'Run: export GITHUB_TOKEN=<your-personal-access-token> ' +
|
|
21
|
+
'(requires repo scope for private repos, public_repo for public repos)');
|
|
22
|
+
}
|
|
23
|
+
return token;
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Repo detection helpers
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** Parse owner/repo from a git remote URL (SSH or HTTPS). */
|
|
29
|
+
function parseOwnerRepo(remoteUrl) {
|
|
30
|
+
// HTTPS: https://github.com/owner/repo.git
|
|
31
|
+
const httpsMatch = /github\.com[/:]([^/]+)\/([^/.]+)(?:\.git)?$/.exec(remoteUrl);
|
|
32
|
+
if (httpsMatch?.[1] && httpsMatch[2]) {
|
|
33
|
+
return { owner: httpsMatch[1], repo: httpsMatch[2] };
|
|
34
|
+
}
|
|
35
|
+
// SSH: git@github.com:owner/repo.git
|
|
36
|
+
const sshMatch = /github\.com:([^/]+)\/([^/.]+)(?:\.git)?$/.exec(remoteUrl);
|
|
37
|
+
if (sshMatch?.[1] && sshMatch[2]) {
|
|
38
|
+
return { owner: sshMatch[1], repo: sshMatch[2] };
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Cannot parse owner/repo from remote URL: "${remoteUrl}". ` +
|
|
41
|
+
'Provide repo as "owner/repo" via the repo parameter.');
|
|
42
|
+
}
|
|
43
|
+
/** Detect owner/repo from git remote origin. */
|
|
44
|
+
async function detectRepo(projectPath) {
|
|
45
|
+
const { stdout } = await git(projectPath, ['remote', 'get-url', 'origin']);
|
|
46
|
+
return parseOwnerRepo(stdout.trim());
|
|
47
|
+
}
|
|
48
|
+
/** Resolve owner/repo — from explicit param or git remote. */
|
|
49
|
+
async function resolveRepo(projectPath, repo) {
|
|
50
|
+
if (repo) {
|
|
51
|
+
const parts = repo.split('/');
|
|
52
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
53
|
+
throw new Error(`Invalid repo format "${repo}". Expected "owner/repo".`);
|
|
54
|
+
}
|
|
55
|
+
return { owner: parts[0], repo: parts[1] };
|
|
56
|
+
}
|
|
57
|
+
return detectRepo(projectPath);
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// GitHub REST API wrappers
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
/** GET a single GitHub issue. */
|
|
63
|
+
async function fetchIssue(token, owner, repo, issueNumber) {
|
|
64
|
+
const url = `${GITHUB_API}/repos/${owner}/${repo}/issues/${issueNumber}`;
|
|
65
|
+
const res = await fetch(url, {
|
|
66
|
+
headers: {
|
|
67
|
+
Authorization: `Bearer ${token}`,
|
|
68
|
+
Accept: 'application/vnd.github.v3+json',
|
|
69
|
+
'User-Agent': 'planu-mcp-server',
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
const text = await res.text();
|
|
74
|
+
throw new Error(`GitHub GET issue #${issueNumber} failed (${res.status}): ${text}`);
|
|
75
|
+
}
|
|
76
|
+
return res.json();
|
|
77
|
+
}
|
|
78
|
+
/** POST a new GitHub issue. */
|
|
79
|
+
async function createGitHubIssue(token, owner, repo, payload) {
|
|
80
|
+
const url = `${GITHUB_API}/repos/${owner}/${repo}/issues`;
|
|
81
|
+
const res = await fetch(url, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: {
|
|
84
|
+
Authorization: `Bearer ${token}`,
|
|
85
|
+
Accept: 'application/vnd.github.v3+json',
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
'User-Agent': 'planu-mcp-server',
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify(payload),
|
|
90
|
+
});
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
const text = await res.text();
|
|
93
|
+
throw new Error(`GitHub POST issue failed (${res.status}): ${text}`);
|
|
94
|
+
}
|
|
95
|
+
return res.json();
|
|
96
|
+
}
|
|
97
|
+
/** PATCH a GitHub issue (close, reopen, etc.). */
|
|
98
|
+
async function patchGitHubIssue(token, owner, repo, issueNumber, payload) {
|
|
99
|
+
const url = `${GITHUB_API}/repos/${owner}/${repo}/issues/${issueNumber}`;
|
|
100
|
+
const res = await fetch(url, {
|
|
101
|
+
method: 'PATCH',
|
|
102
|
+
headers: {
|
|
103
|
+
Authorization: `Bearer ${token}`,
|
|
104
|
+
Accept: 'application/vnd.github.v3+json',
|
|
105
|
+
'Content-Type': 'application/json',
|
|
106
|
+
'User-Agent': 'planu-mcp-server',
|
|
107
|
+
},
|
|
108
|
+
body: JSON.stringify(payload),
|
|
109
|
+
});
|
|
110
|
+
if (!res.ok) {
|
|
111
|
+
const text = await res.text();
|
|
112
|
+
throw new Error(`GitHub PATCH issue #${issueNumber} failed (${res.status}): ${text}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** POST a comment on a GitHub issue. */
|
|
116
|
+
async function postIssueComment(token, owner, repo, issueNumber, comment) {
|
|
117
|
+
const url = `${GITHUB_API}/repos/${owner}/${repo}/issues/${issueNumber}/comments`;
|
|
118
|
+
const res = await fetch(url, {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
headers: {
|
|
121
|
+
Authorization: `Bearer ${token}`,
|
|
122
|
+
Accept: 'application/vnd.github.v3+json',
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
'User-Agent': 'planu-mcp-server',
|
|
125
|
+
},
|
|
126
|
+
body: JSON.stringify(comment),
|
|
127
|
+
});
|
|
128
|
+
if (!res.ok) {
|
|
129
|
+
const text = await res.text();
|
|
130
|
+
throw new Error(`GitHub POST comment on issue #${issueNumber} failed (${res.status}): ${text}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Spec markdown helpers
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
/** Extract acceptance criteria lines from a spec.md file (## Acceptance Criteria section). */
|
|
137
|
+
async function readAcceptanceCriteria(specPath) {
|
|
138
|
+
try {
|
|
139
|
+
const content = await readFile(specPath, 'utf-8');
|
|
140
|
+
const lines = content.split('\n');
|
|
141
|
+
const acStart = lines.findIndex((l) => /^#{1,3}\s+(acceptance criteria|criterios de aceptaci)/i.test(l));
|
|
142
|
+
if (acStart === -1) {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
const criteria = [];
|
|
146
|
+
for (let i = acStart + 1; i < lines.length; i++) {
|
|
147
|
+
const line = lines[i];
|
|
148
|
+
if (!line) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// Stop at next heading
|
|
152
|
+
if (/^#{1,3}\s/.test(line)) {
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
// Collect list items or numbered items
|
|
156
|
+
const match = /^[\s-]*(?:\d+\.)?\s*(?:AC[-\s]\d+:?\s*)?(.+)/.exec(line.trim());
|
|
157
|
+
if (match?.[1]) {
|
|
158
|
+
criteria.push(match[1].trim());
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return criteria;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** Build a GitHub issue body from spec data. */
|
|
168
|
+
function buildIssueBody(specId, description, criteria, specStatus) {
|
|
169
|
+
const parts = [
|
|
170
|
+
`> Auto-synced from Planu spec **${specId}** (status: ${specStatus})`,
|
|
171
|
+
'',
|
|
172
|
+
description,
|
|
173
|
+
];
|
|
174
|
+
if (criteria.length > 0) {
|
|
175
|
+
parts.push('', '## Acceptance Criteria');
|
|
176
|
+
for (const ac of criteria) {
|
|
177
|
+
parts.push(`- [ ] ${ac}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
parts.push('', `---`, `_Managed by [Planu](https://planu.dev)_`);
|
|
181
|
+
return parts.join('\n');
|
|
182
|
+
}
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Public handlers
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
/**
|
|
187
|
+
* import-issue: Read a GitHub issue and create a draft Planu spec from it.
|
|
188
|
+
*/
|
|
189
|
+
export async function importFromGitHubIssue(args) {
|
|
190
|
+
let token;
|
|
191
|
+
try {
|
|
192
|
+
token = requireToken();
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
return {
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: 'text',
|
|
199
|
+
text: JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2),
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
isError: true,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const projectPath = await resolveProjectPath(args.projectId);
|
|
206
|
+
const { owner, repo } = await resolveRepo(projectPath, args.repo);
|
|
207
|
+
const issue = await fetchIssue(token, owner, repo, args.issueNumber);
|
|
208
|
+
const labels = issue.labels.map((l) => l.name);
|
|
209
|
+
const description = issue.body ?? '';
|
|
210
|
+
// Create spec via handleCreateSpec handler
|
|
211
|
+
const result = await handleCreateSpec({
|
|
212
|
+
projectPath,
|
|
213
|
+
title: issue.title,
|
|
214
|
+
description: description || `Imported from GitHub issue #${args.issueNumber}`,
|
|
215
|
+
type: 'feature',
|
|
216
|
+
scope: 'feature',
|
|
217
|
+
tags: labels,
|
|
218
|
+
});
|
|
219
|
+
// Extract specId and specPath from structuredContent
|
|
220
|
+
const structured = result.structuredContent;
|
|
221
|
+
const specId = structured?.specId ?? '';
|
|
222
|
+
const specPath = structured?.specPath ?? '';
|
|
223
|
+
const importResult = {
|
|
224
|
+
action: 'import-issue',
|
|
225
|
+
specId,
|
|
226
|
+
issueNumber: issue.number,
|
|
227
|
+
issueUrl: issue.html_url,
|
|
228
|
+
specPath,
|
|
229
|
+
message: `Imported GitHub issue #${issue.number} "${issue.title}" as draft spec ${specId || '(created)'}`,
|
|
230
|
+
};
|
|
231
|
+
return {
|
|
232
|
+
content: [{ type: 'text', text: JSON.stringify(importResult, null, 2) }],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* export-to-issue: Read a Planu spec and create a GitHub issue with ACs as checklist.
|
|
237
|
+
*/
|
|
238
|
+
export async function exportSpecToGitHubIssue(args) {
|
|
239
|
+
let token;
|
|
240
|
+
try {
|
|
241
|
+
token = requireToken();
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
return {
|
|
245
|
+
content: [
|
|
246
|
+
{
|
|
247
|
+
type: 'text',
|
|
248
|
+
text: JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2),
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
isError: true,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const projectPath = await resolveProjectPath(args.projectId);
|
|
255
|
+
const { owner, repo } = await resolveRepo(projectPath, args.repo);
|
|
256
|
+
const spec = await specStore.getSpec(args.projectId, args.specId);
|
|
257
|
+
if (!spec) {
|
|
258
|
+
return {
|
|
259
|
+
content: [
|
|
260
|
+
{
|
|
261
|
+
type: 'text',
|
|
262
|
+
text: JSON.stringify({ error: `Spec '${args.specId}' not found` }, null, 2),
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
isError: true,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const criteria = await readAcceptanceCriteria(spec.specPath);
|
|
269
|
+
const description = `**Type:** ${spec.type} | **Scope:** ${spec.scope} | **Risk:** ${spec.risk}`;
|
|
270
|
+
const body = buildIssueBody(args.specId, description, criteria, spec.status);
|
|
271
|
+
const issue = await createGitHubIssue(token, owner, repo, {
|
|
272
|
+
title: `[${args.specId}] ${spec.title}`,
|
|
273
|
+
body,
|
|
274
|
+
labels: spec.tags,
|
|
275
|
+
});
|
|
276
|
+
const exportResult = {
|
|
277
|
+
action: 'export-to-issue',
|
|
278
|
+
specId: args.specId,
|
|
279
|
+
issueNumber: issue.number,
|
|
280
|
+
issueUrl: issue.html_url,
|
|
281
|
+
message: `Exported spec ${args.specId} to GitHub issue #${issue.number}: ${issue.html_url}`,
|
|
282
|
+
};
|
|
283
|
+
return {
|
|
284
|
+
content: [{ type: 'text', text: JSON.stringify(exportResult, null, 2) }],
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* sync-issue: Sync spec status with a GitHub issue.
|
|
289
|
+
* - spec.status=done → close the issue
|
|
290
|
+
* - spec.status=approved → post a comment on the issue
|
|
291
|
+
*/
|
|
292
|
+
export async function syncSpecWithGitHubIssue(args) {
|
|
293
|
+
let token;
|
|
294
|
+
try {
|
|
295
|
+
token = requireToken();
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
return {
|
|
299
|
+
content: [
|
|
300
|
+
{
|
|
301
|
+
type: 'text',
|
|
302
|
+
text: JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2),
|
|
303
|
+
},
|
|
304
|
+
],
|
|
305
|
+
isError: true,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const projectPath = await resolveProjectPath(args.projectId);
|
|
309
|
+
const { owner, repo } = await resolveRepo(projectPath, args.repo);
|
|
310
|
+
const spec = await specStore.getSpec(args.projectId, args.specId);
|
|
311
|
+
if (!spec) {
|
|
312
|
+
return {
|
|
313
|
+
content: [
|
|
314
|
+
{
|
|
315
|
+
type: 'text',
|
|
316
|
+
text: JSON.stringify({ error: `Spec '${args.specId}' not found` }, null, 2),
|
|
317
|
+
},
|
|
318
|
+
],
|
|
319
|
+
isError: true,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
const issue = await fetchIssue(token, owner, repo, args.issueNumber);
|
|
323
|
+
let syncedAction = 'none';
|
|
324
|
+
if (spec.status === 'done') {
|
|
325
|
+
if (issue.state !== 'closed') {
|
|
326
|
+
await patchGitHubIssue(token, owner, repo, args.issueNumber, { state: 'closed' });
|
|
327
|
+
}
|
|
328
|
+
syncedAction = 'closed';
|
|
329
|
+
}
|
|
330
|
+
else if (spec.status === 'approved') {
|
|
331
|
+
await postIssueComment(token, owner, repo, args.issueNumber, {
|
|
332
|
+
body: `**Planu spec ${args.specId} is now approved** and implementation has started.\n\n` +
|
|
333
|
+
`_Status: approved | Risk: ${spec.risk}_`,
|
|
334
|
+
});
|
|
335
|
+
syncedAction = 'commented';
|
|
336
|
+
}
|
|
337
|
+
const syncResult = {
|
|
338
|
+
action: 'sync-issue',
|
|
339
|
+
specId: args.specId,
|
|
340
|
+
issueNumber: issue.number,
|
|
341
|
+
issueUrl: issue.html_url,
|
|
342
|
+
syncedAction,
|
|
343
|
+
message: `Synced spec ${args.specId} (${spec.status}) with issue #${args.issueNumber}: action=${syncedAction}`,
|
|
344
|
+
};
|
|
345
|
+
return {
|
|
346
|
+
content: [{ type: 'text', text: JSON.stringify(syncResult, null, 2) }],
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=github-issues-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-issues-ops.js","sourceRoot":"","sources":["../../../src/tools/git/github-issues-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manage-git.d.ts","sourceRoot":"","sources":["../../src/tools/manage-git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"manage-git.d.ts","sourceRoot":"","sources":["../../src/tools/manage-git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAgBpE,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA6FjF"}
|
package/dist/tools/manage-git.js
CHANGED
|
@@ -7,6 +7,7 @@ import { handleSyncBranch, handleCheckGitflow, handleResolveConflict } from './g
|
|
|
7
7
|
import { handleBreakingCheck } from './git/breaking-ops.js';
|
|
8
8
|
import { handleRelease, handleHotfix, handlePromote } from './git/release-ops.js';
|
|
9
9
|
import { handleCleanup } from './git/cleanup-ops.js';
|
|
10
|
+
import { importFromGitHubIssue, exportSpecToGitHubIssue, syncSpecWithGitHubIssue, } from './git/github-issues-ops.js';
|
|
10
11
|
export async function handleManageGit(params) {
|
|
11
12
|
const { projectId, action, specId, config, files } = params;
|
|
12
13
|
try {
|
|
@@ -43,6 +44,25 @@ export async function handleManageGit(params) {
|
|
|
43
44
|
return await handleAutoSetup(projectId, specId, config);
|
|
44
45
|
case 'cleanup':
|
|
45
46
|
return await handleCleanup(projectId, config);
|
|
47
|
+
case 'import-issue':
|
|
48
|
+
return await importFromGitHubIssue({
|
|
49
|
+
projectId,
|
|
50
|
+
issueNumber: config?.issueNumber ?? 0,
|
|
51
|
+
repo: config?.repo,
|
|
52
|
+
});
|
|
53
|
+
case 'export-to-issue':
|
|
54
|
+
return await exportSpecToGitHubIssue({
|
|
55
|
+
projectId,
|
|
56
|
+
specId: specId ?? '',
|
|
57
|
+
repo: config?.repo,
|
|
58
|
+
});
|
|
59
|
+
case 'sync-issue':
|
|
60
|
+
return await syncSpecWithGitHubIssue({
|
|
61
|
+
projectId,
|
|
62
|
+
specId: specId ?? '',
|
|
63
|
+
issueNumber: config?.issueNumber ?? 0,
|
|
64
|
+
repo: config?.repo,
|
|
65
|
+
});
|
|
46
66
|
default:
|
|
47
67
|
return {
|
|
48
68
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manage-git.js","sourceRoot":"","sources":["../../src/tools/manage-git.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"manage-git.js","sourceRoot":"","sources":["../../src/tools/manage-git.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-spec-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/register-spec-tools/core-spec-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BzE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"core-spec-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/register-spec-tools/core-spec-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BzE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiR7D"}
|
|
@@ -123,6 +123,12 @@ export function registerCoreSpecTools(server) {
|
|
|
123
123
|
.max(500)
|
|
124
124
|
.optional()
|
|
125
125
|
.describe('Feature group tag (e.g. "Authentication", "Billing"). Added to tags for categorization. Flat structure — no subdirectories created.'),
|
|
126
|
+
acFormat: z
|
|
127
|
+
.enum(['bdd', 'checkbox'])
|
|
128
|
+
.optional()
|
|
129
|
+
.describe('SPEC-224: Format for acceptance criteria in spec.md. ' +
|
|
130
|
+
'checkbox (default) — markdown checkboxes (- [ ] criterion). ' +
|
|
131
|
+
'bdd — Gherkin Given-When-Then scenarios for BDD workflows.'),
|
|
126
132
|
},
|
|
127
133
|
}, safeTracked('create_spec', async (args) => handleCreateSpec(args)));
|
|
128
134
|
// 6. list_specs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-spec-tools.js","sourceRoot":"","sources":["../../../src/tools/register-spec-tools/core-spec-tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core-spec-tools.js","sourceRoot":"","sources":["../../../src/tools/register-spec-tools/core-spec-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-handler.d.ts","sourceRoot":"","sources":["../../src/tools/safe-handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"safe-handler.d.ts","sourceRoot":"","sources":["../../src/tools/safe-handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAiCpD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEhE;AA4ID;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,CAAC,EACpB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,GACxC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAElC;AAgED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,GACxC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAElC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,GACxC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAKlC"}
|
|
@@ -8,6 +8,7 @@ import { ensureWorkersStarted } from '../engine/workers/index.js';
|
|
|
8
8
|
import { recordError } from '../storage/error-telemetry-store.js';
|
|
9
9
|
import { hashProjectPath } from '../storage/base-store.js';
|
|
10
10
|
import { recordToolTokens, extractOutputText } from './token-recording.js';
|
|
11
|
+
import { DriftCacheStore } from '../storage/drift-cache-store.js';
|
|
11
12
|
import { existsSync } from 'node:fs';
|
|
12
13
|
import { join } from 'node:path';
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
@@ -44,6 +45,71 @@ export function isProjectInitialized(projectPath) {
|
|
|
44
45
|
export function markProjectInitialized(projectPath) {
|
|
45
46
|
uninitializedProjects.delete(projectPath);
|
|
46
47
|
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Drift banner — non-blocking informational notice
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
/**
|
|
52
|
+
* Default drift threshold: 0.3 (30%). Override via PLANU_DRIFT_THRESHOLD env var.
|
|
53
|
+
*/
|
|
54
|
+
const DEFAULT_DRIFT_BANNER_THRESHOLD = 0.3;
|
|
55
|
+
function getDriftBannerThreshold() {
|
|
56
|
+
const env = process.env.PLANU_DRIFT_THRESHOLD;
|
|
57
|
+
if (env === undefined || env === '') {
|
|
58
|
+
return DEFAULT_DRIFT_BANNER_THRESHOLD;
|
|
59
|
+
}
|
|
60
|
+
const parsed = parseFloat(env);
|
|
61
|
+
return Number.isFinite(parsed) && parsed > 0 && parsed <= 1
|
|
62
|
+
? parsed
|
|
63
|
+
: DEFAULT_DRIFT_BANNER_THRESHOLD;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks for pending drift cache entries for a project.
|
|
67
|
+
* Returns a banner string if any pending entry has driftScore >= threshold,
|
|
68
|
+
* or null if nothing to show.
|
|
69
|
+
* Marks all pending entries as shown (fire-and-forget).
|
|
70
|
+
*/
|
|
71
|
+
async function checkPendingDriftBanner(projectPath) {
|
|
72
|
+
if (process.env.PLANU_AUTO_DRIFT === 'false') {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const projectId = hashProjectPath(projectPath);
|
|
77
|
+
const store = new DriftCacheStore(projectId);
|
|
78
|
+
const threshold = getDriftBannerThreshold();
|
|
79
|
+
const pending = await store.getPendingBanners(threshold);
|
|
80
|
+
if (pending.length === 0) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
// Mark as shown — fire-and-forget
|
|
84
|
+
/* v8 ignore start */
|
|
85
|
+
store.markAllShown().catch((err) => {
|
|
86
|
+
console.error('[Planu] Failed to mark drift banners as shown:', err);
|
|
87
|
+
});
|
|
88
|
+
/* v8 ignore stop */
|
|
89
|
+
const specIds = pending.map((e) => e.specId).join(', ');
|
|
90
|
+
const maxScore = Math.max(...pending.map((e) => e.driftScore));
|
|
91
|
+
return (`\n⚠️ Auto-drift alert: specs [${specIds}] may have drifted ` +
|
|
92
|
+
`(score: ${maxScore.toFixed(2)}). Run detect_drift to review.`);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Never block a tool call due to drift cache errors
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Injects a drift banner into a ToolResult if the banner is non-null.
|
|
101
|
+
* The banner is appended as a new text content block so it does not
|
|
102
|
+
* interfere with structured output consumed by callers.
|
|
103
|
+
*/
|
|
104
|
+
function injectDriftBanner(result, banner) {
|
|
105
|
+
if (banner === null || result.isError === true) {
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
...result,
|
|
110
|
+
content: [...result.content, { type: 'text', text: banner }],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
47
113
|
/**
|
|
48
114
|
* Sanitizes path-like fields in tool args before passing to handler.
|
|
49
115
|
* Checks `projectPath` and `path` fields for directory traversal attacks.
|
|
@@ -129,12 +195,15 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
129
195
|
: undefined;
|
|
130
196
|
try {
|
|
131
197
|
const result = await withTimeout(() => handler(safeArgs), getTimeoutMs());
|
|
198
|
+
// Inject pending drift banner (non-blocking, informational only)
|
|
199
|
+
const driftBanner = projectPath !== undefined ? await checkPendingDriftBanner(projectPath) : null;
|
|
200
|
+
const finalResult = injectDriftBanner(result, driftBanner);
|
|
132
201
|
// Record token usage for successful calls (fire-and-forget, only when projectPath available)
|
|
133
202
|
if (toolName !== undefined && projectPath !== undefined) {
|
|
134
|
-
const outputText = extractOutputText(
|
|
203
|
+
const outputText = extractOutputText(finalResult);
|
|
135
204
|
recordToolTokens(toolName, projectPath, args, outputText, SESSION_ID);
|
|
136
205
|
}
|
|
137
|
-
return
|
|
206
|
+
return finalResult;
|
|
138
207
|
}
|
|
139
208
|
catch (error) {
|
|
140
209
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -146,9 +215,11 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
146
215
|
module: `tools/${toolName}`,
|
|
147
216
|
severity: 'error',
|
|
148
217
|
message,
|
|
218
|
+
/* v8 ignore start */
|
|
149
219
|
}).catch((err) => {
|
|
150
220
|
console.error('[Planu] Telemetry recording failed:', err);
|
|
151
221
|
});
|
|
222
|
+
/* v8 ignore stop */
|
|
152
223
|
}
|
|
153
224
|
const reportUrl = 'https://github.com/planu-dev/planu/issues/new?template=bug_report.md';
|
|
154
225
|
return {
|