engineering-memory 1.11.3 → 1.11.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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "engineering-memory",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.4",
|
|
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",
|
|
@@ -542,7 +542,7 @@ export function registerEngineeringMemoryTools(server, service) {
|
|
|
542
542
|
}),
|
|
543
543
|
}, async (input) => toolResult(await service.organizationCreate(input)));
|
|
544
544
|
server.registerTool('organization.member_list', {
|
|
545
|
-
description:
|
|
545
|
+
description: 'List opaque member identifiers and roles. Contact details are omitted; explain required authority by role without identifying a person.',
|
|
546
546
|
inputSchema: z.object({ organizationId: z.string().uuid() }),
|
|
547
547
|
}, async (input) => toolResult(await service.organizationMemberList(input)));
|
|
548
548
|
server.registerTool('organization.member_upsert', {
|
|
@@ -683,7 +683,7 @@ export function registerEngineeringMemoryTools(server, service) {
|
|
|
683
683
|
}),
|
|
684
684
|
}, async (input) => toolResult(await service.projectMemberAdd(input)));
|
|
685
685
|
server.registerTool('project.member_list', {
|
|
686
|
-
description: 'List
|
|
686
|
+
description: 'List stored project member identifiers and roles without contact details. Organization administrators inherit contributor access without a stored grant. Explain access recovery by role, not by personal identity.',
|
|
687
687
|
inputSchema: z.object({ projectId: z.string().uuid() }),
|
|
688
688
|
}, async (input) => toolResult(await service.projectMemberList(input)));
|
|
689
689
|
const workItemLocator = { projectId: z.string().uuid(), workItemId: z.string().uuid() };
|
|
@@ -1866,13 +1866,15 @@ export class BridgeService {
|
|
|
1866
1866
|
...(input.discipline !== undefined ? { discipline: input.discipline } : {}),
|
|
1867
1867
|
}),
|
|
1868
1868
|
});
|
|
1869
|
-
return asJsonValue({ membership: response.data });
|
|
1869
|
+
return asJsonValue({ membership: publicMembership(response.data) });
|
|
1870
1870
|
});
|
|
1871
1871
|
}
|
|
1872
1872
|
async projectMemberList(input) {
|
|
1873
1873
|
return await this.execute(async () => {
|
|
1874
1874
|
const response = await this.dependencies.client.request(endpoints.projectMemberList(input.projectId));
|
|
1875
|
-
return asJsonValue({
|
|
1875
|
+
return asJsonValue({
|
|
1876
|
+
members: Array.isArray(response.data) ? response.data.map(publicMembership) : [],
|
|
1877
|
+
});
|
|
1876
1878
|
});
|
|
1877
1879
|
}
|
|
1878
1880
|
async auditList(input) {
|
|
@@ -1904,13 +1906,15 @@ export class BridgeService {
|
|
|
1904
1906
|
discipline: input.discipline,
|
|
1905
1907
|
}),
|
|
1906
1908
|
});
|
|
1907
|
-
return asJsonValue({ membership: response.data });
|
|
1909
|
+
return asJsonValue({ membership: publicMembership(response.data) });
|
|
1908
1910
|
});
|
|
1909
1911
|
}
|
|
1910
1912
|
async organizationMemberList(input) {
|
|
1911
1913
|
return await this.execute(async () => {
|
|
1912
1914
|
const response = await this.dependencies.client.request(endpoints.organizationMemberList(input.organizationId));
|
|
1913
|
-
return asJsonValue({
|
|
1915
|
+
return asJsonValue({
|
|
1916
|
+
members: Array.isArray(response.data) ? response.data.map(publicMembership) : [],
|
|
1917
|
+
});
|
|
1914
1918
|
});
|
|
1915
1919
|
}
|
|
1916
1920
|
async organizationList() {
|
|
@@ -3737,4 +3741,26 @@ function sourceFromContext(value) {
|
|
|
3737
3741
|
...(linked ? { linked } : {}),
|
|
3738
3742
|
};
|
|
3739
3743
|
}
|
|
3744
|
+
function publicMembership(value) {
|
|
3745
|
+
const membership = objectValue(value);
|
|
3746
|
+
if (!membership)
|
|
3747
|
+
return {};
|
|
3748
|
+
const result = {};
|
|
3749
|
+
for (const key of [
|
|
3750
|
+
'id',
|
|
3751
|
+
'organizationId',
|
|
3752
|
+
'projectId',
|
|
3753
|
+
'userId',
|
|
3754
|
+
'role',
|
|
3755
|
+
'discipline',
|
|
3756
|
+
'administrativeRole',
|
|
3757
|
+
'createdAt',
|
|
3758
|
+
'updatedAt',
|
|
3759
|
+
]) {
|
|
3760
|
+
const field = membership[key];
|
|
3761
|
+
if (typeof field === 'string' || field === null)
|
|
3762
|
+
result[key] = field;
|
|
3763
|
+
}
|
|
3764
|
+
return result;
|
|
3765
|
+
}
|
|
3740
3766
|
//# sourceMappingURL=bridge-service.js.map
|
|
@@ -6,7 +6,7 @@ Sign-in decides nothing beyond who the user is. The organization and the project
|
|
|
6
6
|
|
|
7
7
|
Use the binding returned by `session.entry` as the authority. The bridge stores the selected project and repository identity under `~/.engineering-memory/origins/<api-hash>/project-bindings/`, outside the installed runtime and working tree. It imports a legacy `.engineering-memory/project.json` once, preserving its schema and exact backend fingerprint for existing tasks and receipts. It leaves that file unchanged; after migration the file is optional and may be removed through the repository's normal Git workflow. New bindings never create it. A checkout that never imported the marker still finds a project bound under the older identity: the bridge presents that identity alongside the current one and stores whichever the backend confirms. Never infer a selection from a directory or remote, and never edit binding records by hand. Separate clones or a changed remote require a new explicit selection; worktrees of the same checkout share the local binding.
|
|
8
8
|
|
|
9
|
-
An archived project is recoverable state, not a missing or conflicting binding. When an owner receives `project.restore`, use the `projectId` and `expectedVersion` in its data and call that operation before retrying. A non-owner receives `project.member_list` instead:
|
|
9
|
+
An archived project is recoverable state, not a missing or conflicting binding. When an owner receives `project.restore`, use the `projectId` and `expectedVersion` in its data and call that operation before retrying. A non-owner receives `project.member_list` instead: check the available roles and explain that project-owner authority is required to restore this exact project before retrying. Do not name a person or disclose contact details. Use `project.list` with `includeArchived: true` when an owner must first select the archived project. Never create or bind a replacement project to escape archive state.
|
|
10
10
|
|
|
11
11
|
For a bound repository, call `session.bootstrap` before producing a plan or changing files. Supply the current repository root, project ID, task ID or stable local task slug, objective, task kind, task mode, and current Git diff hash. Use `read_only` for review, diagnosis, planning, or reporting without write authority; use `scaffold` when the task applies organization architecture templates to a new project; use `write` when the request authorizes repository changes. The bridge records the read-only Git diff hash as the immutable task baseline, including a pre-existing dirty worktree. Use the returned task ID, task version, context session ID, pinned revisions, project profile, engineering rules, prior task documents, quality gates, and current deviations.
|
|
12
12
|
|
|
@@ -57,7 +57,7 @@ Open each side with the same workItemId and its own repository binding when work
|
|
|
57
57
|
|
|
58
58
|
### Administration, product management and QA
|
|
59
59
|
|
|
60
|
-
Administrative authority and work discipline are independent. Organization admins can manage projects, assignments, repository URLs and work items in their organization. A global admin has those rights only in organizations they actively belong to. Ordinary users need a live explicit project assignment. Fullstack/backend/web/mobile/frontend disciplines govern implementation, while project overrides do not grant administration.
|
|
60
|
+
Administrative authority and work discipline are independent. Organization admins can manage projects, assignments, repository URLs and work items in their organization. A global admin has those rights only in organizations they actively belong to. Ordinary users need a live explicit project assignment. Active organization administrators, including a global admin with live membership in that organization, inherit contributor access to its projects without a separate project grant. Fullstack/backend/web/mobile/frontend disciplines still govern implementation, while project overrides do not grant administration.
|
|
61
61
|
|
|
62
62
|
An assigned product manager can create, edit, assign, archive and restore work items through the work_item tools. Designer work includes design context and requirement participation; it does not grant general application code leases. A tester can create an unassigned bug and record `work_item.record_test` evidence, then track it with `work_item.test_results`. QA evidence must contain no credentials, PII or production payloads and must identify the exact requirement version. A passed result never silently marks the requirement done. Organization administration separately permits backlog management regardless of discipline.
|
|
63
63
|
|
|
@@ -48,7 +48,7 @@ A new organization is not empty. It reads the product engineering core immediate
|
|
|
48
48
|
|
|
49
49
|
Once the organization is chosen, call `project.list` and offer that organization's projects, with **create a new project** last. Ignore projects belonging to other organizations; a listing that mixes them is how work lands in the wrong place. Creating one follows the unbound-repository flow below.
|
|
50
50
|
|
|
51
|
-
The normal list omits archived projects. If repository entry, setup, binding or task open reports `project.restore`, use the project id and expected version returned with that refusal and restore it before continuing. If it reports `project.member_list`, the current member cannot restore the project: call that operation
|
|
51
|
+
The normal list omits archived projects. If repository entry, setup, binding or task open reports `project.restore`, use the project id and expected version returned with that refusal and restore it before continuing. If it reports `project.member_list`, the current member cannot restore the project: call that operation to check the available roles and explain that the versioned restore requires project-owner authority. Do not identify a person, reconstruct an identity from an account identifier or disclose contact details. If an owner does not yet have the project id and expected version, call `project.list` with `includeArchived: true` and let them select the archived project. Archive state never authorizes creating a duplicate project.
|
|
52
52
|
|
|
53
53
|
Ask both questions again whenever a chat starts in a repository whose binding you have not confirmed in this session.
|
|
54
54
|
|
|
@@ -99,6 +99,8 @@ fail, and raw secrets, headers, customer payloads and PII are excluded.
|
|
|
99
99
|
|
|
100
100
|
## Project Membership
|
|
101
101
|
|
|
102
|
+
Member tools expose opaque account identifiers and roles, not names or email addresses. Do not reconstruct a person's identity, search for their contact details, or repeat personal data when explaining an access refusal. Describe the required role and the current caller's available operation. Use a user-supplied account address only for the membership operation they explicitly requested; do not echo it into routine explanations, task memory or questionnaires. Organization administrators already inherit contributor access within their organization; do not offer to add them to every project to fix development access. Work discipline and live organization membership still apply.
|
|
103
|
+
|
|
102
104
|
Ask for the registered email and intended role. Show owner, maintainer, member, and reader effects. Confirm before calling `project.member_add`. A project grant is valid only while the same account belongs to the parent organization. If the call reports `organization.member_upsert`, do not retry the project write: an organization owner must first confirm the organization role and discipline and call that recovery. When the current account is not an organization owner, explain that coordination requirement instead of pretending the project grant succeeded. Retry `project.member_add` only after the parent grant exists.
|
|
103
105
|
|
|
104
106
|
## Branch
|