@ryuenn3123/agentic-senior-core 6.2.1 → 6.2.3
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/.app.json +6 -0
- package/.agents/plugins/agentic-senior-core/.codex-plugin/plugin.json +15 -0
- package/.agents/plugins/agentic-senior-core/hooks.json +19 -19
- package/.agents/plugins/agentic-senior-core/plugin.json +1 -1
- package/.agents/plugins/marketplace.json +20 -0
- package/gemini-extension.json +1 -1
- package/lib/cli/commands/adapter.mjs +6 -1
- package/lib/cli/commands/global.mjs +129 -74
- package/lib/cli/commands/uninstall.mjs +1 -0
- package/package.json +1 -1
- package/plugin.yaml +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentic-senior-core",
|
|
3
|
+
"version": "6.2.3",
|
|
4
|
+
"description": "Universal AI coding rules. Write code like a staff engineer.",
|
|
5
|
+
"skills": "./skills/",
|
|
6
|
+
"hooks": "./hooks/hooks.json",
|
|
7
|
+
"apps": "./.app.json",
|
|
8
|
+
"interface": {
|
|
9
|
+
"displayName": "Agentic Senior Core",
|
|
10
|
+
"shortDescription": "Universal AI coding rules and workflows",
|
|
11
|
+
"longDescription": "Write code like a staff engineer, not a junior. Universal rules, decision ladder, and deterministic quality gates.",
|
|
12
|
+
"developerName": "fatidaprilian",
|
|
13
|
+
"category": "Productivity"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','session-start.js');const
|
|
10
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\session-start.js\" }",
|
|
9
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','session-start.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','session-start.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','session-start.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
10
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\session-start.js\" }",
|
|
11
11
|
"timeout": 5,
|
|
12
12
|
"statusMessage": "Loading ASC rules..."
|
|
13
13
|
}
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"hooks": [
|
|
20
20
|
{
|
|
21
21
|
"type": "command",
|
|
22
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','subagent-start.js');const
|
|
23
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\subagent-start.js\" }",
|
|
22
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','subagent-start.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','subagent-start.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','subagent-start.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
23
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\subagent-start.js\" }",
|
|
24
24
|
"timeout": 5,
|
|
25
25
|
"statusMessage": "Loading ASC rules..."
|
|
26
26
|
}
|
|
@@ -34,16 +34,16 @@
|
|
|
34
34
|
{
|
|
35
35
|
"type": "command",
|
|
36
36
|
"if": "Edit(**/package.json)",
|
|
37
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const
|
|
38
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\pre-tool-dependency-gate.js\" }",
|
|
37
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
38
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\pre-tool-dependency-gate.js\" }",
|
|
39
39
|
"timeout": 5,
|
|
40
40
|
"statusMessage": "ASC Pre-tool dependency check (Edit)..."
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"type": "command",
|
|
44
44
|
"if": "Write(**/package.json)",
|
|
45
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const
|
|
46
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\pre-tool-dependency-gate.js\" }",
|
|
45
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
46
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\pre-tool-dependency-gate.js\" }",
|
|
47
47
|
"timeout": 5,
|
|
48
48
|
"statusMessage": "ASC Pre-tool dependency check (Write)..."
|
|
49
49
|
}
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"hooks": [
|
|
55
55
|
{
|
|
56
56
|
"type": "command",
|
|
57
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const
|
|
58
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\pre-tool-dependency-gate.js\" }",
|
|
57
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
58
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\pre-tool-dependency-gate.js\" }",
|
|
59
59
|
"timeout": 5,
|
|
60
60
|
"statusMessage": "ASC Pre-tool dependency check (Terminal)..."
|
|
61
61
|
}
|
|
@@ -68,15 +68,15 @@
|
|
|
68
68
|
"hooks": [
|
|
69
69
|
{
|
|
70
70
|
"type": "command",
|
|
71
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','post-edit-enforce.js');const
|
|
72
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\post-edit-enforce.js\" }",
|
|
71
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','post-edit-enforce.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','post-edit-enforce.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','post-edit-enforce.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
72
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\post-edit-enforce.js\" }",
|
|
73
73
|
"timeout": 5,
|
|
74
74
|
"statusMessage": "ASC ladder & spec gate check..."
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
"type": "command",
|
|
78
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','dedup-gate.js');const
|
|
79
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\dedup-gate.js\" }",
|
|
78
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','dedup-gate.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','dedup-gate.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','dedup-gate.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
79
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\dedup-gate.js\" }",
|
|
80
80
|
"timeout": 15,
|
|
81
81
|
"statusMessage": "ASC duplicate-code scan..."
|
|
82
82
|
}
|
|
@@ -86,15 +86,15 @@
|
|
|
86
86
|
"PreInvocation": [
|
|
87
87
|
{
|
|
88
88
|
"type": "command",
|
|
89
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','session-pulse.js');const
|
|
90
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\session-pulse.js\" }",
|
|
89
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','session-pulse.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','session-pulse.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','session-pulse.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
90
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\session-pulse.js\" }",
|
|
91
91
|
"timeout": 5,
|
|
92
92
|
"statusMessage": "Loading ASC rules..."
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"type": "command",
|
|
96
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','ladder-pulse.js');const
|
|
97
|
-
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" }; node \"$root\\hooks\\ladder-pulse.js\" }",
|
|
96
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','ladder-pulse.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','ladder-pulse.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','ladder-pulse.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
97
|
+
"commandWindows": "if (Get-Command node -ErrorAction SilentlyContinue) { $root = if ($env:PLUGIN_ROOT) { $env:PLUGIN_ROOT } else { if ($env:CLAUDE_PLUGIN_ROOT) { $env:CLAUDE_PLUGIN_ROOT } else { if (Test-Path \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\") { \"$env:USERPROFILE\\.agents\\plugins\\agentic-senior-core\" } else { \"$env:USERPROFILE\\.gemini\\config\\plugins\\agentic-senior-core\" } } }; node \"$root\\hooks\\ladder-pulse.js\" }",
|
|
98
98
|
"timeout": 5,
|
|
99
99
|
"statusMessage": "ASC ladder pulse..."
|
|
100
100
|
}
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"PostInvocation": [
|
|
103
103
|
{
|
|
104
104
|
"type": "command",
|
|
105
|
-
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','post-edit-enforce.js');const
|
|
105
|
+
"command": "node -e \"const p=require('path'),fs=require('fs'),os=require('os');const local=p.join(process.cwd(),'.agents','plugins','agentic-senior-core','hooks','post-edit-enforce.js');const g1=p.join(os.homedir(),'.agents','plugins','agentic-senior-core','hooks','post-edit-enforce.js');const g2=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','post-edit-enforce.js');require(fs.existsSync(local)?local:(fs.existsSync(g1)?g1:g2));\"",
|
|
106
106
|
"timeout": 15
|
|
107
107
|
}
|
|
108
108
|
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentic-senior-core-marketplace",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Agentic Senior Core Plugins"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "agentic-senior-core",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./agentic-senior-core"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "INSTALLED_BY_DEFAULT",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
package/gemini-extension.json
CHANGED
|
@@ -12,6 +12,11 @@ const ADAPTER_TARGETS = {
|
|
|
12
12
|
targetPath: '.cursor/rules/agentic-senior-core.mdc',
|
|
13
13
|
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
14
14
|
},
|
|
15
|
+
codex: {
|
|
16
|
+
label: 'Codex CLI / Extension',
|
|
17
|
+
targetPath: '.codex/AGENTS.md',
|
|
18
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
19
|
+
},
|
|
15
20
|
windsurf: {
|
|
16
21
|
label: 'Windsurf (legacy)',
|
|
17
22
|
targetPath: '.windsurf/rules/agentic-senior-core.md',
|
|
@@ -138,7 +143,7 @@ export async function runAdapterCommand(commandArguments) {
|
|
|
138
143
|
|
|
139
144
|
if (requestedAdapters.length === 0) {
|
|
140
145
|
console.log('Agentic Senior Core -- Adapter Generator\n');
|
|
141
|
-
console.log('Usage: asc adapter [--cursor] [--devin] [--cline] [--copilot] [--kiro] [--continue] [--zed] [--aider] [--kilocode] [--roo] [--openhands] [--windsurf] [--all]\n');
|
|
146
|
+
console.log('Usage: asc adapter [--cursor] [--codex] [--devin] [--cline] [--copilot] [--kiro] [--continue] [--zed] [--aider] [--kilocode] [--roo] [--openhands] [--windsurf] [--all]\n');
|
|
142
147
|
console.log('Generates instruction-tier adapter files for IDEs without plugin support.');
|
|
143
148
|
console.log('Each adapter is a single file containing the universal coding rules.\n');
|
|
144
149
|
process.exit(0);
|
|
@@ -20,10 +20,6 @@ function vscodeUserPromptsDirectory() {
|
|
|
20
20
|
return path.join(HOME, '.config', 'Code', 'User', 'prompts');
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
const OLD_PATHS = [
|
|
24
|
-
path.join(HOME, '.gemini', 'config', 'skills'),
|
|
25
|
-
];
|
|
26
|
-
|
|
27
23
|
const GLOBAL_TARGETS = {
|
|
28
24
|
antigravity: {
|
|
29
25
|
label: 'Google Antigravity (2.0, IDE, CLI)',
|
|
@@ -35,6 +31,15 @@ const GLOBAL_TARGETS = {
|
|
|
35
31
|
targetPath: () => path.join(HOME, '.gemini', 'config', 'plugins', 'agentic-senior-core'),
|
|
36
32
|
note: 'Plugin bundle (rules + skills) in ~/.gemini/config/plugins/.',
|
|
37
33
|
},
|
|
34
|
+
codex: {
|
|
35
|
+
label: 'Codex CLI / Extension',
|
|
36
|
+
kind: 'codex-global',
|
|
37
|
+
rulesSourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
38
|
+
pluginSourcePath: '.agents/plugins',
|
|
39
|
+
targetPath: () => path.join(HOME, '.codex', 'AGENTS.md'),
|
|
40
|
+
pluginTargetPath: () => path.join(HOME, '.agents', 'plugins'),
|
|
41
|
+
note: 'Installs global rules to ~/.codex/AGENTS.md and plugin marketplace to ~/.agents/plugins/.',
|
|
42
|
+
},
|
|
38
43
|
cline: {
|
|
39
44
|
label: 'Cline',
|
|
40
45
|
kind: 'file',
|
|
@@ -103,6 +108,121 @@ async function pathExists(filePath) {
|
|
|
103
108
|
}
|
|
104
109
|
}
|
|
105
110
|
|
|
111
|
+
async function copyDirRecursive(src, dest, ignoreNames = []) {
|
|
112
|
+
await fs.mkdir(dest, { recursive: true });
|
|
113
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
if (ignoreNames.includes(entry.name)) continue;
|
|
116
|
+
const srcPath = path.join(src, entry.name);
|
|
117
|
+
const destPath = path.join(dest, entry.name);
|
|
118
|
+
if (entry.isDirectory()) {
|
|
119
|
+
await copyDirRecursive(srcPath, destPath, ignoreNames);
|
|
120
|
+
} else {
|
|
121
|
+
await fs.copyFile(srcPath, destPath);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function ensureCodexConfigEnabled() {
|
|
127
|
+
const configPath = path.join(HOME, '.codex', 'config.toml');
|
|
128
|
+
const agentsPluginsDir = path.join(HOME, '.agents', 'plugins').replace(/\\/g, '/');
|
|
129
|
+
try {
|
|
130
|
+
let content = '';
|
|
131
|
+
if (await pathExists(configPath)) {
|
|
132
|
+
content = await fs.readFile(configPath, 'utf8');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let additions = '';
|
|
136
|
+
|
|
137
|
+
if (!content.includes('[plugins."agentic-senior-core"]')) {
|
|
138
|
+
additions += `\n[plugins."agentic-senior-core"]\nenabled = true\n`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!content.includes('agentic-senior-core-marketplace')) {
|
|
142
|
+
additions += `\n[marketplaces."agentic-senior-core-marketplace"]\nsource = "local"\npath = "${agentsPluginsDir}"\n`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (additions) {
|
|
146
|
+
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
147
|
+
await fs.appendFile(configPath, additions, 'utf8');
|
|
148
|
+
}
|
|
149
|
+
} catch {
|
|
150
|
+
// Best-effort config registration
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function installCodexGlobal(target) {
|
|
155
|
+
const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
|
|
156
|
+
const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
|
|
157
|
+
const hooksSource = path.join(REPOSITORY_ROOT, '.agents', 'plugins', 'agentic-senior-core', 'hooks.json');
|
|
158
|
+
const singlePluginSource = path.join(REPOSITORY_ROOT, '.agents', 'plugins', 'agentic-senior-core');
|
|
159
|
+
const rulesTarget = target.targetPath(); // ~/.codex/AGENTS.md
|
|
160
|
+
const hooksTarget = path.join(HOME, '.codex', 'hooks.json');
|
|
161
|
+
const pluginTarget = target.pluginTargetPath(); // ~/.agents/plugins
|
|
162
|
+
const codexDirectPluginTarget = path.join(HOME, '.codex', 'plugins', 'agentic-senior-core');
|
|
163
|
+
|
|
164
|
+
if (!(await pathExists(rulesSource)) || !(await pathExists(path.join(REPOSITORY_ROOT, '.agents')))) {
|
|
165
|
+
console.error(` ${target.label}: source not found ... FAIL`);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Copy global AGENTS.md instructions (~/.codex/AGENTS.md)
|
|
170
|
+
await fs.mkdir(path.dirname(rulesTarget), { recursive: true });
|
|
171
|
+
await fs.copyFile(rulesSource, rulesTarget);
|
|
172
|
+
|
|
173
|
+
// Copy global hooks file (~/.codex/hooks.json) so Codex Settings -> Hooks tab detects it natively
|
|
174
|
+
if (await pathExists(hooksSource)) {
|
|
175
|
+
await fs.mkdir(path.dirname(hooksTarget), { recursive: true });
|
|
176
|
+
await fs.copyFile(hooksSource, hooksTarget);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Copy plugin bundle & marketplace catalog (~/.agents/plugins/)
|
|
180
|
+
await fs.mkdir(pluginTarget, { recursive: true });
|
|
181
|
+
await copyDirRecursive(pluginSource, pluginTarget);
|
|
182
|
+
|
|
183
|
+
// Copy direct plugin bundle to ~/.codex/plugins/agentic-senior-core/ for instant Codex discovery
|
|
184
|
+
await fs.mkdir(codexDirectPluginTarget, { recursive: true });
|
|
185
|
+
await copyDirRecursive(singlePluginSource, codexDirectPluginTarget);
|
|
186
|
+
|
|
187
|
+
// Clean up standalone skill directories so skills remain 100% unified inside the plugin bundle
|
|
188
|
+
const agentsSkillsTarget = path.join(HOME, '.agents', 'skills');
|
|
189
|
+
const codexSkillsTarget = path.join(HOME, '.codex', 'skills');
|
|
190
|
+
if (await pathExists(agentsSkillsTarget)) {
|
|
191
|
+
await fs.rm(agentsSkillsTarget, { recursive: true, force: true });
|
|
192
|
+
}
|
|
193
|
+
if (await pathExists(codexSkillsTarget)) {
|
|
194
|
+
await fs.rm(codexSkillsTarget, { recursive: true, force: true });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Register enabled = true in ~/.codex/config.toml
|
|
198
|
+
await ensureCodexConfigEnabled();
|
|
199
|
+
|
|
200
|
+
console.log(` ${target.label}: ${rulesTarget}, ${hooksTarget}, ${codexDirectPluginTarget} & ${pluginTarget} ... OK`);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function installAntigravityIde(target) {
|
|
205
|
+
const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
|
|
206
|
+
const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
|
|
207
|
+
const pluginTargetPath = target.pluginTargetPath();
|
|
208
|
+
const cliTargetPath = path.join(HOME, '.gemini', 'antigravity-cli', 'plugins', 'agentic-senior-core');
|
|
209
|
+
|
|
210
|
+
if (!(await pathExists(pluginSource)) || !(await pathExists(rulesSource))) {
|
|
211
|
+
console.error(` ${target.label}: plugin source not found ... FAIL`);
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Filter out .codex-plugin and .app.json so ~/.gemini/ remains 100% clean without Codex-specific files/folders
|
|
216
|
+
await fs.mkdir(path.dirname(pluginTargetPath), { recursive: true });
|
|
217
|
+
await copyDirRecursive(pluginSource, pluginTargetPath, ['.codex-plugin', '.app.json']);
|
|
218
|
+
|
|
219
|
+
await fs.mkdir(path.dirname(cliTargetPath), { recursive: true });
|
|
220
|
+
await copyDirRecursive(pluginSource, cliTargetPath, ['.codex-plugin', '.app.json']);
|
|
221
|
+
|
|
222
|
+
console.log(` ${target.label}: ${pluginTargetPath} ... OK`);
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
|
|
106
226
|
async function installGlobalTarget(targetKey) {
|
|
107
227
|
const target = GLOBAL_TARGETS[targetKey];
|
|
108
228
|
|
|
@@ -110,6 +230,10 @@ async function installGlobalTarget(targetKey) {
|
|
|
110
230
|
return await installAntigravityIde(target);
|
|
111
231
|
}
|
|
112
232
|
|
|
233
|
+
if (target.kind === 'codex-global') {
|
|
234
|
+
return await installCodexGlobal(target);
|
|
235
|
+
}
|
|
236
|
+
|
|
113
237
|
const sourcePath = path.join(REPOSITORY_ROOT, target.sourcePath);
|
|
114
238
|
const targetPath = target.targetPath();
|
|
115
239
|
|
|
@@ -122,11 +246,9 @@ async function installGlobalTarget(targetKey) {
|
|
|
122
246
|
const rawRules = await fs.readFile(sourcePath, 'utf8');
|
|
123
247
|
const formattedRules = `---\ntrigger: always_on\n---\n\n${rawRules}`;
|
|
124
248
|
|
|
125
|
-
// Modern path (~/.windsurf/rules/agentic-senior-core.md)
|
|
126
249
|
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
127
250
|
await fs.writeFile(targetPath, formattedRules, 'utf8');
|
|
128
251
|
|
|
129
|
-
// Legacy path (~/.codeium/windsurf/memories/global_rules.md)
|
|
130
252
|
const legacyPath = target.legacyTargetPath();
|
|
131
253
|
if (!await pathExists(legacyPath)) {
|
|
132
254
|
await fs.mkdir(path.dirname(legacyPath), { recursive: true });
|
|
@@ -137,21 +259,6 @@ async function installGlobalTarget(targetKey) {
|
|
|
137
259
|
return true;
|
|
138
260
|
}
|
|
139
261
|
|
|
140
|
-
if (target.kind === 'guarded-file') {
|
|
141
|
-
if (await pathExists(targetPath)) {
|
|
142
|
-
const existingContent = await fs.readFile(targetPath, 'utf8');
|
|
143
|
-
if (!existingContent.startsWith(ASC_MARKER)) {
|
|
144
|
-
console.log(` ${target.label}: existing ${path.basename(targetPath)} found (not ASC) ... SKIPPED`);
|
|
145
|
-
console.log(' Append the contents of AGENTS.md manually to keep your own rules.');
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
150
|
-
await fs.copyFile(sourcePath, targetPath);
|
|
151
|
-
console.log(` ${target.label}: ${targetPath} ... OK`);
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
262
|
if (target.kind === 'copilot-user-instructions') {
|
|
156
263
|
const rulesContent = await fs.readFile(sourcePath, 'utf8');
|
|
157
264
|
const instructionsContent = `---\napplyTo: '**'\n---\n\n${rulesContent}`;
|
|
@@ -167,58 +274,6 @@ async function installGlobalTarget(targetKey) {
|
|
|
167
274
|
return true;
|
|
168
275
|
}
|
|
169
276
|
|
|
170
|
-
async function copyDirRecursive(src, dest) {
|
|
171
|
-
await fs.mkdir(dest, { recursive: true });
|
|
172
|
-
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
173
|
-
for (const entry of entries) {
|
|
174
|
-
const srcPath = path.join(src, entry.name);
|
|
175
|
-
const destPath = path.join(dest, entry.name);
|
|
176
|
-
if (entry.isDirectory()) {
|
|
177
|
-
await copyDirRecursive(srcPath, destPath);
|
|
178
|
-
} else {
|
|
179
|
-
await fs.copyFile(srcPath, destPath);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
async function installAntigravityIde(target) {
|
|
185
|
-
const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
|
|
186
|
-
const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
|
|
187
|
-
const pluginTargetPath = target.pluginTargetPath();
|
|
188
|
-
const cliTargetPath = path.join(HOME, '.gemini', 'antigravity-cli', 'plugins', 'agentic-senior-core');
|
|
189
|
-
const rulesTargetPath = target.rulesTargetPath();
|
|
190
|
-
|
|
191
|
-
if (!(await pathExists(pluginSource))) {
|
|
192
|
-
console.error(` ${target.label}: plugin source not found (${pluginSource}) ... FAIL`);
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
if (!(await pathExists(rulesSource))) {
|
|
196
|
-
console.error(` ${target.label}: rules source not found (${rulesSource}) ... FAIL`);
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Copy plugin bundle to IDE / 2.0 (~/.gemini/config/plugins/agentic-senior-core/)
|
|
201
|
-
await fs.mkdir(path.dirname(pluginTargetPath), { recursive: true });
|
|
202
|
-
await copyDirRecursive(pluginSource, pluginTargetPath);
|
|
203
|
-
|
|
204
|
-
// Copy plugin bundle to CLI (~/.gemini/antigravity-cli/plugins/agentic-senior-core/)
|
|
205
|
-
await fs.mkdir(path.dirname(cliTargetPath), { recursive: true });
|
|
206
|
-
await copyDirRecursive(pluginSource, cliTargetPath);
|
|
207
|
-
|
|
208
|
-
// Clean up old hooks/hooks.json duplicate from previous versions
|
|
209
|
-
const oldHooksJson = path.join(pluginTargetPath, 'hooks', 'hooks.json');
|
|
210
|
-
if (await pathExists(oldHooksJson)) {
|
|
211
|
-
await fs.rm(oldHooksJson);
|
|
212
|
-
}
|
|
213
|
-
const oldHooksJsonCli = path.join(cliTargetPath, 'hooks', 'hooks.json');
|
|
214
|
-
if (await pathExists(oldHooksJsonCli)) {
|
|
215
|
-
await fs.rm(oldHooksJsonCli);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
console.log(` ${target.label}: ${pluginTargetPath} ... OK`);
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
277
|
export async function runGlobalCommand(commandArguments) {
|
|
223
278
|
const requestedTargets = [];
|
|
224
279
|
|
|
@@ -240,7 +295,7 @@ export async function runGlobalCommand(commandArguments) {
|
|
|
240
295
|
|
|
241
296
|
if (requestedTargets.length === 0) {
|
|
242
297
|
console.log('Agentic Senior Core -- Global Rules Installer\n');
|
|
243
|
-
console.log('Usage: asc global [--antigravity] [--cline] [--roo] [--kilocode] [--kiro] [--openhands] [--windsurf] [--copilot] [--all]\n');
|
|
298
|
+
console.log('Usage: asc global [--antigravity] [--codex] [--cline] [--roo] [--kilocode] [--kiro] [--openhands] [--windsurf] [--copilot] [--all]\n');
|
|
244
299
|
console.log('Installs user-level global rules that apply to ALL projects.\n');
|
|
245
300
|
console.log('Supported automatic global targets:');
|
|
246
301
|
for (const [key, target] of Object.entries(GLOBAL_TARGETS)) {
|
|
@@ -5,6 +5,7 @@ const ASC_SIGNATURE = '# Agentic Senior Core';
|
|
|
5
5
|
|
|
6
6
|
const ADAPTER_FILES = [
|
|
7
7
|
{ label: 'Cursor', path: '.cursor/rules/agentic-senior-core.mdc' },
|
|
8
|
+
{ label: 'Codex CLI / Extension', path: '.codex/AGENTS.md' },
|
|
8
9
|
{ label: 'Windsurf (legacy)', path: '.windsurf/rules/agentic-senior-core.md' },
|
|
9
10
|
{ label: 'Devin Desktop', path: '.devin/rules/agentic-senior-core.md' },
|
|
10
11
|
{ label: 'Cline', path: '.clinerules/agentic-senior-core.md' },
|
package/package.json
CHANGED
package/plugin.yaml
CHANGED