@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/.agents/plugins/agentic-senior-core/skills/asc-adapter/SKILL.md +37 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.continue/rules/agentic-senior-core.md +94 -0
- package/.devin/rules/agentic-senior-core.md +94 -0
- package/.devin-plugin/plugin.json +1 -1
- package/.github/plugin/plugin.json +1 -1
- package/.kilocode/rules/agentic-senior-core.md +94 -0
- package/.openhands/microagents/agentic-senior-core.md +94 -0
- package/.roo/rules/agentic-senior-core.md +94 -0
- package/.zed/rules/agentic-senior-core.md +94 -0
- package/CONVENTIONS.md +94 -0
- package/README.md +117 -14
- package/bin/agentic-senior-core.js +13 -5
- package/gemini-extension.json +1 -1
- package/lib/cli/commands/adapter.mjs +37 -2
- package/lib/cli/commands/status.mjs +98 -18
- package/lib/cli/commands/uninstall.mjs +80 -0
- package/package.json +16 -1
- package/skills/asc-adapter/SKILL.md +37 -0
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)
|
|
8
8
|
[](CONTRIBUTING.md)
|
|
9
9
|
|
|
10
|
-
**Install once. Works across all projects. Supports
|
|
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
|
-
|
|
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>
|
|
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
|
|
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
|
-
#
|
|
132
|
-
|
|
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
|
-
#
|
|
135
|
-
|
|
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
|
|
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,
|
|
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 |
|
|
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
|
-
|
|
|
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
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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 --
|
|
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);
|
package/gemini-extension.json
CHANGED
|
@@ -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] [--
|
|
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
|
-
|
|
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: '
|
|
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, '
|
|
61
|
+
...(IS_WIN ? [path.join(HOME, 'AppData', 'Roaming', 'Windsurf')] : []),
|
|
48
62
|
],
|
|
49
|
-
installHint: 'asc adapter --
|
|
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 --
|
|
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(
|
|
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
|
+
}
|