Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "edgeone-makers",
"owner": {
"name": "EdgeOne"
},
"description": "EdgeOne Makers platform development skills marketplace.",
"plugins": [
{
"name": "edgeone-makers-tools",
"source": "./",
"description": "EdgeOne Makers platform development skills — AI Agents, Cloud Functions, Edge Functions, Storage, Middleware, and Deployment.",
"version": "1.0.0",
"author": {
"name": "EdgeOne"
},
"category": "edge-one",
"tags": ["edgeone", "makers", "edge-functions", "cloud-functions", "agents", "deployment"]
}
]
}
9 changes: 9 additions & 0 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "edgeone-makers-tools",
"description": "EdgeOne Makers platform development skills — AI Agents, Cloud Functions, Edge Functions, Storage, Middleware, and Deployment.",
"version": "1.0.0",
"author": {
"name": "EdgeOne"
},
"hooks": "./hooks/hooks.json"
}
30 changes: 30 additions & 0 deletions .codebuddy-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "edgeone-makers",
"owner": {
"name": "EdgeOne"
},
"description": "EdgeOne Makers platform development skills marketplace.",
"plugins": [
{
"name": "edgeone-makers-tools",
"source": "./",
"description": "EdgeOne Makers platform development skills — AI Agents, Cloud Functions, Edge Functions, Storage, Middleware, and Deployment.",
"version": "1.0.0",
"author": {
"name": "EdgeOne"
},
"strict": false,
"skills": [
"./skills/makers-agents",
"./skills/makers-deploy",
"./skills/makers-edge-functions",
"./skills/makers-cloud-functions",
"./skills/makers-storage",
"./skills/makers-middleware",
"./skills/makers-cli",
"./skills/makers-recipes"
],
"hooks": "./hooks/hooks.json"
}
]
}
16 changes: 0 additions & 16 deletions .cursor-plugin/manifest.json

This file was deleted.

5 changes: 3 additions & 2 deletions .claude-plugin/manifest.json → .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "edgeone-makers-tools",
"description": "EdgeOne Makers platform development skills — AI Agents, Cloud Functions, Edge Functions, Storage, Middleware, and Deployment.",
"version": "1.0.0",
"author": "EdgeOne",
"hooks": "../hooks/hooks.json"
"author": {
"name": "EdgeOne"
}
}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,7 @@ docs/

# Export script and output
scripts/export-clean.sh
edgeone-makers-tools-clean/
edgeone-makers-tools-clean/

# EdgeOne Makers hook signal log and state
.edgeone/signal-log.jsonl
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ internally).
> [`BRANCH.md`](https://github.com/TencentEdgeOne/edgeone-makers-tools/blob/skillhub/BRANCH.md)
> on the `skillhub` branch for the maintenance flow.

### Option C — Claude Code plugin marketplace

```text
/plugin marketplace add TencentEdgeOne/edgeone-makers-tools
/plugin install edgeone-makers-tools@edgeone-makers
```

After installation, your AI coding agent will automatically detect relevant tasks and load the right skill.

## Skills
Expand Down
30 changes: 3 additions & 27 deletions hooks/hooks.json
Original file line number Diff line number Diff line change
@@ -1,37 +1,13 @@
{
"hooks": {
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/on-prompt.sh",
"timeout": 5
}
]
}
],
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"if": "Write(agents/*)|Edit(agents/*)",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/on-agent-write.sh",
"timeout": 5
}
]
},
{
"matcher": "Bash",
"matcher": "Edit|Write|replace_in_file|write_to_file",
"hooks": [
{
"type": "command",
"if": "Bash(edgeone *)",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/on-edgeone-cmd.sh",
"timeout": 5
"command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/validate-write.mjs\"",
"timeout": 3
}
]
}
Expand Down
10 changes: 0 additions & 10 deletions hooks/on-agent-write.sh

This file was deleted.

18 changes: 0 additions & 18 deletions hooks/on-edgeone-cmd.sh

This file was deleted.

18 changes: 0 additions & 18 deletions hooks/on-prompt.sh

This file was deleted.

43 changes: 43 additions & 0 deletions hooks/signal-log.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { appendFileSync, mkdirSync } from 'node:fs';
import { dirname, join } from 'node:path';

const REQUIRED_SIGNAL_FIELDS = ['hook', 'trigger', 'matchedSkill', 'reason'];

export function defaultSignalLogPath(env = process.env, cwd = process.cwd()) {
return env.EDGEONE_MAKERS_SIGNAL_LOG || join(cwd, '.edgeone', 'signal-log.jsonl');
}

function normalizeSignalLogEntry(entry, now = new Date()) {
for (const field of REQUIRED_SIGNAL_FIELDS) {
if (!entry?.[field]) {
throw new Error(`Missing signal log field: ${field}`);
}
}

const normalized = {
timestamp: now.toISOString(),
hook: entry.hook,
trigger: entry.trigger,
matchedSkill: entry.matchedSkill,
reason: entry.reason,
};

if (entry.platform) normalized.platform = entry.platform;
if (entry.toolName) normalized.toolName = entry.toolName;

return normalized;
}

export function shouldWriteSignalLog(options = {}) {
return Boolean(options.enableSignalLog || options.signalLogPath);
}

export function writeSignalLog(entry, options = {}) {
const normalized = normalizeSignalLogEntry(entry, options.now);
const logPath = options.logPath || options.signalLogPath || defaultSignalLogPath();

mkdirSync(dirname(logPath), { recursive: true });
appendFileSync(logPath, `${JSON.stringify(normalized)}\n`);

return normalized;
}
52 changes: 52 additions & 0 deletions hooks/signal-log.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import assert from 'node:assert/strict';
import { mkdtemp, readFile, rm } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import test from 'node:test';

import { writeSignalLog } from './signal-log.mjs';

test('plugin-skill-injection-optimization.SIGNAL_LOGGING.1 appends signal entries to JSONL', async () => {
const tmp = await mkdtemp(join(tmpdir(), 'makers-signal-log-'));
const logPath = join(tmp, '.edgeone', 'signal-log.jsonl');

try {
writeSignalLog(
{
hook: 'PreToolUse',
trigger: 'pathPatterns',
matchedSkill: 'makers-edge-functions',
reason: 'functions/index.ts matched functions/**',
platform: 'claude-code',
toolName: 'Read',
},
{ logPath, now: new Date('2026-06-24T00:00:00.000Z') },
);

const [line] = (await readFile(logPath, 'utf8')).trim().split('\n');

assert.deepEqual(JSON.parse(line), {
timestamp: '2026-06-24T00:00:00.000Z',
hook: 'PreToolUse',
trigger: 'pathPatterns',
matchedSkill: 'makers-edge-functions',
reason: 'functions/index.ts matched functions/**',
platform: 'claude-code',
toolName: 'Read',
});
} finally {
await rm(tmp, { recursive: true, force: true });
}
});

test('plugin-skill-injection-optimization.SIGNAL_LOGGING.2 requires the core signal fields', () => {
assert.throws(
() =>
writeSignalLog({
hook: 'PreToolUse',
trigger: 'pathPatterns',
matchedSkill: 'makers-edge-functions',
}),
/Missing signal log field: reason/,
);
});
Loading
Loading