@ryuenn3123/agentic-senior-core 6.5.3 → 6.6.1

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,42 @@
1
+ // Native Kilo / OpenCode Plugin for Agentic Senior Core
2
+ // Hooks into system prompt transform, session compaction, and shell environment.
3
+
4
+ const ASC_GUARDRAILS = `
5
+ # Agentic Senior Core Rules
6
+ - Write code like a staff engineer. Efficient, safe, maintainable.
7
+ - Before writing code: 1) Need built? 2) Codebase reuse? 3) Stdlib? 4) Dependency? 5) One function? 6) Minimum code.
8
+ - Parameterize all queries. Validate inputs at trust boundaries. Never commit secrets.
9
+ - Early returns over deep nesting. Delete code that carries no value.
10
+ `;
11
+
12
+ const server = async ({ project, directory, worktree }) => {
13
+ return {
14
+ "experimental.chat.system.transform": async (input, output) => {
15
+ if (Array.isArray(output.system)) {
16
+ const hasASC = output.system.some(item => typeof item === 'string' && item.includes('Agentic Senior Core'));
17
+ if (!hasASC) {
18
+ output.system.push(ASC_GUARDRAILS.trim());
19
+ }
20
+ }
21
+ },
22
+ "experimental.session.compacting": async (input, output) => {
23
+ if (Array.isArray(output.context)) {
24
+ output.context.push(
25
+ "## Agentic Senior Core (Persisted Context)\n" +
26
+ "- Maintain strict security guardrails and non-breaking API contracts.\n" +
27
+ "- Prefer clean minimal logic over premature abstractions."
28
+ );
29
+ }
30
+ },
31
+ "shell.env": async (input, output) => {
32
+ if (output.env) {
33
+ output.env.ASC_ENABLED = "1";
34
+ }
35
+ },
36
+ };
37
+ };
38
+
39
+ export default {
40
+ id: "agentic-senior-core",
41
+ server,
42
+ };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.5.3",
3
+ "version": "6.6.1",
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": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.5.3",
3
+ "version": "6.6.1",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "author": "fatidaprilian",
6
6
  "license": "MIT",
@@ -60,8 +60,11 @@ const ADAPTER_TARGETS = {
60
60
  },
61
61
  kilocode: {
62
62
  label: 'Kilo Code',
63
- targetPath: '.kilocode/rules/agentic-senior-core.md',
63
+ targetPath: '.kilo/rules/agentic-senior-core.md',
64
+ legacyTargetPath: '.kilocode/rules/agentic-senior-core.md',
65
+ pluginTargetPath: '.kilo/plugin/agentic-senior-core.js',
64
66
  sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
67
+ pluginSourcePath: '.agents/plugins/agentic-senior-core/kilo-plugin/agentic-senior-core.js',
65
68
  },
66
69
  roo: {
67
70
  label: 'Roo Code',
@@ -84,6 +87,21 @@ async function pathExists(filePath) {
84
87
  }
85
88
  }
86
89
 
