@ryuenn3123/agentic-senior-core 5.8.22 → 5.8.24

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.
@@ -43,38 +43,116 @@ process.stdin.on('data', function (chunk) { inputBuffer += chunk; });
43
43
  process.stdin.on('end', function () {
44
44
  try {
45
45
  const data = JSON.parse(inputBuffer);
46
+
47
+ if (data.invocationNum !== undefined && data.transcriptPath) {
48
+ handleAntigravityPostInvocation(data);
49
+ return;
50
+ }
51
+
46
52
  const toolName = data.tool_name || '';
47
53
  const toolInput = data.tool_input || {};
48
- const filePath = toolInput.file_path || '';
49
- const findings = [];
50
-
51
- if (filePath.endsWith('package.json')) {
52
- checkDependencyAddition(toolName, toolInput, findings);
53
- }
54
+ processSingleEdit(toolName, toolInput, function(nudge) {
55
+ emitClaude(nudge);
56
+ });
57
+ } catch (_) {
58
+ // Silent fail
59
+ }
60
+ });
54
61
 
55
- const ext = path.extname(filePath).slice(1);
56
- if (SOURCE_EXTENSIONS.has(ext)) {
57
- if (toolName === 'Edit') {
58
- checkLocDelta(toolInput, filePath, findings);
59
- } else if (toolName === 'Write') {
60
- checkNewFileSize(toolInput, filePath, findings);
62
+ function handleAntigravityPostInvocation(data) {
63
+ try {
64
+ if (!fs.existsSync(data.transcriptPath)) return;
65
+ const lines = fs.readFileSync(data.transcriptPath, 'utf8').split('\n').filter(Boolean);
66
+ const findings = [];
67
+
68
+ for (let i = 0; i < lines.length; i++) {
69
+ const step = JSON.parse(lines[i]);
70
+ if (step.step_index >= data.initialNumSteps && step.type === 'PLANNER_RESPONSE' && step.tool_calls) {
71
+ for (let j = 0; j < step.tool_calls.length; j++) {
72
+ const tc = step.tool_calls[j];
73
+ let toolName = '';
74
+ let toolInput = {};
75
+
76
+ if (tc.name === 'replace_file_content' || tc.name === 'multi_replace_file_content') {
77
+ toolName = 'Edit';
78
+ toolInput = {
79
+ file_path: tc.args.TargetFile || '',
80
+ new_string: tc.args.ReplacementContent || '',
81
+ old_string: tc.args.TargetContent || ''
82
+ };
83
+ } else if (tc.name === 'write_to_file') {
84
+ toolName = 'Write';
85
+ toolInput = {
86
+ file_path: tc.args.TargetFile || '',
87
+ content: tc.args.CodeContent || ''
88
+ };
89
+ }
90
+
91
+ if (toolName) {
92
+ processSingleEdit(toolName, toolInput, function(nudge) {
93
+ findings.push(nudge);
94
+ }, true);
95
+ }
96
+ }
61
97
  }
62
98
  }
99
+
100
+ if (findings.length > 0) {
101
+ const injectSteps = findings.map(function(f) { return { ephemeralMessage: f }; });
102
+ process.stdout.write(JSON.stringify({ injectSteps: injectSteps }) + '\n');
103
+ } else {
104
+ process.stdout.write(JSON.stringify({}) + '\n');
105
+ }
106
+ } catch (e) {
107
+ process.stdout.write(JSON.stringify({}) + '\n');
108
+ }
109
+ }
63
110
 
64
- checkLivingDocNudge(filePath, findings);
111
+ function processSingleEdit(toolName, toolInput, emitFn, skipArray) {
112
+ const filePath = toolInput.file_path || '';
113
+ if (!filePath) return;
114
+ const findings = [];
65
115
 
66
- if (ext !== 'md') {
67
- checkWorkflowGate(toolName, filePath, ext, findings);
116
+ if (filePath.endsWith('package.json')) {
117
+ checkDependencyAddition(toolName, toolInput, findings);
118
+ }
119
+
120
+ const ext = path.extname(filePath).slice(1);
121
+ if (SOURCE_EXTENSIONS.has(ext)) {
122
+ if (toolName === 'Edit') {
123
+ checkLocDelta(toolInput, filePath, findings);
124
+ } else if (toolName === 'Write') {
125
+ checkNewFileSize(toolInput, filePath, findings);
68
126
  }
127
+ }
69
128
 
70
- if (findings.length === 0) return;
129
+ checkLivingDocNudge(filePath, findings);
71
130
 
72
- const nudge = '[ASC enforcement] ' + findings.join(' ') + ' Review the decision ladder before continuing.';
73
- emit(nudge);
74
- } catch (_) {
75
- // Silent fail — enforcement must not break the session
131
+ if (ext !== 'md') {
132
+ checkWorkflowGate(toolName, filePath, ext, findings);
76
133
  }
77
- });
134
+
135
+ if (findings.length === 0) return;
136
+
137
+ const nudge = '[ASC enforcement] ' + findings.join(' ') + ' Review the decision ladder before continuing.';
138
+ emitFn(nudge);
139
+ }
140
+
141
+ function emitClaude(nudge) {
142
+ try {
143
+ const isCopilot = Boolean(process.env.COPILOT_PLUGIN_DATA);
144
+ let output = {
145
+ hookSpecificOutput: {
146
+ hookEventName: 'PostToolUse',
147
+ additionalContext: nudge,
148
+ },
149
+ };
150
+ if (isCopilot) {
151
+ output = { additionalContext: nudge };
152
+ }
153
+ process.stdout.write(JSON.stringify(output) + '\n');
154
+ } catch (_) {}
155
+ }
78
156
 
79
157
  function checkDependencyAddition(toolName, toolInput, findings) {
80
158
  var target = toolName === 'Edit' ? (toolInput.new_string || '') : (toolInput.content || '');
@@ -215,20 +293,4 @@ function validateDocSpecs(workflow, findings) {
215
293
  } catch (_) {}
216
294
  }
217
295
 
218
- function emit(nudge) {
219
- try {
220
- var isCopilot = Boolean(process.env.COPILOT_PLUGIN_DATA);
221
- var output = {
222
- hookSpecificOutput: {
223
- hookEventName: 'PostToolUse',
224
- additionalContext: nudge,
225
- },
226
- };
227
- if (isCopilot) {
228
- output = { additionalContext: nudge };
229
- }
230
- process.stdout.write(JSON.stringify(output));
231
- } catch (_) {
232
- // EPIPE — silent
233
- }
234
- }
296
+
@@ -27,8 +27,9 @@ process.stdin.on('data', function (chunk) { inputBuffer += chunk; });
27
27
  process.stdin.on('end', function () {
28
28
  try {
29
29
  const data = JSON.parse(inputBuffer);
30
- const toolName = data.tool_name || data.toolName || '';
31
- const toolInput = data.tool_input || data.toolInput || {};
30
+ const isAntigravity = !!data.toolCall;
31
+ const toolName = isAntigravity ? data.toolCall.name : (data.tool_name || data.toolName || '');
32
+ const toolInput = isAntigravity ? data.toolCall.args : (data.tool_input || data.toolInput || {});
32
33
  let added = [];
33
34
 
34
35
  const isTerminal = ['Bash', 'run_command', 'run_shell_command', 'terminal', 'execute_command'].includes(toolName);
@@ -72,15 +73,23 @@ process.stdin.on('end', function () {
72
73
  + ' duplicates standard library or native platform features. '
73
74
  + 'Ladder step 3: use stdlib/native features instead, or add to .asc/dependency-allowlist.json to override.';
74
75
 
75
- const output = {
76
- allow_tool: false,
77
- deny_reason: reason,
78
- hookSpecificOutput: {
79
- hookEventName: 'PreToolUse',
80
- permissionDecision: 'deny',
81
- permissionDecisionReason: reason
82
- }
83
- };
76
+ let output;
77
+ if (isAntigravity) {
78
+ output = {
79
+ decision: "deny",
80
+ reason: reason
81
+ };
82
+ } else {
83
+ output = {
84
+ allow_tool: false,
85
+ deny_reason: reason,
86
+ hookSpecificOutput: {
87
+ hookEventName: 'PreToolUse',
88
+ permissionDecision: 'deny',
89
+ permissionDecisionReason: reason
90
+ }
91
+ };
92
+ }
84
93
  process.stdout.write(JSON.stringify(output) + '\n');
85
94
  process.exit(2);
86
95
  return;
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "node \"${CLAUDE_PLUGIN_ROOT:-$HOME/.gemini/config/plugins/agentic-senior-core}/hooks/session-start.js\"; exit 0",
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
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\" }",
11
11
  "timeout": 5,
12
12
  "statusMessage": "Loading ASC rules..."
@@ -19,7 +19,7 @@
19
19
  "hooks": [
20
20
  {
21
21
  "type": "command",
22
- "command": "node \"${CLAUDE_PLUGIN_ROOT:-$HOME/.gemini/config/plugins/agentic-senior-core}/hooks/subagent-start.js\"; exit 0",
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
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\" }",
24
24
  "timeout": 5,
25
25
  "statusMessage": "Loading ASC rules..."
@@ -34,7 +34,7 @@
34
34
  {
35
35
  "type": "command",
36
36
  "if": "Edit(**/package.json)",
37
- "command": "node \"${CLAUDE_PLUGIN_ROOT:-$HOME/.gemini/config/plugins/agentic-senior-core}/hooks/pre-tool-dependency-gate.js\"; exit 0",
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
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\" }",
39
39
  "timeout": 5,
40
40
  "statusMessage": "ASC Pre-tool dependency check (Edit)..."
@@ -42,7 +42,7 @@
42
42
  {
43
43
  "type": "command",
44
44
  "if": "Write(**/package.json)",
45
- "command": "node \"${CLAUDE_PLUGIN_ROOT:-$HOME/.gemini/config/plugins/agentic-senior-core}/hooks/pre-tool-dependency-gate.js\"; exit 0",
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
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\" }",
47
47
  "timeout": 5,
48
48
  "statusMessage": "ASC Pre-tool dependency check (Write)..."
@@ -54,7 +54,7 @@
54
54
  "hooks": [
55
55
  {
56
56
  "type": "command",
57
- "command": "node \"${CLAUDE_PLUGIN_ROOT:-$HOME/.gemini/config/plugins/agentic-senior-core}/hooks/pre-tool-dependency-gate.js\"; exit 0",
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
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\" }",
59
59
  "timeout": 5,
60
60
  "statusMessage": "ASC Pre-tool dependency check (Terminal)..."
@@ -68,7 +68,7 @@
68
68
  "hooks": [
69
69
  {
70
70
  "type": "command",
71
- "command": "node \"${CLAUDE_PLUGIN_ROOT:-$HOME/.gemini/config/plugins/agentic-senior-core}/hooks/post-edit-enforce.js\"; exit 0",
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
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\" }",
73
73
  "timeout": 5,
74
74
  "statusMessage": "ASC ladder & spec gate check..."
@@ -81,6 +81,13 @@
81
81
  }
82
82
  ]
83
83
  }
84
+ ],
85
+ "PostInvocation": [
86
+ {
87
+ "type": "command",
88
+ "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);\"",
89
+ "timeout": 15
90
+ }
84
91
  ]
85
92
  }
86
- }
93
+ }
@@ -1,10 +1,16 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "5.8.22",
3
+ "version": "5.8.24",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "contextFileName": "rules/agentic-senior-core.md",
6
- "rules": ["rules/"],
7
- "commands": ["commands/"],
8
- "skills": ["skills/"],
6
+ "rules": [
7
+ "rules/"
8
+ ],
9
+ "commands": [
10
+ "commands/"
11
+ ],
12
+ "skills": [
13
+ "skills/"
14
+ ],
9
15
  "hooks": "hooks.json"
10
16
  }
@@ -65,6 +65,8 @@ When you pick the minimal option at step 5 or 6, and it isn't obviously trivial:
65
65
 
66
66
  ## Workflow
67
67
 
68
+ - Prefix ALL terminal commands with `ascx` to compress output and save tokens (e.g., `ascx <your_command>`).
69
+
68
70
  Recognize the scenario and offer the matching command — user decides
69
71
  whether to invoke it. Skip this for trivial edits.
70
72
 
package/AGENTS.md CHANGED
@@ -60,6 +60,8 @@ When you pick the minimal option at step 5 or 6, and it isn't obviously trivial:
60
60
 
61
61
  ## Workflow
62
62
 
63
+ - Prefix ALL terminal commands with `ascx` to compress output and save tokens (e.g., `ascx <your_command>`).
64
+
63
65
  Recognize the scenario and offer the matching command — user decides
64
66
  whether to invoke it. Skip this for trivial edits.
65
67
 
package/README.md CHANGED
@@ -224,9 +224,9 @@ Copies one file to `.openhands/microagents/agentic-senior-core.md`. Repeat per p
224
224
  </details>
225
225
 
226
226
  <details>
227
- <summary><b>Google Antigravity IDE</b></summary>
227
+ <summary><b>Google Antigravity (2.0, IDE, and CLI)</b></summary>
228
228
 
229
- **Option A -- workspace rules (per project):**
229
+ **Option A -- workspace rules (per project for 2.0 and IDE only):**
230
230
 
231
231
  Copy the rules file into your project's `.agents/rules/` directory:
232
232
 
@@ -244,9 +244,9 @@ mkdir .agents\rules -Force
244
244
  cp "$(npm root -g)/@ryuenn3123/agentic-senior-core/.agents/rules/agentic-senior-core.md" .agents\rules\
245
245
  ```
246
246
 
247
- Antigravity IDE reads it automatically with `trigger: always_on`.
247
+ Antigravity IDE and 2.0 read it automatically with `trigger: always_on`. *(Note: Antigravity CLI does not support workspace plugins, use Option B for CLI).*
248
248
 
249
- **Option B -- global install (all projects):**
249
+ **Option B -- global install (all projects and ALL clients):**
250
250
 
251
251
  One command (works on all platforms):
252
252
 
@@ -254,25 +254,15 @@ One command (works on all platforms):
254
254
  asc global --antigravity
255
255
  ```
256
256
 
257
- This installs:
258
- - **Plugin bundle** (skills: `/asc-review`, `/asc-audit`, etc. and **rules**) `~/.gemini/config/plugins/agentic-senior-core/`
257
+ This automatically stages the plugin bundle (skills, rules, hooks, and MCP servers) for:
258
+ - **Antigravity 2.0 & IDE** (`~/.gemini/config/plugins/agentic-senior-core/`)
259
+ - **Antigravity CLI** (`~/.gemini/antigravity-cli/plugins/agentic-senior-core/`)
259
260
 
260
- If you previously installed to `~/.gemini/antigravity-ide/plugins/agentic-senior-core/` or `~/.gemini/config/skills/` (v5.8.4 or earlier), the old paths are cleaned up automatically.
261
+ If you previously installed to legacy locations (v5.8.4 or earlier), the old paths are cleaned up automatically.
261
262
 
262
263
  > Note: `npm update -g` refreshes the npm package only. The global copy does not auto-update -- re-run `asc global --antigravity` after each update.
263
264
 
264
- > **WSL / dual-environment:** `asc global --antigravity` writes to the HOME directory of the current environment. If you use both Windows native and WSL, run it separately in each terminal. The same applies to `agy plugin install` for Antigravity CLI.
265
-
266
- </details>
267
-
268
- <details>
269
- <summary><b>Google Antigravity CLI</b></summary>
270
-
271
- Requires [Antigravity CLI](https://antigravity.google) (`agy`) installed separately.
272
-
273
- ```bash
274
- agy plugin install https://github.com/fatidaprilian/Agentic-Senior-Core.git
275
- ```
265
+ > **WSL / dual-environment:** `asc global --antigravity` writes to the HOME directory of the current environment. If you use both Windows native and WSL, run it separately in each terminal.
276
266
 
277
267
  </details>
278
268
 
@@ -307,7 +297,7 @@ asc global --all
307
297
 
308
298
  | Tool | Global location | Notes |
309
299
  |------|----------------|-------|
310
- | Google Antigravity IDE | `~/.gemini/config/plugins/agentic-senior-core/` | Plugin bundle (skills) + internal rules |
300
+ | Google Antigravity (2.0, IDE, CLI) | `~/.gemini/config/plugins/...` and `~/.gemini/antigravity-cli/plugins/...` | Plugin bundle (skills, hooks, rules) |
311
301
  | Cline | `~/Documents/Cline/Rules/` | Toggleable in the Cline rules panel |
312
302
  | Kilo Code | `~/.kilocode/rules/` | Or point `instructions:` in `~/.config/kilo/kilo.jsonc` at the npm package path — that variant auto-updates |
313
303
  | Kiro | `~/.kiro/steering/` | Some builds have global-steering loading bugs; fall back to `asc adapter --kiro` |
@@ -1,12 +1,18 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "5.8.22",
3
+ "version": "5.8.24",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "author": "fatidaprilian",
6
6
  "license": "MIT",
7
7
  "contextFileName": ".agents/plugins/agentic-senior-core/rules/agentic-senior-core.md",
8
- "rules": [".agents/plugins/agentic-senior-core/rules/"],
9
- "commands": [".agents/plugins/agentic-senior-core/commands/"],
10
- "skills": [".agents/plugins/agentic-senior-core/skills/"],
8
+ "rules": [
9
+ ".agents/plugins/agentic-senior-core/rules/"
10
+ ],
11
+ "commands": [
12
+ ".agents/plugins/agentic-senior-core/commands/"
13
+ ],
14
+ "skills": [
15
+ ".agents/plugins/agentic-senior-core/skills/"
16
+ ],
11
17
  "hooks": ".agents/plugins/agentic-senior-core/hooks.json"
12
18
  }
@@ -26,7 +26,7 @@ const OLD_PATHS = [
26
26
 
27
27
  const GLOBAL_TARGETS = {
28
28
  antigravity: {
29
- label: 'Google Antigravity IDE',
29
+ label: 'Google Antigravity (2.0, IDE, CLI)',
30
30
  kind: 'antigravity-ide',
31
31
  pluginSourcePath: '.agents/plugins/agentic-senior-core',
32
32
  rulesSourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
@@ -172,6 +172,7 @@ async function installAntigravityIde(target) {
172
172
  const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
173
173
  const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
174
174
  const pluginTargetPath = target.pluginTargetPath();
175
+ const cliTargetPath = path.join(HOME, '.gemini', 'antigravity-cli', 'plugins', 'agentic-senior-core');
175
176
  const rulesTargetPath = target.rulesTargetPath();
176
177
 
177
178
  if (!(await pathExists(pluginSource))) {
@@ -183,17 +184,26 @@ async function installAntigravityIde(target) {
183
184
  return false;
184
185
  }
185
186
 
186
- // Copy plugin bundle (plugin.json + skills/) to ~/.gemini/antigravity-ide/plugins/agentic-senior-core/
187
+ // Copy plugin bundle to IDE / 2.0 (~/.gemini/config/plugins/agentic-senior-core/)
187
188
  await fs.mkdir(path.dirname(pluginTargetPath), { recursive: true });
188
189
  await copyDirRecursive(pluginSource, pluginTargetPath);
190
+
191
+ // Copy plugin bundle to CLI (~/.gemini/antigravity-cli/plugins/agentic-senior-core/)
192
+ await fs.mkdir(path.dirname(cliTargetPath), { recursive: true });
193
+ await copyDirRecursive(pluginSource, cliTargetPath);
189
194
 
190
195
  // Clean up old hooks/hooks.json duplicate from previous versions
191
196
  const oldHooksJson = path.join(pluginTargetPath, 'hooks', 'hooks.json');
192
197
  if (await pathExists(oldHooksJson)) {
193
198
  await fs.rm(oldHooksJson);
194
199
  }
200
+ const oldHooksJsonCli = path.join(cliTargetPath, 'hooks', 'hooks.json');
201
+ if (await pathExists(oldHooksJsonCli)) {
202
+ await fs.rm(oldHooksJsonCli);
203
+ }
195
204
 
196
- console.log(` ${target.label}: plugin -> ${pluginTargetPath} ... OK`);
205
+ console.log(` ${target.label}: IDE/2.0 plugin -> ${pluginTargetPath} ... OK`);
206
+ console.log(` ${target.label}: CLI plugin -> ${cliTargetPath} ... OK`);
197
207
 
198
208
  // The IDE automatically loads the plugin bundle's internal rules/ folder!
199
209
  // Appending to GEMINI.md causes double rules (1,250 tokens x 2).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuenn3123/agentic-senior-core",
3
- "version": "5.8.22",
3
+ "version": "5.8.24",
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: 5.8.22
2
+ version: 5.8.24
3
3
  description: Universal AI coding rules. Write code like a staff engineer.
4
4
  author: fatidaprilian
5
5
  provides_hooks: