@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.
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "agentic-senior-core",
3
+ "version": "6.2.3",
4
+ "description": "Universal AI coding rules and workflows. Write code like a staff engineer.",
5
+ "skills": "./skills/"
6
+ }
@@ -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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','session-start.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','subagent-start.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','pre-tool-dependency-gate.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','post-edit-enforce.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','dedup-gate.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','session-pulse.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','ladder-pulse.js');require(fs.existsSync(local)?local:global);\"",
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 global=p.join(os.homedir(),'.gemini','config','plugins','agentic-senior-core','hooks','post-edit-enforce.js');require(fs.existsSync(local)?local:global);\"",
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
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.2.1",
3
+ "version": "6.2.3",
4
4
  "description": "Universal AI coding rules. Because your AI writes code like it gets paid by the line.",
5
5
  "contextFileName": "rules/agentic-senior-core.md",
6
6
  "rules": [
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.2.1",
3
+ "version": "6.2.3",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "author": "fatidaprilian",
6
6
  "license": "MIT",
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuenn3123/agentic-senior-core",
3
- "version": "6.2.1",
3
+ "version": "6.2.3",
4
4
  "type": "module",
5
5
  "description": "Agentic Senior Core: Universal AI coding rules and workflows. Write code like a staff engineer, not a junior.",
6
6
  "bin": {
package/plugin.yaml CHANGED
@@ -1,5 +1,5 @@
1
1
  name: agentic-senior-core
2
- version: 6.2.1
2
+ version: 6.2.3
3
3
  description: Universal AI coding rules. Write code like a staff engineer.
4
4
  author: fatidaprilian
5
5
  provides_hooks: