@vheins/local-memory-mcp 0.16.0 → 0.16.2

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.
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-rb4jB2IX.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-DtO8Q1SV.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-wAYh22Zy.css">
13
13
  </head>
14
14
  <body>
@@ -16,7 +16,7 @@ import {
16
16
  handleTaskClaim,
17
17
  listResources,
18
18
  logger
19
- } from "../chunk-2EW2PODH.js";
19
+ } from "../chunk-SXIFTAR7.js";
20
20
 
21
21
  // src/dashboard/server.ts
22
22
  import express from "express";
@@ -60,7 +60,7 @@ import {
60
60
  toContextSlug,
61
61
  updateSessionFromInitialize,
62
62
  updateSessionRoots
63
- } from "../chunk-2EW2PODH.js";
63
+ } from "../chunk-SXIFTAR7.js";
64
64
 
65
65
  // src/mcp/server.ts
66
66
  import readline from "readline";
@@ -2370,24 +2370,57 @@ async function handleTaskGet(args, storage) {
2370
2370
  throw new Error(`Task not found: ${id || task_code} in repo ${repo}`);
2371
2371
  }
2372
2372
  const comments = storage.taskComments.getTaskCommentsByTaskId(task.id);
2373
+ const children = storage.tasks.getChildrenByParentId(task.id);
2374
+ const depended_by = storage.tasks.getDependedByTaskId(task.id);
2373
2375
  let contentSummary;
