@ryuenn3123/agentic-senior-core 6.2.0 → 6.2.2
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/.codex-plugin/plugin.json +14 -0
- package/.agents/plugins/agentic-senior-core/plugin.json +1 -1
- package/.agents/plugins/marketplace.json +20 -0
- package/gemini-extension.json +1 -1
- package/lib/cli/ascx/fixture-evaluator.mjs +2 -1
- package/lib/cli/ascx/tee-writer.mjs +7 -2
- package/lib/cli/commands/adapter.mjs +6 -1
- package/lib/cli/commands/global.mjs +72 -74
- package/lib/cli/commands/uninstall.mjs +1 -0
- package/package.json +1 -1
- package/plugin.yaml +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentic-senior-core",
|
|
3
|
+
"version": "6.2.2",
|
|
4
|
+
"description": "Universal AI coding rules. Write code like a staff engineer.",
|
|
5
|
+
"skills": "./skills/",
|
|
6
|
+
"hooks": "./hooks/hooks.json",
|
|
7
|
+
"interface": {
|
|
8
|
+
"displayName": "Agentic Senior Core",
|
|
9
|
+
"shortDescription": "Universal AI coding rules and workflows",
|
|
10
|
+
"longDescription": "Write code like a staff engineer, not a junior. Universal rules, decision ladder, and deterministic quality gates.",
|
|
11
|
+
"developerName": "fatidaprilian",
|
|
12
|
+
"category": "Productivity"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -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": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
package/gemini-extension.json
CHANGED
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
|
|
4
4
|
import { runAscx } from './runtime.mjs';
|
|
5
5
|
import { estimateOutputTokens } from './token-estimate.mjs';
|
|
6
|
+
import { getDefaultTeeDirectory } from './tee-writer.mjs';
|
|
6
7
|
|
|
7
8
|
function combineOutput(stdout, stderr) {
|
|
8
9
|
return [stdout, stderr].filter(Boolean).join('\n');
|
|
@@ -115,7 +116,7 @@ async function evaluateFixture(fixtureEntry, options) {
|
|
|
115
116
|
export async function evaluateAscxFixtures(fixtures, options = {}) {
|
|
116
117
|
const cwd = options.cwd || process.cwd();
|
|
117
118
|
const teeDirectoryPath = path.resolve(
|
|
118
|
-
options.teeDirectoryPath ||
|
|
119
|
+
options.teeDirectoryPath || getDefaultTeeDirectory(cwd)
|
|
119
120
|
);
|
|
120
121
|
const results = [];
|
|
121
122
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
2
3
|
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
3
5
|
|
|
4
6
|
export const MAX_TEE_FILES = 20;
|
|
5
7
|
|
|
@@ -12,7 +14,11 @@ function sanitizeFileNamePart(rawValue) {
|
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
export function getDefaultTeeDirectory(cwd = process.cwd()) {
|
|
15
|
-
|
|
17
|
+
const localLegacyDir = path.resolve(cwd, '.agent-context', 'state', 'token-saver', 'tee');
|
|
18
|
+
if (existsSync(localLegacyDir)) {
|
|
19
|
+
return localLegacyDir;
|
|
20
|
+
}
|
|
21
|
+
return path.join(os.homedir(), '.asc', 'state', 'token-saver', 'tee');
|
|
16
22
|
}
|
|
17
23
|
|
|
18
24
|
async function sweepOldTeeFiles(directoryPath, maxFiles = MAX_TEE_FILES) {
|
|
@@ -60,4 +66,3 @@ export async function writeRawTeeFile({
|
|
|
60
66
|
|
|
61
67
|
return teeFilePath;
|
|
62
68
|
}
|
|
63
|
-
|
|
@@ -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,64 @@ async function pathExists(filePath) {
|
|
|
103
108
|
}
|
|
104
109
|
}
|
|
105
110
|
|
|
111
|
+
async function copyDirRecursive(src, dest) {
|
|
112
|
+
await fs.mkdir(dest, { recursive: true });
|
|
113
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
const srcPath = path.join(src, entry.name);
|
|
116
|
+
const destPath = path.join(dest, entry.name);
|
|
117
|
+
if (entry.isDirectory()) {
|
|
118
|
+
await copyDirRecursive(srcPath, destPath);
|
|
119
|
+
} else {
|
|
120
|
+
await fs.copyFile(srcPath, destPath);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function installCodexGlobal(target) {
|
|
126
|
+
const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
|
|
127
|
+
const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
|
|
128
|
+
const rulesTarget = target.targetPath();
|
|
129
|
+
const pluginTarget = target.pluginTargetPath();
|
|
130
|
+
|
|
131
|
+
if (!(await pathExists(rulesSource)) || !(await pathExists(pluginSource))) {
|
|
132
|
+
console.error(` ${target.label}: source not found ... FAIL`);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Copy global AGENTS.md instructions (~/.codex/AGENTS.md)
|
|
137
|
+
await fs.mkdir(path.dirname(rulesTarget), { recursive: true });
|
|
138
|
+
await fs.copyFile(rulesSource, rulesTarget);
|
|
139
|
+
|
|
140
|
+
// Copy plugin bundle & marketplace catalog (~/.agents/plugins/)
|
|
141
|
+
await fs.mkdir(pluginTarget, { recursive: true });
|
|
142
|
+
await copyDirRecursive(pluginSource, pluginTarget);
|
|
143
|
+
|
|
144
|
+
console.log(` ${target.label}: ${rulesTarget} & ${pluginTarget} ... OK`);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function installAntigravityIde(target) {
|
|
149
|
+
const pluginSource = path.join(REPOSITORY_ROOT, target.pluginSourcePath);
|
|
150
|
+
const rulesSource = path.join(REPOSITORY_ROOT, target.rulesSourcePath);
|
|
151
|
+
const pluginTargetPath = target.pluginTargetPath();
|
|
152
|
+
const cliTargetPath = path.join(HOME, '.gemini', 'antigravity-cli', 'plugins', 'agentic-senior-core');
|
|
153
|
+
|
|
154
|
+
if (!(await pathExists(pluginSource)) || !(await pathExists(rulesSource))) {
|
|
155
|
+
console.error(` ${target.label}: plugin source not found ... FAIL`);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
await fs.mkdir(path.dirname(pluginTargetPath), { recursive: true });
|
|
160
|
+
await copyDirRecursive(pluginSource, pluginTargetPath);
|
|
161
|
+
|
|
162
|
+
await fs.mkdir(path.dirname(cliTargetPath), { recursive: true });
|
|
163
|
+
await copyDirRecursive(pluginSource, cliTargetPath);
|
|
164
|
+
|
|
165
|
+
console.log(` ${target.label}: ${pluginTargetPath} ... OK`);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
|
|
106
169
|
async function installGlobalTarget(targetKey) {
|
|
107
170
|
const target = GLOBAL_TARGETS[targetKey];
|
|
108
171
|
|
|
@@ -110,6 +173,10 @@ async function installGlobalTarget(targetKey) {
|
|
|
110
173
|
return await installAntigravityIde(target);
|
|
111
174
|
}
|
|
112
175
|
|
|
176
|
+
if (target.kind === 'codex-global') {
|
|
177
|
+
return await installCodexGlobal(target);
|
|
178
|
+
}
|
|
179
|
+
|
|
113
180
|
const sourcePath = path.join(REPOSITORY_ROOT, target.sourcePath);
|
|
114
181
|
const targetPath = target.targetPath();
|
|
115
182
|
|
|
@@ -122,11 +189,9 @@ async function installGlobalTarget(targetKey) {
|
|
|
122
189
|
const rawRules = await fs.readFile(sourcePath, 'utf8');
|
|
123
190
|
const formattedRules = `---\ntrigger: always_on\n---\n\n${rawRules}`;
|
|
124
191
|
|
|
125
|
-
// Modern path (~/.windsurf/rules/agentic-senior-core.md)
|
|
126
192
|
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
127
193
|
await fs.writeFile(targetPath, formattedRules, 'utf8');
|
|
128
194
|
|
|
129
|
-
// Legacy path (~/.codeium/windsurf/memories/global_rules.md)
|
|
130
195
|
const legacyPath = target.legacyTargetPath();
|
|
131
196
|
if (!await pathExists(legacyPath)) {
|
|
132
197
|
await fs.mkdir(path.dirname(legacyPath), { recursive: true });
|
|
@@ -137,21 +202,6 @@ async function installGlobalTarget(targetKey) {
|
|
|
137
202
|
return true;
|
|
138
203
|
}
|
|
139
204
|
|
|
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
205
|
if (target.kind === 'copilot-user-instructions') {
|
|
156
206
|
const rulesContent = await fs.readFile(sourcePath, 'utf8');
|
|
157
207
|
const instructionsContent = `---\napplyTo: '**'\n---\n\n${rulesContent}`;
|
|
@@ -167,58 +217,6 @@ async function installGlobalTarget(targetKey) {
|
|
|
167
217
|
return true;
|
|
168
218
|
}
|
|
169
219
|
|
|
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
220
|
export async function runGlobalCommand(commandArguments) {
|
|
223
221
|
const requestedTargets = [];
|
|
224
222
|
|
|
@@ -240,7 +238,7 @@ export async function runGlobalCommand(commandArguments) {
|
|
|
240
238
|
|
|
241
239
|
if (requestedTargets.length === 0) {
|
|
242
240
|
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');
|
|
241
|
+
console.log('Usage: asc global [--antigravity] [--codex] [--cline] [--roo] [--kilocode] [--kiro] [--openhands] [--windsurf] [--copilot] [--all]\n');
|
|
244
242
|
console.log('Installs user-level global rules that apply to ALL projects.\n');
|
|
245
243
|
console.log('Supported automatic global targets:');
|
|
246
244
|
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
package/plugin.yaml
CHANGED