engineering-intelligence 0.2.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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +125 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +176 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/installer/blocks.d.ts +5 -0
- package/dist/installer/blocks.d.ts.map +1 -0
- package/dist/installer/blocks.js +27 -0
- package/dist/installer/blocks.js.map +1 -0
- package/dist/installer/index.d.ts +10 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +206 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/manifest/index.d.ts +7 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +25 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/templates.d.ts +6 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +103 -0
- package/dist/templates.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/index.d.ts +4 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +77 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +39 -0
- package/templates/canonical/agents/change-agent.md +8 -0
- package/templates/canonical/agents/engineering-orchestrator.md +10 -0
- package/templates/canonical/agents/knowledge-agent.md +8 -0
- package/templates/canonical/agents/quality-agent.md +8 -0
- package/templates/canonical/rules/engineering-intelligence.md +22 -0
- package/templates/canonical/skills/architecture-review-engine/SKILL.md +10 -0
- package/templates/canonical/skills/change-detection-engine/SKILL.md +17 -0
- package/templates/canonical/skills/change-history-engine/SKILL.md +13 -0
- package/templates/canonical/skills/context-sync-engine/SKILL.md +19 -0
- package/templates/canonical/skills/deep-project-knowledge-extractor/SKILL.md +16 -0
- package/templates/canonical/skills/engineering-change-review/SKILL.md +18 -0
- package/templates/canonical/skills/engineering-intelligence/SKILL.md +21 -0
- package/templates/canonical/skills/graph-engine/SKILL.md +58 -0
- package/templates/canonical/skills/impact-analysis-engine/SKILL.md +20 -0
- package/templates/canonical/skills/incremental-sync-engine/SKILL.md +21 -0
- package/templates/canonical/skills/initialize-engineering-intelligence/SKILL.md +32 -0
- package/templates/canonical/skills/knowledge-base-validator/SKILL.md +17 -0
- package/templates/canonical/skills/knowledge-sync-engine/SKILL.md +17 -0
- package/templates/canonical/skills/memory-sync-engine/SKILL.md +18 -0
- package/templates/canonical/skills/refactoring-planner/SKILL.md +10 -0
- package/templates/canonical/skills/testing-intelligence-engine/SKILL.md +10 -0
- package/templates/canonical/workflows/analyze-impact.md +13 -0
- package/templates/canonical/workflows/engineering-intelligence.md +11 -0
- package/templates/canonical/workflows/initialize-engineering-intelligence.md +11 -0
- package/templates/canonical/workflows/map-architecture.md +17 -0
- package/templates/canonical/workflows/review-engineering-change.md +11 -0
- package/templates/canonical/workflows/sync-engineering-intelligence.md +11 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { access, mkdir, readFile, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { renderAdapters } from "../adapters/index.js";
|
|
4
|
+
import { MANIFEST_PATH, TEMPLATE_VERSION, hashContent, readManifest, writeManifest } from "../manifest/index.js";
|
|
5
|
+
import { validateRender } from "../validation/index.js";
|
|
6
|
+
import { readManagedBlock, removeManagedBlock, upsertManagedBlock } from "./blocks.js";
|
|
7
|
+
async function exists(location) {
|
|
8
|
+
try {
|
|
9
|
+
await access(location);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function readMaybe(location) {
|
|
17
|
+
try {
|
|
18
|
+
return await readFile(location, "utf8");
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error.code === "ENOENT") {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function writeTarget(root, relativePath, content) {
|
|
28
|
+
const absolute = path.join(root, relativePath);
|
|
29
|
+
await mkdir(path.dirname(absolute), { recursive: true });
|
|
30
|
+
await writeFile(absolute, content, "utf8");
|
|
31
|
+
}
|
|
32
|
+
function priorByPath(manifest) {
|
|
33
|
+
return new Map((manifest?.files ?? []).map((entry) => [entry.path, entry]));
|
|
34
|
+
}
|
|
35
|
+
function entryFor(rendered) {
|
|
36
|
+
return {
|
|
37
|
+
path: rendered.path,
|
|
38
|
+
kind: rendered.kind,
|
|
39
|
+
hash: hashContent(rendered.content.trimEnd()),
|
|
40
|
+
blockId: rendered.blockId,
|
|
41
|
+
owners: rendered.owners,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function applyRendered(root, rendered, prior, options) {
|
|
45
|
+
const absolute = path.join(root, rendered.path);
|
|
46
|
+
const current = await readMaybe(absolute);
|
|
47
|
+
const desiredEntry = entryFor(rendered);
|
|
48
|
+
if (rendered.kind === "file") {
|
|
49
|
+
const currentHash = current === undefined ? undefined : hashContent(current.trimEnd());
|
|
50
|
+
const isSafe = current === undefined ||
|
|
51
|
+
currentHash === desiredEntry.hash ||
|
|
52
|
+
(prior !== undefined && currentHash === prior.hash) ||
|
|
53
|
+
options.force === true;
|
|
54
|
+
if (!isSafe) {
|
|
55
|
+
return {
|
|
56
|
+
action: { path: rendered.path, status: "conflict", message: "Existing or locally modified file preserved." },
|
|
57
|
+
entry: prior,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const status = current === undefined ? "created" : currentHash === desiredEntry.hash ? "unchanged" : "updated";
|
|
61
|
+
if (!options.dryRun && status !== "unchanged") {
|
|
62
|
+
await writeTarget(root, rendered.path, rendered.content);
|
|
63
|
+
}
|
|
64
|
+
return { action: { path: rendered.path, status }, entry: desiredEntry };
|
|
65
|
+
}
|
|
66
|
+
const id = rendered.blockId;
|
|
67
|
+
const existingBlock = current === undefined ? undefined : readManagedBlock(current, id);
|
|
68
|
+
const existingHash = existingBlock === undefined ? undefined : hashContent(existingBlock.trimEnd());
|
|
69
|
+
const isSafe = existingBlock === undefined ||
|
|
70
|
+
existingHash === desiredEntry.hash ||
|
|
71
|
+
(prior !== undefined && existingHash === prior.hash) ||
|
|
72
|
+
options.force === true;
|
|
73
|
+
if (!isSafe) {
|
|
74
|
+
return {
|
|
75
|
+
action: { path: rendered.path, status: "conflict", message: "Locally modified managed block preserved." },
|
|
76
|
+
entry: prior,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const status = current === undefined || existingBlock === undefined
|
|
80
|
+
? "created"
|
|
81
|
+
: existingHash === desiredEntry.hash
|
|
82
|
+
? "unchanged"
|
|
83
|
+
: "updated";
|
|
84
|
+
if (!options.dryRun && status !== "unchanged") {
|
|
85
|
+
await writeTarget(root, rendered.path, upsertManagedBlock(current ?? "", rendered.content, id));
|
|
86
|
+
}
|
|
87
|
+
return { action: { path: rendered.path, status }, entry: desiredEntry };
|
|
88
|
+
}
|
|
89
|
+
async function removeEntry(root, entry, options, reason = "Locally modified content preserved.") {
|
|
90
|
+
const absolute = path.join(root, entry.path);
|
|
91
|
+
const current = await readMaybe(absolute);
|
|
92
|
+
if (current === undefined) {
|
|
93
|
+
return { action: { path: entry.path, status: "preserved", message: "Already missing." }, retained: false };
|
|
94
|
+
}
|
|
95
|
+
const managed = entry.kind === "block" && entry.blockId ? readManagedBlock(current, entry.blockId) : current;
|
|
96
|
+
const unchanged = managed !== undefined && hashContent(managed.trimEnd()) === entry.hash;
|
|
97
|
+
if (!unchanged && !options.force) {
|
|
98
|
+
return { action: { path: entry.path, status: "conflict", message: reason }, retained: true };
|
|
99
|
+
}
|
|
100
|
+
if (!options.dryRun) {
|
|
101
|
+
if (entry.kind === "file") {
|
|
102
|
+
await unlink(absolute);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const remaining = removeManagedBlock(current, entry.blockId);
|
|
106
|
+
if (remaining.trim().length === 0) {
|
|
107
|
+
await unlink(absolute);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
await writeFile(absolute, remaining, "utf8");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { action: { path: entry.path, status: "removed" }, retained: false };
|
|
115
|
+
}
|
|
116
|
+
export async function install(root, requestedAdapters, options) {
|
|
117
|
+
const priorManifest = await readManifest(root);
|
|
118
|
+
const adapters = [...new Set([...(priorManifest?.adapters ?? []), ...requestedAdapters])];
|
|
119
|
+
const errors = await validateRender(adapters);
|
|
120
|
+
if (errors.length > 0) {
|
|
121
|
+
return {
|
|
122
|
+
actions: errors.map((message) => ({ path: "templates", status: "error", message })),
|
|
123
|
+
conflicts: errors.length,
|
|
124
|
+
changed: 0,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const desired = await renderAdapters(adapters);
|
|
128
|
+
const prior = priorByPath(priorManifest);
|
|
129
|
+
const actions = [];
|
|
130
|
+
const entries = [];
|
|
131
|
+
for (const rendered of desired) {
|
|
132
|
+
const result = await applyRendered(root, rendered, prior.get(rendered.path), options);
|
|
133
|
+
actions.push(result.action);
|
|
134
|
+
if (result.entry) {
|
|
135
|
+
entries.push(result.entry);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const desiredPaths = new Set(desired.map((item) => item.path));
|
|
139
|
+
for (const obsolete of priorManifest?.files ?? []) {
|
|
140
|
+
if (desiredPaths.has(obsolete.path)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const removal = await removeEntry(root, obsolete, options, "Obsolete managed content was edited locally and was preserved.");
|
|
144
|
+
actions.push(removal.action);
|
|
145
|
+
if (removal.retained) {
|
|
146
|
+
entries.push(obsolete);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const now = new Date().toISOString();
|
|
150
|
+
const manifest = {
|
|
151
|
+
schemaVersion: 1,
|
|
152
|
+
packageVersion: options.packageVersion,
|
|
153
|
+
templateVersion: TEMPLATE_VERSION,
|
|
154
|
+
adapters,
|
|
155
|
+
files: entries,
|
|
156
|
+
installedAt: priorManifest?.installedAt ?? now,
|
|
157
|
+
updatedAt: now,
|
|
158
|
+
};
|
|
159
|
+
if (!options.dryRun) {
|
|
160
|
+
await mkdir(path.join(root, ".engineering-intelligence"), { recursive: true });
|
|
161
|
+
await writeManifest(root, manifest);
|
|
162
|
+
}
|
|
163
|
+
return summarize(actions);
|
|
164
|
+
}
|
|
165
|
+
export async function update(root, options) {
|
|
166
|
+
const manifest = await readManifest(root);
|
|
167
|
+
if (!manifest) {
|
|
168
|
+
return summarize([{ path: MANIFEST_PATH, status: "error", message: "Nothing installed; run install first." }]);
|
|
169
|
+
}
|
|
170
|
+
return install(root, manifest.adapters, options);
|
|
171
|
+
}
|
|
172
|
+
export async function uninstall(root, options) {
|
|
173
|
+
const manifest = await readManifest(root);
|
|
174
|
+
if (!manifest) {
|
|
175
|
+
return summarize([{ path: MANIFEST_PATH, status: "error", message: "Nothing installed." }]);
|
|
176
|
+
}
|
|
177
|
+
const actions = [];
|
|
178
|
+
const retained = [];
|
|
179
|
+
for (const entry of manifest.files) {
|
|
180
|
+
const removal = await removeEntry(root, entry, options);
|
|
181
|
+
actions.push(removal.action);
|
|
182
|
+
if (removal.retained) {
|
|
183
|
+
retained.push(entry);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (!options.dryRun) {
|
|
187
|
+
const manifestAbsolute = path.join(root, MANIFEST_PATH);
|
|
188
|
+
if (retained.length === 0) {
|
|
189
|
+
if (await exists(manifestAbsolute)) {
|
|
190
|
+
await unlink(manifestAbsolute);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
await writeManifest(root, { ...manifest, files: retained, updatedAt: new Date().toISOString() });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return summarize(actions);
|
|
198
|
+
}
|
|
199
|
+
function summarize(actions) {
|
|
200
|
+
return {
|
|
201
|
+
actions,
|
|
202
|
+
conflicts: actions.filter((action) => action.status === "conflict" || action.status === "error").length,
|
|
203
|
+
changed: actions.filter((action) => ["created", "updated", "removed"].includes(action.status)).length,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { InstallManifest } from "../types.js";
|
|
2
|
+
export declare const MANIFEST_PATH = ".engineering-intelligence/install-manifest.json";
|
|
3
|
+
export declare const TEMPLATE_VERSION = "2.0.0";
|
|
4
|
+
export declare function hashContent(content: string): string;
|
|
5
|
+
export declare function readManifest(root: string): Promise<InstallManifest | undefined>;
|
|
6
|
+
export declare function writeManifest(root: string, manifest: InstallManifest): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,aAAa,oDAAoD,CAAC;AAC/E,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAWrF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1F"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export const MANIFEST_PATH = ".engineering-intelligence/install-manifest.json";
|
|
5
|
+
export const TEMPLATE_VERSION = "2.0.0";
|
|
6
|
+
export function hashContent(content) {
|
|
7
|
+
return createHash("sha256").update(content).digest("hex");
|
|
8
|
+
}
|
|
9
|
+
export async function readManifest(root) {
|
|
10
|
+
try {
|
|
11
|
+
const text = await readFile(path.join(root, MANIFEST_PATH), "utf8");
|
|
12
|
+
return JSON.parse(text);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
const code = error.code;
|
|
16
|
+
if (code === "ENOENT") {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function writeManifest(root, manifest) {
|
|
23
|
+
await writeFile(path.join(root, MANIFEST_PATH), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,MAAM,aAAa,GAAG,iDAAiD,CAAC;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAExC,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,QAAyB;IACzE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const SKILL_NAMES: readonly ["initialize-engineering-intelligence", "engineering-intelligence", "deep-project-knowledge-extractor", "knowledge-base-validator", "impact-analysis-engine", "testing-intelligence-engine", "knowledge-sync-engine", "memory-sync-engine", "context-sync-engine", "change-history-engine", "architecture-review-engine", "refactoring-planner", "graph-engine", "change-detection-engine", "incremental-sync-engine", "engineering-change-review"];
|
|
2
|
+
export declare const AGENT_NAMES: readonly ["engineering-orchestrator", "change-agent", "quality-agent", "knowledge-agent"];
|
|
3
|
+
export declare const WORKFLOW_NAMES: readonly ["initialize-engineering-intelligence", "engineering-intelligence", "map-architecture", "analyze-impact", "sync-engineering-intelligence", "review-engineering-change"];
|
|
4
|
+
export declare function readTemplate(category: "skills" | "agents" | "workflows" | "rules", name: string): Promise<string>;
|
|
5
|
+
export declare function validateCanonicalTemplates(): Promise<string[]>;
|
|
6
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,8bAiBd,CAAC;AAEX,eAAO,MAAM,WAAW,2FAKd,CAAC;AAEX,eAAO,MAAM,cAAc,kLAOjB,CAAC;AAOX,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,EACrD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAsDpE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
export const SKILL_NAMES = [
|
|
5
|
+
"initialize-engineering-intelligence",
|
|
6
|
+
"engineering-intelligence",
|
|
7
|
+
"deep-project-knowledge-extractor",
|
|
8
|
+
"knowledge-base-validator",
|
|
9
|
+
"impact-analysis-engine",
|
|
10
|
+
"testing-intelligence-engine",
|
|
11
|
+
"knowledge-sync-engine",
|
|
12
|
+
"memory-sync-engine",
|
|
13
|
+
"context-sync-engine",
|
|
14
|
+
"change-history-engine",
|
|
15
|
+
"architecture-review-engine",
|
|
16
|
+
"refactoring-planner",
|
|
17
|
+
"graph-engine",
|
|
18
|
+
"change-detection-engine",
|
|
19
|
+
"incremental-sync-engine",
|
|
20
|
+
"engineering-change-review",
|
|
21
|
+
];
|
|
22
|
+
export const AGENT_NAMES = [
|
|
23
|
+
"engineering-orchestrator",
|
|
24
|
+
"change-agent",
|
|
25
|
+
"quality-agent",
|
|
26
|
+
"knowledge-agent",
|
|
27
|
+
];
|
|
28
|
+
export const WORKFLOW_NAMES = [
|
|
29
|
+
"initialize-engineering-intelligence",
|
|
30
|
+
"engineering-intelligence",
|
|
31
|
+
"map-architecture",
|
|
32
|
+
"analyze-impact",
|
|
33
|
+
"sync-engineering-intelligence",
|
|
34
|
+
"review-engineering-change",
|
|
35
|
+
];
|
|
36
|
+
function templateRoot() {
|
|
37
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
38
|
+
return path.resolve(here, "../templates/canonical");
|
|
39
|
+
}
|
|
40
|
+
export async function readTemplate(category, name) {
|
|
41
|
+
const suffix = category === "skills" ? "SKILL.md" : `${name}.md`;
|
|
42
|
+
const location = category === "skills"
|
|
43
|
+
? path.join(templateRoot(), category, name, suffix)
|
|
44
|
+
: path.join(templateRoot(), category, suffix);
|
|
45
|
+
return readFile(location, "utf8");
|
|
46
|
+
}
|
|
47
|
+
export async function validateCanonicalTemplates() {
|
|
48
|
+
const errors = [];
|
|
49
|
+
const required = [
|
|
50
|
+
...SKILL_NAMES.map((name) => ["skills", name]),
|
|
51
|
+
...AGENT_NAMES.map((name) => ["agents", name]),
|
|
52
|
+
...WORKFLOW_NAMES.map((name) => ["workflows", name]),
|
|
53
|
+
["rules", "engineering-intelligence"],
|
|
54
|
+
];
|
|
55
|
+
for (const [category, name] of required) {
|
|
56
|
+
try {
|
|
57
|
+
const content = await readTemplate(category, name);
|
|
58
|
+
if (content.includes(".agent/") || content.includes(".agents/memory") || content.includes(".agents/context")) {
|
|
59
|
+
errors.push(`${category}/${name} contains an obsolete runtime path`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
errors.push(`Missing canonical template: ${category}/${name}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const skillDirectory = path.join(templateRoot(), "skills");
|
|
67
|
+
const foundSkills = await readdir(skillDirectory).catch(() => []);
|
|
68
|
+
for (const name of SKILL_NAMES) {
|
|
69
|
+
if (!foundSkills.includes(name)) {
|
|
70
|
+
errors.push(`Missing canonical skill directory: ${name}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const graph = await readTemplate("skills", "graph-engine").catch(() => "");
|
|
74
|
+
for (const artifact of [
|
|
75
|
+
"dependency-graph.json",
|
|
76
|
+
"service-graph.json",
|
|
77
|
+
"runtime-graph.json",
|
|
78
|
+
"business-flow-graph.json",
|
|
79
|
+
"architecture-map.md",
|
|
80
|
+
]) {
|
|
81
|
+
if (!graph.includes(artifact)) {
|
|
82
|
+
errors.push(`graph-engine does not define required graph artifact: ${artifact}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
for (const requiredContract of ["schemaVersion", "evidence", "unknowns", "verified | inferred | unknown"]) {
|
|
86
|
+
if (!graph.includes(requiredContract)) {
|
|
87
|
+
errors.push(`graph-engine does not define required graph contract field: ${requiredContract}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const workflow of [
|
|
91
|
+
"map-architecture",
|
|
92
|
+
"analyze-impact",
|
|
93
|
+
"sync-engineering-intelligence",
|
|
94
|
+
"review-engineering-change",
|
|
95
|
+
]) {
|
|
96
|
+
const content = await readTemplate("workflows", workflow).catch(() => "");
|
|
97
|
+
if (!content.toLowerCase().includes("not modify product code")) {
|
|
98
|
+
errors.push(`${workflow} must state that it does not modify product code`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return errors;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const IDE_IDS: readonly ["antigravity", "codex", "claude-code", "cursor", "github-copilot", "gemini-cli", "generic"];
|
|
2
|
+
export type IdeId = (typeof IDE_IDS)[number];
|
|
3
|
+
export type ManagedKind = "file" | "block";
|
|
4
|
+
export interface RenderedFile {
|
|
5
|
+
path: string;
|
|
6
|
+
content: string;
|
|
7
|
+
kind: ManagedKind;
|
|
8
|
+
blockId?: string;
|
|
9
|
+
owners: IdeId[];
|
|
10
|
+
}
|
|
11
|
+
export interface ManagedFileEntry {
|
|
12
|
+
path: string;
|
|
13
|
+
kind: ManagedKind;
|
|
14
|
+
hash: string;
|
|
15
|
+
blockId?: string;
|
|
16
|
+
owners: IdeId[];
|
|
17
|
+
}
|
|
18
|
+
export interface InstallManifest {
|
|
19
|
+
schemaVersion: 1;
|
|
20
|
+
packageVersion: string;
|
|
21
|
+
templateVersion: string;
|
|
22
|
+
adapters: IdeId[];
|
|
23
|
+
files: ManagedFileEntry[];
|
|
24
|
+
installedAt: string;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
}
|
|
27
|
+
export type ActionStatus = "created" | "updated" | "unchanged" | "removed" | "preserved" | "conflict" | "warning" | "error";
|
|
28
|
+
export interface FileAction {
|
|
29
|
+
path: string;
|
|
30
|
+
status: ActionStatus;
|
|
31
|
+
message?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface OperationResult {
|
|
34
|
+
actions: FileAction[];
|
|
35
|
+
conflicts: number;
|
|
36
|
+
changed: number;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,uGAQV,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,GACT,WAAW,GACX,UAAU,GACV,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,aAAa;IACb,OAAO;IACP,aAAa;IACb,QAAQ;IACR,gBAAgB;IAChB,YAAY;IACZ,SAAS;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAWrD,wBAAsB,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBrE;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsChE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { access, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { renderAdapters } from "../adapters/index.js";
|
|
4
|
+
import { readManagedBlock } from "../installer/blocks.js";
|
|
5
|
+
import { MANIFEST_PATH, hashContent, readManifest } from "../manifest/index.js";
|
|
6
|
+
import { validateCanonicalTemplates } from "../templates.js";
|
|
7
|
+
async function exists(location) {
|
|
8
|
+
try {
|
|
9
|
+
await access(location);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function validateRender(ides) {
|
|
17
|
+
const errors = await validateCanonicalTemplates();
|
|
18
|
+
const rendered = await renderAdapters(ides);
|
|
19
|
+
for (const item of rendered) {
|
|
20
|
+
if (item.content.includes(".agent/") ||
|
|
21
|
+
item.content.includes(".agents/memory") ||
|
|
22
|
+
item.content.includes(".agents/context")) {
|
|
23
|
+
errors.push(`${item.path} references an obsolete or host-bound runtime output path`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const allContent = rendered.map((item) => item.content).join("\n");
|
|
27
|
+
for (const requiredPath of [
|
|
28
|
+
".engineering-intelligence/graph/",
|
|
29
|
+
".engineering-intelligence/reports/",
|
|
30
|
+
]) {
|
|
31
|
+
if (!allContent.includes(requiredPath)) {
|
|
32
|
+
errors.push(`Rendered templates do not describe required V2 runtime path: ${requiredPath}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return errors;
|
|
36
|
+
}
|
|
37
|
+
export async function doctor(root) {
|
|
38
|
+
const actions = [];
|
|
39
|
+
const manifest = await readManifest(root);
|
|
40
|
+
if (!manifest) {
|
|
41
|
+
actions.push({ path: MANIFEST_PATH, status: "error", message: "No installation manifest found." });
|
|
42
|
+
return actions;
|
|
43
|
+
}
|
|
44
|
+
const renderingErrors = await validateRender(manifest.adapters);
|
|
45
|
+
for (const message of renderingErrors) {
|
|
46
|
+
actions.push({ path: "templates", status: "error", message });
|
|
47
|
+
}
|
|
48
|
+
if (await exists(path.join(root, ".agent"))) {
|
|
49
|
+
actions.push({
|
|
50
|
+
path: ".agent",
|
|
51
|
+
status: "warning",
|
|
52
|
+
message: "Legacy .agent directory found; installed adapters use .agents.",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
for (const entry of manifest.files) {
|
|
56
|
+
const absolute = path.join(root, entry.path);
|
|
57
|
+
if (!(await exists(absolute))) {
|
|
58
|
+
actions.push({ path: entry.path, status: "error", message: "Managed file is missing." });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const current = await readFile(absolute, "utf8");
|
|
62
|
+
const tracked = entry.kind === "block" && entry.blockId
|
|
63
|
+
? readManagedBlock(current, entry.blockId)
|
|
64
|
+
: current;
|
|
65
|
+
if (tracked === undefined) {
|
|
66
|
+
actions.push({ path: entry.path, status: "error", message: "Managed block is missing." });
|
|
67
|
+
}
|
|
68
|
+
else if (hashContent(tracked.trimEnd()) !== entry.hash) {
|
|
69
|
+
actions.push({ path: entry.path, status: "warning", message: "Managed content was edited locally." });
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
actions.push({ path: entry.path, status: "unchanged" });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return actions;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "engineering-intelligence",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Install graph-backed engineering intelligence skills, agents, and workflows for AI coding IDEs.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"engineering-intelligence": "./dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"templates",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc -p tsconfig.json",
|
|
17
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
18
|
+
"test": "npm run build && node --test test/*.test.mjs",
|
|
19
|
+
"prepack": "npm run clean && npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"agent-skills",
|
|
23
|
+
"ai-ide",
|
|
24
|
+
"codex",
|
|
25
|
+
"claude-code",
|
|
26
|
+
"cursor",
|
|
27
|
+
"copilot",
|
|
28
|
+
"gemini",
|
|
29
|
+
"antigravity"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20.11"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.15.0",
|
|
37
|
+
"typescript": "^5.8.3"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: change-agent
|
|
3
|
+
description: Implements scoped engineering changes after impact analysis and provides evidence for validation and synchronization.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Change Agent
|
|
7
|
+
|
|
8
|
+
Read relevant intelligence and graph artifacts, consume the persisted impact report, edit only the necessary code, and add appropriate tests. Return concrete changed areas and validation evidence for quality, graph synchronization, and knowledge responsibilities.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: engineering-orchestrator
|
|
3
|
+
description: Coordinates initialized engineering work by routing analysis, change, quality, and knowledge responsibilities.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Engineering Orchestrator
|
|
7
|
+
|
|
8
|
+
Read available project intelligence and graph artifacts first. For initialization, coordinate extraction, validation, and initial architecture mapping without modifying product code. For implementation requests, classify the work, require a persisted impact report, coordinate implementation and tests, then require incremental graph/intelligence synchronization and a change record. Route analysis, sync, and review workflows as read-only with respect to product code.
|
|
9
|
+
|
|
10
|
+
Use these specialized capabilities when available: `initialize-engineering-intelligence`, `engineering-intelligence`, `graph-engine`, `change-detection-engine`, `impact-analysis-engine`, `testing-intelligence-engine`, `incremental-sync-engine`, `knowledge-sync-engine`, `memory-sync-engine`, `context-sync-engine`, `engineering-change-review`, and `change-history-engine`.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: knowledge-agent
|
|
3
|
+
description: Maintains evidence-based knowledge, durable memory, navigation context, event guidance, and change history.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Knowledge Agent
|
|
7
|
+
|
|
8
|
+
Maintain `knowledge-base/`, `.engineering-intelligence/memory/`, `.engineering-intelligence/context/`, `.engineering-intelligence/events/`, `.engineering-intelligence/graph/`, `.engineering-intelligence/reports/`, and `.changes/`. Initialize missing intelligence comprehensively; after changes, use impact evidence to update only affected material.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quality-agent
|
|
3
|
+
description: Validates engineering changes, regression risk, architecture effects, and documentation accuracy.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Quality Agent
|
|
7
|
+
|
|
8
|
+
Review the implementation against the request and persisted impact assessment. Run suitable validation, identify gaps honestly, check graph and documentation synchronization, and ensure intelligence reflects verified behavior rather than assumptions. Do not silently apply fixes during a review-only workflow.
|