@ryuenn3123/agentic-senior-core 6.13.0 → 6.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.13.0",
3
+ "version": "6.14.0",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "skills": "./skills/",
6
6
  "hooks": "./hooks/hooks.json",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.13.0",
3
+ "version": "6.14.0",
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": [
@@ -25,7 +25,7 @@ Run this when setting up a new project or when a developer wants ASC rules activ
25
25
 
26
26
  Plugin hosts (always-on, no adapter needed): Claude Code, Codex CLI, Gemini CLI, Antigravity CLI, Copilot CLI, Devin CLI, Hermes, OpenCode, OpenClaw.
27
27
 
28
- Adapter hosts (one file per project): Cursor, Devin Desktop, Cline, GitHub Copilot, Kiro, Continue, Zed, Aider, Kilo Code, Roo Code, OpenHands.
28
+ Adapter hosts (one file per project): Cursor, Devin Desktop, Cline, GitHub Copilot, Kiro, Continue, Zed, Aider, Kilo Code, OpenCode, Roo Code, OpenHands.
29
29
 
30
30
  ## Commands
31
31
 
@@ -41,7 +41,7 @@ asc uninstall --dry-run # Preview what would be removed
41
41
 
42
42
  ## Notes
43
43
 
44
- - **Tiered output**: Hosts with native skill/plugin support (Claude Code, Antigravity, Cursor, Roo, Kilo Code) receive the Lean Core rules only (~80 lines). Domain-specific guidance (testing, security, architecture) is loaded on-demand via their native skill engines, saving ~40% token overhead on routine tasks. Hosts without skill support (Aider, Zed, OpenHands) receive a full standalone file combining Core + Domain Reference for completeness.
44
+ - **Tiered output**: Hosts with native skill/plugin support (Claude Code, Antigravity, Cursor, Roo, Kilo Code, OpenCode) receive the Lean Core rules only (~80 lines). Domain-specific guidance (testing, security, architecture) is loaded on-demand via their native skill engines, saving ~40% token overhead on routine tasks. Hosts without skill support (Aider, Zed, OpenHands) receive a full standalone file combining Core + Domain Reference for completeness.
45
45
  - Cursor uses `.mdc` format with `alwaysApply: true` frontmatter.
46
46
  - Windsurf is now Devin Desktop. Use `--devin` for the preferred path, `--windsurf` for legacy.
47
47
  - Zed also reads `AGENTS.md` natively, so the adapter is optional.
package/CONTRIBUTING.md CHANGED
@@ -75,7 +75,7 @@ These hosts support full plugin systems. Create the host's manifest in its stand
75
75
  | Copilot CLI | `.github/plugin/plugin.json` | JSON |
76
76
  | Devin | `.devin-plugin/plugin.json` | JSON minimal |
77
77
  | Hermes | `plugin.yaml` + `__init__.py` | YAML + Python |
78
- | OpenCode | `.opencode/plugins/agentic-senior-core.mjs` | JS module |
78
+ | OpenCode | `.opencode/plugins/agentic-senior-core.js` | JS module (V2 setup + V1 server) |
79
79
 
80
80
  ### Instruction-tier hosts (single file copy)
81
81
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-senior-core",
3
- "version": "6.13.0",
3
+ "version": "6.14.0",
4
4
  "description": "Universal AI coding rules. Write code like a staff engineer.",
5
5
  "author": "fatidaprilian",
6
6
  "license": "MIT",
@@ -66,6 +66,15 @@ const ADAPTER_TARGETS = {
66
66
  sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
67
67
  pluginSourcePath: 'lib/kilo-plugin/agentic-senior-core.js',
68
68
  },
69
+ opencode: {
70
+ label: 'OpenCode',
71
+ targetPath: 'AGENTS.md',
72
+ sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
73
+ pluginTargetPath: '.opencode/plugins/agentic-senior-core.js',
74
+ pluginSourcePath: 'lib/opencode-plugin/agentic-senior-core.js',
75
+ skillsTargetPath: '.opencode/skills',
76
+ skillsSourcePath: '.agents/plugins/agentic-senior-core/skills',
77
+ },
69
78
  roo: {
70
79
  label: 'Roo Code',
71
80
  targetPath: '.roo/rules/agentic-senior-core.md',
@@ -80,6 +89,7 @@ const ADAPTER_TARGETS = {
80
89
  },
81
90
  };
82
91
 
92
+
83
93
  async function pathExists(filePath) {
84
94
  try {
85
95
  await fs.access(filePath);
@@ -159,6 +169,22 @@ async function generateAdapter(targetDirectory, adapterKey) {
159
169
  }
160
170
  }
161
171
 
172
+ if (adapterKey === 'opencode') {
173
+ if (adapter.pluginSourcePath && adapter.pluginTargetPath) {
174
+ const pluginSource = path.join(REPOSITORY_ROOT, adapter.pluginSourcePath);
175
+ const pluginTarget = path.join(targetDirectory, adapter.pluginTargetPath);
176
+ if (await pathExists(pluginSource)) {
177
+ await fs.mkdir(path.dirname(pluginTarget), { recursive: true });
178
+ await fs.copyFile(pluginSource, pluginTarget);
179
+ }
180
+ }
181
+ const skillsSource = path.join(REPOSITORY_ROOT, adapter.skillsSourcePath || '.agents/plugins/agentic-senior-core/skills');
182
+ const localSkillsTarget = path.join(targetDirectory, adapter.skillsTargetPath || '.opencode/skills');
183
+ if (await pathExists(skillsSource)) {
184
+ await copyDirRecursive(skillsSource, localSkillsTarget);
185
+ }
186
+ }
187
+
162
188
  if (adapterKey === 'roo') {
163
189
  const skillsSource = path.join(REPOSITORY_ROOT, adapter.skillsSourcePath || '.agents/plugins/agentic-senior-core/skills');
164
190
  const localSkillsTarget = path.join(targetDirectory, adapter.skillsTargetPath || '.roo/skills');
@@ -193,7 +219,7 @@ export async function runAdapterCommand(commandArguments) {
193
219
 
194
220
  if (requestedAdapters.length === 0) {
195
221
  console.log('Agentic Senior Core -- Adapter Generator\n');
196
- console.log('Usage: asc adapter [--cursor] [--codex] [--devin] [--cline] [--copilot] [--kiro] [--continue] [--zed] [--aider] [--kilocode] [--roo] [--openhands] [--windsurf] [--all]\n');
222
+ console.log('Usage: asc adapter [--cursor] [--codex] [--devin] [--cline] [--copilot] [--kiro] [--continue] [--zed] [--aider] [--kilocode] [--opencode] [--roo] [--openhands] [--windsurf] [--all]\n');
197
223
  console.log('Generates instruction-tier adapter files for IDEs without plugin support.');
198
224
  console.log('Each adapter is a single file containing the universal coding rules.\n');
199
225
  process.exit(0);
@@ -67,8 +67,20 @@ const GLOBAL_TARGETS = {
67
67
  pluginTargetPath: () => path.join(HOME, '.config', 'kilo', 'plugin', 'agentic-senior-core.js'),
68
68
  note: 'Installs global plugin to ~/.config/kilo/plugin/ and rules to ~/.config/kilo/rules/.',
69
69
  },
70
+ opencode: {
71
+ label: 'OpenCode',
72
+ kind: 'opencode-global',
73
+ rulesSourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
74
+ pluginSourcePath: 'lib/opencode-plugin/agentic-senior-core.js',
75
+ skillsSourcePath: '.agents/plugins/agentic-senior-core/skills',
76
+ targetPath: () => path.join(HOME, '.config', 'opencode', 'AGENTS.md'),
77
+ pluginTargetPath: () => path.join(HOME, '.config', 'opencode', 'plugins', 'agentic-senior-core.js'),
78
+ skillsTargetPath: () => path.join(HOME, '.config', 'opencode', 'skills'),
79
+ note: 'Installs global rules to ~/.config/opencode/AGENTS.md, plugin to plugins/, and skills.',
80
+ },
70
81
  kiro: {
71
82
  label: 'Kiro',
83
+
72
84
  kind: 'file',
73
85
  sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
74
86
  targetPath: () => path.join(HOME, '.kiro', 'steering', 'agentic-senior-core.md'),
@@ -281,6 +293,35 @@ async function installRooGlobal(target) {
281
293
  return true;
282
294
  }
283
295
 
296
+ async function installOpenCodeGlobal(target) {
297
+ const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
298
+ const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
299
+ const skillsSource = path.join(REPOSITORY_ROOT, target.skillsSourcePath);
300
+ const rulesTarget = target.targetPath();
301
+ const pluginTarget = target.pluginTargetPath();
302
+ const skillsTarget = target.skillsTargetPath();
303
+
304
+ if (!(await pathExists(rulesSource))) {
305
+ console.error(` ${target.label}: rules source not found ... FAIL`);
306
+ return false;
307
+ }
308
+
309
+ await fs.mkdir(path.dirname(rulesTarget), { recursive: true });
310
+ await fs.copyFile(rulesSource, rulesTarget);
311
+
312
+ if (await pathExists(pluginSource)) {
313
+ await fs.mkdir(path.dirname(pluginTarget), { recursive: true });
314
+ await fs.copyFile(pluginSource, pluginTarget);
315
+ }
316
+
317
+ if (await pathExists(skillsSource)) {
318
+ await copyDirRecursive(skillsSource, skillsTarget);
319
+ }
320
+
321
+ console.log(` ${target.label}: ${rulesTarget}, ${pluginTarget} & ${skillsTarget} ... OK`);
322
+ return true;
323
+ }
324
+
284
325
  async function installAntigravityIde(target) {
285
326
  const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
286
327
  const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
@@ -412,6 +453,10 @@ async function installGlobalTarget(targetKey) {
412
453
  return await installRooGlobal(target);
413
454
  }
414
455
 
456
+ if (target.kind === 'opencode-global') {
457
+ return await installOpenCodeGlobal(target);
458
+ }
459
+
415
460
  const sourcePath = path.join(REPOSITORY_ROOT, target.sourcePath);
416
461
  const targetPath = target.targetPath();
417
462
 
@@ -473,7 +518,7 @@ export async function runGlobalCommand(commandArguments) {
473
518
 
474
519
  if (requestedTargets.length === 0) {
475
520
  console.log('Agentic Senior Core -- Global Rules Installer\n');
476
- console.log('Usage: asc global [--antigravity] [--codex] [--cline] [--roo] [--kilocode] [--kiro] [--openhands] [--windsurf] [--copilot] [--all]\n');
521
+ console.log('Usage: asc global [--antigravity] [--codex] [--cline] [--roo] [--kilocode] [--opencode] [--kiro] [--openhands] [--windsurf] [--copilot] [--all]\n');
477
522
  console.log('Installs user-level global rules that apply to ALL projects.\n');
478
523
  console.log('Supported automatic global targets:');
479
524
  for (const [key, target] of Object.entries(GLOBAL_TARGETS)) {
@@ -42,6 +42,16 @@ const IDE_CHECKS = [
42
42
  checkCommands: ['agy'],
43
43
  installHint: 'agy plugin install https://github.com/fatidaprilian/Agentic-Senior-Core.git',
44
44
  },
45
+ {
46
+ name: 'OpenCode',
47
+ type: 'plugin',
48
+ checkPaths: [
49
+ path.join(HOME, '.config', 'opencode'),
50
+ path.join(HOME, '.opencode'),
51
+ ],
52
+ checkCommands: ['opencode'],
53
+ installHint: 'asc global --opencode (or asc adapter --opencode)',
54
+ },
45
55
  {
46
56
  name: 'Cursor',
47
57
  type: 'adapter',
@@ -17,6 +17,8 @@ const ADAPTER_FILES = [
17
17
  { label: 'Kilo Code (modern rules)', path: '.kilo/rules/agentic-senior-core.md' },
18
18
  { label: 'Kilo Code (modern plugin)', path: '.kilo/plugin/agentic-senior-core.js' },
19
19
  { label: 'Kilo Code (legacy rules)', path: '.kilocode/rules/agentic-senior-core.md' },
20
+ { label: 'OpenCode (plugin)', path: '.opencode/plugins/agentic-senior-core.js' },
21
+ { label: 'OpenCode (rules)', path: 'AGENTS.md' },
20
22
  { label: 'Roo Code', path: '.roo/rules/agentic-senior-core.md' },
21
23
  { label: 'OpenHands', path: '.openhands/microagents/agentic-senior-core.md' },
22
24
  { label: 'ASC Compiled Validator', path: '.asc/hooks/pre-commit-validator.cjs' },
@@ -26,6 +28,7 @@ const ADAPTER_FILES = [
26
28
  const ADAPTER_DIRECTORIES = [
27
29
  { label: 'Roo Code skills', path: '.roo/skills', markerFile: 'asc/SKILL.md' },
28
30
  { label: 'Kilo Code skills', path: '.kilo/skills', markerFile: 'asc/SKILL.md' },
31
+ { label: 'OpenCode skills', path: '.opencode/skills', markerFile: 'asc/SKILL.md' },
29
32
  ];
30
33
 
31
34
  const GIT_HOOK_PATHS = [
@@ -9,6 +9,40 @@ const ASC_GUARDRAILS = `
9
9
  - Early returns over deep nesting. Delete code that carries no value.
10
10
  `;
11
11
 
12
+ const setup = async (ctx) => {
13
+ if (ctx.session?.hook) {
14
+ await ctx.session.hook("context", (event) => {
15
+ if (Array.isArray(event.system)) {
16
+ const hasASC = event.system.some(item =>
17
+ (typeof item === 'string' && item.includes('Agentic Senior Core')) ||
18
+ (item && typeof item === 'object' && item.text && item.text.includes('Agentic Senior Core'))
19
+ );
20
+ if (!hasASC) {
21
+ event.system.push({ type: "text", text: ASC_GUARDRAILS.trim() });
22
+ }
23
+ }
24
+ });
25
+
26
+ await ctx.session.hook("compaction", (event) => {
27
+ if (Array.isArray(event.context)) {
28
+ event.context.push(
29
+ "## Agentic Senior Core (Persisted Context)\n" +
30
+ "- Maintain strict security guardrails and non-breaking API contracts.\n" +
31
+ "- Prefer clean minimal logic over premature abstractions."
32
+ );
33
+ }
34
+ });
35
+ }
36
+
37
+ if (ctx.shell?.hook) {
38
+ await ctx.shell.hook("create.before", (event) => {
39
+ if (event.env) {
40
+ event.env.ASC_ENABLED = "1";
41
+ }
42
+ });
43
+ }
44
+ };
45
+
12
46
  const server = async ({ project, directory, worktree }) => {
13
47
  return {
14
48
  "experimental.chat.system.transform": async (input, output) => {
@@ -38,5 +72,7 @@ const server = async ({ project, directory, worktree }) => {
38
72
 
39
73
  export default {
40
74
  id: "agentic-senior-core",
75
+ setup,
41
76
  server,
42
77
  };
78
+
@@ -0,0 +1,80 @@
1
+ // Native OpenCode Plugin for Agentic Senior Core
2
+ // Supports OpenCode V2 (setup) and legacy OpenCode / Kilo V1 (server)
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 setup = async (ctx) => {
13
+ if (ctx.session?.hook) {
14
+ // OpenCode V2 Context hook: inject system guardrails before model request
15
+ await ctx.session.hook("context", (event) => {
16
+ if (Array.isArray(event.system)) {
17
+ const hasASC = event.system.some(item =>
18
+ (typeof item === 'string' && item.includes('Agentic Senior Core')) ||
19
+ (item && typeof item === 'object' && item.text && item.text.includes('Agentic Senior Core'))
20
+ );
21
+ if (!hasASC) {
22
+ event.system.push({ type: "text", text: ASC_GUARDRAILS.trim() });
23
+ }
24
+ }
25
+ });
26
+
27
+ // OpenCode V2 Compaction hook: preserve core principles across session compaction
28
+ await ctx.session.hook("compaction", (event) => {
29
+ if (Array.isArray(event.context)) {
30
+ event.context.push(
31
+ "## Agentic Senior Core (Persisted Context)\n" +
32
+ "- Maintain strict security guardrails and non-breaking API contracts.\n" +
33
+ "- Prefer clean minimal logic over premature abstractions."
34
+ );
35
+ }
36
+ });
37
+ }
38
+
39
+ // OpenCode V2 Shell hook: mark ASC enabled in process environment
40
+ if (ctx.shell?.hook) {
41
+ await ctx.shell.hook("create.before", (event) => {
42
+ if (event.env) {
43
+ event.env.ASC_ENABLED = "1";
44
+ }
45
+ });
46
+ }
47
+ };
48
+
49
+ const server = async ({ project, directory, worktree }) => {
50
+ return {
51
+ "experimental.chat.system.transform": async (input, output) => {
52
+ if (Array.isArray(output.system)) {
53
+ const hasASC = output.system.some(item => typeof item === 'string' && item.includes('Agentic Senior Core'));
54
+ if (!hasASC) {
55
+ output.system.push(ASC_GUARDRAILS.trim());
56
+ }
57
+ }
58
+ },
59
+ "experimental.session.compacting": async (input, output) => {
60
+ if (Array.isArray(output.context)) {
61
+ output.context.push(
62
+ "## Agentic Senior Core (Persisted Context)\n" +
63
+ "- Maintain strict security guardrails and non-breaking API contracts.\n" +
64
+ "- Prefer clean minimal logic over premature abstractions."
65
+ );
66
+ }
67
+ },
68
+ "shell.env": async (input, output) => {
69
+ if (output.env) {
70
+ output.env.ASC_ENABLED = "1";
71
+ }
72
+ },
73
+ };
74
+ };
75
+
76
+ export default {
77
+ id: "agentic-senior-core",
78
+ setup,
79
+ server,
80
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuenn3123/agentic-senior-core",
3
- "version": "6.13.0",
3
+ "version": "6.14.0",
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.13.0
2
+ version: 6.14.0
3
3
  description: Universal AI coding rules. Write code like a staff engineer.
4
4
  author: fatidaprilian
5
5
  provides_hooks: