@arcbridge/adapters 0.4.2 → 0.6.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/dist/index.js +40 -21
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
// src/claude/claude-adapter.ts
|
|
2
2
|
import { mkdirSync, writeFileSync, existsSync, readFileSync } from "fs";
|
|
3
3
|
import { join } from "path";
|
|
4
|
+
|
|
5
|
+
// src/shared/mcp-command.ts
|
|
6
|
+
import { platform } from "os";
|
|
7
|
+
function mcpCommand() {
|
|
8
|
+
if (platform() === "win32") {
|
|
9
|
+
return {
|
|
10
|
+
command: "cmd",
|
|
11
|
+
args: ["/c", "npx", "-y", "@arcbridge/mcp-server"]
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
command: "npx",
|
|
16
|
+
args: ["-y", "@arcbridge/mcp-server"]
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function mcpCommandArray() {
|
|
20
|
+
if (platform() === "win32") {
|
|
21
|
+
return ["cmd", "/c", "npx", "-y", "@arcbridge/mcp-server"];
|
|
22
|
+
}
|
|
23
|
+
return ["npx", "-y", "@arcbridge/mcp-server"];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// src/claude/claude-adapter.ts
|
|
4
27
|
function generateClaudeMd(config) {
|
|
5
28
|
const lines = [
|
|
6
29
|
`# ${config.project_name}`,
|
|
@@ -160,10 +183,7 @@ ${arcbridgeContent}`, "utf-8");
|
|
|
160
183
|
if (!existsSync(mcpJsonPath)) {
|
|
161
184
|
const mcpConfig = {
|
|
162
185
|
mcpServers: {
|
|
163
|
-
arcbridge:
|
|
164
|
-
command: "npx",
|
|
165
|
-
args: ["@arcbridge/mcp-server"]
|
|
166
|
-
}
|
|
186
|
+
arcbridge: mcpCommand()
|
|
167
187
|
}
|
|
168
188
|
};
|
|
169
189
|
writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2) + "\n", "utf-8");
|
|
@@ -172,10 +192,7 @@ ${arcbridgeContent}`, "utf-8");
|
|
|
172
192
|
const existing = JSON.parse(readFileSync(mcpJsonPath, "utf-8"));
|
|
173
193
|
if (!existing.mcpServers?.arcbridge) {
|
|
174
194
|
existing.mcpServers = existing.mcpServers ?? {};
|
|
175
|
-
existing.mcpServers.arcbridge =
|
|
176
|
-
command: "npx",
|
|
177
|
-
args: ["@arcbridge/mcp-server"]
|
|
178
|
-
};
|
|
195
|
+
existing.mcpServers.arcbridge = mcpCommand();
|
|
179
196
|
writeFileSync(mcpJsonPath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
180
197
|
}
|
|
181
198
|
} catch {
|
|
@@ -459,11 +476,19 @@ function generateAgentsMd(config) {
|
|
|
459
476
|
"",
|
|
460
477
|
"Add this to your `~/.codex/config.toml` (one-time setup):",
|
|
461
478
|
"",
|
|
479
|
+
"**macOS / Linux:**",
|
|
462
480
|
"```toml",
|
|
463
481
|
"[mcp_servers.arcbridge]",
|
|
464
482
|
'command = "npx"',
|
|
465
483
|
'args = ["-y", "@arcbridge/mcp-server"]',
|
|
466
484
|
"```",
|
|
485
|
+
"",
|
|
486
|
+
"**Windows:**",
|
|
487
|
+
"```toml",
|
|
488
|
+
"[mcp_servers.arcbridge]",
|
|
489
|
+
'command = "cmd"',
|
|
490
|
+
'args = ["/c", "npx", "-y", "@arcbridge/mcp-server"]',
|
|
491
|
+
"```",
|
|
467
492
|
""
|
|
468
493
|
],
|
|
469
494
|
suffix: [
|
|
@@ -516,10 +541,7 @@ import { join as join5 } from "path";
|
|
|
516
541
|
function generateSettingsJson() {
|
|
517
542
|
const settings = {
|
|
518
543
|
mcpServers: {
|
|
519
|
-
arcbridge:
|
|
520
|
-
command: "npx",
|
|
521
|
-
args: ["-y", "@arcbridge/mcp-server"]
|
|
522
|
-
}
|
|
544
|
+
arcbridge: mcpCommand()
|
|
523
545
|
}
|
|
524
546
|
};
|
|
525
547
|
return JSON.stringify(settings, null, 2) + "\n";
|
|
@@ -571,10 +593,7 @@ var GeminiAdapter = class {
|
|
|
571
593
|
const existing = JSON.parse(readFileSync4(settingsPath, "utf-8"));
|
|
572
594
|
if (!existing.mcpServers?.arcbridge) {
|
|
573
595
|
existing.mcpServers = existing.mcpServers ?? {};
|
|
574
|
-
existing.mcpServers.arcbridge =
|
|
575
|
-
command: "npx",
|
|
576
|
-
args: ["-y", "@arcbridge/mcp-server"]
|
|
577
|
-
};
|
|
596
|
+
existing.mcpServers.arcbridge = mcpCommand();
|
|
578
597
|
writeFileSync6(settingsPath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
579
598
|
}
|
|
580
599
|
} catch {
|
|
@@ -605,7 +624,7 @@ function generateOpenCodeJson() {
|
|
|
605
624
|
mcp: {
|
|
606
625
|
arcbridge: {
|
|
607
626
|
type: "local",
|
|
608
|
-
command:
|
|
627
|
+
command: mcpCommandArray()
|
|
609
628
|
}
|
|
610
629
|
}
|
|
611
630
|
};
|
|
@@ -659,7 +678,7 @@ var OpenCodeAdapter = class {
|
|
|
659
678
|
if (!mcpObj.arcbridge) {
|
|
660
679
|
mcpObj.arcbridge = {
|
|
661
680
|
type: "local",
|
|
662
|
-
command:
|
|
681
|
+
command: mcpCommandArray()
|
|
663
682
|
};
|
|
664
683
|
existing.mcp = mcpObj;
|
|
665
684
|
changed = true;
|
|
@@ -693,11 +712,11 @@ var adapters = {
|
|
|
693
712
|
gemini: () => new GeminiAdapter(),
|
|
694
713
|
opencode: () => new OpenCodeAdapter()
|
|
695
714
|
};
|
|
696
|
-
function getAdapter(
|
|
697
|
-
const factory = adapters[
|
|
715
|
+
function getAdapter(platform2) {
|
|
716
|
+
const factory = adapters[platform2];
|
|
698
717
|
if (!factory) {
|
|
699
718
|
throw new Error(
|
|
700
|
-
`Unknown platform: ${
|
|
719
|
+
`Unknown platform: ${platform2}. Available: ${Object.keys(adapters).join(", ")}`
|
|
701
720
|
);
|
|
702
721
|
}
|
|
703
722
|
return factory();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/claude/claude-adapter.ts","../src/copilot/copilot-adapter.ts","../src/codex/codex-adapter.ts","../src/shared/skills.ts","../src/shared/marker-merge.ts","../src/shared/instructions.ts","../src/gemini/gemini-adapter.ts","../src/opencode/opencode-adapter.ts","../src/index.ts"],"sourcesContent":["import { mkdirSync, writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter } from \"../types.js\";\n\nfunction generateClaudeMd(config: ArcBridgeConfig): string {\n const lines: string[] = [\n `# ${config.project_name}`,\n \"\",\n `> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,\n \"\",\n \"## Project Overview\",\n \"\",\n `- **Type:** ${config.project_type}`,\n `- **Quality Priorities:** ${config.quality_priorities.join(\", \")}`,\n \"\",\n \"## How to Work in This Project\",\n \"\",\n \"This project follows the **Plan → Build → Sync → Review** convention using ArcBridge.\",\n \"ArcBridge provides MCP tools that give you architectural awareness. **Use them throughout your work.**\",\n \"\",\n \"### Before Starting Any Work\",\n \"\",\n \"1. Check project status: `arcbridge_get_project_status`\",\n \"2. Review current tasks: `arcbridge_get_current_tasks`\",\n \"3. Activate the appropriate role (see below): `arcbridge_activate_role`\",\n \"\",\n \"### When Planning or Refining Architecture\",\n \"\",\n \"Activate the **architect** role: `arcbridge_activate_role({ role: \\\"architect\\\" })`\",\n \"\",\n \"Then use:\",\n \"- `arcbridge_get_building_blocks` — view current architecture decomposition\",\n \"- `arcbridge_get_quality_scenarios` — view quality requirements\",\n \"- `arcbridge_get_open_questions` — find architectural gaps to resolve\",\n \"- `arcbridge_propose_arc42_update` — propose doc updates from recent code changes\",\n \"\",\n \"### When Implementing Features\",\n \"\",\n \"Activate the **implementer** role: `arcbridge_activate_role({ role: \\\"implementer\\\" })`\",\n \"\",\n \"Then use:\",\n \"- `arcbridge_get_guidance` — get context-aware guidance for the file/block you're working on\",\n \"- `arcbridge_get_current_tasks` — check what tasks are expected in the current phase\",\n \"- `arcbridge_search_symbols` / `arcbridge_get_symbol` — understand existing code\",\n \"- `arcbridge_get_dependency_graph` — check module dependencies before adding new ones\",\n \"- `arcbridge_update_task` — mark tasks as in-progress or done as you complete them\",\n \"- `arcbridge_reindex` — re-index after significant code changes\",\n \"\",\n \"### After Implementing (Phase Boundary Review)\",\n \"\",\n \"Before completing a phase, consult the review roles. Not every role is needed every phase — use this guide:\",\n \"\",\n \"| Role | When to consult | How |\",\n \"|------|----------------|-----|\",\n \"| **code-reviewer** | Every phase | `arcbridge_activate_role({ role: \\\"code-reviewer\\\" })` then `arcbridge_get_practice_review` |\",\n \"| **security-reviewer** | Phases with auth, uploads, API routes, user input | `arcbridge_activate_role({ role: \\\"security-reviewer\\\" })` then `arcbridge_run_role_check` |\",\n \"| **quality-guardian** | Every 2nd phase, or when quality scenarios are linked | `arcbridge_activate_role({ role: \\\"quality-guardian\\\" })` then `arcbridge_get_practice_review` |\",\n \"| **architect** | When drift is detected or architecture evolved significantly | `arcbridge_activate_role({ role: \\\"architect\\\" })` then `arcbridge_check_drift` |\",\n \"\",\n \"Then run the standard checks:\",\n \"\",\n \"1. **Drift check:** `arcbridge_check_drift` — catch undeclared dependencies and missing modules\",\n \"2. **Verify scenarios:** `arcbridge_verify_scenarios` — run linked tests for quality scenarios\",\n \"\",\n \"### Completing a Phase\",\n \"\",\n \"Activate the **phase-manager** role: `arcbridge_activate_role({ role: \\\"phase-manager\\\" })`\",\n \"\",\n \"Then: `arcbridge_complete_phase` — validates three gates: all tasks done, no critical drift, must-have quality scenarios not failing.\",\n \"\",\n ];\n\n // Add React/Next.js section only for relevant project types\n if (config.project_type === \"nextjs-app-router\" || config.project_type === \"react-vite\") {\n lines.push(\n \"## React & Next.js Analysis\",\n \"\",\n \"- `arcbridge_get_component_graph` — view component hierarchy, props, state, and context usage\",\n \"- `arcbridge_get_route_map` — view Next.js route tree (pages, layouts, API routes)\",\n \"- `arcbridge_get_boundary_analysis` — analyze server/client boundaries and detect violations\",\n \"\",\n );\n }\n\n lines.push(\n \"## Agent Roles\",\n \"\",\n \"Activate roles with `arcbridge_activate_role` to get specialized context and tool guidance:\",\n \"\",\n \"| Role | When to Use |\",\n \"|------|-------------|\",\n \"| `architect` | Defining building blocks, reviewing dependencies, creating ADRs |\",\n \"| `implementer` | Writing code within the established architecture |\",\n \"| `security-reviewer` | Auditing auth, input validation, client/server boundaries |\",\n \"| `quality-guardian` | Reviewing test coverage, quality scenarios, quality gates |\",\n \"| `phase-manager` | Completing phases, managing task transitions |\",\n \"| `code-reviewer` | Reviewing code for correctness, patterns, edge cases |\",\n \"| `onboarding` | Understanding the project (for new developers) |\",\n \"\",\n \"Roles are defined in `.arcbridge/agents/` and `.claude/agents/`.\",\n \"\",\n );\n\n return lines.join(\"\\n\");\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n `# ${role.name}`,\n \"\",\n role.description,\n \"\",\n \"## Tools\",\n \"\",\n ...role.required_tools.map((t) => `- ${t}`),\n \"\",\n ];\n\n if (role.denied_tools.length > 0) {\n lines.push(\"## Denied Tools\", \"\", ...role.denied_tools.map((t) => `- ${t}`), \"\");\n }\n\n if (role.read_only) {\n lines.push(\"## Access\", \"\", \"This role is **read-only**.\", \"\");\n }\n\n if (role.quality_focus.length > 0) {\n lines.push(\n \"## Quality Focus\",\n \"\",\n ...role.quality_focus.map((q) => `- ${q}`),\n \"\",\n );\n }\n\n lines.push(\"## Instructions\", \"\", role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class ClaudeAdapter implements PlatformAdapter {\n platform = \"claude\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const arcbridgeContent = generateClaudeMd(config);\n const claudeMdPath = join(targetDir, \"CLAUDE.md\");\n const marker = \"<!-- arcbridge-generated -->\";\n\n if (existsSync(claudeMdPath)) {\n const existing = readFileSync(claudeMdPath, \"utf-8\");\n\n // Detect where ArcBridge content starts: marker from current version,\n // or the generated heading from older versions (before marker was added)\n const markerIndex = existing.indexOf(marker);\n const legacyIndex = existing.indexOf(\"## ArcBridge Workflow\");\n const splitIndex = markerIndex >= 0 ? markerIndex : legacyIndex;\n\n if (splitIndex >= 0) {\n // Replace everything from the ArcBridge section onwards\n const userContent = existing.slice(0, splitIndex).trimEnd();\n writeFileSync(claudeMdPath, `${userContent}\\n\\n${marker}\\n\\n${arcbridgeContent}`, \"utf-8\");\n } else {\n // No existing ArcBridge content — append\n writeFileSync(claudeMdPath, `${existing.trimEnd()}\\n\\n${marker}\\n\\n${arcbridgeContent}`, \"utf-8\");\n }\n } else {\n writeFileSync(claudeMdPath, `${marker}\\n\\n${arcbridgeContent}`, \"utf-8\");\n }\n\n // Generate .mcp.json if it doesn't already exist\n const mcpJsonPath = join(targetDir, \".mcp.json\");\n if (!existsSync(mcpJsonPath)) {\n const mcpConfig = {\n mcpServers: {\n arcbridge: {\n command: \"npx\",\n args: [\"@arcbridge/mcp-server\"],\n },\n },\n };\n writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2) + \"\\n\", \"utf-8\");\n } else {\n // If .mcp.json exists, add arcbridge server if not already present\n try {\n const existing = JSON.parse(readFileSync(mcpJsonPath, \"utf-8\")) as {\n mcpServers?: Record<string, unknown>;\n };\n if (!existing.mcpServers?.arcbridge) {\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers.arcbridge = {\n command: \"npx\",\n args: [\"@arcbridge/mcp-server\"],\n };\n writeFileSync(mcpJsonPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch {\n // If we can't parse existing .mcp.json, leave it alone\n }\n }\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[]): void {\n const agentsDir = join(targetDir, \".claude\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n }\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter } from \"../types.js\";\n\nfunction generateCopilotInstructions(config: ArcBridgeConfig): string {\n const lines: string[] = [\n `# ${config.project_name} - Copilot Instructions`,\n \"\",\n `> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,\n \"\",\n \"## Project Context\",\n \"\",\n `This is a ${config.project_type} project.`,\n \"\",\n `**Quality Priorities:** ${config.quality_priorities.join(\", \")}`,\n \"\",\n \"## Architecture\",\n \"\",\n \"Architecture documentation is in `.arcbridge/arc42/`.\",\n \"Quality scenarios are in `.arcbridge/arc42/10-quality-scenarios.yaml`.\",\n \"Phase plan is in `.arcbridge/plan/`.\",\n \"\",\n \"## Code Intelligence\",\n \"\",\n \"Use ArcBridge MCP tools to explore the codebase:\",\n \"- `arcbridge_search_symbols` — Search for functions, classes, types\",\n \"- `arcbridge_get_symbol` — Get full details on a symbol\",\n \"- `arcbridge_get_dependency_graph` — Analyze module dependencies\",\n \"- `arcbridge_reindex` — Re-index after code changes\",\n \"\",\n \"## React & Next.js Analysis\",\n \"\",\n \"- `arcbridge_get_component_graph` — View component hierarchy, props, state, and context\",\n \"- `arcbridge_get_route_map` — View Next.js route tree (pages, layouts, API routes)\",\n \"- `arcbridge_get_boundary_analysis` — Analyze server/client boundaries\",\n \"\",\n \"## Architecture Bridge\",\n \"\",\n \"- `arcbridge_check_drift` — Detect architecture drift and boundary violations\",\n \"- `arcbridge_get_guidance` — Get context-aware guidance for code changes\",\n \"- `arcbridge_get_open_questions` — Surface architectural gaps\",\n \"- `arcbridge_propose_arc42_update` — Generate arc42 update proposals from code changes\",\n \"- `arcbridge_get_practice_review` — Review recent changes across 5 practice dimensions\",\n \"\",\n \"## Conventions\",\n \"\",\n \"- Follow existing patterns in the codebase\",\n \"- Stay within building block boundaries\",\n \"- Write tests for new functionality\",\n \"- Check quality scenarios before submitting changes\",\n \"\",\n ];\n\n return lines.join(\"\\n\");\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n `# ${role.name}`,\n \"\",\n role.description,\n \"\",\n ];\n\n if (role.read_only) {\n lines.push(\"**Access:** Read-only\", \"\");\n }\n\n if (role.quality_focus.length > 0) {\n lines.push(\n \"## Quality Focus\",\n \"\",\n ...role.quality_focus.map((q) => `- ${q}`),\n \"\",\n );\n }\n\n lines.push(\"## Instructions\", \"\", role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class CopilotAdapter implements PlatformAdapter {\n platform = \"copilot\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const githubDir = join(targetDir, \".github\");\n mkdirSync(githubDir, { recursive: true });\n\n const content = generateCopilotInstructions(config);\n writeFileSync(\n join(githubDir, \"copilot-instructions.md\"),\n content,\n \"utf-8\",\n );\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[]): void {\n const agentsDir = join(targetDir, \".github\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n }\n}\n","import { writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter, AdapterOptions } from \"../types.js\";\nimport { generateSkills } from \"../shared/skills.js\";\nimport { writeWithMarkerMerge } from \"../shared/marker-merge.js\";\nimport { generateInstructions } from \"../shared/instructions.js\";\n\nfunction generateAgentsMd(config: ArcBridgeConfig): string {\n return generateInstructions(config, {\n prefix: [\n \"## Codex MCP Setup\",\n \"\",\n \"Add this to your `~/.codex/config.toml` (one-time setup):\",\n \"\",\n \"```toml\",\n \"[mcp_servers.arcbridge]\",\n 'command = \"npx\"',\n 'args = [\"-y\", \"@arcbridge/mcp-server\"]',\n \"```\",\n \"\",\n ],\n suffix: [\n \"## Agent Roles\",\n \"\",\n \"Activate roles with `arcbridge_activate_role` to get specialized context.\",\n \"Roles are defined in `.arcbridge/agents/`.\",\n \"\",\n \"*Role table is appended below after agent configs are generated.*\",\n \"\",\n ],\n });\n}\n\nexport class CodexAdapter implements PlatformAdapter {\n platform = \"codex\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const agentsMdContent = generateAgentsMd(config);\n writeWithMarkerMerge(join(targetDir, \"AGENTS.md\"), agentsMdContent);\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[], options?: AdapterOptions): void {\n // Append dynamic role table to AGENTS.md (replaces placeholder)\n const agentsMdPath = join(targetDir, \"AGENTS.md\");\n if (existsSync(agentsMdPath)) {\n let content = readFileSync(agentsMdPath, \"utf-8\");\n const roleTable = [\n \"| Role | Description |\",\n \"|------|-------------|\",\n ...roles.map((r) => `| \\`${r.role_id}\\` | ${r.description} |`),\n \"\",\n ].join(\"\\n\");\n\n const placeholder = \"*Role table is appended below after agent configs are generated.*\";\n if (content.includes(placeholder)) {\n content = content.replace(placeholder, roleTable);\n } else {\n // Fallback: append role table at the end if placeholder was removed\n content = `${content.trimEnd()}\\n\\n## Agent Roles\\n\\n${roleTable}\\n`;\n }\n writeFileSync(agentsMdPath, content, \"utf-8\");\n }\n\n // Generate missing skills (shared with Gemini adapter — only writes if not present)\n generateSkills(targetDir, options?.force);\n }\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport const SYNC_SKILL = `---\nname: arcbridge-sync\ndescription: Run the ArcBridge sync loop — reindex code, detect architecture drift, and update task statuses. Use after significant code changes or before completing a phase.\n---\n\n# ArcBridge Sync\n\nRun the full sync loop to keep architecture docs and task statuses in sync with code changes.\n\n## Steps\n\n1. **Reindex** — \\`arcbridge_reindex\\` to update the symbol index with recent code changes\n2. **Check drift** — \\`arcbridge_check_drift\\` to detect undeclared dependencies and missing modules\n3. **Review tasks** — \\`arcbridge_get_current_tasks\\` to see if any tasks can be inferred as done\n4. **Propose updates** — \\`arcbridge_propose_arc42_update\\` to generate documentation update proposals\n`;\n\nexport const REVIEW_SKILL = `---\nname: arcbridge-review\ndescription: Run ArcBridge phase boundary reviews — drift check, quality scenario verification, and practice review across 5 dimensions. Use before completing a phase.\n---\n\n# ArcBridge Phase Review\n\nRun the full review suite before completing a phase gate.\n\n## Steps\n\n1. **Drift check** — \\`arcbridge_check_drift\\` to catch undeclared dependencies and boundary violations\n2. **Verify scenarios** — \\`arcbridge_verify_scenarios\\` to run linked tests for quality scenarios\n3. **Practice review** — \\`arcbridge_get_practice_review\\` to review changes across architecture, security, testing, docs, and complexity\n4. **Role checks** — optionally run \\`arcbridge_run_role_check\\` with specific roles (security-reviewer, quality-guardian)\n5. **Complete phase** — if all checks pass, run \\`arcbridge_complete_phase\\` to validate gates and transition\n`;\n\n/**\n * Generate ArcBridge skills under a skills directory.\n * By default writes to `.agents/skills/` (shared convention for Codex/Gemini/OpenCode).\n * Pass a custom skillsDir to write to a platform-specific location (e.g. `.opencode/skills/`).\n * Only writes skills that don't already exist — preserves existing content.\n * Pass force=true to overwrite existing skills (e.g., after template updates).\n */\nexport function generateSkills(targetDir: string, force = false, skillsDir?: string): void {\n const dir = skillsDir ?? join(targetDir, \".agents\", \"skills\");\n\n const syncPath = join(dir, \"arcbridge-sync\", \"SKILL.md\");\n if (force || !existsSync(syncPath)) {\n mkdirSync(join(dir, \"arcbridge-sync\"), { recursive: true });\n writeFileSync(syncPath, SYNC_SKILL, \"utf-8\");\n }\n\n const reviewPath = join(dir, \"arcbridge-review\", \"SKILL.md\");\n if (force || !existsSync(reviewPath)) {\n mkdirSync(join(dir, \"arcbridge-review\"), { recursive: true });\n writeFileSync(reviewPath, REVIEW_SKILL, \"utf-8\");\n }\n}\n","import { writeFileSync, existsSync, readFileSync } from \"node:fs\";\n\nexport const MARKER = \"<!-- arcbridge-generated -->\";\n\n/**\n * Write content to a file with marker-based merge.\n * Preserves any user content above the marker, replaces everything from the marker onwards.\n * If the file has no marker, appends after existing content.\n * If the file doesn't exist, creates it with the marker.\n */\nexport function writeWithMarkerMerge(filePath: string, content: string): void {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, \"utf-8\");\n const markerIndex = existing.indexOf(MARKER);\n\n if (markerIndex >= 0) {\n const userContent = existing.slice(0, markerIndex).trimEnd();\n const prefix = userContent ? `${userContent}\\n\\n` : \"\";\n writeFileSync(filePath, `${prefix}${MARKER}\\n\\n${content}`, \"utf-8\");\n } else {\n const existingTrimmed = existing.trimEnd();\n const prefix = existingTrimmed ? `${existingTrimmed}\\n\\n` : \"\";\n writeFileSync(filePath, `${prefix}${MARKER}\\n\\n${content}`, \"utf-8\");\n }\n } else {\n writeFileSync(filePath, `${MARKER}\\n\\n${content}`, \"utf-8\");\n }\n}\n","import type { ArcBridgeConfig } from \"@arcbridge/core\";\n\nexport interface InstructionOptions {\n /** Lines to prepend before the shared workflow section (after project overview) */\n prefix?: string[];\n /** Lines to append after the shared workflow section */\n suffix?: string[];\n}\n\n/**\n * Generate the shared ArcBridge workflow instructions.\n * Used by Gemini, OpenCode, and Codex adapters. Claude uses its own\n * variant with platform-specific wording.\n */\nexport function generateInstructions(config: ArcBridgeConfig, options?: InstructionOptions): string {\n const lines: string[] = [\n `# ${config.project_name}`,\n \"\",\n `> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,\n \"\",\n ];\n\n if (options?.prefix) {\n lines.push(...options.prefix);\n }\n\n lines.push(\n \"## Project Overview\",\n \"\",\n `- **Type:** ${config.project_type}`,\n `- **Quality Priorities:** ${config.quality_priorities.join(\", \")}`,\n \"\",\n \"## How to Work in This Project\",\n \"\",\n \"This project follows the **Plan → Build → Sync → Review** convention using ArcBridge.\",\n \"ArcBridge provides MCP tools that give you architectural awareness. **Use them throughout your work.**\",\n \"\",\n \"### Before Starting Any Work\",\n \"\",\n \"1. Check project status: `arcbridge_get_project_status`\",\n \"2. Review current tasks: `arcbridge_get_current_tasks`\",\n \"3. Activate the appropriate role: `arcbridge_activate_role`\",\n \"\",\n \"### When Planning or Refining Architecture\",\n \"\",\n \"Activate the **architect** role: `arcbridge_activate_role({ role: \\\"architect\\\" })`\",\n \"\",\n \"- `arcbridge_get_building_blocks` — view architecture decomposition\",\n \"- `arcbridge_get_quality_scenarios` — view quality requirements\",\n \"- `arcbridge_get_open_questions` — find architectural gaps\",\n \"- `arcbridge_propose_arc42_update` — propose doc updates from code changes\",\n \"\",\n \"### When Implementing Features\",\n \"\",\n \"Activate the **implementer** role: `arcbridge_activate_role({ role: \\\"implementer\\\" })`\",\n \"\",\n \"- `arcbridge_get_guidance` — context-aware guidance for the file/block you're working on\",\n \"- `arcbridge_get_current_tasks` — check expected tasks in the current phase\",\n \"- `arcbridge_search_symbols` / `arcbridge_get_symbol` — understand existing code\",\n \"- `arcbridge_get_dependency_graph` — check module dependencies\",\n \"- `arcbridge_update_task` — mark tasks as in-progress or done\",\n \"- `arcbridge_reindex` — re-index after significant code changes\",\n \"\",\n \"### After Implementing (Phase Boundary Review)\",\n \"\",\n \"Before completing a phase:\",\n \"\",\n \"1. **Drift check:** `arcbridge_check_drift` — catch undeclared dependencies\",\n \"2. **Verify scenarios:** `arcbridge_verify_scenarios` — run linked quality tests\",\n \"3. **Practice review:** `arcbridge_get_practice_review` — review across 5 dimensions\",\n \"\",\n \"### Completing a Phase\",\n \"\",\n \"Activate the **phase-manager** role, then: `arcbridge_complete_phase`\",\n \"— validates three gates: all tasks done, no critical drift, must-have quality scenarios (priority = \\\"must\\\") not failing.\",\n \"\",\n );\n\n if (config.project_type === \"nextjs-app-router\" || config.project_type === \"react-vite\") {\n lines.push(\n \"## React & Next.js Analysis\",\n \"\",\n \"- `arcbridge_get_component_graph` — component hierarchy, props, state, context\",\n \"- `arcbridge_get_route_map` — Next.js route tree (pages, layouts, API routes)\",\n \"- `arcbridge_get_boundary_analysis` — server/client boundary analysis\",\n \"\",\n );\n }\n\n if (options?.suffix) {\n lines.push(...options.suffix);\n }\n\n return lines.join(\"\\n\");\n}\n","import { mkdirSync, writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter, AdapterOptions } from \"../types.js\";\nimport { generateSkills } from \"../shared/skills.js\";\nimport { writeWithMarkerMerge } from \"../shared/marker-merge.js\";\nimport { generateInstructions } from \"../shared/instructions.js\";\n\nfunction generateSettingsJson(): string {\n const settings = {\n mcpServers: {\n arcbridge: {\n command: \"npx\",\n args: [\"-y\", \"@arcbridge/mcp-server\"],\n },\n },\n };\n return JSON.stringify(settings, null, 2) + \"\\n\";\n}\n\nfunction yamlQuote(value: string): string {\n // Quote if value contains YAML-significant characters\n if (/[:#{}&*!|>'\"%@`\\n]/.test(value) || value !== value.trim()) {\n return JSON.stringify(value);\n }\n return value;\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n \"---\",\n `name: ${role.role_id}`,\n `description: ${yamlQuote(role.description)}`,\n ];\n\n // Build tools allowlist from role's required_tools (respects read_only constraint)\n const tools: string[] = role.required_tools.map(\n (tool) => `mcp_*_${tool}`,\n );\n if (role.read_only) {\n tools.push(\"read_file\", \"grep_search\", \"list_directory\");\n }\n if (tools.length > 0) {\n lines.push(\"tools:\");\n for (const tool of tools) {\n lines.push(` - ${tool}`);\n }\n }\n\n const suggestedModel = role.model_preferences?.suggested_models?.gemini?.trim();\n if (suggestedModel) {\n lines.push(`model: ${yamlQuote(suggestedModel)}`);\n } else if (role.model_preferences.reasoning_depth === \"high\") {\n lines.push(\"model: gemini-2.5-pro\");\n }\n\n lines.push(\"---\", \"\");\n lines.push(role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class GeminiAdapter implements PlatformAdapter {\n platform = \"gemini\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const geminiDir = join(targetDir, \".gemini\");\n mkdirSync(geminiDir, { recursive: true });\n\n // Generate .gemini/settings.json (MCP config)\n const settingsPath = join(geminiDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n writeFileSync(settingsPath, generateSettingsJson(), \"utf-8\");\n } else {\n // Add arcbridge MCP server if not already present\n try {\n const existing = JSON.parse(readFileSync(settingsPath, \"utf-8\")) as {\n mcpServers?: Record<string, unknown>;\n };\n if (!existing.mcpServers?.arcbridge) {\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers.arcbridge = {\n command: \"npx\",\n args: [\"-y\", \"@arcbridge/mcp-server\"],\n };\n writeFileSync(settingsPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch {\n // Can't parse existing settings.json — leave it alone\n }\n }\n\n // Generate .gemini/styleguide.md and GEMINI.md (same content)\n const instructionsContent = generateInstructions(config);\n writeWithMarkerMerge(join(geminiDir, \"styleguide.md\"), instructionsContent);\n writeWithMarkerMerge(join(targetDir, \"GEMINI.md\"), instructionsContent);\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[], options?: AdapterOptions): void {\n // Generate .gemini/agents/*.md (Gemini subagents mapped from ArcBridge roles)\n const agentsDir = join(targetDir, \".gemini\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n\n // Generate missing skills (shared with Codex adapter — only writes if not present)\n generateSkills(targetDir, options?.force);\n }\n}\n","import { mkdirSync, writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter, AdapterOptions } from \"../types.js\";\nimport { generateSkills } from \"../shared/skills.js\";\nimport { writeWithMarkerMerge } from \"../shared/marker-merge.js\";\nimport { generateInstructions } from \"../shared/instructions.js\";\n\nfunction generateOpenCodeJson(): string {\n const config = {\n $schema: \"https://opencode.ai/config.json\",\n instructions: [\"OPENCODE.md\"],\n mcp: {\n arcbridge: {\n type: \"local\",\n command: [\"npx\", \"-y\", \"@arcbridge/mcp-server\"],\n },\n },\n };\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\nfunction yamlQuote(value: string): string {\n if (/[:#{}&*!|>'\"%@`\\n]/.test(value) || value !== value.trim()) {\n return JSON.stringify(value);\n }\n return value;\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n \"---\",\n `description: ${yamlQuote(role.description)}`,\n ];\n\n // All ArcBridge roles are invokable via @mention, so they use subagent mode\n lines.push(`mode: subagent`);\n\n // Tool permissions — deny write/edit for read-only roles\n if (role.read_only) {\n lines.push(\"permission:\");\n lines.push(\" edit: deny\");\n lines.push(\" write: deny\");\n }\n\n lines.push(\"---\", \"\");\n lines.push(role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class OpenCodeAdapter implements PlatformAdapter {\n platform = \"opencode\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n // Generate opencode.json (MCP config)\n const configPath = join(targetDir, \"opencode.json\");\n if (!existsSync(configPath)) {\n writeFileSync(configPath, generateOpenCodeJson(), \"utf-8\");\n } else {\n // Merge arcbridge config into existing opencode.json without overwriting user settings\n try {\n const existing = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n let changed = false;\n\n // Ensure $schema is set\n if (!existing.$schema) {\n existing.$schema = \"https://opencode.ai/config.json\";\n changed = true;\n }\n\n // Ensure instructions array includes OPENCODE.md\n const instructions = existing.instructions as string[] | undefined;\n if (!Array.isArray(instructions)) {\n existing.instructions = [\"OPENCODE.md\"];\n changed = true;\n } else if (!instructions.includes(\"OPENCODE.md\")) {\n instructions.push(\"OPENCODE.md\");\n changed = true;\n }\n\n // Ensure mcp.arcbridge is present (reset mcp if it's not a plain object)\n const mcp = existing.mcp;\n const mcpObj: Record<string, unknown> =\n typeof mcp === \"object\" && mcp !== null && !Array.isArray(mcp)\n ? (mcp as Record<string, unknown>)\n : {};\n if (!mcpObj.arcbridge) {\n mcpObj.arcbridge = {\n type: \"local\",\n command: [\"npx\", \"-y\", \"@arcbridge/mcp-server\"],\n };\n existing.mcp = mcpObj;\n changed = true;\n }\n\n if (changed) {\n writeFileSync(configPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch {\n // Can't parse existing opencode.json — leave it alone\n }\n }\n\n // Generate OPENCODE.md (project instructions — opencode reads AGENTS.md by default,\n // but we use OPENCODE.md + the instructions config field to avoid colliding with Codex)\n const instructionsContent = generateInstructions(config);\n writeWithMarkerMerge(join(targetDir, \"OPENCODE.md\"), instructionsContent);\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[], options?: AdapterOptions): void {\n // Generate .opencode/agents/*.md (OpenCode subagents mapped from ArcBridge roles)\n const agentsDir = join(targetDir, \".opencode\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n\n // Generate skills under .opencode/skills/ (OpenCode loads from .opencode/skills/*/SKILL.md)\n generateSkills(targetDir, options?.force, join(targetDir, \".opencode\", \"skills\"));\n\n // Also generate shared .agents/skills/ (OpenCode loads these too)\n generateSkills(targetDir, options?.force);\n }\n}\n","export type { PlatformAdapter, AdapterOptions } from \"./types.js\";\nexport { ClaudeAdapter } from \"./claude/claude-adapter.js\";\nexport { CopilotAdapter } from \"./copilot/copilot-adapter.js\";\nexport { CodexAdapter } from \"./codex/codex-adapter.js\";\nexport { GeminiAdapter } from \"./gemini/gemini-adapter.js\";\nexport { OpenCodeAdapter } from \"./opencode/opencode-adapter.js\";\n\nimport type { PlatformAdapter } from \"./types.js\";\nimport { ClaudeAdapter } from \"./claude/claude-adapter.js\";\nimport { CopilotAdapter } from \"./copilot/copilot-adapter.js\";\nimport { CodexAdapter } from \"./codex/codex-adapter.js\";\nimport { GeminiAdapter } from \"./gemini/gemini-adapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/opencode-adapter.js\";\n\nconst adapters: Record<string, () => PlatformAdapter> = {\n claude: () => new ClaudeAdapter(),\n copilot: () => new CopilotAdapter(),\n codex: () => new CodexAdapter(),\n gemini: () => new GeminiAdapter(),\n opencode: () => new OpenCodeAdapter(),\n};\n\nexport function getAdapter(platform: string): PlatformAdapter {\n const factory = adapters[platform];\n if (!factory) {\n throw new Error(\n `Unknown platform: ${platform}. Available: ${Object.keys(adapters).join(\", \")}`,\n );\n }\n return factory();\n}\n"],"mappings":"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","names":["mkdirSync","writeFileSync","join","generateAgentFile","writeFileSync","existsSync","readFileSync","join","mkdirSync","writeFileSync","existsSync","join","writeFileSync","existsSync","readFileSync","join","existsSync","readFileSync","writeFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","join","generateAgentFile","join","mkdirSync","existsSync","writeFileSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","join","yamlQuote","generateAgentFile","join","existsSync","writeFileSync","readFileSync","mkdirSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/claude/claude-adapter.ts","../src/shared/mcp-command.ts","../src/copilot/copilot-adapter.ts","../src/codex/codex-adapter.ts","../src/shared/skills.ts","../src/shared/marker-merge.ts","../src/shared/instructions.ts","../src/gemini/gemini-adapter.ts","../src/opencode/opencode-adapter.ts","../src/index.ts"],"sourcesContent":["import { mkdirSync, writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter } from \"../types.js\";\nimport { mcpCommand } from \"../shared/mcp-command.js\";\n\nfunction generateClaudeMd(config: ArcBridgeConfig): string {\n const lines: string[] = [\n `# ${config.project_name}`,\n \"\",\n `> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,\n \"\",\n \"## Project Overview\",\n \"\",\n `- **Type:** ${config.project_type}`,\n `- **Quality Priorities:** ${config.quality_priorities.join(\", \")}`,\n \"\",\n \"## How to Work in This Project\",\n \"\",\n \"This project follows the **Plan → Build → Sync → Review** convention using ArcBridge.\",\n \"ArcBridge provides MCP tools that give you architectural awareness. **Use them throughout your work.**\",\n \"\",\n \"### Before Starting Any Work\",\n \"\",\n \"1. Check project status: `arcbridge_get_project_status`\",\n \"2. Review current tasks: `arcbridge_get_current_tasks`\",\n \"3. Activate the appropriate role (see below): `arcbridge_activate_role`\",\n \"\",\n \"### When Planning or Refining Architecture\",\n \"\",\n \"Activate the **architect** role: `arcbridge_activate_role({ role: \\\"architect\\\" })`\",\n \"\",\n \"Then use:\",\n \"- `arcbridge_get_building_blocks` — view current architecture decomposition\",\n \"- `arcbridge_get_quality_scenarios` — view quality requirements\",\n \"- `arcbridge_get_open_questions` — find architectural gaps to resolve\",\n \"- `arcbridge_propose_arc42_update` — propose doc updates from recent code changes\",\n \"\",\n \"### When Implementing Features\",\n \"\",\n \"Activate the **implementer** role: `arcbridge_activate_role({ role: \\\"implementer\\\" })`\",\n \"\",\n \"Then use:\",\n \"- `arcbridge_get_guidance` — get context-aware guidance for the file/block you're working on\",\n \"- `arcbridge_get_current_tasks` — check what tasks are expected in the current phase\",\n \"- `arcbridge_search_symbols` / `arcbridge_get_symbol` — understand existing code\",\n \"- `arcbridge_get_dependency_graph` — check module dependencies before adding new ones\",\n \"- `arcbridge_update_task` — mark tasks as in-progress or done as you complete them\",\n \"- `arcbridge_reindex` — re-index after significant code changes\",\n \"\",\n \"### After Implementing (Phase Boundary Review)\",\n \"\",\n \"Before completing a phase, consult the review roles. Not every role is needed every phase — use this guide:\",\n \"\",\n \"| Role | When to consult | How |\",\n \"|------|----------------|-----|\",\n \"| **code-reviewer** | Every phase | `arcbridge_activate_role({ role: \\\"code-reviewer\\\" })` then `arcbridge_get_practice_review` |\",\n \"| **security-reviewer** | Phases with auth, uploads, API routes, user input | `arcbridge_activate_role({ role: \\\"security-reviewer\\\" })` then `arcbridge_run_role_check` |\",\n \"| **quality-guardian** | Every 2nd phase, or when quality scenarios are linked | `arcbridge_activate_role({ role: \\\"quality-guardian\\\" })` then `arcbridge_get_practice_review` |\",\n \"| **architect** | When drift is detected or architecture evolved significantly | `arcbridge_activate_role({ role: \\\"architect\\\" })` then `arcbridge_check_drift` |\",\n \"\",\n \"Then run the standard checks:\",\n \"\",\n \"1. **Drift check:** `arcbridge_check_drift` — catch undeclared dependencies and missing modules\",\n \"2. **Verify scenarios:** `arcbridge_verify_scenarios` — run linked tests for quality scenarios\",\n \"\",\n \"### Completing a Phase\",\n \"\",\n \"Activate the **phase-manager** role: `arcbridge_activate_role({ role: \\\"phase-manager\\\" })`\",\n \"\",\n \"Then: `arcbridge_complete_phase` — validates three gates: all tasks done, no critical drift, must-have quality scenarios not failing.\",\n \"\",\n ];\n\n // Add React/Next.js section only for relevant project types\n if (config.project_type === \"nextjs-app-router\" || config.project_type === \"react-vite\") {\n lines.push(\n \"## React & Next.js Analysis\",\n \"\",\n \"- `arcbridge_get_component_graph` — view component hierarchy, props, state, and context usage\",\n \"- `arcbridge_get_route_map` — view Next.js route tree (pages, layouts, API routes)\",\n \"- `arcbridge_get_boundary_analysis` — analyze server/client boundaries and detect violations\",\n \"\",\n );\n }\n\n lines.push(\n \"## Agent Roles\",\n \"\",\n \"Activate roles with `arcbridge_activate_role` to get specialized context and tool guidance:\",\n \"\",\n \"| Role | When to Use |\",\n \"|------|-------------|\",\n \"| `architect` | Defining building blocks, reviewing dependencies, creating ADRs |\",\n \"| `implementer` | Writing code within the established architecture |\",\n \"| `security-reviewer` | Auditing auth, input validation, client/server boundaries |\",\n \"| `quality-guardian` | Reviewing test coverage, quality scenarios, quality gates |\",\n \"| `phase-manager` | Completing phases, managing task transitions |\",\n \"| `code-reviewer` | Reviewing code for correctness, patterns, edge cases |\",\n \"| `onboarding` | Understanding the project (for new developers) |\",\n \"\",\n \"Roles are defined in `.arcbridge/agents/` and `.claude/agents/`.\",\n \"\",\n );\n\n return lines.join(\"\\n\");\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n `# ${role.name}`,\n \"\",\n role.description,\n \"\",\n \"## Tools\",\n \"\",\n ...role.required_tools.map((t) => `- ${t}`),\n \"\",\n ];\n\n if (role.denied_tools.length > 0) {\n lines.push(\"## Denied Tools\", \"\", ...role.denied_tools.map((t) => `- ${t}`), \"\");\n }\n\n if (role.read_only) {\n lines.push(\"## Access\", \"\", \"This role is **read-only**.\", \"\");\n }\n\n if (role.quality_focus.length > 0) {\n lines.push(\n \"## Quality Focus\",\n \"\",\n ...role.quality_focus.map((q) => `- ${q}`),\n \"\",\n );\n }\n\n lines.push(\"## Instructions\", \"\", role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class ClaudeAdapter implements PlatformAdapter {\n platform = \"claude\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const arcbridgeContent = generateClaudeMd(config);\n const claudeMdPath = join(targetDir, \"CLAUDE.md\");\n const marker = \"<!-- arcbridge-generated -->\";\n\n if (existsSync(claudeMdPath)) {\n const existing = readFileSync(claudeMdPath, \"utf-8\");\n\n // Detect where ArcBridge content starts: marker from current version,\n // or the generated heading from older versions (before marker was added)\n const markerIndex = existing.indexOf(marker);\n const legacyIndex = existing.indexOf(\"## ArcBridge Workflow\");\n const splitIndex = markerIndex >= 0 ? markerIndex : legacyIndex;\n\n if (splitIndex >= 0) {\n // Replace everything from the ArcBridge section onwards\n const userContent = existing.slice(0, splitIndex).trimEnd();\n writeFileSync(claudeMdPath, `${userContent}\\n\\n${marker}\\n\\n${arcbridgeContent}`, \"utf-8\");\n } else {\n // No existing ArcBridge content — append\n writeFileSync(claudeMdPath, `${existing.trimEnd()}\\n\\n${marker}\\n\\n${arcbridgeContent}`, \"utf-8\");\n }\n } else {\n writeFileSync(claudeMdPath, `${marker}\\n\\n${arcbridgeContent}`, \"utf-8\");\n }\n\n // Generate .mcp.json if it doesn't already exist\n const mcpJsonPath = join(targetDir, \".mcp.json\");\n if (!existsSync(mcpJsonPath)) {\n const mcpConfig = {\n mcpServers: {\n arcbridge: mcpCommand(),\n },\n };\n writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2) + \"\\n\", \"utf-8\");\n } else {\n // If .mcp.json exists, add arcbridge server if not already present\n try {\n const existing = JSON.parse(readFileSync(mcpJsonPath, \"utf-8\")) as {\n mcpServers?: Record<string, unknown>;\n };\n if (!existing.mcpServers?.arcbridge) {\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers.arcbridge = mcpCommand();\n writeFileSync(mcpJsonPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch {\n // If we can't parse existing .mcp.json, leave it alone\n }\n }\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[]): void {\n const agentsDir = join(targetDir, \".claude\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n }\n}\n","import { platform } from \"node:os\";\n\n/**\n * Return the MCP server command and args for the current platform.\n * On Windows, `npx` is a `.cmd` script that cannot be spawned directly —\n * MCP clients use `child_process.spawn` without a shell, so we wrap it\n * with `cmd /c`.\n */\nexport function mcpCommand(): { command: string; args: string[] } {\n if (platform() === \"win32\") {\n return {\n command: \"cmd\",\n args: [\"/c\", \"npx\", \"-y\", \"@arcbridge/mcp-server\"],\n };\n }\n return {\n command: \"npx\",\n args: [\"-y\", \"@arcbridge/mcp-server\"],\n };\n}\n\n/**\n * Return the MCP server command as a flat array (for platforms like OpenCode\n * that use `command: [\"npx\", ...]` instead of separate command + args).\n */\nexport function mcpCommandArray(): string[] {\n if (platform() === \"win32\") {\n return [\"cmd\", \"/c\", \"npx\", \"-y\", \"@arcbridge/mcp-server\"];\n }\n return [\"npx\", \"-y\", \"@arcbridge/mcp-server\"];\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter } from \"../types.js\";\n\nfunction generateCopilotInstructions(config: ArcBridgeConfig): string {\n const lines: string[] = [\n `# ${config.project_name} - Copilot Instructions`,\n \"\",\n `> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,\n \"\",\n \"## Project Context\",\n \"\",\n `This is a ${config.project_type} project.`,\n \"\",\n `**Quality Priorities:** ${config.quality_priorities.join(\", \")}`,\n \"\",\n \"## Architecture\",\n \"\",\n \"Architecture documentation is in `.arcbridge/arc42/`.\",\n \"Quality scenarios are in `.arcbridge/arc42/10-quality-scenarios.yaml`.\",\n \"Phase plan is in `.arcbridge/plan/`.\",\n \"\",\n \"## Code Intelligence\",\n \"\",\n \"Use ArcBridge MCP tools to explore the codebase:\",\n \"- `arcbridge_search_symbols` — Search for functions, classes, types\",\n \"- `arcbridge_get_symbol` — Get full details on a symbol\",\n \"- `arcbridge_get_dependency_graph` — Analyze module dependencies\",\n \"- `arcbridge_reindex` — Re-index after code changes\",\n \"\",\n \"## React & Next.js Analysis\",\n \"\",\n \"- `arcbridge_get_component_graph` — View component hierarchy, props, state, and context\",\n \"- `arcbridge_get_route_map` — View Next.js route tree (pages, layouts, API routes)\",\n \"- `arcbridge_get_boundary_analysis` — Analyze server/client boundaries\",\n \"\",\n \"## Architecture Bridge\",\n \"\",\n \"- `arcbridge_check_drift` — Detect architecture drift and boundary violations\",\n \"- `arcbridge_get_guidance` — Get context-aware guidance for code changes\",\n \"- `arcbridge_get_open_questions` — Surface architectural gaps\",\n \"- `arcbridge_propose_arc42_update` — Generate arc42 update proposals from code changes\",\n \"- `arcbridge_get_practice_review` — Review recent changes across 5 practice dimensions\",\n \"\",\n \"## Conventions\",\n \"\",\n \"- Follow existing patterns in the codebase\",\n \"- Stay within building block boundaries\",\n \"- Write tests for new functionality\",\n \"- Check quality scenarios before submitting changes\",\n \"\",\n ];\n\n return lines.join(\"\\n\");\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n `# ${role.name}`,\n \"\",\n role.description,\n \"\",\n ];\n\n if (role.read_only) {\n lines.push(\"**Access:** Read-only\", \"\");\n }\n\n if (role.quality_focus.length > 0) {\n lines.push(\n \"## Quality Focus\",\n \"\",\n ...role.quality_focus.map((q) => `- ${q}`),\n \"\",\n );\n }\n\n lines.push(\"## Instructions\", \"\", role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class CopilotAdapter implements PlatformAdapter {\n platform = \"copilot\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const githubDir = join(targetDir, \".github\");\n mkdirSync(githubDir, { recursive: true });\n\n const content = generateCopilotInstructions(config);\n writeFileSync(\n join(githubDir, \"copilot-instructions.md\"),\n content,\n \"utf-8\",\n );\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[]): void {\n const agentsDir = join(targetDir, \".github\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n }\n}\n","import { writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter, AdapterOptions } from \"../types.js\";\nimport { generateSkills } from \"../shared/skills.js\";\nimport { writeWithMarkerMerge } from \"../shared/marker-merge.js\";\nimport { generateInstructions } from \"../shared/instructions.js\";\n\nfunction generateAgentsMd(config: ArcBridgeConfig): string {\n return generateInstructions(config, {\n prefix: [\n \"## Codex MCP Setup\",\n \"\",\n \"Add this to your `~/.codex/config.toml` (one-time setup):\",\n \"\",\n \"**macOS / Linux:**\",\n \"```toml\",\n \"[mcp_servers.arcbridge]\",\n 'command = \"npx\"',\n 'args = [\"-y\", \"@arcbridge/mcp-server\"]',\n \"```\",\n \"\",\n \"**Windows:**\",\n \"```toml\",\n \"[mcp_servers.arcbridge]\",\n 'command = \"cmd\"',\n 'args = [\"/c\", \"npx\", \"-y\", \"@arcbridge/mcp-server\"]',\n \"```\",\n \"\",\n ],\n suffix: [\n \"## Agent Roles\",\n \"\",\n \"Activate roles with `arcbridge_activate_role` to get specialized context.\",\n \"Roles are defined in `.arcbridge/agents/`.\",\n \"\",\n \"*Role table is appended below after agent configs are generated.*\",\n \"\",\n ],\n });\n}\n\nexport class CodexAdapter implements PlatformAdapter {\n platform = \"codex\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const agentsMdContent = generateAgentsMd(config);\n writeWithMarkerMerge(join(targetDir, \"AGENTS.md\"), agentsMdContent);\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[], options?: AdapterOptions): void {\n // Append dynamic role table to AGENTS.md (replaces placeholder)\n const agentsMdPath = join(targetDir, \"AGENTS.md\");\n if (existsSync(agentsMdPath)) {\n let content = readFileSync(agentsMdPath, \"utf-8\");\n const roleTable = [\n \"| Role | Description |\",\n \"|------|-------------|\",\n ...roles.map((r) => `| \\`${r.role_id}\\` | ${r.description} |`),\n \"\",\n ].join(\"\\n\");\n\n const placeholder = \"*Role table is appended below after agent configs are generated.*\";\n if (content.includes(placeholder)) {\n content = content.replace(placeholder, roleTable);\n } else {\n // Fallback: append role table at the end if placeholder was removed\n content = `${content.trimEnd()}\\n\\n## Agent Roles\\n\\n${roleTable}\\n`;\n }\n writeFileSync(agentsMdPath, content, \"utf-8\");\n }\n\n // Generate missing skills (shared with Gemini adapter — only writes if not present)\n generateSkills(targetDir, options?.force);\n }\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport const SYNC_SKILL = `---\nname: arcbridge-sync\ndescription: Run the ArcBridge sync loop — reindex code, detect architecture drift, and update task statuses. Use after significant code changes or before completing a phase.\n---\n\n# ArcBridge Sync\n\nRun the full sync loop to keep architecture docs and task statuses in sync with code changes.\n\n## Steps\n\n1. **Reindex** — \\`arcbridge_reindex\\` to update the symbol index with recent code changes\n2. **Check drift** — \\`arcbridge_check_drift\\` to detect undeclared dependencies and missing modules\n3. **Review tasks** — \\`arcbridge_get_current_tasks\\` to see if any tasks can be inferred as done\n4. **Propose updates** — \\`arcbridge_propose_arc42_update\\` to generate documentation update proposals\n`;\n\nexport const REVIEW_SKILL = `---\nname: arcbridge-review\ndescription: Run ArcBridge phase boundary reviews — drift check, quality scenario verification, and practice review across 5 dimensions. Use before completing a phase.\n---\n\n# ArcBridge Phase Review\n\nRun the full review suite before completing a phase gate.\n\n## Steps\n\n1. **Drift check** — \\`arcbridge_check_drift\\` to catch undeclared dependencies and boundary violations\n2. **Verify scenarios** — \\`arcbridge_verify_scenarios\\` to run linked tests for quality scenarios\n3. **Practice review** — \\`arcbridge_get_practice_review\\` to review changes across architecture, security, testing, docs, and complexity\n4. **Role checks** — optionally run \\`arcbridge_run_role_check\\` with specific roles (security-reviewer, quality-guardian)\n5. **Complete phase** — if all checks pass, run \\`arcbridge_complete_phase\\` to validate gates and transition\n`;\n\n/**\n * Generate ArcBridge skills under a skills directory.\n * By default writes to `.agents/skills/` (shared convention for Codex/Gemini/OpenCode).\n * Pass a custom skillsDir to write to a platform-specific location (e.g. `.opencode/skills/`).\n * Only writes skills that don't already exist — preserves existing content.\n * Pass force=true to overwrite existing skills (e.g., after template updates).\n */\nexport function generateSkills(targetDir: string, force = false, skillsDir?: string): void {\n const dir = skillsDir ?? join(targetDir, \".agents\", \"skills\");\n\n const syncPath = join(dir, \"arcbridge-sync\", \"SKILL.md\");\n if (force || !existsSync(syncPath)) {\n mkdirSync(join(dir, \"arcbridge-sync\"), { recursive: true });\n writeFileSync(syncPath, SYNC_SKILL, \"utf-8\");\n }\n\n const reviewPath = join(dir, \"arcbridge-review\", \"SKILL.md\");\n if (force || !existsSync(reviewPath)) {\n mkdirSync(join(dir, \"arcbridge-review\"), { recursive: true });\n writeFileSync(reviewPath, REVIEW_SKILL, \"utf-8\");\n }\n}\n","import { writeFileSync, existsSync, readFileSync } from \"node:fs\";\n\nexport const MARKER = \"<!-- arcbridge-generated -->\";\n\n/**\n * Write content to a file with marker-based merge.\n * Preserves any user content above the marker, replaces everything from the marker onwards.\n * If the file has no marker, appends after existing content.\n * If the file doesn't exist, creates it with the marker.\n */\nexport function writeWithMarkerMerge(filePath: string, content: string): void {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, \"utf-8\");\n const markerIndex = existing.indexOf(MARKER);\n\n if (markerIndex >= 0) {\n const userContent = existing.slice(0, markerIndex).trimEnd();\n const prefix = userContent ? `${userContent}\\n\\n` : \"\";\n writeFileSync(filePath, `${prefix}${MARKER}\\n\\n${content}`, \"utf-8\");\n } else {\n const existingTrimmed = existing.trimEnd();\n const prefix = existingTrimmed ? `${existingTrimmed}\\n\\n` : \"\";\n writeFileSync(filePath, `${prefix}${MARKER}\\n\\n${content}`, \"utf-8\");\n }\n } else {\n writeFileSync(filePath, `${MARKER}\\n\\n${content}`, \"utf-8\");\n }\n}\n","import type { ArcBridgeConfig } from \"@arcbridge/core\";\n\nexport interface InstructionOptions {\n /** Lines to prepend before the shared workflow section (after project overview) */\n prefix?: string[];\n /** Lines to append after the shared workflow section */\n suffix?: string[];\n}\n\n/**\n * Generate the shared ArcBridge workflow instructions.\n * Used by Gemini, OpenCode, and Codex adapters. Claude uses its own\n * variant with platform-specific wording.\n */\nexport function generateInstructions(config: ArcBridgeConfig, options?: InstructionOptions): string {\n const lines: string[] = [\n `# ${config.project_name}`,\n \"\",\n `> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,\n \"\",\n ];\n\n if (options?.prefix) {\n lines.push(...options.prefix);\n }\n\n lines.push(\n \"## Project Overview\",\n \"\",\n `- **Type:** ${config.project_type}`,\n `- **Quality Priorities:** ${config.quality_priorities.join(\", \")}`,\n \"\",\n \"## How to Work in This Project\",\n \"\",\n \"This project follows the **Plan → Build → Sync → Review** convention using ArcBridge.\",\n \"ArcBridge provides MCP tools that give you architectural awareness. **Use them throughout your work.**\",\n \"\",\n \"### Before Starting Any Work\",\n \"\",\n \"1. Check project status: `arcbridge_get_project_status`\",\n \"2. Review current tasks: `arcbridge_get_current_tasks`\",\n \"3. Activate the appropriate role: `arcbridge_activate_role`\",\n \"\",\n \"### When Planning or Refining Architecture\",\n \"\",\n \"Activate the **architect** role: `arcbridge_activate_role({ role: \\\"architect\\\" })`\",\n \"\",\n \"- `arcbridge_get_building_blocks` — view architecture decomposition\",\n \"- `arcbridge_get_quality_scenarios` — view quality requirements\",\n \"- `arcbridge_get_open_questions` — find architectural gaps\",\n \"- `arcbridge_propose_arc42_update` — propose doc updates from code changes\",\n \"\",\n \"### When Implementing Features\",\n \"\",\n \"Activate the **implementer** role: `arcbridge_activate_role({ role: \\\"implementer\\\" })`\",\n \"\",\n \"- `arcbridge_get_guidance` — context-aware guidance for the file/block you're working on\",\n \"- `arcbridge_get_current_tasks` — check expected tasks in the current phase\",\n \"- `arcbridge_search_symbols` / `arcbridge_get_symbol` — understand existing code\",\n \"- `arcbridge_get_dependency_graph` — check module dependencies\",\n \"- `arcbridge_update_task` — mark tasks as in-progress or done\",\n \"- `arcbridge_reindex` — re-index after significant code changes\",\n \"\",\n \"### After Implementing (Phase Boundary Review)\",\n \"\",\n \"Before completing a phase:\",\n \"\",\n \"1. **Drift check:** `arcbridge_check_drift` — catch undeclared dependencies\",\n \"2. **Verify scenarios:** `arcbridge_verify_scenarios` — run linked quality tests\",\n \"3. **Practice review:** `arcbridge_get_practice_review` — review across 5 dimensions\",\n \"\",\n \"### Completing a Phase\",\n \"\",\n \"Activate the **phase-manager** role, then: `arcbridge_complete_phase`\",\n \"— validates three gates: all tasks done, no critical drift, must-have quality scenarios (priority = \\\"must\\\") not failing.\",\n \"\",\n );\n\n if (config.project_type === \"nextjs-app-router\" || config.project_type === \"react-vite\") {\n lines.push(\n \"## React & Next.js Analysis\",\n \"\",\n \"- `arcbridge_get_component_graph` — component hierarchy, props, state, context\",\n \"- `arcbridge_get_route_map` — Next.js route tree (pages, layouts, API routes)\",\n \"- `arcbridge_get_boundary_analysis` — server/client boundary analysis\",\n \"\",\n );\n }\n\n if (options?.suffix) {\n lines.push(...options.suffix);\n }\n\n return lines.join(\"\\n\");\n}\n","import { mkdirSync, writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter, AdapterOptions } from \"../types.js\";\nimport { generateSkills } from \"../shared/skills.js\";\nimport { writeWithMarkerMerge } from \"../shared/marker-merge.js\";\nimport { generateInstructions } from \"../shared/instructions.js\";\nimport { mcpCommand } from \"../shared/mcp-command.js\";\n\nfunction generateSettingsJson(): string {\n const settings = {\n mcpServers: {\n arcbridge: mcpCommand(),\n },\n };\n return JSON.stringify(settings, null, 2) + \"\\n\";\n}\n\nfunction yamlQuote(value: string): string {\n // Quote if value contains YAML-significant characters\n if (/[:#{}&*!|>'\"%@`\\n]/.test(value) || value !== value.trim()) {\n return JSON.stringify(value);\n }\n return value;\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n \"---\",\n `name: ${role.role_id}`,\n `description: ${yamlQuote(role.description)}`,\n ];\n\n // Build tools allowlist from role's required_tools (respects read_only constraint)\n const tools: string[] = role.required_tools.map(\n (tool) => `mcp_*_${tool}`,\n );\n if (role.read_only) {\n tools.push(\"read_file\", \"grep_search\", \"list_directory\");\n }\n if (tools.length > 0) {\n lines.push(\"tools:\");\n for (const tool of tools) {\n lines.push(` - ${tool}`);\n }\n }\n\n const suggestedModel = role.model_preferences?.suggested_models?.gemini?.trim();\n if (suggestedModel) {\n lines.push(`model: ${yamlQuote(suggestedModel)}`);\n } else if (role.model_preferences.reasoning_depth === \"high\") {\n lines.push(\"model: gemini-2.5-pro\");\n }\n\n lines.push(\"---\", \"\");\n lines.push(role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class GeminiAdapter implements PlatformAdapter {\n platform = \"gemini\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n const geminiDir = join(targetDir, \".gemini\");\n mkdirSync(geminiDir, { recursive: true });\n\n // Generate .gemini/settings.json (MCP config)\n const settingsPath = join(geminiDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n writeFileSync(settingsPath, generateSettingsJson(), \"utf-8\");\n } else {\n // Add arcbridge MCP server if not already present\n try {\n const existing = JSON.parse(readFileSync(settingsPath, \"utf-8\")) as {\n mcpServers?: Record<string, unknown>;\n };\n if (!existing.mcpServers?.arcbridge) {\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers.arcbridge = mcpCommand();\n writeFileSync(settingsPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch {\n // Can't parse existing settings.json — leave it alone\n }\n }\n\n // Generate .gemini/styleguide.md and GEMINI.md (same content)\n const instructionsContent = generateInstructions(config);\n writeWithMarkerMerge(join(geminiDir, \"styleguide.md\"), instructionsContent);\n writeWithMarkerMerge(join(targetDir, \"GEMINI.md\"), instructionsContent);\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[], options?: AdapterOptions): void {\n // Generate .gemini/agents/*.md (Gemini subagents mapped from ArcBridge roles)\n const agentsDir = join(targetDir, \".gemini\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n\n // Generate missing skills (shared with Codex adapter — only writes if not present)\n generateSkills(targetDir, options?.force);\n }\n}\n","import { mkdirSync, writeFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentRole, ArcBridgeConfig } from \"@arcbridge/core\";\nimport type { PlatformAdapter, AdapterOptions } from \"../types.js\";\nimport { generateSkills } from \"../shared/skills.js\";\nimport { writeWithMarkerMerge } from \"../shared/marker-merge.js\";\nimport { generateInstructions } from \"../shared/instructions.js\";\nimport { mcpCommandArray } from \"../shared/mcp-command.js\";\n\nfunction generateOpenCodeJson(): string {\n const config = {\n $schema: \"https://opencode.ai/config.json\",\n instructions: [\"OPENCODE.md\"],\n mcp: {\n arcbridge: {\n type: \"local\",\n command: mcpCommandArray(),\n },\n },\n };\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\nfunction yamlQuote(value: string): string {\n if (/[:#{}&*!|>'\"%@`\\n]/.test(value) || value !== value.trim()) {\n return JSON.stringify(value);\n }\n return value;\n}\n\nfunction generateAgentFile(role: AgentRole): string {\n const lines: string[] = [\n \"---\",\n `description: ${yamlQuote(role.description)}`,\n ];\n\n // All ArcBridge roles are invokable via @mention, so they use subagent mode\n lines.push(`mode: subagent`);\n\n // Tool permissions — deny write/edit for read-only roles\n if (role.read_only) {\n lines.push(\"permission:\");\n lines.push(\" edit: deny\");\n lines.push(\" write: deny\");\n }\n\n lines.push(\"---\", \"\");\n lines.push(role.system_prompt, \"\");\n\n return lines.join(\"\\n\");\n}\n\nexport class OpenCodeAdapter implements PlatformAdapter {\n platform = \"opencode\";\n\n generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void {\n // Generate opencode.json (MCP config)\n const configPath = join(targetDir, \"opencode.json\");\n if (!existsSync(configPath)) {\n writeFileSync(configPath, generateOpenCodeJson(), \"utf-8\");\n } else {\n // Merge arcbridge config into existing opencode.json without overwriting user settings\n try {\n const existing = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n let changed = false;\n\n // Ensure $schema is set\n if (!existing.$schema) {\n existing.$schema = \"https://opencode.ai/config.json\";\n changed = true;\n }\n\n // Ensure instructions array includes OPENCODE.md\n const instructions = existing.instructions as string[] | undefined;\n if (!Array.isArray(instructions)) {\n existing.instructions = [\"OPENCODE.md\"];\n changed = true;\n } else if (!instructions.includes(\"OPENCODE.md\")) {\n instructions.push(\"OPENCODE.md\");\n changed = true;\n }\n\n // Ensure mcp.arcbridge is present (reset mcp if it's not a plain object)\n const mcp = existing.mcp;\n const mcpObj: Record<string, unknown> =\n typeof mcp === \"object\" && mcp !== null && !Array.isArray(mcp)\n ? (mcp as Record<string, unknown>)\n : {};\n if (!mcpObj.arcbridge) {\n mcpObj.arcbridge = {\n type: \"local\",\n command: mcpCommandArray(),\n };\n existing.mcp = mcpObj;\n changed = true;\n }\n\n if (changed) {\n writeFileSync(configPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch {\n // Can't parse existing opencode.json — leave it alone\n }\n }\n\n // Generate OPENCODE.md (project instructions — opencode reads AGENTS.md by default,\n // but we use OPENCODE.md + the instructions config field to avoid colliding with Codex)\n const instructionsContent = generateInstructions(config);\n writeWithMarkerMerge(join(targetDir, \"OPENCODE.md\"), instructionsContent);\n }\n\n generateAgentConfigs(targetDir: string, roles: AgentRole[], options?: AdapterOptions): void {\n // Generate .opencode/agents/*.md (OpenCode subagents mapped from ArcBridge roles)\n const agentsDir = join(targetDir, \".opencode\", \"agents\");\n mkdirSync(agentsDir, { recursive: true });\n\n for (const role of roles) {\n const content = generateAgentFile(role);\n writeFileSync(join(agentsDir, `${role.role_id}.md`), content, \"utf-8\");\n }\n\n // Generate skills under .opencode/skills/ (OpenCode loads from .opencode/skills/*/SKILL.md)\n generateSkills(targetDir, options?.force, join(targetDir, \".opencode\", \"skills\"));\n\n // Also generate shared .agents/skills/ (OpenCode loads these too)\n generateSkills(targetDir, options?.force);\n }\n}\n","export type { PlatformAdapter, AdapterOptions } from \"./types.js\";\nexport { ClaudeAdapter } from \"./claude/claude-adapter.js\";\nexport { CopilotAdapter } from \"./copilot/copilot-adapter.js\";\nexport { CodexAdapter } from \"./codex/codex-adapter.js\";\nexport { GeminiAdapter } from \"./gemini/gemini-adapter.js\";\nexport { OpenCodeAdapter } from \"./opencode/opencode-adapter.js\";\n\nimport type { PlatformAdapter } from \"./types.js\";\nimport { ClaudeAdapter } from \"./claude/claude-adapter.js\";\nimport { CopilotAdapter } from \"./copilot/copilot-adapter.js\";\nimport { CodexAdapter } from \"./codex/codex-adapter.js\";\nimport { GeminiAdapter } from \"./gemini/gemini-adapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/opencode-adapter.js\";\n\nconst adapters: Record<string, () => PlatformAdapter> = {\n claude: () => new ClaudeAdapter(),\n copilot: () => new CopilotAdapter(),\n codex: () => new CodexAdapter(),\n gemini: () => new GeminiAdapter(),\n opencode: () => new OpenCodeAdapter(),\n};\n\nexport function getAdapter(platform: string): PlatformAdapter {\n const factory = adapters[platform];\n if (!factory) {\n throw new Error(\n `Unknown platform: ${platform}. Available: ${Object.keys(adapters).join(\", \")}`,\n );\n }\n return factory();\n}\n"],"mappings":"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","names":["mkdirSync","writeFileSync","join","generateAgentFile","writeFileSync","existsSync","readFileSync","join","mkdirSync","writeFileSync","existsSync","join","writeFileSync","existsSync","readFileSync","join","existsSync","readFileSync","writeFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","join","generateAgentFile","join","mkdirSync","existsSync","writeFileSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","join","yamlQuote","generateAgentFile","join","existsSync","writeFileSync","readFileSync","mkdirSync","platform"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arcbridge/adapters",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Platform adapters for ArcBridge — Claude Code and GitHub Copilot config generators",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@arcbridge/core": "0.
|
|
35
|
+
"@arcbridge/core": "0.6.0"
|
|
36
36
|
},
|
|
37
37
|
"engines": {
|
|
38
38
|
"node": ">=22.16.0"
|