@ryuenn3123/agentic-senior-core 5.2.0 → 5.3.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/CONVENTIONS.md ADDED
@@ -0,0 +1,94 @@
1
+ # Agentic Senior Core
2
+
3
+ You write code like a staff engineer. Efficient, safe, maintainable.
4
+ The best code is the code never written. Write only what the task needs.
5
+
6
+ Before writing any code, stop at the first step that holds:
7
+
8
+ 1. Does this need to be built at all?
9
+ 2. Does the codebase already have this? Reuse it.
10
+ 3. Does the standard library or a native platform feature cover it? Use it.
11
+ 4. Does an already-installed dependency solve it? Use it.
12
+ 5. Can this be one straightforward function? Write it.
13
+ 6. Only then: write the minimum code that works.
14
+
15
+ ## Code Quality
16
+
17
+ - Descriptive variable and function names. No cryptic abbreviations.
18
+ - Early returns over deep nesting. Keep the main flow traceable.
19
+ - No clever hacks, code golfing, deeply nested ternaries, or tricky functional chains.
20
+ - No premature abstraction. Direct procedural flow over helper chains when no real duplication exists.
21
+ - Delete code that carries no behavior, safety, or test value.
22
+
23
+ ## Architecture
24
+
25
+ - Explicit module boundaries. Group by feature or domain.
26
+ - No custom crypto, state management, or routing when standard libraries exist.
27
+ - Controllers handle protocol translation only. Business logic belongs in services.
28
+ - Default to modular monolith unless scale evidence demands microservices.
29
+ - Do not choose framework by habit. Match project evidence and needs.
30
+
31
+ ## Security (never skip)
32
+
33
+ - Validate and normalize ALL inputs at trust boundaries.
34
+ - Parameterize all queries. Never interpolate input into SQL or shell commands.
35
+ - Never commit secrets, tokens, or credentials. Inject via environment variables.
36
+ - Enforce resource-level authorization, not just authentication.
37
+ - Error responses and logs must not leak stack traces, internals, or PII.
38
+ - Encode output for user-controlled content to prevent XSS.
39
+
40
+ ## Error Handling
41
+
42
+ - Fail fast on invalid input.
43
+ - Structured error responses with safe details only.
44
+ - Distinguish client errors (4xx) from server errors (5xx).
45
+ - No silent swallowing. Log operational errors with context.
46
+
47
+ ## Testing
48
+
49
+ - Write tests for business logic and boundary failures, not implementation details.
50
+ - Cover happy path, error paths, edge cases.
51
+ - Tests must be fast, isolated, deterministic.
52
+ - Integration tests for critical data paths.
53
+
54
+ ## API Design
55
+
56
+ - Bounded list reads: always paginate or set explicit limits.
57
+ - Idempotent for side-effect mutations.
58
+ - Backward-compatible by default. Version breaking changes explicitly.
59
+ - Sync docs in the same commit when changing API or schema.
60
+
61
+ ## Database
62
+
63
+ - Avoid N+1 queries. Paginate all growable datasets.
64
+ - Multi-table mutations run inside transactions.
65
+ - Monetary amounts: integer minor units or exact decimal. Never floats.
66
+ - Schema changes require versioned, reversible migrations.
67
+
68
+ ## Frontend
69
+
70
+ - Semantic HTML before custom components.
71
+ - WCAG 2.2 AA accessibility floor.
72
+ - Responsive by default. Handle empty, loading, error, offline states.
73
+
74
+ ## Infrastructure
75
+
76
+ - Container configs: multi-stage builds, non-root users, no baked secrets.
77
+ - Configuration from environment, validated at startup.
78
+ - Structured logging with correlation IDs.
79
+
80
+ ## Resilience
81
+
82
+ - Every outbound call has a strict timeout.
83
+ - Retries use exponential backoff with jitter. Only retry idempotent operations.
84
+ - Circuit breakers for unhealthy dependencies.
85
+
86
+ ## Async and Events
87
+
88
+ - Events are immutable. Consumers are idempotent.
89
+ - Dead-letter queues for failed messages.
90
+ - Background jobs have timeouts and retry limits.
91
+
92
+ ## Response Style
93
+
94
+ Write the smallest complete answer. Remove greetings, narration, padding. Preserve exact commands, file paths, error messages, validation status, risks, and next actions.
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
8
8
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
9
9
 
10
- **Install once. Works across all projects. Supports 16+ AI coding agents.**
10
+ **Install once. Works across all projects. Supports 23+ AI coding agents.**
11
11
 
12
12
  </div>
13
13
 
@@ -75,13 +75,21 @@ This copies one file to `.cursor/rules/agentic-senior-core.mdc`. Cursor reads it
75
75
  </details>
76
76
 
77
77
  <details>
78
- <summary><b>Windsurf</b> (IDE)</summary>
78
+ <summary><b>Windsurf / Devin Desktop</b> (IDE)</summary>
79
+
80
+ Windsurf was acquired by Cognition and renamed to Devin Desktop. Use `--devin` for the preferred path:
81
+
82
+ ```bash
83
+ asc adapter --devin
84
+ ```
85
+
86
+ This copies one file to `.devin/rules/agentic-senior-core.md`. For legacy Windsurf installations:
79
87
 
80
88
  ```bash
81
89
  asc adapter --windsurf
82
90
  ```
83
91
 
84
- Copies one file to `.windsurf/rules/agentic-senior-core.md`. Repeat per project.
92
+ Repeat per project.
85
93
 
86
94
  </details>
87
95
 
@@ -119,26 +127,112 @@ Copies one file to `.kiro/steering/agentic-senior-core.md`. Repeat per project.
119
127
  </details>
120
128
 
121
129
  <details>
122
- <summary><b>Google Antigravity</b> (IDE)</summary>
130
+ <summary><b>Continue</b> (VS Code extension)</summary>
131
+
132
+ ```bash
133
+ asc adapter --continue
134
+ ```
135
+
136
+ Copies one file to `.continue/rules/agentic-senior-core.md`. Repeat per project.
137
+
138
+ </details>
139
+
140
+ <details>
141
+ <summary><b>Zed</b> (IDE)</summary>
142
+
143
+ ```bash
144
+ asc adapter --zed
145
+ ```
146
+
147
+ Copies one file to `.zed/rules/agentic-senior-core.md`. Zed also reads `AGENTS.md` natively, so this is optional if you already have AGENTS.md in your project. Repeat per project.
148
+
149
+ </details>
150
+
151
+ <details>
152
+ <summary><b>Aider</b> (terminal agent)</summary>
153
+
154
+ ```bash
155
+ asc adapter --aider
156
+ ```
157
+
158
+ Copies one file to `CONVENTIONS.md` at project root. Aider reads this automatically. Repeat per project.
159
+
160
+ </details>
161
+
162
+ <details>
163
+ <summary><b>Kilo Code</b> (VS Code extension)</summary>
164
+
165
+ ```bash
166
+ asc adapter --kilocode
167
+ ```
168
+
169
+ Copies one file to `.kilocode/rules/agentic-senior-core.md`. Repeat per project.
170
+
171
+ </details>
172
+
173
+ <details>
174
+ <summary><b>Roo Code</b> (VS Code extension)</summary>
175
+
176
+ ```bash
177
+ asc adapter --roo
178
+ ```
179
+
180
+ Copies one file to `.roo/rules/agentic-senior-core.md`. Repeat per project.
181
+
182
+ </details>
183
+
184
+ <details>
185
+ <summary><b>OpenHands</b></summary>
186
+
187
+ ```bash
188
+ asc adapter --openhands
189
+ ```
190
+
191
+ Copies one file to `.openhands/microagents/agentic-senior-core.md`. Repeat per project.
192
+
193
+ </details>
194
+
195
+ <details>
196
+ <summary><b>Google Antigravity IDE</b></summary>
123
197
 
124
198
  **Option A -- workspace rules (per project):**
125
199
 
126
- Copy `.agents/rules/agentic-senior-core.md` into your project. Antigravity reads it automatically with `trigger: always_on`.
200
+ Copy the rules file into your project's `.agents/rules/` directory:
201
+
202
+ ```bash
203
+ # From the npm package (after Step 1)
204
+ cp "$(npm root -g)/@ryuenn3123/agentic-senior-core/.agents/rules/agentic-senior-core.md" .agents/rules/
205
+ ```
206
+
207
+ Antigravity IDE reads it automatically with `trigger: always_on`.
127
208
 
128
209
  **Option B -- global plugin (all projects):**
129
210
 
211
+ Copy the plugin bundle to Antigravity's global plugin directory:
212
+
130
213
  ```bash
131
- # Via Antigravity CLI
132
- agy plugin install https://github.com/fatidaprilian/Agentic-Senior-Core.git
214
+ # Windows
215
+ xcopy /E /I "%APPDATA%\npm\node_modules\@ryuenn3123\agentic-senior-core\.agents\plugins\agentic-senior-core" "%USERPROFILE%\.gemini\config\plugins\agentic-senior-core"
133
216
 
134
- # Or manually copy the plugin bundle to:
135
- # ~/.gemini/config/plugins/agentic-senior-core/
217
+ # macOS / Linux
218
+ cp -r "$(npm root -g)/@ryuenn3123/agentic-senior-core/.agents/plugins/agentic-senior-core" ~/.gemini/config/plugins/
136
219
  ```
137
220
 
138
221
  The plugin bundle includes rules, skills (`/asc-review`, `/asc-audit`, `/asc-refactor`), and `plugin.json`.
139
222
 
140
223
  </details>
141
224
 
225
+ <details>
226
+ <summary><b>Google Antigravity CLI</b></summary>
227
+
228
+ Requires [Antigravity CLI](https://antigravity.google) (`agy`) installed separately.
229
+
230
+ ```bash
231
+ agy plugin install https://github.com/fatidaprilian/Agentic-Senior-Core.git
232
+ ```
233
+
234
+ </details>
235
+
142
236
  <details>
143
237
  <summary><b>Devin / Hermes / OpenCode / OpenClaw</b></summary>
144
238
 
@@ -153,12 +247,12 @@ Plugin manifests ship in the npm package at their standard paths (`.devin-plugin
153
247
  asc adapter --all
154
248
  ```
155
249
 
156
- Generates adapter files for Cursor, Windsurf, Cline, Copilot, and Kiro in one go.
250
+ Generates adapter files for Cursor, Devin Desktop, Windsurf, Cline, Copilot, Kiro, Continue, Zed, Aider, Kilo Code, Roo Code, and OpenHands in one go.
157
251
 
158
252
  </details>
159
253
 
160
254
  **Terminal agents** (Claude Code, Codex, Gemini, Copilot CLI) = install once, always-on, zero per-project files.
161
- **IDE agents** (Cursor, Windsurf, Cline, Copilot VS Code, Kiro, Antigravity) = one file per project via `asc adapter` or copy.
255
+ **IDE agents** (Cursor, Devin Desktop, Cline, Copilot VS Code, Kiro, Continue, Zed, Aider, Kilo Code, Roo Code, OpenHands, Antigravity) = one file per project via `asc adapter` or copy.
162
256
 
163
257
  ### Updating
164
258
 
@@ -205,12 +299,20 @@ Input validation at trust boundaries, parameterized queries, auth checks, error
205
299
  | Hermes | Terminal agent | Plugin registration | No |
206
300
  | OpenCode | Terminal agent | Auto-detected | No |
207
301
  | OpenClaw | Terminal agent | Auto-detected | No |
208
- | Antigravity | IDE | `agy plugin install` or copy rules | No (plugin) / Yes (rules) |
302
+ | Antigravity IDE | IDE | Copy rules or plugin bundle | No (global) / Yes (rules) |
303
+ | Antigravity CLI | Terminal agent | `agy plugin install` | No |
209
304
  | Cursor | IDE | `asc adapter --cursor` | Yes (1 file) |
210
- | Windsurf | IDE | `asc adapter --windsurf` | Yes (1 file) |
305
+ | Devin Desktop | IDE | `asc adapter --devin` | Yes (1 file) |
306
+ | Windsurf (legacy) | IDE | `asc adapter --windsurf` | Yes (1 file) |
211
307
  | Cline | VS Code ext | `asc adapter --cline` | Yes (1 file) |
212
308
  | GitHub Copilot | VS Code ext | `asc adapter --copilot` | Yes (1 file) |
213
309
  | Kiro | IDE | `asc adapter --kiro` | Yes (1 file) |
310
+ | Continue | VS Code ext | `asc adapter --continue` | Yes (1 file) |
311
+ | Zed | IDE | `asc adapter --zed` | Yes (1 file) |
312
+ | Aider | Terminal agent | `asc adapter --aider` | Yes (1 file) |
313
+ | Kilo Code | VS Code ext | `asc adapter --kilocode` | Yes (1 file) |
314
+ | Roo Code | VS Code ext | `asc adapter --roo` | Yes (1 file) |
315
+ | OpenHands | Agent | `asc adapter --openhands` | Yes (1 file) |
214
316
 
215
317
  ---
216
318
 
@@ -230,7 +332,8 @@ Available on plugin hosts (Claude Code, Codex, Gemini CLI):
230
332
  ## CLI
231
333
 
232
334
  ```bash
233
- asc adapter [--cursor|--windsurf|--cline|--copilot|--kiro|--all]
335
+ asc adapter [--cursor|--devin|--windsurf|--cline|--copilot|--kiro|--continue|--zed|--aider|--kilocode|--roo|--openhands|--all]
336
+ asc uninstall [--dry-run]
234
337
  asc clean [--dry-run]
235
338
  asc status
236
339
  asc mcp
@@ -3,10 +3,11 @@
3
3
  * Agentic-Senior-Core CLI v5 -- Universal plugin system.
4
4
  *
5
5
  * Commands:
6
- * adapter Generate instruction-tier adapter files for IDEs without plugin support
7
- * clean Remove v4 per-project artifacts (.agent-context/, bridge files)
8
- * status Show detected IDEs and install hints
9
- * mcp Start MCP stdio server
6
+ * adapter Generate instruction-tier adapter files for IDEs without plugin support
7
+ * uninstall Remove ASC adapter files from the current project
8
+ * clean Remove v4 per-project artifacts (.agent-context/, bridge files)
9
+ * status Show detected IDEs and install hints
10
+ * mcp Start MCP stdio server
10
11
  */
11
12
  import { exit } from 'node:process';
12
13
  import { readFileSync } from 'node:fs';
@@ -25,9 +26,10 @@ function printUsage() {
25
26
  console.log(' Claude Code: /plugin marketplace add fatidaprilian/Agentic-Senior-Core');
26
27
  console.log(' Codex CLI: codex plugins install agentic-senior-core\n');
27
28
  console.log('Adapter install (one file per project):');
28
- console.log(' asc adapter --cursor --windsurf --cline --copilot --kiro --all\n');
29
+ console.log(' asc adapter --cursor --devin --cline --copilot --kiro --continue --zed --aider --kilocode --roo --openhands --windsurf --all\n');
29
30
  console.log('Commands:');
30
31
  console.log(' adapter Generate instruction-tier adapter files');
32
+ console.log(' uninstall Remove ASC adapter files from this project');
31
33
  console.log(' clean Remove v4 per-project artifacts');
32
34
  console.log(' status Show detected IDEs and install hints');
33
35
  console.log(' mcp Start MCP stdio server');
@@ -55,6 +57,12 @@ async function main() {
55
57
  return;
56
58
  }
57
59
 
60
+ if (commandArgument === 'uninstall') {
61
+ const { runUninstallCommand } = await import('../lib/cli/commands/uninstall.mjs');
62
+ await runUninstallCommand(commandArguments);
63
+ return;
64
+ }
65
+
58
66
  if (commandArgument === 'clean') {
59
67
  const { runCleanCommand } = await import('../lib/cli/commands/clean.mjs');
60
68
  await runCleanCommand(commandArguments);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "5.2.0",
3
+ "version": "5.3.0",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "author": "fatidaprilian",
6
6
  "license": "MIT",
@@ -13,10 +13,15 @@ const ADAPTER_TARGETS = {
13
13
  sourcePath: '.cursor/rules/agentic-senior-core.mdc',
14
14
  },
15
15
  windsurf: {
16
- label: 'Windsurf',
16
+ label: 'Windsurf (legacy)',
17
17
  targetPath: '.windsurf/rules/agentic-senior-core.md',
18
18
  sourcePath: '.windsurf/rules/agentic-senior-core.md',
19
19
  },
20
+ devin: {
21
+ label: 'Devin Desktop',
22
+ targetPath: '.devin/rules/agentic-senior-core.md',
23
+ sourcePath: '.devin/rules/agentic-senior-core.md',
24
+ },
20
25
  cline: {
21
26
  label: 'Cline',
22
27
  targetPath: '.clinerules/agentic-senior-core.md',
@@ -32,6 +37,36 @@ const ADAPTER_TARGETS = {
32
37
  targetPath: '.kiro/steering/agentic-senior-core.md',
33
38
  sourcePath: '.kiro/steering/agentic-senior-core.md',
34
39
  },
40
+ continue: {
41
+ label: 'Continue',
42
+ targetPath: '.continue/rules/agentic-senior-core.md',
43
+ sourcePath: '.continue/rules/agentic-senior-core.md',
44
+ },
45
+ zed: {
46
+ label: 'Zed',
47
+ targetPath: '.zed/rules/agentic-senior-core.md',
48
+ sourcePath: '.zed/rules/agentic-senior-core.md',
49
+ },
50
+ aider: {
51
+ label: 'Aider',
52
+ targetPath: 'CONVENTIONS.md',
53
+ sourcePath: 'CONVENTIONS.md',
54
+ },
55
+ kilocode: {
56
+ label: 'Kilo Code',
57
+ targetPath: '.kilocode/rules/agentic-senior-core.md',
58
+ sourcePath: '.kilocode/rules/agentic-senior-core.md',
59
+ },
60
+ roo: {
61
+ label: 'Roo Code',
62
+ targetPath: '.roo/rules/agentic-senior-core.md',
63
+ sourcePath: '.roo/rules/agentic-senior-core.md',
64
+ },
65
+ openhands: {
66
+ label: 'OpenHands',
67
+ targetPath: '.openhands/microagents/agentic-senior-core.md',
68
+ sourcePath: '.openhands/microagents/agentic-senior-core.md',
69
+ },
35
70
  };
36
71
 
37
72
  async function pathExists(filePath) {
@@ -87,7 +122,7 @@ export async function runAdapterCommand(commandArguments) {
87
122
 
88
123
  if (requestedAdapters.length === 0) {
89
124
  console.log('Agentic Senior Core -- Adapter Generator\n');
90
- console.log('Usage: asc adapter [--cursor] [--windsurf] [--cline] [--copilot] [--kiro] [--all]\n');
125
+ console.log('Usage: asc adapter [--cursor] [--devin] [--cline] [--copilot] [--kiro] [--continue] [--zed] [--aider] [--kilocode] [--roo] [--openhands] [--windsurf] [--all]\n');
91
126
  console.log('Generates instruction-tier adapter files for IDEs without plugin support.');
92
127
  console.log('Each adapter is a single file containing the universal coding rules.\n');
93
128
  console.log('Available adapters:');
@@ -1,62 +1,131 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import os from 'node:os';
4
+ import { execSync } from 'node:child_process';
4
5
 
5
6
  const HOME = os.homedir();
7
+ const IS_WIN = process.platform === 'win32';
8
+ const IS_MAC = process.platform === 'darwin';
9
+
10
+ function commandExists(name) {
11
+ try {
12
+ execSync(IS_WIN ? `where ${name}` : `which ${name}`, { stdio: 'ignore' });
13
+ return true;
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
6
18
 
7
19
  const IDE_CHECKS = [
8
20
  {
9
21
  name: 'Claude Code',
10
22
  type: 'plugin',
11
- checkPaths: [
12
- path.join(HOME, '.claude'),
13
- ],
14
- installHint: '/plugin marketplace add fatidaprilian/Agentic-Senior-Core',
23
+ checkPaths: [path.join(HOME, '.claude')],
24
+ installHint: 'claude plugin add fatidaprilian/Agentic-Senior-Core',
15
25
  },
16
26
  {
17
27
  name: 'Codex CLI',
18
28
  type: 'plugin',
19
- checkPaths: [
20
- path.join(HOME, '.codex'),
21
- ],
29
+ checkPaths: [path.join(HOME, '.codex')],
22
30
  installHint: 'codex plugins install agentic-senior-core',
23
31
  },
24
32
  {
25
33
  name: 'Gemini CLI',
26
34
  type: 'plugin',
27
- checkPaths: [
28
- path.join(HOME, '.gemini'),
29
- ],
35
+ checkPaths: [path.join(HOME, '.gemini')],
30
36
  installHint: 'Auto-detected via gemini-extension.json',
31
37
  },
38
+ {
39
+ name: 'Antigravity',
40
+ type: 'plugin',
41
+ checkPaths: [path.join(HOME, '.gemini')],
42
+ checkCommands: ['agy'],
43
+ installHint: 'agy plugin install https://github.com/fatidaprilian/Agentic-Senior-Core.git',
44
+ },
32
45
  {
33
46
  name: 'Cursor',
34
47
  type: 'adapter',
35
48
  checkPaths: [
36
49
  path.join(HOME, '.cursor'),
37
- path.join(HOME, 'AppData', 'Roaming', 'Cursor'),
38
- path.join(HOME, '.config', 'Cursor'),
50
+ ...(IS_WIN ? [path.join(HOME, 'AppData', 'Roaming', 'Cursor')] : []),
51
+ ...(!IS_WIN ? [path.join(HOME, '.config', 'Cursor')] : []),
39
52
  ],
40
53
  installHint: 'asc adapter --cursor',
41
54
  },
42
55
  {
43
- name: 'Windsurf',
56
+ name: 'Devin Desktop',
44
57
  type: 'adapter',
45
58
  checkPaths: [
59
+ path.join(HOME, '.devin'),
46
60
  path.join(HOME, '.codeium'),
47
- path.join(HOME, '.windsurf'),
61
+ ...(IS_WIN ? [path.join(HOME, 'AppData', 'Roaming', 'Windsurf')] : []),
48
62
  ],
49
- installHint: 'asc adapter --windsurf',
63
+ installHint: 'asc adapter --devin',
50
64
  },
51
65
  {
52
66
  name: 'Cline',
53
67
  type: 'adapter',
54
68
  checkPaths: [
55
- path.join(HOME, 'Documents', 'Cline'),
56
69
  path.join(HOME, '.cline'),
70
+ ...(IS_WIN ? [path.join(HOME, 'Documents', 'Cline')] : []),
57
71
  ],
58
72
  installHint: 'asc adapter --cline',
59
73
  },
74
+ {
75
+ name: 'GitHub Copilot',
76
+ type: 'adapter',
77
+ checkPaths: [
78
+ path.join(HOME, '.config', 'github-copilot'),
79
+ ...(IS_WIN ? [path.join(HOME, 'AppData', 'Local', 'GitHub Copilot')] : []),
80
+ ],
81
+ installHint: 'asc adapter --copilot',
82
+ },
83
+ {
84
+ name: 'Kiro',
85
+ type: 'adapter',
86
+ checkPaths: [path.join(HOME, '.kiro')],
87
+ installHint: 'asc adapter --kiro',
88
+ },
89
+ {
90
+ name: 'Continue',
91
+ type: 'adapter',
92
+ checkPaths: [path.join(HOME, '.continue')],
93
+ installHint: 'asc adapter --continue',
94
+ },
95
+ {
96
+ name: 'Zed',
97
+ type: 'adapter',
98
+ checkPaths: [
99
+ path.join(HOME, '.config', 'zed'),
100
+ ...(IS_MAC ? [path.join(HOME, 'Library', 'Application Support', 'Zed')] : []),
101
+ ],
102
+ installHint: 'asc adapter --zed',
103
+ },
104
+ {
105
+ name: 'Aider',
106
+ type: 'adapter',
107
+ checkPaths: [],
108
+ checkCommands: ['aider'],
109
+ installHint: 'asc adapter --aider',
110
+ },
111
+ {
112
+ name: 'Kilo Code',
113
+ type: 'adapter',
114
+ checkPaths: [path.join(HOME, '.kilocode')],
115
+ installHint: 'asc adapter --kilocode',
116
+ },
117
+ {
118
+ name: 'Roo Code',
119
+ type: 'adapter',
120
+ checkPaths: [path.join(HOME, '.roo')],
121
+ installHint: 'asc adapter --roo',
122
+ },
123
+ {
124
+ name: 'OpenHands',
125
+ type: 'adapter',
126
+ checkPaths: [path.join(HOME, '.openhands')],
127
+ installHint: 'asc adapter --openhands',
128
+ },
60
129
  ];
61
130
 
62
131
  async function pathExists(filePath) {
@@ -69,10 +138,11 @@ async function pathExists(filePath) {
69
138
  }
70
139
 
71
140
  export async function runStatusCommand() {
72
- console.log('Agentic Senior Core -- IDE Status\n');
141
+ console.log('Agentic Senior Core -- Host Status\n');
73
142
 
74
143
  for (const ide of IDE_CHECKS) {
75
144
  let detected = false;
145
+
76
146
  for (const checkPath of ide.checkPaths) {
77
147
  if (await pathExists(checkPath)) {
78
148
  detected = true;
@@ -80,9 +150,18 @@ export async function runStatusCommand() {
80
150
  }
81
151
  }
82
152
 
153
+ if (!detected && ide.checkCommands) {
154
+ for (const cmd of ide.checkCommands) {
155
+ if (commandExists(cmd)) {
156
+ detected = true;
157
+ break;
158
+ }
159
+ }
160
+ }
161
+
83
162
  const icon = detected ? '[x]' : '[ ]';
84
163
  const support = ide.type === 'plugin' ? '(plugin)' : '(adapter)';
85
- console.log(` ${icon} ${ide.name.padEnd(15)} ${support.padEnd(10)} ${detected ? 'detected' : 'not found'}`);
164
+ console.log(` ${icon} ${ide.name.padEnd(18)} ${support.padEnd(10)} ${detected ? 'detected' : 'not found'}`);
86
165
 
87
166
  if (detected) {
88
167
  console.log(` Install: ${ide.installHint}`);
@@ -91,4 +170,5 @@ export async function runStatusCommand() {
91
170
 
92
171
  console.log('\nPlugin hosts get always-on rules via SessionStart hook.');
93
172
  console.log('Adapter hosts need one file per project via "asc adapter".');
173
+ console.log('\nTip: run "asc adapter --all" to generate adapters for all supported hosts.');
94
174
  }
@@ -0,0 +1,80 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+
4
+ const ASC_SIGNATURE = '# Agentic Senior Core';
5
+
6
+ const ADAPTER_FILES = [
7
+ { label: 'Cursor', path: '.cursor/rules/agentic-senior-core.mdc' },
8
+ { label: 'Windsurf (legacy)', path: '.windsurf/rules/agentic-senior-core.md' },
9
+ { label: 'Devin Desktop', path: '.devin/rules/agentic-senior-core.md' },
10
+ { label: 'Cline', path: '.clinerules/agentic-senior-core.md' },
11
+ { label: 'GitHub Copilot', path: '.github/copilot-instructions.md' },
12
+ { label: 'Kiro', path: '.kiro/steering/agentic-senior-core.md' },
13
+ { label: 'Continue', path: '.continue/rules/agentic-senior-core.md' },
14
+ { label: 'Zed', path: '.zed/rules/agentic-senior-core.md' },
15
+ { label: 'Aider', path: 'CONVENTIONS.md' },
16
+ { label: 'Kilo Code', path: '.kilocode/rules/agentic-senior-core.md' },
17
+ { label: 'Roo Code', path: '.roo/rules/agentic-senior-core.md' },
18
+ { label: 'OpenHands', path: '.openhands/microagents/agentic-senior-core.md' },
19
+ ];
20
+
21
+ async function pathExists(filePath) {
22
+ try {
23
+ await fs.access(filePath);
24
+ return true;
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ async function isAscFile(filePath) {
31
+ try {
32
+ const content = await fs.readFile(filePath, 'utf8');
33
+ return content.includes(ASC_SIGNATURE);
34
+ } catch {
35
+ return false;
36
+ }
37
+ }
38
+
39
+ export async function runUninstallCommand(commandArguments) {
40
+ const targetDirectory = process.cwd();
41
+ const dryRun = commandArguments.includes('--dry-run');
42
+
43
+ console.log('Agentic Senior Core -- Uninstall adapters\n');
44
+ console.log(`Target: ${targetDirectory}`);
45
+ if (dryRun) console.log('Mode: dry-run (no files will be deleted)\n');
46
+ else console.log('');
47
+
48
+ let found = 0;
49
+ let removed = 0;
50
+
51
+ for (const adapter of ADAPTER_FILES) {
52
+ const fullPath = path.join(targetDirectory, adapter.path);
53
+ if (!(await pathExists(fullPath))) continue;
54
+ if (!(await isAscFile(fullPath))) {
55
+ console.log(` skip: ${adapter.path} (not an ASC file)`);
56
+ continue;
57
+ }
58
+
59
+ found++;
60
+
61
+ if (dryRun) {
62
+ console.log(` would remove: ${adapter.path} (${adapter.label})`);
63
+ } else {
64
+ await fs.rm(fullPath);
65
+ console.log(` removed: ${adapter.path} (${adapter.label})`);
66
+ removed++;
67
+ }
68
+ }
69
+
70
+ if (found === 0) {
71
+ console.log('No ASC adapter files found in this project.');
72
+ return;
73
+ }
74
+
75
+ if (dryRun) {
76
+ console.log(`\n${found} adapter file(s) found. Run without --dry-run to remove.`);
77
+ } else {
78
+ console.log(`\n${removed} adapter file(s) removed.`);
79
+ }
80
+ }