engineering-memory 0.2.0 → 0.2.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "engineering-memory",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Installs the Engineering Memory skill and its local MCP bridge. Sign in after installing; your organization and project are resolved from your account.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -1799,8 +1799,11 @@ export class BridgeService {
1799
1799
  if (pointer.verificationIntent || pointer.closeIntent) {
1800
1800
  throw new Error('A clean active task snapshot is required for checkpointing');
1801
1801
  }
1802
- if (pointer.taskSlug !== input.taskSlug) {
1803
- throw new Error('Checkpoint task slug does not match the active task pointer');
1802
+ // The slug names the task's journal directory, and a directory is the same
1803
+ // one whatever case it is typed in. Rejecting KAN-1003 against kan-1003
1804
+ // refuses a correct checkpoint over nothing.
1805
+ if (pointer.taskSlug.toLowerCase() !== input.taskSlug.toLowerCase()) {
1806
+ throw new Error(`Checkpoint task slug ${input.taskSlug} does not match the active task ${pointer.taskSlug}`);
1804
1807
  }
1805
1808
  return pointer;
1806
1809
  }
@@ -2296,7 +2299,19 @@ function assertNewResourceEvidence(candidates, evidence) {
2296
2299
  .map(({ path, kind }) => ({ path, kind }))
2297
2300
  .sort((left, right) => left.path.localeCompare(right.path));
2298
2301
  if (stableStringify(expected) !== stableStringify(actual)) {
2299
- throw new Error('New screen or shared component paths require exact memory reconciliation');
2302
+ const expectedPaths = new Set(expected.map((entry) => entry.path));
2303
+ const actualPaths = new Set(actual.map((entry) => entry.path));
2304
+ const missing = expected
2305
+ .filter((entry) => !actualPaths.has(entry.path))
2306
+ .map((entry) => `${entry.path} (${entry.kind})`);
2307
+ const extra = actual
2308
+ .filter((entry) => !expectedPaths.has(entry.path))
2309
+ .map((entry) => `${entry.path} (${entry.kind})`);
2310
+ const details = [
2311
+ missing.length ? `missing evidence for ${missing.join(', ')}` : '',
2312
+ extra.length ? `evidence for paths the policy does not classify: ${extra.join(', ')}` : '',
2313
+ ].filter(Boolean);
2314
+ throw new Error(`New screen or shared component paths require exact memory reconciliation. ${details.length ? details.join('; ') : 'The kinds do not match the project discovery policy.'}`);
2300
2315
  }
2301
2316
  }
2302
2317
  function assertValidationEvidence(validations) {
@@ -99,6 +99,8 @@ After `task.close`, and every time, ask the user what to do with the finished wo
99
99
 
100
100
  The two pull request options take the base branch the pull request targets, typed by the user; the head is the branch the task was done on. Never guess a base branch, and never open a pull request that was not asked for.
101
101
 
102
+ Check that a pull request can actually be opened before offering one. If the machine has no `gh` and no token to open it with, say so in the option itself and offer what is really on the table: commit and push, and the ready-to-open compare link afterwards. Offering something you cannot deliver wastes the user's answer. Never read a credential out of a keychain or a helper to open one yourself.
103
+
102
104
  Once a pull request exists the work is not finished and the turn does not end there. Check whether it merges cleanly. If it does, say so with the link. If it does not, name the conflicting files and ask whether to resolve them — then wait. Resolving a conflict is a change to someone else's work and needs its own yes.
103
105
 
104
106
  ## Git Hook