@schnick371/devsteps-shared 1.1.0-next.2 → 1.1.0-next.4

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 (55) hide show
  1. package/README.md +29 -0
  2. package/dist/agents.test.d.ts +18 -0
  3. package/dist/agents.test.d.ts.map +1 -0
  4. package/dist/agents.test.js +96 -0
  5. package/dist/agents.test.js.map +1 -0
  6. package/dist/constants/index.d.ts +2 -2
  7. package/dist/constants/index.d.ts.map +1 -1
  8. package/dist/constants/index.js +2 -2
  9. package/dist/constants/index.js.map +1 -1
  10. package/dist/core/add.d.ts.map +1 -1
  11. package/dist/core/add.js +4 -3
  12. package/dist/core/add.js.map +1 -1
  13. package/dist/core/context.d.ts +44 -0
  14. package/dist/core/context.d.ts.map +1 -1
  15. package/dist/core/context.js +326 -1
  16. package/dist/core/context.js.map +1 -1
  17. package/dist/core/context.test.d.ts +10 -0
  18. package/dist/core/context.test.d.ts.map +1 -0
  19. package/dist/core/context.test.js +239 -0
  20. package/dist/core/context.test.js.map +1 -0
  21. package/dist/core/index.d.ts +1 -1
  22. package/dist/core/index.d.ts.map +1 -1
  23. package/dist/core/index.js +1 -1
  24. package/dist/core/index.js.map +1 -1
  25. package/dist/core/update.js +4 -4
  26. package/dist/core/update.js.map +1 -1
  27. package/dist/schemas/cbp-mandate.d.ts +141 -6
  28. package/dist/schemas/cbp-mandate.d.ts.map +1 -1
  29. package/dist/schemas/cbp-mandate.js +121 -18
  30. package/dist/schemas/cbp-mandate.js.map +1 -1
  31. package/dist/schemas/cbp-mandate.test.d.ts +2 -1
  32. package/dist/schemas/cbp-mandate.test.d.ts.map +1 -1
  33. package/dist/schemas/cbp-mandate.test.js +130 -6
  34. package/dist/schemas/cbp-mandate.test.js.map +1 -1
  35. package/dist/utils/backup-github-files.d.ts +34 -0
  36. package/dist/utils/backup-github-files.d.ts.map +1 -0
  37. package/dist/utils/backup-github-files.js +137 -0
  38. package/dist/utils/backup-github-files.js.map +1 -0
  39. package/dist/utils/index.d.ts +25 -1
  40. package/dist/utils/index.d.ts.map +1 -1
  41. package/dist/utils/index.js +36 -1
  42. package/dist/utils/index.js.map +1 -1
  43. package/dist/utils/init-helpers.d.ts +14 -1
  44. package/dist/utils/init-helpers.d.ts.map +1 -1
  45. package/dist/utils/init-helpers.js +37 -2
  46. package/dist/utils/init-helpers.js.map +1 -1
  47. package/dist/utils/normalize.test.d.ts +15 -0
  48. package/dist/utils/normalize.test.d.ts.map +1 -0
  49. package/dist/utils/normalize.test.js +101 -0
  50. package/dist/utils/normalize.test.js.map +1 -0
  51. package/dist/utils/update-copilot-files.d.ts +59 -0
  52. package/dist/utils/update-copilot-files.d.ts.map +1 -0
  53. package/dist/utils/update-copilot-files.js +183 -0
  54. package/dist/utils/update-copilot-files.js.map +1 -0
  55. package/package.json +1 -1
@@ -6,7 +6,9 @@
6
6
  * Builds structured project context at quick/standard/deep levels.
7
7
  *
8
8
  * @see STORY-085 Context Command
9
+ * @see STORY-121 Layered AI Context Auto-Delivery
9
10
  */
11
+ import { statSync } from 'node:fs';
10
12
  import { promises as fs } from 'node:fs';
11
13
  import path from 'node:path';
12
14
  import { CACHE_CONFIG, getCache } from '../utils/cache.js';
@@ -198,7 +200,7 @@ export async function getQuickContext(projectDir, devstepsDir) {
198
200
  // Add suggestions
199
201
  const suggestions = [];
200
202
  if (!staticContext) {
201
- suggestions.push('Consider creating .devsteps/PROJECT.md for static context');
203
+ suggestions.push('Run `devsteps context generate` to create PROJECT.md for richer AI context');
202
204
  }
203
205
  if (activeItems.by_status.blocked > 0) {
204
206
  suggestions.push(`${activeItems.by_status.blocked} blocked items need attention`);
@@ -206,6 +208,329 @@ export async function getQuickContext(projectDir, devstepsDir) {
206
208
  if (suggestions.length > 0) {
207
209
  response.suggestions = suggestions;
208
210
  }
211
+ // Add context_meta for staleness awareness (TASK-276)
212
+ response.context_meta = await buildContextMeta(devstepsDir, 'quick', false);
209
213
  return response;
210
214
  }
215
+ /**
216
+ * Build context_meta block for any context response.
217
+ * Computes PROJECT.md age from filesystem mtime.
218
+ * @see STORY-121 TASK-276
219
+ */
220
+ export async function buildContextMeta(devstepsDir, level, cacheHit) {
221
+ const projectPath = path.join(devstepsDir, 'PROJECT.md');
222
+ let projectMdAgeHours = Number.POSITIVE_INFINITY;
223
+ try {
224
+ const stat = statSync(projectPath);
225
+ projectMdAgeHours = (Date.now() - stat.mtimeMs) / (1000 * 60 * 60);
226
+ }
227
+ catch {
228
+ // File doesn't exist — treat as infinitely stale
229
+ }
230
+ return {
231
+ generated_at: new Date().toISOString(),
232
+ project_md_age_hours: projectMdAgeHours,
233
+ is_stale: projectMdAgeHours > 24,
234
+ level,
235
+ cache_hit: cacheHit,
236
+ };
237
+ }
238
+ /**
239
+ * Get active items list from index (non-done, non-cancelled, non-obsolete)
240
+ */
241
+ async function getActiveItemsSummary(devstepsDir) {
242
+ const indexPath = path.join(devstepsDir, 'index.json');
243
+ const TERMINAL_STATUSES = new Set(['done', 'cancelled', 'obsolete']);
244
+ try {
245
+ const content = await fs.readFile(indexPath, 'utf-8');
246
+ const index = JSON.parse(content);
247
+ return index.items
248
+ .filter((item) => !TERMINAL_STATUSES.has(item.status))
249
+ .sort((a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime())
250
+ .slice(0, 30)
251
+ .map((item) => ({
252
+ id: item.id,
253
+ type: item.type,
254
+ title: item.title,
255
+ status: item.status,
256
+ updated: item.updated,
257
+ affected_paths: item.affected_paths,
258
+ }));
259
+ }
260
+ catch {
261
+ return [];
262
+ }
263
+ }
264
+ /**
265
+ * Collect unique affected_paths from in-progress items (top 10).
266
+ */
267
+ function collectKeyPaths(items) {
268
+ const seen = new Set();
269
+ const result = [];
270
+ for (const item of items) {
271
+ if (item.status !== 'in-progress')
272
+ continue;
273
+ for (const p of item.affected_paths ?? []) {
274
+ if (!seen.has(p)) {
275
+ seen.add(p);
276
+ result.push(p);
277
+ if (result.length >= 10)
278
+ return result;
279
+ }
280
+ }
281
+ }
282
+ return result;
283
+ }
284
+ /**
285
+ * Get standard context — extended project context for AI (< 20K tokens).
286
+ * Includes all quick fields plus open items, blocked items, in-progress summary,
287
+ * recent changes (7 days), key affected paths, and context_meta.
288
+ * @see STORY-121 TASK-273
289
+ */
290
+ export async function getStandardContext(projectDir, devstepsDir) {
291
+ const [packages, activeItems, recentUpdates, staticContext, allActiveItems] = await Promise.all([
292
+ analyzePackages(projectDir),
293
+ getItemCounts(devstepsDir),
294
+ getRecentUpdates(devstepsDir, 7),
295
+ readProjectMd(devstepsDir),
296
+ getActiveItemsSummary(devstepsDir),
297
+ ]);
298
+ const inProgress = allActiveItems.filter((i) => i.status === 'in-progress');
299
+ const blocked = allActiveItems.filter((i) => i.status === 'blocked');
300
+ const keyPaths = collectKeyPaths(allActiveItems);
301
+ const response = {
302
+ context_level: 'standard',
303
+ tokens_used: 0,
304
+ dynamic_context: {
305
+ packages,
306
+ active_items: activeItems,
307
+ recent_updates: recentUpdates,
308
+ },
309
+ };
310
+ if (staticContext) {
311
+ response.static_context = staticContext;
312
+ }
313
+ // Extended fields for standard level (stored as additional dynamic context)
314
+ const extendedContext = {
315
+ ...response.dynamic_context,
316
+ open_items_count: allActiveItems.length,
317
+ in_progress: inProgress.map((i) => ({ id: i.id, type: i.type, title: i.title, updated: i.updated })),
318
+ blocking_items: blocked.map((i) => ({ id: i.id, type: i.type, title: i.title })),
319
+ key_paths: keyPaths,
320
+ };
321
+ response.dynamic_context = extendedContext;
322
+ // Add suggestions
323
+ const suggestions = [];
324
+ if (!staticContext) {
325
+ suggestions.push('Run `devsteps context generate` to create PROJECT.md for richer AI context');
326
+ }
327
+ if (blocked.length > 0) {
328
+ suggestions.push(`${blocked.length} blocked item(s) need attention`);
329
+ }
330
+ if (inProgress.length > 5) {
331
+ suggestions.push(`${inProgress.length} items in-progress — consider focusing`);
332
+ }
333
+ if (suggestions.length > 0) {
334
+ response.suggestions = suggestions;
335
+ }
336
+ response.tokens_used = estimateTokens(response);
337
+ response.context_meta = await buildContextMeta(devstepsDir, 'standard', false);
338
+ return response;
339
+ }
340
+ /**
341
+ * Format a ContextResponse as readable plain text for embedding in AI prompts
342
+ * (used by MCP resource devsteps://project-context).
343
+ * @see STORY-121 TASK-275
344
+ */
345
+ export function formatContextAsText(ctx) {
346
+ const lines = [];
347
+ lines.push('# DevSteps Project Context');
348
+ lines.push('');
349
+ if (ctx.static_context) {
350
+ const sc = ctx.static_context;
351
+ if (sc.project_type) {
352
+ lines.push(`**Project Type:** ${sc.project_type}`);
353
+ lines.push('');
354
+ }
355
+ if (sc.tech_stack && Object.keys(sc.tech_stack).length > 0) {
356
+ lines.push('## Tech Stack');
357
+ for (const [key, val] of Object.entries(sc.tech_stack)) {
358
+ lines.push(`- **${key}:** ${val}`);
359
+ }
360
+ lines.push('');
361
+ }
362
+ }
363
+ // Packages
364
+ if (ctx.dynamic_context.packages.length > 0) {
365
+ lines.push('## Packages');
366
+ for (const pkg of ctx.dynamic_context.packages) {
367
+ lines.push(`- **${pkg.name}:** ${pkg.purpose}`);
368
+ }
369
+ lines.push('');
370
+ }
371
+ // Item summary
372
+ const counts = ctx.dynamic_context.active_items;
373
+ lines.push('## Project Status');
374
+ lines.push(`Total items: ${counts.total}`);
375
+ if (counts.by_status) {
376
+ const statusParts = Object.entries(counts.by_status)
377
+ .filter(([, n]) => n > 0)
378
+ .map(([s, n]) => `${s}: ${n}`)
379
+ .join(', ');
380
+ if (statusParts)
381
+ lines.push(`By status: ${statusParts}`);
382
+ }
383
+ lines.push('');
384
+ // Recent updates
385
+ if (ctx.dynamic_context.recent_updates.length > 0) {
386
+ lines.push('## Recent Activity (last 7 days)');
387
+ for (const u of ctx.dynamic_context.recent_updates.slice(0, 5)) {
388
+ lines.push(`- [${u.id}] ${u.title} (${u.type}, updated ${u.updated.slice(0, 10)})`);
389
+ }
390
+ lines.push('');
391
+ }
392
+ // Staleness warning
393
+ if (ctx.context_meta?.is_stale) {
394
+ lines.push(`⚠️ Context may be stale (PROJECT.md is ${ctx.context_meta.project_md_age_hours.toFixed(1)}h old). Run \`devsteps context generate\` to refresh.`);
395
+ lines.push('');
396
+ }
397
+ // Conventions
398
+ lines.push('## DevSteps Conventions');
399
+ lines.push('- Never edit .devsteps/ directly — use MCP tools or CLI');
400
+ lines.push('- Item hierarchy: Epic → Story|Spike → Task|Bug');
401
+ lines.push('- Status flow: draft → planned → in-progress → review → done');
402
+ lines.push('- Git: `type(scope): subject` + footer `Implements: ID`');
403
+ return lines.join('\n');
404
+ }
405
+ /**
406
+ * Generate PROJECT.md content from live project state.
407
+ * Used by `devsteps context generate` CLI command.
408
+ * @see STORY-121 TASK-272
409
+ */
410
+ export async function generateProjectMd(projectDir, devstepsDir) {
411
+ const [packages, counts, recentUpdates] = await Promise.all([
412
+ analyzePackages(projectDir),
413
+ getItemCounts(devstepsDir),
414
+ getRecentUpdates(devstepsDir, 14),
415
+ ]);
416
+ let projectName = path.basename(projectDir);
417
+ let methodology = 'scrum';
418
+ let projectDescription = '';
419
+ try {
420
+ const configRaw = await fs.readFile(path.join(devstepsDir, 'config.json'), 'utf-8');
421
+ const config = JSON.parse(configRaw);
422
+ projectName = config.project_name || projectName;
423
+ methodology = config.settings?.methodology || methodology;
424
+ projectDescription = config.description || '';
425
+ }
426
+ catch {
427
+ // config missing - use defaults
428
+ }
429
+ if (!projectDescription) {
430
+ try {
431
+ const readme = await fs.readFile(path.join(projectDir, 'README.md'), 'utf-8');
432
+ const firstPara = readme
433
+ .split('\n\n')
434
+ .find((p) => p.trim() && !p.startsWith('#') && !p.startsWith('<!--'));
435
+ projectDescription = firstPara?.trim().replace(/\n/g, ' ').slice(0, 300) || '';
436
+ }
437
+ catch {
438
+ // No README
439
+ }
440
+ }
441
+ const techLines = [];
442
+ try {
443
+ const rootPkg = await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8');
444
+ const root = JSON.parse(rootPkg);
445
+ const allDeps = { ...root.dependencies, ...root.devDependencies };
446
+ const knownStack = [
447
+ [/@modelcontextprotocol\/sdk/, 'MCP SDK (@modelcontextprotocol/sdk)'],
448
+ [/\bzod\b/, 'Zod (schema validation)'],
449
+ [/\bcommander\b/, 'Commander (CLI framework)'],
450
+ [/\bchalk\b/, 'Chalk (terminal styling)'],
451
+ [/\bora\b/, 'Ora (spinners)'],
452
+ [/\bpino\b/, 'Pino (structured logging)'],
453
+ [/\bprom-client\b/, 'prom-client (Prometheus metrics)'],
454
+ [/@biomejs\/biome/, 'Biome (lint + format)'],
455
+ [/\bvitest\b/, 'Vitest (unit testing)'],
456
+ [/\besbuild\b/, 'esbuild (bundler)'],
457
+ [/\btypescript\b/, 'TypeScript'],
458
+ ];
459
+ for (const [pattern, label] of knownStack) {
460
+ if (Object.keys(allDeps).some((k) => pattern.test(k))) {
461
+ techLines.push(`- ${label}`);
462
+ }
463
+ }
464
+ }
465
+ catch {
466
+ // No root package.json
467
+ }
468
+ const inProgressCount = counts.by_status['in-progress'] || 0;
469
+ const openCount = counts.total -
470
+ (counts.by_status.done || 0) -
471
+ (counts.by_status.cancelled || 0) -
472
+ (counts.by_status.obsolete || 0);
473
+ const lines = [];
474
+ lines.push(`# ${projectName}`);
475
+ lines.push('');
476
+ if (projectDescription) {
477
+ lines.push('## Description');
478
+ lines.push('');
479
+ lines.push(projectDescription);
480
+ lines.push('');
481
+ }
482
+ if (techLines.length > 0) {
483
+ lines.push('## Tech Stack');
484
+ lines.push('');
485
+ lines.push('- **Runtime:** Node.js 22+, TypeScript ESM');
486
+ lines.push('- **Monorepo:** npm workspaces, esbuild per-package');
487
+ lines.push(`- **Methodology:** ${methodology}`);
488
+ for (const t of techLines) {
489
+ lines.push(t);
490
+ }
491
+ lines.push('');
492
+ }
493
+ lines.push('## Project Type');
494
+ lines.push('');
495
+ lines.push(methodology.charAt(0).toUpperCase() + methodology.slice(1));
496
+ lines.push('');
497
+ if (packages.length > 0) {
498
+ lines.push('## Package Structure');
499
+ lines.push('');
500
+ for (const pkg of packages) {
501
+ lines.push(`- **${pkg.name}:** ${pkg.purpose}`);
502
+ }
503
+ lines.push('');
504
+ }
505
+ lines.push('## Status');
506
+ lines.push('');
507
+ lines.push(`Total items: ${counts.total} | Open: ${openCount} | In-progress: ${inProgressCount}`);
508
+ if (counts.by_type) {
509
+ const typeSummary = Object.entries(counts.by_type)
510
+ .filter(([, n]) => n > 0)
511
+ .map(([t, n]) => `${t}: ${n}`)
512
+ .join(', ');
513
+ if (typeSummary)
514
+ lines.push(`By type: ${typeSummary}`);
515
+ }
516
+ lines.push('');
517
+ if (recentUpdates.length > 0) {
518
+ lines.push('## Active Work');
519
+ lines.push('');
520
+ for (const u of recentUpdates.slice(0, 10)) {
521
+ lines.push(`- [${u.id}] ${u.title} (${u.type})`);
522
+ }
523
+ lines.push('');
524
+ }
525
+ lines.push('## Conventions');
526
+ lines.push('');
527
+ lines.push('- **WorkDir:** `.devsteps/` -- managed by DevSteps tools only');
528
+ lines.push('- **Hierarchy:** Epic -> Story|Spike -> Task|Bug');
529
+ lines.push('- **Status flow:** draft -> planned -> in-progress -> review -> done');
530
+ lines.push('- **Commits:** `type(scope): subject` + footer `Implements: ID`');
531
+ lines.push('- **Quality:** Build + tests must pass before marking done');
532
+ lines.push('');
533
+ lines.push(`_Generated by \`devsteps context generate\` at ${new Date().toISOString()}_`);
534
+ return lines.join('\n');
535
+ }
211
536
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Tests for context generation — quick/standard levels, context_meta, generateProjectMd
6
+ *
7
+ * @see STORY-121 TASK-273, TASK-276
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../src/core/context.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Tests for context generation — quick/standard levels, context_meta, generateProjectMd
6
+ *
7
+ * @see STORY-121 TASK-273, TASK-276
8
+ */
9
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
10
+ import { tmpdir } from 'node:os';
11
+ import path from 'node:path';
12
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
13
+ import { buildContextMeta, formatContextAsText, generateProjectMd, getQuickContext, getStandardContext, } from './context.js';
14
+ // ─── Test fixtures ────────────────────────────────────────────────────────────
15
+ function makeIndex(items) {
16
+ return JSON.stringify({
17
+ version: '2.0.0',
18
+ items,
19
+ });
20
+ }
21
+ function makeItem(id, type, status) {
22
+ return { id, type, title: `${type} ${id}`, status, updated: new Date().toISOString() };
23
+ }
24
+ let tmpDir;
25
+ let projectDir;
26
+ let devstepsDir;
27
+ beforeEach(() => {
28
+ tmpDir = mkdtempSync(path.join(tmpdir(), 'devsteps-ctx-test-'));
29
+ projectDir = tmpDir;
30
+ devstepsDir = path.join(tmpDir, '.devsteps');
31
+ mkdirSync(devstepsDir, { recursive: true });
32
+ // Minimal index
33
+ writeFileSync(path.join(devstepsDir, 'index.json'), makeIndex([
34
+ makeItem('STORY-001', 'story', 'in-progress'),
35
+ makeItem('TASK-001', 'task', 'planned'),
36
+ makeItem('TASK-002', 'task', 'done'),
37
+ makeItem('BUG-001', 'bug', 'blocked'),
38
+ ]));
39
+ });
40
+ afterEach(() => {
41
+ rmSync(tmpDir, { recursive: true, force: true });
42
+ });
43
+ // ─── getQuickContext ──────────────────────────────────────────────────────────
44
+ describe('getQuickContext', () => {
45
+ it('returns success with correct context_level', async () => {
46
+ const ctx = await getQuickContext(projectDir, devstepsDir);
47
+ expect(ctx.context_level).toBe('quick');
48
+ });
49
+ it('includes active_items counts', async () => {
50
+ const ctx = await getQuickContext(projectDir, devstepsDir);
51
+ expect(ctx.dynamic_context.active_items.total).toBe(4);
52
+ expect(ctx.dynamic_context.active_items.by_type.story).toBe(1);
53
+ expect(ctx.dynamic_context.active_items.by_status.done).toBe(1);
54
+ });
55
+ it('includes context_meta', async () => {
56
+ const ctx = await getQuickContext(projectDir, devstepsDir);
57
+ expect(ctx.context_meta).toBeDefined();
58
+ expect(ctx.context_meta.level).toBe('quick');
59
+ expect(typeof ctx.context_meta.generated_at).toBe('string');
60
+ expect(typeof ctx.context_meta.project_md_age_hours).toBe('number');
61
+ expect(typeof ctx.context_meta.is_stale).toBe('boolean');
62
+ expect(typeof ctx.context_meta.cache_hit).toBe('boolean');
63
+ });
64
+ it('context_meta.is_stale true when PROJECT.md missing', async () => {
65
+ const ctx = await getQuickContext(projectDir, devstepsDir);
66
+ // PROJECT.md not written in beforeEach — should be stale (Infinity age)
67
+ expect(ctx.context_meta.is_stale).toBe(true);
68
+ expect(ctx.context_meta.project_md_age_hours).toBe(Number.POSITIVE_INFINITY);
69
+ });
70
+ it('context_meta.is_stale false when PROJECT.md is fresh', async () => {
71
+ writeFileSync(path.join(devstepsDir, 'PROJECT.md'), '# Test', 'utf-8');
72
+ const ctx = await getQuickContext(projectDir, devstepsDir);
73
+ expect(ctx.context_meta.is_stale).toBe(false);
74
+ expect(ctx.context_meta.project_md_age_hours).toBeLessThan(1);
75
+ });
76
+ it('includes suggestions when PROJECT.md missing', async () => {
77
+ const ctx = await getQuickContext(projectDir, devstepsDir);
78
+ expect(ctx.suggestions).toBeDefined();
79
+ expect(ctx.suggestions.some((s) => s.includes('devsteps context generate'))).toBe(true);
80
+ });
81
+ it('includes suggestions for blocked items', async () => {
82
+ const ctx = await getQuickContext(projectDir, devstepsDir);
83
+ expect(ctx.suggestions.some((s) => s.includes('blocked'))).toBe(true);
84
+ });
85
+ it('tokens_used is positive', async () => {
86
+ const ctx = await getQuickContext(projectDir, devstepsDir);
87
+ expect(ctx.tokens_used).toBeGreaterThan(0);
88
+ });
89
+ });
90
+ // ─── getStandardContext ───────────────────────────────────────────────────────
91
+ describe('getStandardContext', () => {
92
+ it('returns context_level standard', async () => {
93
+ const ctx = await getStandardContext(projectDir, devstepsDir);
94
+ expect(ctx.context_level).toBe('standard');
95
+ });
96
+ it('includes context_meta with level standard', async () => {
97
+ const ctx = await getStandardContext(projectDir, devstepsDir);
98
+ expect(ctx.context_meta).toBeDefined();
99
+ expect(ctx.context_meta.level).toBe('standard');
100
+ });
101
+ it('standard context includes open_items_count in dynamic_context', async () => {
102
+ const ctx = await getStandardContext(projectDir, devstepsDir);
103
+ // 4 items total, 3 non-done (in-progress, planned, blocked)
104
+ const dc = ctx.dynamic_context;
105
+ expect(dc.open_items_count).toBeDefined();
106
+ expect(dc.open_items_count).toBeGreaterThanOrEqual(3);
107
+ });
108
+ it('standard context includes in_progress array', async () => {
109
+ const ctx = await getStandardContext(projectDir, devstepsDir);
110
+ const dc = ctx.dynamic_context;
111
+ expect(dc.in_progress).toBeDefined();
112
+ expect(dc.in_progress.some((i) => i.id === 'STORY-001')).toBe(true);
113
+ });
114
+ it('standard context includes blocking_items array', async () => {
115
+ const ctx = await getStandardContext(projectDir, devstepsDir);
116
+ const dc = ctx.dynamic_context;
117
+ expect(dc.blocking_items).toBeDefined();
118
+ expect(dc.blocking_items.some((i) => i.id === 'BUG-001')).toBe(true);
119
+ });
120
+ it('tokens_used is positive and larger than quick', async () => {
121
+ const quick = await getQuickContext(projectDir, devstepsDir);
122
+ const standard = await getStandardContext(projectDir, devstepsDir);
123
+ expect(standard.tokens_used).toBeGreaterThan(0);
124
+ // Standard should be at least as many tokens as quick
125
+ expect(standard.tokens_used).toBeGreaterThanOrEqual(quick.tokens_used);
126
+ });
127
+ });
128
+ // ─── buildContextMeta ────────────────────────────────────────────────────────
129
+ describe('buildContextMeta', () => {
130
+ it('returns is_stale true when PROJECT.md missing', async () => {
131
+ const meta = await buildContextMeta(devstepsDir, 'quick', false);
132
+ expect(meta.is_stale).toBe(true);
133
+ });
134
+ it('returns is_stale false when PROJECT.md fresh', async () => {
135
+ writeFileSync(path.join(devstepsDir, 'PROJECT.md'), '# test', 'utf-8');
136
+ const meta = await buildContextMeta(devstepsDir, 'quick', false);
137
+ expect(meta.is_stale).toBe(false);
138
+ });
139
+ it('returns correct level', async () => {
140
+ const meta = await buildContextMeta(devstepsDir, 'standard', true);
141
+ expect(meta.level).toBe('standard');
142
+ expect(meta.cache_hit).toBe(true);
143
+ });
144
+ it('generated_at is valid ISO date', async () => {
145
+ const meta = await buildContextMeta(devstepsDir, 'quick', false);
146
+ expect(new Date(meta.generated_at).getTime()).not.toBeNaN();
147
+ });
148
+ });
149
+ // ─── formatContextAsText ─────────────────────────────────────────────────────
150
+ describe('formatContextAsText', () => {
151
+ it('produces non-empty markdown string', async () => {
152
+ const ctx = await getQuickContext(projectDir, devstepsDir);
153
+ const text = formatContextAsText(ctx);
154
+ expect(typeof text).toBe('string');
155
+ expect(text.length).toBeGreaterThan(50);
156
+ });
157
+ it('contains project status section', async () => {
158
+ const ctx = await getQuickContext(projectDir, devstepsDir);
159
+ const text = formatContextAsText(ctx);
160
+ expect(text).toContain('## Project Status');
161
+ expect(text).toContain('Total items: 4');
162
+ });
163
+ it('contains DevSteps Conventions section', async () => {
164
+ const ctx = await getQuickContext(projectDir, devstepsDir);
165
+ const text = formatContextAsText(ctx);
166
+ expect(text).toContain('## DevSteps Conventions');
167
+ expect(text).toContain('.devsteps/');
168
+ });
169
+ it('includes stale warning when is_stale', async () => {
170
+ // PROJECT.md missing => is_stale
171
+ const ctx = await getQuickContext(projectDir, devstepsDir);
172
+ const text = formatContextAsText(ctx);
173
+ expect(text).toContain('stale');
174
+ expect(text).toContain('devsteps context generate');
175
+ });
176
+ it('no stale warning when PROJECT.md fresh', async () => {
177
+ writeFileSync(path.join(devstepsDir, 'PROJECT.md'), '# test', 'utf-8');
178
+ const ctx = await getQuickContext(projectDir, devstepsDir);
179
+ const text = formatContextAsText(ctx);
180
+ expect(text).not.toContain('stale');
181
+ });
182
+ });
183
+ // ─── generateProjectMd ───────────────────────────────────────────────────────
184
+ describe('generateProjectMd', () => {
185
+ beforeEach(() => {
186
+ // Write a minimal config.json
187
+ writeFileSync(path.join(devstepsDir, 'config.json'), JSON.stringify({
188
+ project_name: 'test-project',
189
+ settings: { methodology: 'scrum' },
190
+ created: new Date().toISOString(),
191
+ }), 'utf-8');
192
+ });
193
+ it('produces markdown starting with project name', async () => {
194
+ const md = await generateProjectMd(projectDir, devstepsDir);
195
+ expect(md).toMatch(/^# test-project/);
196
+ });
197
+ it('contains Project Type section', async () => {
198
+ const md = await generateProjectMd(projectDir, devstepsDir);
199
+ expect(md).toContain('## Project Type');
200
+ expect(md).toContain('Scrum');
201
+ });
202
+ it('contains Status section with item counts', async () => {
203
+ const md = await generateProjectMd(projectDir, devstepsDir);
204
+ expect(md).toContain('## Status');
205
+ expect(md).toContain('Total items: 4');
206
+ });
207
+ it('contains Conventions section', async () => {
208
+ const md = await generateProjectMd(projectDir, devstepsDir);
209
+ expect(md).toContain('## Conventions');
210
+ expect(md).toContain('.devsteps/');
211
+ });
212
+ it('ends with generation timestamp', async () => {
213
+ const md = await generateProjectMd(projectDir, devstepsDir);
214
+ expect(md).toContain('_Generated by');
215
+ expect(md).toContain('devsteps context generate');
216
+ });
217
+ it('reads description from README.md when no config description', async () => {
218
+ writeFileSync(path.join(projectDir, 'README.md'), '# Test\n\nThis is the first paragraph.', 'utf-8');
219
+ const md = await generateProjectMd(projectDir, devstepsDir);
220
+ expect(md).toContain('This is the first paragraph.');
221
+ });
222
+ it('includes package structure when packages/ dir exists', async () => {
223
+ const pkgDir = path.join(projectDir, 'packages', 'mypkg');
224
+ mkdirSync(pkgDir, { recursive: true });
225
+ writeFileSync(path.join(pkgDir, 'package.json'), JSON.stringify({ name: '@test/mypkg', description: 'My test package' }), 'utf-8');
226
+ const md = await generateProjectMd(projectDir, devstepsDir);
227
+ expect(md).toContain('## Package Structure');
228
+ expect(md).toContain('@test/mypkg');
229
+ expect(md).toContain('My test package');
230
+ });
231
+ it('works when config.json is missing (graceful fallback)', async () => {
232
+ rmSync(path.join(devstepsDir, 'config.json'));
233
+ const md = await generateProjectMd(projectDir, devstepsDir);
234
+ // Should not throw — uses directory name as project name
235
+ expect(md).toBeDefined();
236
+ expect(md.startsWith('#')).toBe(true);
237
+ });
238
+ });
239
+ //# sourceMappingURL=context.test.js.map