2374
2376
  if (!isStructuredRequest) {
2375
2377
  const lines = [
2376
2378
  `Task: ${task.title}`,
2377
2379
  `Code: ${task.task_code}`,
2380
+ `Repo: ${task.repo}`,
2378
2381
  `Status: ${task.status}`,
2379
2382
  `Priority: ${task.priority}`,
2380
2383
  `ID: ${task.id}`
2381
2384
  ];
2382
2385
  if (task.phase) lines.push(`Phase: ${task.phase}`);
2386
+ if (task.parent_code) lines.push(`Parent: ${task.parent_code} (${task.parent_id || ""})`);
2387
+ if (task.depends_on_code) lines.push(`Depends On: ${task.depends_on_code} (${task.depends_on || ""})`);
2388
+ if (task.doc_path) lines.push(`Doc Path: ${task.doc_path}`);
2383
2389
  if (task.description) lines.push(`Description: ${task.description}`);
2390
+ if (task.tags && task.tags.length > 0) lines.push(`Tags: ${task.tags.join(", ")}`);
2384
2391
  if (task.suggested_skills && task.suggested_skills.length > 0)
2385
2392
  lines.push(`Suggested Skills: ${task.suggested_skills.join(", ")}`);
2393
+ if (task.est_tokens) lines.push(`Est Tokens: ${task.est_tokens}`);
2394
+ if (task.commit_id) lines.push(`Commit: ${task.commit_id}`);
2395
+ if (task.changed_files && task.changed_files.length > 0)
2396
+ lines.push(`Changed Files: ${task.changed_files.join(", ")}`);
2386
2397
  if (task.metadata) lines.push(`Metadata: ${JSON.stringify(task.metadata)}`);
2398
+ if (task.comments_count !== void 0) lines.push(`Comments: ${task.comments_count}`);
2399
+ if (task.coordination) {
2400
+ if (task.coordination.active_claim_count > 0) {
2401
+ lines.push(`Claim: ${task.coordination.active_claim_agent || "?"} (${task.coordination.active_claim_role || ""}) since ${task.coordination.active_claim_claimed_at || ""}`);
2402
+ }
2403
+ if (task.coordination.pending_handoff_count > 0) {
2404
+ lines.push(`Handoff: ${task.coordination.pending_handoff_summary || ""} \u2192 ${task.coordination.pending_handoff_to_agent || "?"}`);
2405
+ }
2406
+ }
2387
2407
  lines.push(`Created: ${task.created_at}`);
2388
2408
  if (task.updated_at) lines.push(`Updated: ${task.updated_at}`);
2389
2409
  if (task.in_progress_at) lines.push(`Started: ${task.in_progress_at}`);
2390
2410
  if (task.finished_at) lines.push(`Finished: ${task.finished_at}`);
2411
+ if (task.canceled_at) lines.push(`Canceled: ${task.canceled_at}`);
2412
+ if (children.length > 0) {
2413
+ lines.push("", "--- Children ---");
2414
+ for (const c of children) {
2415
+ lines.push(`- ${c.task_code}: ${c.title} (${c.status})`);
2416
+ }
2417
+ }
2418
+ if (depended_by.length > 0) {
2419
+ lines.push("", "--- Depended By ---");
2420
+ for (const d of depended_by) {
2421
+ lines.push(`- ${d.task_code}: ${d.title} (${d.status})`);
2422
+ }
2423
+ }
2391
2424
  if (comments.length > 0) {
2392
2425
  lines.push("", "--- History ---");
2393
2426
  for (const c of comments) {
@@ -2400,7 +2433,9 @@ async function handleTaskGet(args, storage) {
2400
2433
  }
2401
2434
  const structuredData = {
2402
2435
  ...task,
2403
- comments
2436
+ comments,
2437
+ children,
2438
+ depended_by
2404
2439
  };
2405
2440
  return createMcpResponse(structuredData, contentSummary || "", {
2406
2441
  contentSummary,
@@ -42,6 +42,14 @@ G2 | sprint? | src=.agents/documents/tasks/sprints/ | → route sprint flow |
42
42
 
43
43
  `1=Low` `2=Normal` `3=Medium` `4=High` `5=Critical` (ascending urgency)
44
44
 
45
+ ## 3B. SKILL TRACKING METADATA
46
+ When a task's description references specific skills (e.g., "Load feature-decomposition skill"), set `metadata.required_skills` and `metadata.fsm_gates`:
47
+
48
+ - `metadata.required_skills`: `["skill-name-1", "skill-name-2"]` — array of skill names the task depends on.
49
+ - `metadata.fsm_gates`: `["S0", "S1", "G0"]` — array of FSM step/gate identifiers the skill requires.
50
+ - **Optional**: Only set when the task explicitly references a skill. Most tasks do NOT need skill tracking.
51
+ - **Enforcement**: The `task-memory-executor` G0.5 gate checks `metadata.required_skills` before execution. If a skill is listed but wasn't loaded, the executor blocks the task.
52
+
45
53
  ## Blueprint Flow (G1→)
46
54
 
47
55
  Root parent → phase parents P0..P10 → child tasks per breakdown row
@@ -20,7 +20,8 @@ S0 | sync: resolve identity (arg→auto `<runner>-<randomName>`, 1x reuse all lo
20
20
  S1 | hydrate: task-detail ONCE per task — MUST cache, MUST reuse all steps, NO re-fetch | S0✅ | full task | —
21
21
  G0 | readiness: depends_on✅ AND parent_id✅? if all blocked → report blockers + pause | S1✅ | → S2 / skip+pick next | —
22
22
  S2 | claim: task-claim(with identity metadata) + task-update→in_progress(agent, role, identity) | G0✅ | ownership | —
23
- S3 | research: check task-detail for suggested_skills load each via skill() tool; then memory-search + standard-search(MANDATORY per task — even sub-agents/decomposed) + hydrate relevant | S2✅ | context | —
23
+ G0.5 | skill readiness: check task.metadata.required_skills if present, load each via skill() and verify FSM completed (all gates passed). If skill not loaded or FSM incomplete → ⛔ block with reason. If absent → skip (most tasks don't use skills). Check task-detail for suggested_skills too if present, load each. | S2✅ | S3 / ⛔ → blocker | —
24
+ S3 | research: memory-search + standard-search(MANDATORY per task — even sub-agents/decomposed) + hydrate relevant | G0.5✅ | context | —
24
25
  S4 | execute: trace logic+callsites+docs — DO NOT infer from file presence; decompose if too broad | S3✅ | changes | —
25
26
  S5 | validate: tests + linters + type-check + browser(if UI — MANDATORY: console errors, overflow, responsive, core interactions) + logic audit all paths | S4✅ | verification | —
26
27
  S6 | finalize: task-update→completed(evidence: inspected files, verified logic, test results) + memory-store(insights) + standard-store(rules) + handoff(if work remains — with identity) + retrospective + report | S5✅ | completion | —
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vheins/local-memory-mcp",
3
- "version": "0.16.0",
3
+ "version": "0.16.2",
4
4
  "description": "MCP Local Memory Service for coding copilot agents",
5
5
  "mcpName": "io.github.vheins/local-memory-mcp",
6
6
  "type": "module",
@@ -50,6 +50,7 @@
50
50
  "better-sqlite3": "^12.9.0",
51
51
  "chart.js": "^4.5.1",
52
52
  "dompurify": "^3.3.3",
53
+ "esbuild": "0.28.1",
53
54
  "express": "^5.2.1",
54
55
  "gray-matter": "^4.0.3",
55
56
  "marked": "^18.0.0",
@@ -91,6 +92,7 @@
91
92
  },
92
93
  "overrides": {
93
94
  "protobufjs": "^7.5.8",
94
- "brace-expansion": "^5.0.6"
95
+ "brace-expansion": "^5.0.6",
96
+ "esbuild": "0.28.1"
95
97
  }
96
98
  }