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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/adapters/index.d.ts +4 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +125 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +176 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/installer/blocks.d.ts +5 -0
  12. package/dist/installer/blocks.d.ts.map +1 -0
  13. package/dist/installer/blocks.js +27 -0
  14. package/dist/installer/blocks.js.map +1 -0
  15. package/dist/installer/index.d.ts +10 -0
  16. package/dist/installer/index.d.ts.map +1 -0
  17. package/dist/installer/index.js +206 -0
  18. package/dist/installer/index.js.map +1 -0
  19. package/dist/manifest/index.d.ts +7 -0
  20. package/dist/manifest/index.d.ts.map +1 -0
  21. package/dist/manifest/index.js +25 -0
  22. package/dist/manifest/index.js.map +1 -0
  23. package/dist/templates.d.ts +6 -0
  24. package/dist/templates.d.ts.map +1 -0
  25. package/dist/templates.js +103 -0
  26. package/dist/templates.js.map +1 -0
  27. package/dist/types.d.ts +38 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +10 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/validation/index.d.ts +4 -0
  32. package/dist/validation/index.d.ts.map +1 -0
  33. package/dist/validation/index.js +77 -0
  34. package/dist/validation/index.js.map +1 -0
  35. package/package.json +39 -0
  36. package/templates/canonical/agents/change-agent.md +8 -0
  37. package/templates/canonical/agents/engineering-orchestrator.md +10 -0
  38. package/templates/canonical/agents/knowledge-agent.md +8 -0
  39. package/templates/canonical/agents/quality-agent.md +8 -0
  40. package/templates/canonical/rules/engineering-intelligence.md +22 -0
  41. package/templates/canonical/skills/architecture-review-engine/SKILL.md +10 -0
  42. package/templates/canonical/skills/change-detection-engine/SKILL.md +17 -0
  43. package/templates/canonical/skills/change-history-engine/SKILL.md +13 -0
  44. package/templates/canonical/skills/context-sync-engine/SKILL.md +19 -0
  45. package/templates/canonical/skills/deep-project-knowledge-extractor/SKILL.md +16 -0
  46. package/templates/canonical/skills/engineering-change-review/SKILL.md +18 -0
  47. package/templates/canonical/skills/engineering-intelligence/SKILL.md +21 -0
  48. package/templates/canonical/skills/graph-engine/SKILL.md +58 -0
  49. package/templates/canonical/skills/impact-analysis-engine/SKILL.md +20 -0
  50. package/templates/canonical/skills/incremental-sync-engine/SKILL.md +21 -0
  51. package/templates/canonical/skills/initialize-engineering-intelligence/SKILL.md +32 -0
  52. package/templates/canonical/skills/knowledge-base-validator/SKILL.md +17 -0
  53. package/templates/canonical/skills/knowledge-sync-engine/SKILL.md +17 -0
  54. package/templates/canonical/skills/memory-sync-engine/SKILL.md +18 -0
  55. package/templates/canonical/skills/refactoring-planner/SKILL.md +10 -0
  56. package/templates/canonical/skills/testing-intelligence-engine/SKILL.md +10 -0
  57. package/templates/canonical/workflows/analyze-impact.md +13 -0
  58. package/templates/canonical/workflows/engineering-intelligence.md +11 -0
  59. package/templates/canonical/workflows/initialize-engineering-intelligence.md +11 -0
  60. package/templates/canonical/workflows/map-architecture.md +17 -0
  61. package/templates/canonical/workflows/review-engineering-change.md +11 -0
  62. package/templates/canonical/workflows/sync-engineering-intelligence.md +11 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Engineering Intelligence OS contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # Engineering Intelligence OS
