@ryuenn3123/agentic-senior-core 5.8.21 → 5.8.23
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/hooks/post-edit-enforce.js +100 -38
- package/.agents/plugins/agentic-senior-core/hooks/pre-tool-dependency-gate.js +20 -11
- package/.agents/plugins/agentic-senior-core/hooks.json +14 -7
- package/.agents/plugins/agentic-senior-core/plugin.json +10 -4
- package/.agents/plugins/agentic-senior-core/skills/asc-new-project/SKILL.md +5 -6
- package/README.md +10 -20
- package/gemini-extension.json +12 -6
- package/lib/cli/commands/adapter.mjs +21 -13
- package/lib/cli/commands/global.mjs +21 -11
- package/package.json +1 -21
- package/plugin.yaml +1 -1
- package/.claude-plugin/marketplace.json +0 -17
- package/.claude-plugin/plugin.json +0 -17
- package/.clinerules/agentic-senior-core.md +0 -109
- package/.codex-plugin/plugin.json +0 -24
- package/.continue/rules/agentic-senior-core.md +0 -109
- package/.cursor/rules/agentic-senior-core.mdc +0 -114
- package/.devin/rules/agentic-senior-core.md +0 -109
- package/.devin-plugin/plugin.json +0 -13
- package/.github/copilot-instructions.md +0 -109
- package/.github/plugin/marketplace.json +0 -20
- package/.github/plugin/plugin.json +0 -16
- package/.kilocode/rules/agentic-senior-core.md +0 -109
- package/.kiro/steering/agentic-senior-core.md +0 -109
- package/.openclaw/skills/asc/SKILL.md +0 -36
- package/.openclaw/skills/asc-adapter/SKILL.md +0 -43
- package/.openclaw/skills/asc-add-feature/SKILL.md +0 -53
- package/.openclaw/skills/asc-audit/SKILL.md +0 -36
- package/.openclaw/skills/asc-debt/SKILL.md +0 -72
- package/.openclaw/skills/asc-new-project/SKILL.md +0 -62
- package/.openclaw/skills/asc-refactor/SKILL.md +0 -62
- package/.openclaw/skills/asc-reference/SKILL.md +0 -59
- package/.openclaw/skills/asc-review/SKILL.md +0 -63
- package/.opencode/plugins/agentic-senior-core.mjs +0 -31
- package/.openhands/microagents/agentic-senior-core.md +0 -109
- package/.roo/rules/agentic-senior-core.md +0 -109
- package/.windsurf/rules/agentic-senior-core.md +0 -109
- package/.zed/rules/agentic-senior-core.md +0 -109
- package/hooks/copilot-hooks.json +0 -30
- package/hooks/hooks.json +0 -86
- package/hooks/lib/known-duplicates.json +0 -32
- package/hooks/package.json +0 -3
- package/hooks/path-util.cjs +0 -23
- package/hooks/post-edit-enforce.js +0 -234
- package/hooks/pre-tool-dependency-gate.js +0 -155
- package/hooks/session-start.js +0 -36
- package/hooks/subagent-start.js +0 -38
- package/skills/asc/SKILL.md +0 -36
- package/skills/asc-adapter/SKILL.md +0 -43
- package/skills/asc-add-feature/SKILL.md +0 -53
- package/skills/asc-audit/SKILL.md +0 -36
- package/skills/asc-debt/SKILL.md +0 -72
- package/skills/asc-new-project/SKILL.md +0 -62
- package/skills/asc-refactor/SKILL.md +0 -62
- package/skills/asc-reference/SKILL.md +0 -59
- package/skills/asc-review/SKILL.md +0 -63
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-add-feature.md +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-add-feature.toml +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-audit.md +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-audit.toml +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-help.md +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-help.toml +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-new-project.md +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-new-project.toml +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-refactor.md +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-refactor.toml +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-review.md +0 -0
- /package/{commands → .agents/plugins/agentic-senior-core/commands}/asc-review.toml +0 -0
|
@@ -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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
processSingleEdit(toolName, toolInput, function(nudge) {
|
|
55
|
+
emitClaude(nudge);
|
|
56
|
+
});
|
|
57
|
+
} catch (_) {
|
|
58
|
+
// Silent fail
|
|
59
|
+
}
|
|
60
|
+
});
|
|
54
61
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
111
|
+
function processSingleEdit(toolName, toolInput, emitFn, skipArray) {
|
|
112
|
+
const filePath = toolInput.file_path || '';
|
|
113
|
+
if (!filePath) return;
|
|
114
|
+
const findings = [];
|
|
65
115
|
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
129
|
+
checkLivingDocNudge(filePath, findings);
|
|
71
130
|
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
|
31
|
-
const
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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 \"
|
|
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 \"
|
|
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 \"
|
|
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 \"
|
|
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 \"
|
|
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 \"
|
|
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.
|
|
3
|
+
"version": "5.8.23",
|
|
4
4
|
"description": "Universal AI coding rules. Write code like a staff engineer.",
|
|
5
5
|
"contextFileName": "rules/agentic-senior-core.md",
|
|
6
|
-
"rules": [
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
"rules": [
|
|
7
|
+
"rules/"
|
|
8
|
+
],
|
|
9
|
+
"commands": [
|
|
10
|
+
"commands/"
|
|
11
|
+
],
|
|
12
|
+
"skills": [
|
|
13
|
+
"skills/"
|
|
14
|
+
],
|
|
9
15
|
"hooks": "hooks.json"
|
|
10
16
|
}
|
|
@@ -8,17 +8,16 @@ description: >
|
|
|
8
8
|
|
|
9
9
|
Structured greenfield workflow. Prevents building before alignment on what to build.
|
|
10
10
|
|
|
11
|
-
Grounded in: Spec-Driven Development (SDD) with scaffolding-spec approach. Core spec documents guide greenfield implementation (`PRD.md`, `Architecture.md`, `
|
|
11
|
+
Grounded in: Spec-Driven Development (SDD) with scaffolding-spec approach. Core spec documents guide greenfield implementation (`PRD.md`, `Architecture.md`, `Schema.md`). Once implemented, the code becomes the primary ground truth, while docs are updated on structural changes.
|
|
12
12
|
|
|
13
|
-
## Gate Mechanism &
|
|
13
|
+
## Gate Mechanism & 3 Spec Document Requirement
|
|
14
14
|
|
|
15
15
|
This workflow nudges the agent to stop at each phase boundary, same enforcement tier as the existing decision ladder — not a hard block. Bypasses are logged to the debt ledger.
|
|
16
16
|
|
|
17
|
-
For greenfield projects (`asc-new-project`), Phase 2 requires creating the **
|
|
17
|
+
For greenfield projects (`asc-new-project`), Phase 2 requires creating the **3 Core SDD Documents** in `docs/` or project root:
|
|
18
18
|
1. `PRD.md` — Product intent, goals, non-goals, and user problems.
|
|
19
19
|
2. `Architecture.md` — System structure, module boundaries, and tech stack choices.
|
|
20
|
-
3. `
|
|
21
|
-
4. `Schema.md` — Data contracts, database entities, API endpoints.
|
|
20
|
+
3. `Schema.md` — Data contracts, database entities, API endpoints.
|
|
22
21
|
|
|
23
22
|
*Note on Rules:* Coding conventions and project constraints are automatically loaded from global plugin rules (`agentic-senior-core.md`) or workspace `AGENTS.md`. No duplicate `docs/Rules.md` file is required.
|
|
24
23
|
|
|
@@ -43,7 +42,7 @@ Format:
|
|
|
43
42
|
## Phase 2: Spec (No Implementation Code)
|
|
44
43
|
|
|
45
44
|
1. On approval of Phase 1, update `workflow-gate.json` phase to `plan`.
|
|
46
|
-
2. Generate the
|
|
45
|
+
2. Generate the 3 core SDD documents from templates (`docs/PRD.md`, `docs/Architecture.md`, `docs/Schema.md`).
|
|
47
46
|
3. Verify exact file naming — check for typos like `Architectyre.md`.
|
|
48
47
|
4. Output specs for review.
|
|
49
48
|
5. **STOP and wait for user approval.** Do not implement code.
|
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
|
|
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
|
|
258
|
-
- **
|
|
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
|
|
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.
|
|
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/
|
|
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` |
|
package/gemini-extension.json
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-senior-core",
|
|
3
|
-
"version": "5.8.
|
|
3
|
+
"version": "5.8.23",
|
|
4
4
|
"description": "Universal AI coding rules. Write code like a staff engineer.",
|
|
5
5
|
"author": "fatidaprilian",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"contextFileName": "rules/agentic-senior-core.md",
|
|
8
|
-
"rules": [
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
7
|
+
"contextFileName": ".agents/plugins/agentic-senior-core/rules/agentic-senior-core.md",
|
|
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
|
+
],
|
|
17
|
+
"hooks": ".agents/plugins/agentic-senior-core/hooks.json"
|
|
12
18
|
}
|
|
@@ -10,62 +10,62 @@ const ADAPTER_TARGETS = {
|
|
|
10
10
|
cursor: {
|
|
11
11
|
label: 'Cursor',
|
|
12
12
|
targetPath: '.cursor/rules/agentic-senior-core.mdc',
|
|
13
|
-
sourcePath: '.
|
|
13
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
14
14
|
},
|
|
15
15
|
windsurf: {
|
|
16
16
|
label: 'Windsurf (legacy)',
|
|
17
17
|
targetPath: '.windsurf/rules/agentic-senior-core.md',
|
|
18
|
-
sourcePath: '.
|
|
18
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
19
19
|
},
|
|
20
20
|
devin: {
|
|
21
21
|
label: 'Devin Desktop',
|
|
22
22
|
targetPath: '.devin/rules/agentic-senior-core.md',
|
|
23
|
-
sourcePath: '.
|
|
23
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
24
24
|
},
|
|
25
25
|
cline: {
|
|
26
26
|
label: 'Cline',
|
|
27
27
|
targetPath: '.clinerules/agentic-senior-core.md',
|
|
28
|
-
sourcePath: '.
|
|
28
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
29
29
|
},
|
|
30
30
|
copilot: {
|
|
31
31
|
label: 'GitHub Copilot',
|
|
32
32
|
targetPath: '.github/copilot-instructions.md',
|
|
33
|
-
sourcePath: '.
|
|
33
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
34
34
|
},
|
|
35
35
|
kiro: {
|
|
36
36
|
label: 'Kiro',
|
|
37
37
|
targetPath: '.kiro/steering/agentic-senior-core.md',
|
|
38
|
-
sourcePath: '.
|
|
38
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
39
39
|
},
|
|
40
40
|
continue: {
|
|
41
41
|
label: 'Continue',
|
|
42
42
|
targetPath: '.continue/rules/agentic-senior-core.md',
|
|
43
|
-
sourcePath: '.
|
|
43
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
44
44
|
},
|
|
45
45
|
zed: {
|
|
46
46
|
label: 'Zed',
|
|
47
47
|
targetPath: '.zed/rules/agentic-senior-core.md',
|
|
48
|
-
sourcePath: '.
|
|
48
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
49
49
|
},
|
|
50
50
|
aider: {
|
|
51
51
|
label: 'Aider',
|
|
52
52
|
targetPath: 'CONVENTIONS.md',
|
|
53
|
-
sourcePath: '
|
|
53
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
54
54
|
},
|
|
55
55
|
kilocode: {
|
|
56
56
|
label: 'Kilo Code',
|
|
57
57
|
targetPath: '.kilocode/rules/agentic-senior-core.md',
|
|
58
|
-
sourcePath: '.
|
|
58
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
59
59
|
},
|
|
60
60
|
roo: {
|
|
61
61
|
label: 'Roo Code',
|
|
62
62
|
targetPath: '.roo/rules/agentic-senior-core.md',
|
|
63
|
-
sourcePath: '.
|
|
63
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
64
64
|
},
|
|
65
65
|
openhands: {
|
|
66
66
|
label: 'OpenHands',
|
|
67
67
|
targetPath: '.openhands/microagents/agentic-senior-core.md',
|
|
68
|
-
sourcePath: '.
|
|
68
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
69
69
|
},
|
|
70
70
|
};
|
|
71
71
|
|
|
@@ -95,7 +95,15 @@ async function generateAdapter(targetDirectory, adapterKey) {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
await fs.mkdir(targetDir, { recursive: true });
|
|
98
|
-
|
|
98
|
+
|
|
99
|
+
if (adapterKey === 'copilot') {
|
|
100
|
+
const rulesContent = await fs.readFile(sourcePath, 'utf8');
|
|
101
|
+
const instructionsContent = `---\napplyTo: '**'\n---\n\n${rulesContent}`;
|
|
102
|
+
await fs.writeFile(targetPath, instructionsContent);
|
|
103
|
+
} else {
|
|
104
|
+
await fs.copyFile(sourcePath, targetPath);
|
|
105
|
+
}
|
|
106
|
+
|
|
99
107
|
console.log(` ${adapter.label}: ${adapter.targetPath} ... OK`);
|
|
100
108
|
return true;
|
|
101
109
|
}
|
|
@@ -26,10 +26,10 @@ 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
|
-
rulesSourcePath: '.agents/rules/agentic-senior-core.md',
|
|
32
|
+
rulesSourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
33
33
|
pluginTargetPath: () => path.join(HOME, '.gemini', 'config', 'plugins', 'agentic-senior-core'),
|
|
34
34
|
rulesTargetPath: () => path.join(HOME, '.gemini', 'GEMINI.md'),
|
|
35
35
|
targetPath: () => path.join(HOME, '.gemini', 'config', 'plugins', 'agentic-senior-core'),
|
|
@@ -38,49 +38,49 @@ const GLOBAL_TARGETS = {
|
|
|
38
38
|
cline: {
|
|
39
39
|
label: 'Cline',
|
|
40
40
|
kind: 'file',
|
|
41
|
-
sourcePath: '.
|
|
41
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
42
42
|
targetPath: () => path.join(HOME, 'Documents', 'Cline', 'Rules', 'agentic-senior-core.md'),
|
|
43
43
|
note: 'Toggleable in the Cline rules panel.',
|
|
44
44
|
},
|
|
45
45
|
roo: {
|
|
46
46
|
label: 'Roo Code',
|
|
47
47
|
kind: 'file',
|
|
48
|
-
sourcePath: '.
|
|
48
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
49
49
|
targetPath: () => path.join(HOME, '.roo', 'rules', 'agentic-senior-core.md'),
|
|
50
50
|
note: 'Roo Code was discontinued in May 2026; kept for existing installs.',
|
|
51
51
|
},
|
|
52
52
|
kilocode: {
|
|
53
53
|
label: 'Kilo Code',
|
|
54
54
|
kind: 'file',
|
|
55
|
-
sourcePath: '.
|
|
55
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
56
56
|
targetPath: () => path.join(HOME, '.kilocode', 'rules', 'agentic-senior-core.md'),
|
|
57
57
|
note: 'Kilo v7+: prefer adding the file path to the instructions array in ~/.config/kilo/kilo.jsonc (auto-updates with npm).',
|
|
58
58
|
},
|
|
59
59
|
kiro: {
|
|
60
60
|
label: 'Kiro',
|
|
61
61
|
kind: 'file',
|
|
62
|
-
sourcePath: '.
|
|
62
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
63
63
|
targetPath: () => path.join(HOME, '.kiro', 'steering', 'agentic-senior-core.md'),
|
|
64
64
|
note: 'Global steering has known loading bugs in some Kiro builds; fall back to asc adapter --kiro if rules are not picked up.',
|
|
65
65
|
},
|
|
66
66
|
openhands: {
|
|
67
67
|
label: 'OpenHands',
|
|
68
68
|
kind: 'file',
|
|
69
|
-
sourcePath: '.
|
|
69
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
70
70
|
targetPath: () => path.join(HOME, '.openhands', 'microagents', 'agentic-senior-core.md'),
|
|
71
71
|
note: 'Works in CLI/headless/dev modes. Docker runs need the directory mounted.',
|
|
72
72
|
},
|
|
73
73
|
windsurf: {
|
|
74
74
|
label: 'Windsurf / Devin Desktop',
|
|
75
75
|
kind: 'guarded-file',
|
|
76
|
-
sourcePath: '.
|
|
76
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
77
77
|
targetPath: () => path.join(HOME, '.codeium', 'windsurf', 'memories', 'global_rules.md'),
|
|
78
78
|
note: 'Single global file (6,000 char limit). Skipped if you already have your own global_rules.md.',
|
|
79
79
|
},
|
|
80
80
|
copilot: {
|
|
81
81
|
label: 'GitHub Copilot (VS Code)',
|
|
82
82
|
kind: 'copilot-user-instructions',
|
|
83
|
-
sourcePath: '.
|
|
83
|
+
sourcePath: '.agents/plugins/agentic-senior-core/rules/agentic-senior-core.md',
|
|
84
84
|
targetPath: () => path.join(vscodeUserPromptsDirectory(), 'agentic-senior-core.instructions.md'),
|
|
85
85
|
note: 'Installs into the VS Code default profile. Other profiles need their own copy.',
|
|
86
86
|
},
|
|
@@ -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
|
|
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).
|