90
+ async function copyDirRecursive(src, dest, ignoreNames = []) {
91
+ await fs.mkdir(dest, { recursive: true });
92
+ const entries = await fs.readdir(src, { withFileTypes: true });
93
+ for (const entry of entries) {
94
+ if (ignoreNames.includes(entry.name)) continue;
95
+ const srcPath = path.join(src, entry.name);
96
+ const destPath = path.join(dest, entry.name);
97
+ if (entry.isDirectory()) {
98
+ await copyDirRecursive(srcPath, destPath, ignoreNames);
99
+ } else {
100
+ await fs.copyFile(srcPath, destPath);
101
+ }
102
+ }
103
+ }
104
+
87
105
  async function generateAdapter(targetDirectory, adapterKey) {
88
106
  const adapter = ADAPTER_TARGETS[adapterKey];
89
107
  if (!adapter) {
@@ -117,7 +135,28 @@ async function generateAdapter(targetDirectory, adapterKey) {
117
135
  }
118
136
 
119
137
  await fs.writeFile(targetPath, finalContent, 'utf8');
120
-
138
+
139
+ if (adapterKey === 'kilocode') {
140
+ if (adapter.pluginSourcePath && adapter.pluginTargetPath) {
141
+ const pluginSource = path.join(REPOSITORY_ROOT, adapter.pluginSourcePath);
142
+ const pluginTarget = path.join(targetDirectory, adapter.pluginTargetPath);
143
+ if (await pathExists(pluginSource)) {
144
+ await fs.mkdir(path.dirname(pluginTarget), { recursive: true });
145
+ await fs.copyFile(pluginSource, pluginTarget);
146
+ }
147
+ }
148
+ const skillsSource = path.join(REPOSITORY_ROOT, '.agents', 'plugins', 'agentic-senior-core', 'skills');
149
+ const localSkillsTarget = path.join(targetDirectory, '.kilo', 'skills');
150
+ if (await pathExists(skillsSource)) {
151
+ await copyDirRecursive(skillsSource, localSkillsTarget);
152
+ }
153
+ if (adapter.legacyTargetPath) {
154
+ const legacyTarget = path.join(targetDirectory, adapter.legacyTargetPath);
155
+ await fs.mkdir(path.dirname(legacyTarget), { recursive: true });
156
+ await fs.writeFile(legacyTarget, finalContent, 'utf8');
157
+ }
158
+ }
159
+
121
160
  console.log(` ${adapter.label}: ${adapter.targetPath} ... OK`);
122
161
  return true;
123
162
  }
@@ -56,10 +56,13 @@ const GLOBAL_TARGETS = {
56
56
  },
57
57
  kilocode: {
58
58
  label: 'Kilo Code',
59
- kind: 'file',
60
- sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
61
- targetPath: () => path.join(HOME, '.kilocode', 'rules', 'agentic-senior-core.md'),
62
- note: 'Kilo v7+: prefer adding the file path to the instructions array in ~/.config/kilo/kilo.jsonc (auto-updates with npm).',
59
+ kind: 'kilo-global',
60
+ rulesSourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
61
+ pluginSourcePath: '.agents/plugins/agentic-senior-core/kilo-plugin/agentic-senior-core.js',
62
+ targetPath: () => path.join(HOME, '.config', 'kilo', 'rules', 'agentic-senior-core.md'),
63
+ legacyTargetPath: () => path.join(HOME, '.kilocode', 'rules', 'agentic-senior-core.md'),
64
+ pluginTargetPath: () => path.join(HOME, '.config', 'kilo', 'plugin', 'agentic-senior-core.js'),
65
+ note: 'Installs global plugin to ~/.config/kilo/plugin/ and rules to ~/.config/kilo/rules/.',
63
66
  },
64
67
  kiro: {
65
68
  label: 'Kiro',
@@ -201,6 +204,52 @@ async function installCodexGlobal(target) {
201
204
  return true;
202
205
  }
203
206
 
207
+ async function installKiloGlobal(target) {
208
+ const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
209
+ const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
210
+ const rulesTarget = target.targetPath();
211
+ const pluginTarget = target.pluginTargetPath();
212
+ const legacyRulesTarget = target.legacyTargetPath();
213
+
214
+ if (!(await pathExists(rulesSource))) {
215
+ console.error(` ${target.label}: rules source not found ... FAIL`);
216
+ return false;
217
+ }
218
+
219
+ await fs.mkdir(path.dirname(rulesTarget), { recursive: true });
220
+ await fs.copyFile(rulesSource, rulesTarget);
221
+
222
+ await fs.mkdir(path.dirname(legacyRulesTarget), { recursive: true });
223
+ await fs.copyFile(rulesSource, legacyRulesTarget);
224
+
225
+ if (await pathExists(pluginSource)) {
226
+ await fs.mkdir(path.dirname(pluginTarget), { recursive: true });
227
+ await fs.copyFile(pluginSource, pluginTarget);
228
+ }
229
+
230
+ const skillsSource = path.join(REPOSITORY_ROOT, '.agents', 'plugins', 'agentic-senior-core', 'skills');
231
+ const globalSkillsTarget = path.join(HOME, '.kilo', 'skills');
232
+ if (await pathExists(skillsSource)) {
233
+ await copyDirRecursive(skillsSource, globalSkillsTarget);
234
+ }
235
+
236
+ if (process.env.APPDATA) {
237
+ const appDataKiloPlugin = path.join(process.env.APPDATA, 'kilo', 'plugin', 'agentic-senior-core.js');
238
+ const appDataKiloRules = path.join(process.env.APPDATA, 'kilo', 'rules', 'agentic-senior-core.md');
239
+ try {
240
+ if (await pathExists(pluginSource)) {
241
+ await fs.mkdir(path.dirname(appDataKiloPlugin), { recursive: true });
242
+ await fs.copyFile(pluginSource, appDataKiloPlugin);
243
+ }
244
+ await fs.mkdir(path.dirname(appDataKiloRules), { recursive: true });
245
+ await fs.copyFile(rulesSource, appDataKiloRules);
246
+ } catch (_) {}
247
+ }
248
+
249
+ console.log(` ${target.label}: ${rulesTarget}, ${pluginTarget} & ${globalSkillsTarget} ... OK`);
250
+ return true;
251
+ }
252
+
204
253
  async function installAntigravityIde(target) {
205
254
  const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
206
255
  const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
@@ -319,6 +368,10 @@ async function installGlobalTarget(targetKey) {
319
368
  return await installCodexGlobal(target);
320
369
  }
321
370
 
371
+ if (target.kind === 'kilo-global') {
372
+ return await installKiloGlobal(target);
373
+ }
374
+
322
375
  const sourcePath = path.join(REPOSITORY_ROOT, target.sourcePath);
323
376
  const targetPath = target.targetPath();
324
377
 
@@ -111,8 +111,13 @@ const IDE_CHECKS = [
111
111
  {
112
112
  name: 'Kilo Code',
113
113
  type: 'adapter',
114
- checkPaths: [path.join(HOME, '.kilocode')],
115
- installHint: 'asc adapter --kilocode',
114
+ checkPaths: [
115
+ path.join(HOME, '.config', 'kilo'),
116
+ path.join(HOME, '.kilo'),
117
+ path.join(HOME, '.kilocode'),
118
+ ...(process.env.APPDATA ? [path.join(process.env.APPDATA, 'kilo')] : []),
119
+ ],
120
+ installHint: 'asc global --kilocode',
116
121
  },
117
122
  {
118
123
  name: 'Roo Code',
@@ -14,7 +14,9 @@ const ADAPTER_FILES = [
14
14
  { label: 'Continue', path: '.continue/rules/agentic-senior-core.md' },
15
15
  { label: 'Zed', path: '.zed/rules/agentic-senior-core.md' },
16
16
  { label: 'Aider', path: 'CONVENTIONS.md' },
17
- { label: 'Kilo Code', path: '.kilocode/rules/agentic-senior-core.md' },
17
+ { label: 'Kilo Code (modern rules)', path: '.kilo/rules/agentic-senior-core.md' },
18
+ { label: 'Kilo Code (modern plugin)', path: '.kilo/plugin/agentic-senior-core.js' },
19
+ { label: 'Kilo Code (legacy rules)', path: '.kilocode/rules/agentic-senior-core.md' },
18
20
  { label: 'Roo Code', path: '.roo/rules/agentic-senior-core.md' },
19
21
  { label: 'OpenHands', path: '.openhands/microagents/agentic-senior-core.md' },
20
22
  { label: 'ASC Compiled Validator', path: '.asc/hooks/pre-commit-validator.cjs' },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuenn3123/agentic-senior-core",
3
- "version": "6.5.3",
3
+ "version": "6.6.1",
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.5.3
2
+ version: 6.6.1
3
3
  description: Universal AI coding rules. Write code like a staff engineer.
4
4
  author: fatidaprilian
5
5
  provides_hooks: