@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.
Files changed (86) hide show
  1. package/dist/config/workers-registry.json +13 -0
  2. package/dist/engine/bdd-formatter.d.ts +22 -0
  3. package/dist/engine/bdd-formatter.d.ts.map +1 -0
  4. package/dist/engine/bdd-formatter.js +182 -0
  5. package/dist/engine/bdd-formatter.js.map +1 -0
  6. package/dist/engine/validator/dor-dod.d.ts.map +1 -1
  7. package/dist/engine/validator/dor-dod.js +33 -0
  8. package/dist/engine/validator/dor-dod.js.map +1 -1
  9. package/dist/engine/worker-config-loader.d.ts +48 -0
  10. package/dist/engine/worker-config-loader.d.ts.map +1 -0
  11. package/dist/engine/worker-config-loader.js +167 -0
  12. package/dist/engine/worker-config-loader.js.map +1 -0
  13. package/dist/engine/workers/handlers/auto-drift.d.ts +13 -0
  14. package/dist/engine/workers/handlers/auto-drift.d.ts.map +1 -0
  15. package/dist/engine/workers/handlers/auto-drift.js +178 -0
  16. package/dist/engine/workers/handlers/auto-drift.js.map +1 -0
  17. package/dist/engine/workers/index.d.ts +4 -0
  18. package/dist/engine/workers/index.d.ts.map +1 -1
  19. package/dist/engine/workers/index.js +3 -0
  20. package/dist/engine/workers/index.js.map +1 -1
  21. package/dist/engine/workers/worker-crash-recovery.d.ts +30 -0
  22. package/dist/engine/workers/worker-crash-recovery.d.ts.map +1 -0
  23. package/dist/engine/workers/worker-crash-recovery.js +115 -0
  24. package/dist/engine/workers/worker-crash-recovery.js.map +1 -0
  25. package/dist/engine/workers/worker-engine.d.ts +1 -1
  26. package/dist/engine/workers/worker-engine.d.ts.map +1 -1
  27. package/dist/engine/workers/worker-engine.js +13 -1
  28. package/dist/engine/workers/worker-engine.js.map +1 -1
  29. package/dist/engine/workers/worker-heartbeat.d.ts +34 -0
  30. package/dist/engine/workers/worker-heartbeat.d.ts.map +1 -0
  31. package/dist/engine/workers/worker-heartbeat.js +84 -0
  32. package/dist/engine/workers/worker-heartbeat.js.map +1 -0
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/storage/drift-cache-store.d.ts +40 -0
  36. package/dist/storage/drift-cache-store.d.ts.map +1 -0
  37. package/dist/storage/drift-cache-store.js +103 -0
  38. package/dist/storage/drift-cache-store.js.map +1 -0
  39. package/dist/storage/worker-metrics-store.d.ts +20 -0
  40. package/dist/storage/worker-metrics-store.d.ts.map +1 -0
  41. package/dist/storage/worker-metrics-store.js +103 -0
  42. package/dist/storage/worker-metrics-store.js.map +1 -0
  43. package/dist/tools/create-spec-hu/hu-body-generators.d.ts +2 -1
  44. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  45. package/dist/tools/create-spec-hu/hu-body-generators.js +16 -8
  46. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  47. package/dist/tools/create-spec-hu.d.ts +2 -1
  48. package/dist/tools/create-spec-hu.d.ts.map +1 -1
  49. package/dist/tools/create-spec-hu.js +3 -2
  50. package/dist/tools/create-spec-hu.js.map +1 -1
  51. package/dist/tools/create-spec.js +2 -2
  52. package/dist/tools/create-spec.js.map +1 -1
  53. package/dist/tools/git/github-issues-ops.d.ts +29 -0
  54. package/dist/tools/git/github-issues-ops.d.ts.map +1 -0
  55. package/dist/tools/git/github-issues-ops.js +349 -0
  56. package/dist/tools/git/github-issues-ops.js.map +1 -0
  57. package/dist/tools/manage-git.d.ts.map +1 -1
  58. package/dist/tools/manage-git.js +20 -0
  59. package/dist/tools/manage-git.js.map +1 -1
  60. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  61. package/dist/tools/register-spec-tools/core-spec-tools.js +6 -0
  62. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  63. package/dist/tools/safe-handler.d.ts.map +1 -1
  64. package/dist/tools/safe-handler.js +73 -2
  65. package/dist/tools/safe-handler.js.map +1 -1
  66. package/dist/tools/schemas/github.d.ts +1 -1
  67. package/dist/tools/schemas/lifecycle.d.ts +3 -0
  68. package/dist/tools/schemas/lifecycle.d.ts.map +1 -1
  69. package/dist/tools/schemas/lifecycle.js +4 -1
  70. package/dist/tools/schemas/lifecycle.js.map +1 -1
  71. package/dist/tools/update-status.d.ts.map +1 -1
  72. package/dist/tools/update-status.js +4 -2
  73. package/dist/tools/update-status.js.map +1 -1
  74. package/dist/types/common/tech-enums.d.ts +1 -1
  75. package/dist/types/common/tech-enums.d.ts.map +1 -1
  76. package/dist/types/git.d.ts +48 -0
  77. package/dist/types/git.d.ts.map +1 -1
  78. package/dist/types/spec/inputs.d.ts +2 -0
  79. package/dist/types/spec/inputs.d.ts.map +1 -1
  80. package/dist/types/workers.d.ts +36 -0
  81. package/dist/types/workers.d.ts.map +1 -1
  82. package/package.json +1 -1
  83. package/src/config/workers-registry.json +13 -0
  84. package/src/i18n/messages/en.json +14 -0
  85. package/src/i18n/messages/es.json +14 -0
  86. 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;AAWpE,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAuEjF"}
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"}
@@ -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":"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"}
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,CAyQ7D"}
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;AAgCpD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEhE;AAqED;;;;;;;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;AAyDD;;;;;;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"}
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(result);
203
+ const outputText = extractOutputText(finalResult);
135
204
  recordToolTokens(toolName, projectPath, args, outputText, SESSION_ID);
136
205
  }
137
- return result;
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 {