@arcbridge/adapters 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +54 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +285 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Achim Kuehn
|
|
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,54 @@
|
|
|
1
|
+
# @arcbridge/adapters
|
|
2
|
+
|
|
3
|
+
Platform adapters for ArcBridge — generate AI agent configurations for Claude Code and GitHub Copilot.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @arcbridge/adapters
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
Translates ArcBridge's canonical agent role definitions (`.arcbridge/agents/*.md`) into platform-specific configurations:
|
|
14
|
+
|
|
15
|
+
- **Claude Code** — Generates `CLAUDE.md` project instructions and `.claude/agents/*.md` agent files
|
|
16
|
+
- **GitHub Copilot** — Generates `.github/copilot-instructions.md` and `.github/agents/*.md` agent files
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { getAdapter, ClaudeAdapter, CopilotAdapter } from "@arcbridge/adapters";
|
|
22
|
+
|
|
23
|
+
// By name
|
|
24
|
+
const adapter = getAdapter("claude"); // or "copilot"
|
|
25
|
+
const files = adapter.generate(projectRoot, roles, projectName);
|
|
26
|
+
// files: { path: string, content: string }[]
|
|
27
|
+
|
|
28
|
+
// Or directly
|
|
29
|
+
const claude = new ClaudeAdapter();
|
|
30
|
+
const copilot = new CopilotAdapter();
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Each adapter implements the `PlatformAdapter` interface:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
interface PlatformAdapter {
|
|
37
|
+
generate(
|
|
38
|
+
projectRoot: string,
|
|
39
|
+
roles: AgentRole[],
|
|
40
|
+
projectName: string,
|
|
41
|
+
): { path: string; content: string }[];
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Supported Platforms
|
|
46
|
+
|
|
47
|
+
| Platform | Output Files |
|
|
48
|
+
|----------|-------------|
|
|
49
|
+
| Claude Code | `CLAUDE.md`, `.claude/agents/*.md` |
|
|
50
|
+
| GitHub Copilot | `.github/copilot-instructions.md`, `.github/agents/*.md` |
|
|
51
|
+
|
|
52
|
+
## License
|
|
53
|
+
|
|
54
|
+
[MIT](../../LICENSE)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ArcBridgeConfig, AgentRole } from '@arcbridge/core';
|
|
2
|
+
|
|
3
|
+
interface PlatformAdapter {
|
|
4
|
+
platform: string;
|
|
5
|
+
generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void;
|
|
6
|
+
generateAgentConfigs(targetDir: string, roles: AgentRole[]): void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
declare class ClaudeAdapter implements PlatformAdapter {
|
|
10
|
+
platform: string;
|
|
11
|
+
generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void;
|
|
12
|
+
generateAgentConfigs(targetDir: string, roles: AgentRole[]): void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
declare class CopilotAdapter implements PlatformAdapter {
|
|
16
|
+
platform: string;
|
|
17
|
+
generateProjectConfig(targetDir: string, config: ArcBridgeConfig): void;
|
|
18
|
+
generateAgentConfigs(targetDir: string, roles: AgentRole[]): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
declare function getAdapter(platform: string): PlatformAdapter;
|
|
22
|
+
|
|
23
|
+
export { ClaudeAdapter, CopilotAdapter, type PlatformAdapter, getAdapter };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// src/claude/claude-adapter.ts
|
|
2
|
+
import { mkdirSync, writeFileSync, existsSync, readFileSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
function generateClaudeMd(config) {
|
|
5
|
+
const lines = [
|
|
6
|
+
`# ${config.project_name}`,
|
|
7
|
+
"",
|
|
8
|
+
`> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,
|
|
9
|
+
"",
|
|
10
|
+
"## Project Overview",
|
|
11
|
+
"",
|
|
12
|
+
`- **Type:** ${config.project_type}`,
|
|
13
|
+
`- **Quality Priorities:** ${config.quality_priorities.join(", ")}`,
|
|
14
|
+
"",
|
|
15
|
+
"## How to Work in This Project",
|
|
16
|
+
"",
|
|
17
|
+
"This project follows the **Plan \u2192 Build \u2192 Sync \u2192 Review** convention using ArcBridge.",
|
|
18
|
+
"ArcBridge provides MCP tools that give you architectural awareness. **Use them throughout your work.**",
|
|
19
|
+
"",
|
|
20
|
+
"### Before Starting Any Work",
|
|
21
|
+
"",
|
|
22
|
+
"1. Check project status: `arcbridge_get_project_status`",
|
|
23
|
+
"2. Review current tasks: `arcbridge_get_current_tasks`",
|
|
24
|
+
"3. Activate the appropriate role (see below): `arcbridge_activate_role`",
|
|
25
|
+
"",
|
|
26
|
+
"### When Planning or Refining Architecture",
|
|
27
|
+
"",
|
|
28
|
+
'Activate the **architect** role: `arcbridge_activate_role({ role: "architect" })`',
|
|
29
|
+
"",
|
|
30
|
+
"Then use:",
|
|
31
|
+
"- `arcbridge_get_building_blocks` \u2014 view current architecture decomposition",
|
|
32
|
+
"- `arcbridge_get_quality_scenarios` \u2014 view quality requirements",
|
|
33
|
+
"- `arcbridge_get_open_questions` \u2014 find architectural gaps to resolve",
|
|
34
|
+
"- `arcbridge_propose_arc42_update` \u2014 propose doc updates from recent code changes",
|
|
35
|
+
"",
|
|
36
|
+
"### When Implementing Features",
|
|
37
|
+
"",
|
|
38
|
+
'Activate the **implementer** role: `arcbridge_activate_role({ role: "implementer" })`',
|
|
39
|
+
"",
|
|
40
|
+
"Then use:",
|
|
41
|
+
"- `arcbridge_get_guidance` \u2014 get context-aware guidance for the file/block you're working on",
|
|
42
|
+
"- `arcbridge_get_current_tasks` \u2014 check what tasks are expected in the current phase",
|
|
43
|
+
"- `arcbridge_search_symbols` / `arcbridge_get_symbol` \u2014 understand existing code",
|
|
44
|
+
"- `arcbridge_get_dependency_graph` \u2014 check module dependencies before adding new ones",
|
|
45
|
+
"- `arcbridge_update_task` \u2014 mark tasks as in-progress or done as you complete them",
|
|
46
|
+
"- `arcbridge_reindex` \u2014 re-index after significant code changes",
|
|
47
|
+
"",
|
|
48
|
+
"### After Implementing (Phase Boundary Review)",
|
|
49
|
+
"",
|
|
50
|
+
"Before completing a phase, consult the review roles. Not every role is needed every phase \u2014 use this guide:",
|
|
51
|
+
"",
|
|
52
|
+
"| Role | When to consult | How |",
|
|
53
|
+
"|------|----------------|-----|",
|
|
54
|
+
'| **code-reviewer** | Every phase | `arcbridge_activate_role({ role: "code-reviewer" })` then `arcbridge_get_practice_review` |',
|
|
55
|
+
'| **security-reviewer** | Phases with auth, uploads, API routes, user input | `arcbridge_activate_role({ role: "security-reviewer" })` then `arcbridge_run_role_check` |',
|
|
56
|
+
'| **quality-guardian** | Every 2nd phase, or when quality scenarios are linked | `arcbridge_activate_role({ role: "quality-guardian" })` then `arcbridge_get_practice_review` |',
|
|
57
|
+
'| **architect** | When drift is detected or architecture evolved significantly | `arcbridge_activate_role({ role: "architect" })` then `arcbridge_check_drift` |',
|
|
58
|
+
"",
|
|
59
|
+
"Then run the standard checks:",
|
|
60
|
+
"",
|
|
61
|
+
"1. **Drift check:** `arcbridge_check_drift` \u2014 catch undeclared dependencies and missing modules",
|
|
62
|
+
"2. **Verify scenarios:** `arcbridge_verify_scenarios` \u2014 run linked tests for quality scenarios",
|
|
63
|
+
"",
|
|
64
|
+
"### Completing a Phase",
|
|
65
|
+
"",
|
|
66
|
+
'Activate the **phase-manager** role: `arcbridge_activate_role({ role: "phase-manager" })`',
|
|
67
|
+
"",
|
|
68
|
+
"Then: `arcbridge_complete_phase` \u2014 validates three gates: all tasks done, no critical drift, must-have quality scenarios not failing.",
|
|
69
|
+
""
|
|
70
|
+
];
|
|
71
|
+
if (config.project_type === "nextjs-app-router" || config.project_type === "react-vite") {
|
|
72
|
+
lines.push(
|
|
73
|
+
"## React & Next.js Analysis",
|
|
74
|
+
"",
|
|
75
|
+
"- `arcbridge_get_component_graph` \u2014 view component hierarchy, props, state, and context usage",
|
|
76
|
+
"- `arcbridge_get_route_map` \u2014 view Next.js route tree (pages, layouts, API routes)",
|
|
77
|
+
"- `arcbridge_get_boundary_analysis` \u2014 analyze server/client boundaries and detect violations",
|
|
78
|
+
""
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
lines.push(
|
|
82
|
+
"## Agent Roles",
|
|
83
|
+
"",
|
|
84
|
+
"Activate roles with `arcbridge_activate_role` to get specialized context and tool guidance:",
|
|
85
|
+
"",
|
|
86
|
+
"| Role | When to Use |",
|
|
87
|
+
"|------|-------------|",
|
|
88
|
+
"| `architect` | Defining building blocks, reviewing dependencies, creating ADRs |",
|
|
89
|
+
"| `implementer` | Writing code within the established architecture |",
|
|
90
|
+
"| `security-reviewer` | Auditing auth, input validation, client/server boundaries |",
|
|
91
|
+
"| `quality-guardian` | Reviewing test coverage, quality scenarios, quality gates |",
|
|
92
|
+
"| `phase-manager` | Completing phases, managing task transitions |",
|
|
93
|
+
"| `code-reviewer` | Reviewing code for correctness, patterns, edge cases |",
|
|
94
|
+
"| `onboarding` | Understanding the project (for new developers) |",
|
|
95
|
+
"",
|
|
96
|
+
"Roles are defined in `.arcbridge/agents/` and `.claude/agents/`.",
|
|
97
|
+
""
|
|
98
|
+
);
|
|
99
|
+
return lines.join("\n");
|
|
100
|
+
}
|
|
101
|
+
function generateAgentFile(role) {
|
|
102
|
+
const lines = [
|
|
103
|
+
`# ${role.name}`,
|
|
104
|
+
"",
|
|
105
|
+
role.description,
|
|
106
|
+
"",
|
|
107
|
+
"## Tools",
|
|
108
|
+
"",
|
|
109
|
+
...role.required_tools.map((t) => `- ${t}`),
|
|
110
|
+
""
|
|
111
|
+
];
|
|
112
|
+
if (role.denied_tools.length > 0) {
|
|
113
|
+
lines.push("## Denied Tools", "", ...role.denied_tools.map((t) => `- ${t}`), "");
|
|
114
|
+
}
|
|
115
|
+
if (role.read_only) {
|
|
116
|
+
lines.push("## Access", "", "This role is **read-only**.", "");
|
|
117
|
+
}
|
|
118
|
+
if (role.quality_focus.length > 0) {
|
|
119
|
+
lines.push(
|
|
120
|
+
"## Quality Focus",
|
|
121
|
+
"",
|
|
122
|
+
...role.quality_focus.map((q) => `- ${q}`),
|
|
123
|
+
""
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
lines.push("## Instructions", "", role.system_prompt, "");
|
|
127
|
+
return lines.join("\n");
|
|
128
|
+
}
|
|
129
|
+
var ClaudeAdapter = class {
|
|
130
|
+
platform = "claude";
|
|
131
|
+
generateProjectConfig(targetDir, config) {
|
|
132
|
+
const content = generateClaudeMd(config);
|
|
133
|
+
writeFileSync(join(targetDir, "CLAUDE.md"), content, "utf-8");
|
|
134
|
+
const mcpJsonPath = join(targetDir, ".mcp.json");
|
|
135
|
+
if (!existsSync(mcpJsonPath)) {
|
|
136
|
+
const mcpConfig = {
|
|
137
|
+
mcpServers: {
|
|
138
|
+
arcbridge: {
|
|
139
|
+
command: "npx",
|
|
140
|
+
args: ["@arcbridge/mcp-server"]
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2) + "\n", "utf-8");
|
|
145
|
+
} else {
|
|
146
|
+
try {
|
|
147
|
+
const existing = JSON.parse(readFileSync(mcpJsonPath, "utf-8"));
|
|
148
|
+
if (!existing.mcpServers?.arcbridge) {
|
|
149
|
+
existing.mcpServers = existing.mcpServers ?? {};
|
|
150
|
+
existing.mcpServers.arcbridge = {
|
|
151
|
+
command: "npx",
|
|
152
|
+
args: ["@arcbridge/mcp-server"]
|
|
153
|
+
};
|
|
154
|
+
writeFileSync(mcpJsonPath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
155
|
+
}
|
|
156
|
+
} catch {
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
generateAgentConfigs(targetDir, roles) {
|
|
161
|
+
const agentsDir = join(targetDir, ".claude", "agents");
|
|
162
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
163
|
+
for (const role of roles) {
|
|
164
|
+
const content = generateAgentFile(role);
|
|
165
|
+
writeFileSync(join(agentsDir, `${role.role_id}.md`), content, "utf-8");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// src/copilot/copilot-adapter.ts
|
|
171
|
+
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "fs";
|
|
172
|
+
import { join as join2 } from "path";
|
|
173
|
+
function generateCopilotInstructions(config) {
|
|
174
|
+
const lines = [
|
|
175
|
+
`# ${config.project_name} - Copilot Instructions`,
|
|
176
|
+
"",
|
|
177
|
+
`> Auto-generated by ArcBridge. Edit .arcbridge/ files to update.`,
|
|
178
|
+
"",
|
|
179
|
+
"## Project Context",
|
|
180
|
+
"",
|
|
181
|
+
`This is a ${config.project_type} project.`,
|
|
182
|
+
"",
|
|
183
|
+
`**Quality Priorities:** ${config.quality_priorities.join(", ")}`,
|
|
184
|
+
"",
|
|
185
|
+
"## Architecture",
|
|
186
|
+
"",
|
|
187
|
+
"Architecture documentation is in `.arcbridge/arc42/`.",
|
|
188
|
+
"Quality scenarios are in `.arcbridge/arc42/10-quality-scenarios.yaml`.",
|
|
189
|
+
"Phase plan is in `.arcbridge/plan/`.",
|
|
190
|
+
"",
|
|
191
|
+
"## Code Intelligence",
|
|
192
|
+
"",
|
|
193
|
+
"Use ArcBridge MCP tools to explore the codebase:",
|
|
194
|
+
"- `arcbridge_search_symbols` \u2014 Search for functions, classes, types",
|
|
195
|
+
"- `arcbridge_get_symbol` \u2014 Get full details on a symbol",
|
|
196
|
+
"- `arcbridge_get_dependency_graph` \u2014 Analyze module dependencies",
|
|
197
|
+
"- `arcbridge_reindex` \u2014 Re-index after code changes",
|
|
198
|
+
"",
|
|
199
|
+
"## React & Next.js Analysis",
|
|
200
|
+
"",
|
|
201
|
+
"- `arcbridge_get_component_graph` \u2014 View component hierarchy, props, state, and context",
|
|
202
|
+
"- `arcbridge_get_route_map` \u2014 View Next.js route tree (pages, layouts, API routes)",
|
|
203
|
+
"- `arcbridge_get_boundary_analysis` \u2014 Analyze server/client boundaries",
|
|
204
|
+
"",
|
|
205
|
+
"## Architecture Bridge",
|
|
206
|
+
"",
|
|
207
|
+
"- `arcbridge_check_drift` \u2014 Detect architecture drift and boundary violations",
|
|
208
|
+
"- `arcbridge_get_guidance` \u2014 Get context-aware guidance for code changes",
|
|
209
|
+
"- `arcbridge_get_open_questions` \u2014 Surface architectural gaps",
|
|
210
|
+
"- `arcbridge_propose_arc42_update` \u2014 Generate arc42 update proposals from code changes",
|
|
211
|
+
"- `arcbridge_get_practice_review` \u2014 Review recent changes across 5 practice dimensions",
|
|
212
|
+
"",
|
|
213
|
+
"## Conventions",
|
|
214
|
+
"",
|
|
215
|
+
"- Follow existing patterns in the codebase",
|
|
216
|
+
"- Stay within building block boundaries",
|
|
217
|
+
"- Write tests for new functionality",
|
|
218
|
+
"- Check quality scenarios before submitting changes",
|
|
219
|
+
""
|
|
220
|
+
];
|
|
221
|
+
return lines.join("\n");
|
|
222
|
+
}
|
|
223
|
+
function generateAgentFile2(role) {
|
|
224
|
+
const lines = [
|
|
225
|
+
`# ${role.name}`,
|
|
226
|
+
"",
|
|
227
|
+
role.description,
|
|
228
|
+
""
|
|
229
|
+
];
|
|
230
|
+
if (role.read_only) {
|
|
231
|
+
lines.push("**Access:** Read-only", "");
|
|
232
|
+
}
|
|
233
|
+
if (role.quality_focus.length > 0) {
|
|
234
|
+
lines.push(
|
|
235
|
+
"## Quality Focus",
|
|
236
|
+
"",
|
|
237
|
+
...role.quality_focus.map((q) => `- ${q}`),
|
|
238
|
+
""
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
lines.push("## Instructions", "", role.system_prompt, "");
|
|
242
|
+
return lines.join("\n");
|
|
243
|
+
}
|
|
244
|
+
var CopilotAdapter = class {
|
|
245
|
+
platform = "copilot";
|
|
246
|
+
generateProjectConfig(targetDir, config) {
|
|
247
|
+
const githubDir = join2(targetDir, ".github");
|
|
248
|
+
mkdirSync2(githubDir, { recursive: true });
|
|
249
|
+
const content = generateCopilotInstructions(config);
|
|
250
|
+
writeFileSync2(
|
|
251
|
+
join2(githubDir, "copilot-instructions.md"),
|
|
252
|
+
content,
|
|
253
|
+
"utf-8"
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
generateAgentConfigs(targetDir, roles) {
|
|
257
|
+
const agentsDir = join2(targetDir, ".github", "agents");
|
|
258
|
+
mkdirSync2(agentsDir, { recursive: true });
|
|
259
|
+
for (const role of roles) {
|
|
260
|
+
const content = generateAgentFile2(role);
|
|
261
|
+
writeFileSync2(join2(agentsDir, `${role.role_id}.md`), content, "utf-8");
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// src/index.ts
|
|
267
|
+
var adapters = {
|
|
268
|
+
claude: () => new ClaudeAdapter(),
|
|
269
|
+
copilot: () => new CopilotAdapter()
|
|
270
|
+
};
|
|
271
|
+
function getAdapter(platform) {
|
|
272
|
+
const factory = adapters[platform];
|
|
273
|
+
if (!factory) {
|
|
274
|
+
throw new Error(
|
|
275
|
+
`Unknown platform: ${platform}. Available: ${Object.keys(adapters).join(", ")}`
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
return factory();
|
|
279
|
+
}
|
|
280
|
+
export {
|
|
281
|
+
ClaudeAdapter,
|
|
282
|
+
CopilotAdapter,
|
|
283
|
+
getAdapter
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/claude/claude-adapter.ts","../src/copilot/copilot-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 content = generateClaudeMd(config);\n writeFileSync(join(targetDir, \"CLAUDE.md\"), content, \"utf-8\");\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","export type { PlatformAdapter } from \"./types.js\";\nexport { ClaudeAdapter } from \"./claude/claude-adapter.js\";\nexport { CopilotAdapter } from \"./copilot/copilot-adapter.js\";\n\nimport type { PlatformAdapter } from \"./types.js\";\nimport { ClaudeAdapter } from \"./claude/claude-adapter.js\";\nimport { CopilotAdapter } from \"./copilot/copilot-adapter.js\";\n\nconst adapters: Record<string, () => PlatformAdapter> = {\n claude: () => new ClaudeAdapter(),\n copilot: () => new CopilotAdapter(),\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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arcbridge/adapters",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Platform adapters for ArcBridge — Claude Code and GitHub Copilot config generators",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/bifteki-crew/arcbridge.git",
|
|
13
|
+
"directory": "packages/adapters"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"arcbridge",
|
|
17
|
+
"claude",
|
|
18
|
+
"copilot",
|
|
19
|
+
"ai-agents"
|
|
20
|
+
],
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"main": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"import": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@arcbridge/core": "0.1.0"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsup",
|
|
39
|
+
"clean": "rm -rf dist"
|
|
40
|
+
}
|
|
41
|
+
}
|