2
+
3
+ `engineering-intelligence` installs a reusable, graph-backed engineering-orchestration toolkit into a software repository for AI coding IDEs. The installed skills and workflows teach the IDE agent how to initialize an evidence-based project knowledge base, map architecture, analyze change impact, and keep intelligence synchronized while implementing engineering work.
4
+
5
+ The installer does **not** inspect the target source code, call an AI model, or generate documentation itself. That work occurs later inside the selected IDE when a developer invokes the installed workflow.
6
+
7
+ ## Supported IDEs
8
+
9
+ | IDE adapter | Installed integration | Invocation |
10
+ | --- | --- | --- |
11
+ | Antigravity | `.agents/skills`, `.agents/rules`, `.agents/workflows` | Native slash workflows |
12
+ | Codex | `.agents/skills`, managed `AGENTS.md` guidance | Mention the installed `$skill-name` in chat |
13
+ | Claude Code | `.claude/skills`, `.claude/agents`, `.claude/commands`, managed `CLAUDE.md` | Native slash workflows |
14
+ | Cursor | `.cursor/rules`, `.cursor/commands` | Native slash workflows |
15
+ | GitHub Copilot | `.github/skills`, `.github/agents`, `.github/prompts`, managed instructions | Use supported skills/prompts or ask for the workflow in chat |
16
+ | Gemini CLI | `.agents/skills`, `.gemini/commands`, managed `GEMINI.md` | Native slash workflows |
17
+ | Generic | `.agents/skills`, managed `AGENTS.md` | Ask the agent to invoke the named workflow |
18
+
19
+ ## Install
20
+
21
+ From the repository that should receive the toolkit:
22
+
23
+ ```bash
24
+ npx engineering-intelligence
25
+ ```
26
+
27
+ For repeatable or multi-IDE setup:
28
+
29
+ ```bash
30
+ npx engineering-intelligence install . --ide antigravity --ide codex --ide cursor --yes
31
+ npx engineering-intelligence install ./my-project --ide claude-code,gemini-cli --dry-run
32
+ ```
33
+
34
+ With no `--ide` in an interactive terminal, the CLI prompts for one or more adapters. In noninteractive use, `--yes` without an adapter installs the `generic` adapter.
35
+
36
+ ## Use In A Target Repository
37
+
38
+ Initialize project understanding through the selected AI IDE:
39
+
40
+ ```text
41
+ /initialize-engineering-intelligence
42
+ ```
43
+
44
+ Then use the engineering workflow for implementation requests:
45
+
46
+ ```text
47
+ /engineering-intelligence Add rate limiting to public authentication endpoints
48
+ ```
49
+
50
+ V2 adds four read-only-with-respect-to-product-code workflows:
51
+
52
+ ```text
53
+ /map-architecture
54
+ /analyze-impact Introduce a checkout service boundary
55
+ /sync-engineering-intelligence Review the current working-tree diff
56
+ /review-engineering-change Review the current working-tree diff
57
+ ```
58
+
59
+ `/map-architecture` writes graph intelligence, `/analyze-impact` writes impact reports, `/sync-engineering-intelligence` updates intelligence artifacts, and `/review-engineering-change` writes findings. Only `/engineering-intelligence` is intended to implement product-code changes.
60
+
61
+ Where a host does not expose native custom slash commands, mention the installed skill name or request the same workflow in chat.
62
+
63
+ The IDE agent, not this installer, creates and maintains:
64
+
65
+ ```text
66
+ knowledge-base/
67
+ .engineering-intelligence/memory/
68
+ .engineering-intelligence/context/
69
+ .engineering-intelligence/events/
70
+ .engineering-intelligence/graph/
71
+ .engineering-intelligence/reports/
72
+ .changes/
73
+ ```
74
+
75
+ Graph intelligence includes `dependency-graph.json`, `service-graph.json`, `runtime-graph.json`, `business-flow-graph.json`, and a Mermaid-backed `architecture-map.md`. Impact and review results are stored as `IMP-XXX-*.md` and `REV-XXX-*.md` reports.
76
+
77
+ The installer reserves only `.engineering-intelligence/install-manifest.json` for safe lifecycle management.
78
+
79
+ ## Lifecycle Commands
80
+
81
+ ```bash
82
+ npx engineering-intelligence update . --dry-run
83
+ npx engineering-intelligence update .
84
+ npx engineering-intelligence doctor .
85
+ npx engineering-intelligence doctor . --json
86
+ npx engineering-intelligence uninstall . --dry-run
87
+ npx engineering-intelligence uninstall .
88
+ ```
89
+
90
+ Installation and update track managed content hashes. Files created by the package are updated only when they still match their installed version. Shared instruction documents such as `AGENTS.md`, `CLAUDE.md`, and `GEMINI.md` receive a marked managed block; content outside that block remains user-owned. Locally modified managed content is reported as a conflict and preserved unless `--force` is explicitly provided.
91
+
92
+ `doctor` validates installed files, manifest drift, template paths, and obsolete legacy `.agent` folders.
93
+
94
+ Repositories installed with V1 can adopt V2 safely:
95
+
96
+ ```bash
97
+ npx engineering-intelligence update .
98
+ ```
99
+
100
+ The update adds graph/impact skills and workflows and updates untouched managed instruction blocks; locally edited managed files remain protected by conflict reporting.
101
+
102
+ ## Toolkit Contents
103
+
104
+ The default package installs only engineering-intelligence capabilities:
105
+
106
+ - initialization, knowledge extraction, and validation
107
+ - impact and testing intelligence
108
+ - evidence-backed JSON architecture graphs and Mermaid architecture mapping
109
+ - standalone impact, synchronization, and read-only engineering review workflows
110
+ - incremental knowledge, memory, and context synchronization
111
+ - change history, architecture review, and refactoring planning
112
+ - engineering orchestrator, change, quality, and knowledge roles
113
+
114
+ Earlier experimental trading, PDF, and unrelated workflow assets in this development repository are not exported in the package and are never installed into a target project.
115
+
116
+ ## Development
117
+
118
+ ```bash
119
+ npm install
120
+ npm test
121
+ npm pack
122
+ ```
123
+
124
+ The source repository is organized as:
125
+
126
+ ```text
127
+ src/adapters/ native IDE renderers
128
+ src/installer/ install, update, conflict, and uninstall behavior
129
+ src/manifest/ managed-content tracking
130
+ src/validation/ doctor and content checks
131
+ templates/canonical/ host-neutral engineering toolkit source
132
+ test/ adapter and installer lifecycle tests
133
+ ```
134
+
135
+ To add an IDE adapter:
136
+
137
+ 1. Add a renderer in `src/adapters/index.ts` using documented native locations and formats.
138
+ 2. Reuse canonical skills and workflow meaning rather than duplicating host-specific logic.
139
+ 3. Extend adapter and lifecycle tests to cover generated paths, multi-adapter compatibility, and update/uninstall behavior.
140
+ 4. Document the host’s actual invocation support in the supported IDE table.
141
+
142
+ To improve workflow behavior, edit canonical templates under `templates/canonical/` and keep generated runtime paths host-neutral.
@@ -0,0 +1,4 @@
1
+ import { type IdeId, type RenderedFile } from "../types.js";
2
+ export declare function isIdeId(input: string): input is IdeId;
3
+ export declare function renderAdapters(ides: IdeId[]): Promise<RenderedFile[]>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AA0JrE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,CAErD;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAI3E"}
@@ -0,0 +1,125 @@
1
+ import { AGENT_NAMES, SKILL_NAMES, WORKFLOW_NAMES, readTemplate } from "../templates.js";
2
+ import { IDE_IDS } from "../types.js";
3
+ const BLOCK_ID = "engineering-intelligence";
4
+ const sharedInstructions = `# Engineering Intelligence OS
5
+
6
+ This repository uses installed engineering intelligence workflows.
7
+
8
+ - For initial understanding and documentation, invoke \`initialize-engineering-intelligence\` or ask the agent to initialize engineering intelligence.
9
+ - For implementation work, invoke \`engineering-intelligence\` with the request or ask the agent to apply the engineering intelligence workflow.
10
+ - For architecture mapping, impact analysis, synchronization, or review, invoke \`map-architecture\`, \`analyze-impact\`, \`sync-engineering-intelligence\`, or \`review-engineering-change\`; these workflows do not modify product code.
11
+ - Canonical generated outputs live in \`knowledge-base/\`, \`.engineering-intelligence/memory/\`, \`.engineering-intelligence/context/\`, \`.engineering-intelligence/events/\`, \`.engineering-intelligence/graph/\`, \`.engineering-intelligence/reports/\`, and \`.changes/\`.
12
+ - Before non-trivial edits, write an impact report; after edits, validate and incrementally synchronize only affected intelligence and graph artifacts.
13
+ - Base documentation claims on repository evidence and identify unknowns explicitly.
14
+ `;
15
+ function file(path, content, owner) {
16
+ return { path, content, kind: "file", owners: [owner] };
17
+ }
18
+ function block(path, content, owner) {
19
+ return { path, content, kind: "block", blockId: BLOCK_ID, owners: [owner] };
20
+ }
21
+ async function skillsAt(directory, owner) {
22
+ return Promise.all(SKILL_NAMES.map(async (name) => file(`${directory}/${name}/SKILL.md`, await readTemplate("skills", name), owner)));
23
+ }
24
+ async function workflowsAt(directory, owner) {
25
+ return Promise.all(WORKFLOW_NAMES.map(async (name) => file(`${directory}/${name}.md`, await readTemplate("workflows", name), owner)));
26
+ }
27
+ async function agentsAt(directory, owner) {
28
+ return Promise.all(AGENT_NAMES.map(async (name) => file(`${directory}/${name}.md`, await readTemplate("agents", name), owner)));
29
+ }
30
+ async function renderAdapter(ide) {
31
+ switch (ide) {
32
+ case "antigravity":
33
+ return [
34
+ ...(await skillsAt(".agents/skills", ide)),
35
+ ...(await workflowsAt(".agents/workflows", ide)),
36
+ file(".agents/rules/engineering-intelligence.md", await readTemplate("rules", "engineering-intelligence"), ide),
37
+ ];
38
+ case "codex":
39
+ return [...(await skillsAt(".agents/skills", ide)), block("AGENTS.md", sharedInstructions, ide)];
40
+ case "generic":
41
+ return [...(await skillsAt(".agents/skills", ide)), block("AGENTS.md", sharedInstructions, ide)];
42
+ case "claude-code":
43
+ return [
44
+ ...(await skillsAt(".claude/skills", ide)),
45
+ ...(await agentsAt(".claude/agents", ide)),
46
+ ...(await workflowsAt(".claude/commands", ide)),
47
+ block("CLAUDE.md", sharedInstructions, ide),
48
+ ];
49
+ case "cursor": {
50
+ const rule = `---\ndescription: Engineering Intelligence orchestration and synchronization rules\nalwaysApply: true\n---\n\n${await readTemplate("rules", "engineering-intelligence")}`;
51
+ return [
52
+ file(".cursor/rules/engineering-intelligence.mdc", rule, ide),
53
+ ...(await workflowsAt(".cursor/commands", ide)),
54
+ ];
55
+ }
56
+ case "github-copilot": {
57
+ const agentFiles = await agentsAt(".github/agents", ide);
58
+ const promptFiles = await Promise.all(WORKFLOW_NAMES.map(async (name) => file(`.github/prompts/${name}.prompt.md`, await readTemplate("workflows", name), ide)));
59
+ return [
60
+ ...(await skillsAt(".github/skills", ide)),
61
+ ...agentFiles,
62
+ ...promptFiles,
63
+ block(".github/copilot-instructions.md", sharedInstructions, ide),
64
+ ];
65
+ }
66
+ case "gemini-cli": {
67
+ const workflowDescriptions = {
68
+ "initialize-engineering-intelligence": "Initialize engineering intelligence for this project.",
69
+ "engineering-intelligence": "Implement a request using engineering intelligence.",
70
+ "map-architecture": "Build or refresh evidence-backed architecture graph intelligence.",
71
+ "analyze-impact": "Analyze an intended change or existing diff without modifying product code.",
72
+ "sync-engineering-intelligence": "Synchronize affected project intelligence without modifying product code.",
73
+ "review-engineering-change": "Review an engineering change without applying fixes.",
74
+ };
75
+ const inputWorkflows = new Set([
76
+ "engineering-intelligence",
77
+ "analyze-impact",
78
+ "sync-engineering-intelligence",
79
+ "review-engineering-change",
80
+ ]);
81
+ const commands = await Promise.all(WORKFLOW_NAMES.map(async (name) => {
82
+ const workflow = await readTemplate("workflows", name);
83
+ const prompt = inputWorkflows.has(name)
84
+ ? `${workflow}\n\nUser supplied scope or request: {{args}}`
85
+ : workflow;
86
+ return file(`.gemini/commands/${name}.toml`, toGeminiCommand(workflowDescriptions[name], prompt), ide);
87
+ }));
88
+ return [
89
+ ...(await skillsAt(".agents/skills", ide)),
90
+ ...commands,
91
+ block("GEMINI.md", sharedInstructions, ide),
92
+ ];
93
+ }
94
+ }
95
+ }
96
+ function toGeminiCommand(description, prompt) {
97
+ const escaped = prompt.replaceAll('"""', '\\"\\"\\"');
98
+ return `description = ${JSON.stringify(description)}\nprompt = """\n${escaped}\n"""\n`;
99
+ }
100
+ function mergeRenderedFiles(files) {
101
+ const merged = new Map();
102
+ for (const candidate of files) {
103
+ const existing = merged.get(candidate.path);
104
+ if (!existing) {
105
+ merged.set(candidate.path, candidate);
106
+ continue;
107
+ }
108
+ if (existing.kind !== candidate.kind ||
109
+ existing.content !== candidate.content ||
110
+ existing.blockId !== candidate.blockId) {
111
+ throw new Error(`Adapters produce incompatible managed content for ${candidate.path}`);
112
+ }
113
+ existing.owners = [...new Set([...existing.owners, ...candidate.owners])];
114
+ }
115
+ return [...merged.values()].sort((left, right) => left.path.localeCompare(right.path));
116
+ }
117
+ export function isIdeId(input) {
118
+ return IDE_IDS.includes(input);
119
+ }
120
+ export async function renderAdapters(ides) {
121
+ const unique = [...new Set(ides)];
122
+ const outputs = await Promise.all(unique.map(renderAdapter));
123
+ return mergeRenderedFiles(outputs.flat());
124
+ }
125
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { stdin as input, stdout as output } from "node:process";
6
+ import { fileURLToPath } from "node:url";
7
+ import { isIdeId } from "../adapters/index.js";
8
+ import { install, uninstall, update } from "../installer/index.js";
9
+ import { doctor } from "../validation/index.js";
10
+ import { IDE_IDS } from "../types.js";
11
+ async function packageVersion() {
12
+ const packageJson = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../package.json");
13
+ const parsed = JSON.parse(await readFile(packageJson, "utf8"));
14
+ return parsed.version;
15
+ }
16
+ function usage() {
17
+ return `engineering-intelligence
18
+
19
+ Install engineering intelligence orchestration assets for AI coding IDEs.
20
+
21
+ Usage:
22
+ engineering-intelligence [install] [path] [--ide <id>...] [--yes] [--dry-run] [--force]
23
+ engineering-intelligence update [path] [--dry-run] [--force]
24
+ engineering-intelligence doctor [path] [--json]
25
+ engineering-intelligence uninstall [path] [--dry-run] [--force]
26
+
27
+ IDE ids: ${IDE_IDS.join(", ")}
28
+ `;
29
+ }
30
+ function parseArgs(args) {
31
+ let command = "install";
32
+ const remaining = [...args];
33
+ if (remaining[0] && ["install", "update", "doctor", "uninstall"].includes(remaining[0])) {
34
+ command = remaining.shift();
35
+ }
36
+ if (remaining.includes("--help") || remaining.includes("-h")) {
37
+ output.write(usage());
38
+ process.exit(0);
39
+ }
40
+ const ides = [];
41
+ let target;
42
+ let yes = false;
43
+ let dryRun = false;
44
+ let force = false;
45
+ let json = false;
46
+ for (let index = 0; index < remaining.length; index += 1) {
47
+ const arg = remaining[index];
48
+ if (arg === "--ide") {
49
+ const value = remaining[++index];
50
+ if (!value) {
51
+ throw new Error("--ide requires a value.");
52
+ }
53
+ for (const ide of value.split(",")) {
54
+ if (!isIdeId(ide)) {
55
+ throw new Error(`Unknown IDE "${ide}". Supported: ${IDE_IDS.join(", ")}.`);
56
+ }
57
+ ides.push(ide);
58
+ }
59
+ }
60
+ else if (arg.startsWith("--ide=")) {
61
+ const value = arg.slice("--ide=".length);
62
+ for (const ide of value.split(",")) {
63
+ if (!isIdeId(ide)) {
64
+ throw new Error(`Unknown IDE "${ide}". Supported: ${IDE_IDS.join(", ")}.`);
65
+ }
66
+ ides.push(ide);
67
+ }
68
+ }
69
+ else if (arg === "--yes" || arg === "-y") {
70
+ yes = true;
71
+ }
72
+ else if (arg === "--dry-run") {
73
+ dryRun = true;
74
+ }
75
+ else if (arg === "--force") {
76
+ force = true;
77
+ }
78
+ else if (arg === "--json") {
79
+ json = true;
80
+ }
81
+ else if (arg.startsWith("-")) {
82
+ throw new Error(`Unknown option "${arg}".`);
83
+ }
84
+ else if (!target) {
85
+ target = arg;
86
+ }
87
+ else {
88
+ throw new Error(`Unexpected argument "${arg}".`);
89
+ }
90
+ }
91
+ return {
92
+ command,
93
+ root: path.resolve(target ?? process.cwd()),
94
+ ides: [...new Set(ides)],
95
+ yes,
96
+ dryRun,
97
+ force,
98
+ json,
99
+ };
100
+ }
101
+ async function selectIdes(options) {
102
+ if (options.command !== "install" || options.ides.length > 0) {
103
+ return options.ides;
104
+ }
105
+ if (options.yes || !input.isTTY) {
106
+ return ["generic"];
107
+ }
108
+ const readline = createInterface({ input, output });
109
+ output.write(`Select one or more IDE adapters:\n${IDE_IDS.map((ide, i) => ` ${i + 1}. ${ide}`).join("\n")}\n`);
110
+ const answer = await readline.question("Adapter numbers or ids, comma separated [generic]: ");
111
+ readline.close();
112
+ const choices = answer.trim().length === 0 ? ["generic"] : answer.split(",").map((part) => part.trim());
113
+ return [...new Set(choices.map((choice) => {
114
+ const numbered = Number.parseInt(choice, 10);
115
+ const candidate = Number.isNaN(numbered) ? choice : IDE_IDS[numbered - 1];
116
+ if (!candidate || !isIdeId(candidate)) {
117
+ throw new Error(`Unknown IDE selection "${choice}".`);
118
+ }
119
+ return candidate;
120
+ }))];
121
+ }
122
+ function printActions(actions) {
123
+ for (const action of actions) {
124
+ const detail = action.message ? ` - ${action.message}` : "";
125
+ output.write(`${action.status.padEnd(9)} ${action.path}${detail}\n`);
126
+ }
127
+ }
128
+ function printResult(label, result, dryRun) {
129
+ printActions(result.actions);
130
+ const prefix = dryRun ? "Dry run:" : `${label}:`;
131
+ output.write(`${prefix} ${result.changed} changed, ${result.conflicts} conflict(s).\n`);
132
+ }
133
+ async function main() {
134
+ const options = parseArgs(process.argv.slice(2));
135
+ const version = await packageVersion();
136
+ if (options.command === "doctor") {
137
+ const actions = await doctor(options.root);
138
+ if (options.json) {
139
+ output.write(`${JSON.stringify(actions, null, 2)}\n`);
140
+ }
141
+ else {
142
+ printActions(actions);
143
+ }
144
+ process.exitCode = actions.some((action) => action.status === "error") ? 1 : 0;
145
+ return;
146
+ }
147
+ if (options.command === "uninstall") {
148
+ const result = await uninstall(options.root, { dryRun: options.dryRun, force: options.force, packageVersion: version });
149
+ printResult("Uninstall complete", result, options.dryRun);
150
+ process.exitCode = result.conflicts > 0 ? 1 : 0;
151
+ return;
152
+ }
153
+ if (options.command === "update") {
154
+ const result = await update(options.root, { dryRun: options.dryRun, force: options.force, packageVersion: version });
155
+ printResult("Update complete", result, options.dryRun);
156
+ process.exitCode = result.conflicts > 0 ? 1 : 0;
157
+ return;
158
+ }
159
+ const ides = await selectIdes(options);
160
+ const result = await install(options.root, ides, {
161
+ dryRun: options.dryRun,
162
+ force: options.force,
163
+ packageVersion: version,
164
+ });
165
+ printResult(`Installed ${ides.join(", ")}`, result, options.dryRun);
166
+ if (!options.dryRun && result.conflicts === 0) {
167
+ output.write("Open your selected AI IDE and invoke the installed initialization workflow.\n");
168
+ }
169
+ process.exitCode = result.conflicts > 0 ? 1 : 0;
170
+ }
171
+ main().catch((error) => {
172
+ const message = error instanceof Error ? error.message : String(error);
173
+ process.stderr.write(`Error: ${message}\n`);
174
+ process.exitCode = 1;
175
+ });
176
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function managedBlock(content: string, id: string): string;
2
+ export declare function readManagedBlock(source: string, id: string): string | undefined;
3
+ export declare function upsertManagedBlock(source: string, content: string, id: string): string;
4
+ export declare function removeManagedBlock(source: string, id: string): string;
5
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/installer/blocks.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK/E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAUtF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAMrE"}
@@ -0,0 +1,27 @@
1
+ const START = (id) => `<!-- ${id}:start -->`;
2
+ const END = (id) => `<!-- ${id}:end -->`;
3
+ function escapeRegExp(value) {
4
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5
+ }
6
+ export function managedBlock(content, id) {
7
+ return `${START(id)}\n${content.trimEnd()}\n${END(id)}`;
8
+ }
9
+ export function readManagedBlock(source, id) {
10
+ const expression = new RegExp(`${escapeRegExp(START(id))}\\n([\\s\\S]*?)\\n${escapeRegExp(END(id))}`);
11
+ return expression.exec(source)?.[1];
12
+ }
13
+ export function upsertManagedBlock(source, content, id) {
14
+ const replacement = managedBlock(content, id);
15
+ const expression = new RegExp(`${escapeRegExp(START(id))}\\n[\\s\\S]*?\\n${escapeRegExp(END(id))}`);
16
+ if (expression.test(source)) {
17
+ return source.replace(expression, replacement);
18
+ }
19
+ const prefix = source.length === 0 ? "" : `${source.trimEnd()}\n\n`;
20
+ return `${prefix}${replacement}\n`;
21
+ }
22
+ export function removeManagedBlock(source, id) {
23
+ const expression = new RegExp(`\\n?${escapeRegExp(START(id))}\\n[\\s\\S]*?\\n${escapeRegExp(END(id))}\\n?`);
24
+ const remaining = source.replace(expression, "\n").trimEnd();
25
+ return remaining.length > 0 ? `${remaining}\n` : "";
26
+ }
27
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/installer/blocks.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;AAC7D,MAAM,GAAG,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;AAEzD,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,EAAU;IACtD,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,EAAU;IACzD,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,qBAAqB,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CACvE,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,OAAe,EAAE,EAAU;IAC5E,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,mBAAmB,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CACrE,CAAC;IACF,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;IACpE,OAAO,GAAG,MAAM,GAAG,WAAW,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,EAAU;IAC3D,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,mBAAmB,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAC7E,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { IdeId, OperationResult } from "../types.js";
2
+ export interface MutationOptions {
3
+ dryRun?: boolean;
4
+ force?: boolean;
5
+ packageVersion: string;
6
+ }
7
+ export declare function install(root: string, requestedAdapters: IdeId[], options: MutationOptions): Promise<OperationResult>;
8
+ export declare function update(root: string, options: MutationOptions): Promise<OperationResult>;
9
+ export declare function uninstall(root: string, options: MutationOptions): Promise<OperationResult>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,KAAK,EAGL,eAAe,EAEhB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAgID,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,KAAK,EAAE,EAC1B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAqD1B;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAM7F;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAyBhG"}