aura-code 0.6.3 → 0.10.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.
- package/README.md +47 -164
- package/dist/agent/affect.d.ts +13 -0
- package/dist/agent/affect.js +34 -0
- package/dist/agent/affect.js.map +1 -0
- package/dist/agent/compactor.d.ts +27 -4
- package/dist/agent/compactor.js +185 -54
- package/dist/agent/compactor.js.map +1 -1
- package/dist/agent/confess.d.ts +35 -0
- package/dist/agent/confess.js +296 -0
- package/dist/agent/confess.js.map +1 -0
- package/dist/agent/context.d.ts +0 -4
- package/dist/agent/context.js +0 -38
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/domain-expertise.d.ts +22 -0
- package/dist/agent/domain-expertise.js +110 -0
- package/dist/agent/domain-expertise.js.map +1 -0
- package/dist/agent/executive-queue.d.ts +26 -0
- package/dist/agent/executive-queue.js +50 -0
- package/dist/agent/executive-queue.js.map +1 -0
- package/dist/agent/generational-flush.d.ts +28 -0
- package/dist/agent/generational-flush.js +48 -0
- package/dist/agent/generational-flush.js.map +1 -0
- package/dist/agent/loop-profile.d.ts +50 -0
- package/dist/agent/loop-profile.js +88 -0
- package/dist/agent/loop-profile.js.map +1 -0
- package/dist/agent/loop.d.ts +14 -5
- package/dist/agent/loop.js +167 -39
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/memory-consolidate.d.ts +14 -0
- package/dist/agent/memory-consolidate.js +141 -0
- package/dist/agent/memory-consolidate.js.map +1 -0
- package/dist/agent/mixture.d.ts +33 -0
- package/dist/agent/mixture.js +138 -0
- package/dist/agent/mixture.js.map +1 -0
- package/dist/agent/spawner.js +2 -2
- package/dist/agent/spawner.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/agent/system-prompt.js +50 -22
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/unified-memory.d.ts +15 -0
- package/dist/agent/unified-memory.js +164 -0
- package/dist/agent/unified-memory.js.map +1 -0
- package/dist/checkpoints/engine.d.ts +44 -0
- package/dist/checkpoints/engine.js +324 -0
- package/dist/checkpoints/engine.js.map +1 -0
- package/dist/cli/command-palette.d.ts +26 -0
- package/dist/cli/command-palette.js +133 -0
- package/dist/cli/command-palette.js.map +1 -0
- package/dist/cli/context-health.d.ts +51 -0
- package/dist/cli/context-health.js +187 -0
- package/dist/cli/context-health.js.map +1 -0
- package/dist/cli/diamond.d.ts +67 -0
- package/dist/cli/diamond.js +222 -12
- package/dist/cli/diamond.js.map +1 -1
- package/dist/cli/dic.d.ts +2 -0
- package/dist/cli/dic.js +106 -0
- package/dist/cli/dic.js.map +1 -0
- package/dist/cli/diff-view.d.ts +18 -0
- package/dist/cli/diff-view.js +114 -0
- package/dist/cli/diff-view.js.map +1 -0
- package/dist/cli/display.d.ts +18 -4
- package/dist/cli/display.js +74 -151
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/help-data.d.ts +7 -0
- package/dist/cli/help-data.js +80 -0
- package/dist/cli/help-data.js.map +1 -0
- package/dist/cli/index.js +1002 -852
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/markdown.d.ts +5 -0
- package/dist/cli/markdown.js +128 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/model-select.d.ts +39 -0
- package/dist/cli/model-select.js +65 -0
- package/dist/cli/model-select.js.map +1 -0
- package/dist/cli/tui.d.ts +34 -0
- package/dist/cli/tui.js +1176 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -17
- package/dist/config/defaults.js +25 -46
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/project-config.d.ts +2 -6
- package/dist/config/project-config.js +2 -2
- package/dist/config/project-config.js.map +1 -1
- package/dist/doctor/checks.d.ts +18 -0
- package/dist/doctor/checks.js +524 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/index.d.ts +4 -0
- package/dist/doctor/index.js +229 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/repair.d.ts +19 -0
- package/dist/doctor/repair.js +126 -0
- package/dist/doctor/repair.js.map +1 -0
- package/dist/doctor/types.d.ts +38 -0
- package/dist/doctor/types.js +10 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/dream/dream.d.ts +79 -59
- package/dist/dream/dream.js +324 -144
- package/dist/dream/dream.js.map +1 -1
- package/dist/dream/episode.d.ts +17 -0
- package/dist/dream/episode.js +116 -0
- package/dist/dream/episode.js.map +1 -0
- package/dist/kanban/engine.d.ts +26 -0
- package/dist/kanban/engine.js +208 -0
- package/dist/kanban/engine.js.map +1 -0
- package/dist/kanban/types.d.ts +19 -0
- package/dist/kanban/types.js +9 -1
- package/dist/kanban/types.js.map +1 -1
- package/dist/machina/render-html.js +4 -2
- package/dist/machina/render-html.js.map +1 -1
- package/dist/machina/render-terminal.js +11 -4
- package/dist/machina/render-terminal.js.map +1 -1
- package/dist/machina/repair.d.ts +23 -0
- package/dist/machina/repair.js +98 -0
- package/dist/machina/repair.js.map +1 -0
- package/dist/machina/spec.js +12 -12
- package/dist/machina/spec.js.map +1 -1
- package/dist/machina/verify.d.ts +13 -1
- package/dist/machina/verify.js +12 -2
- package/dist/machina/verify.js.map +1 -1
- package/dist/mining/extract.d.ts +34 -0
- package/dist/mining/extract.js +229 -0
- package/dist/mining/extract.js.map +1 -0
- package/dist/mining/refine.d.ts +28 -0
- package/dist/mining/refine.js +256 -0
- package/dist/mining/refine.js.map +1 -0
- package/dist/perception/extractor.js +5 -3
- package/dist/perception/extractor.js.map +1 -1
- package/dist/perception/graph-store.d.ts +0 -11
- package/dist/perception/graph-store.js +0 -33
- package/dist/perception/graph-store.js.map +1 -1
- package/dist/perception/index.d.ts +1 -1
- package/dist/perception/index.js +1 -2
- package/dist/perception/index.js.map +1 -1
- package/dist/plugins/commands.d.ts +38 -0
- package/dist/plugins/commands.js +134 -0
- package/dist/plugins/commands.js.map +1 -0
- package/dist/plugins/frontmatter.d.ts +14 -0
- package/dist/plugins/frontmatter.js +78 -0
- package/dist/plugins/frontmatter.js.map +1 -0
- package/dist/plugins/hooks.d.ts +12 -0
- package/dist/plugins/hooks.js +148 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/loader.d.ts +7 -0
- package/dist/plugins/loader.js +255 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/market.d.ts +23 -0
- package/dist/plugins/market.js +281 -0
- package/dist/plugins/market.js.map +1 -0
- package/dist/plugins/types.d.ts +90 -0
- package/dist/plugins/types.js +20 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
- package/dist/providers/anthropic-oauth-draft.js +414 -0
- package/dist/providers/anthropic-oauth-draft.js.map +1 -0
- package/dist/providers/anthropic.d.ts +4 -1
- package/dist/providers/anthropic.js +35 -7
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +43 -19
- package/dist/providers/factory.js +183 -129
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +9 -22
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/live-models.d.ts +23 -0
- package/dist/providers/live-models.js +145 -0
- package/dist/providers/live-models.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +1 -12
- package/dist/providers/openai-compatible.js +71 -108
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/providers/resilient-factory.js +1 -1
- package/dist/providers/resilient-factory.js.map +1 -1
- package/dist/repl/queue.d.ts +22 -0
- package/dist/repl/queue.js +165 -0
- package/dist/repl/queue.js.map +1 -0
- package/dist/repl/side-channel.d.ts +23 -0
- package/dist/repl/side-channel.js +63 -0
- package/dist/repl/side-channel.js.map +1 -0
- package/dist/research/council.d.ts +2 -0
- package/dist/research/council.js +29 -4
- package/dist/research/council.js.map +1 -1
- package/dist/ruby/alternator.d.ts +11 -30
- package/dist/ruby/alternator.js +59 -38
- package/dist/ruby/alternator.js.map +1 -1
- package/dist/ruby/episode-capture.d.ts +0 -10
- package/dist/ruby/episode-capture.js +0 -33
- package/dist/ruby/episode-capture.js.map +1 -1
- package/dist/ruby/types.js +1 -1
- package/dist/ruby/types.js.map +1 -1
- package/dist/safety/path-jail.d.ts +17 -0
- package/dist/safety/path-jail.js +100 -0
- package/dist/safety/path-jail.js.map +1 -0
- package/dist/safety/permissions.d.ts +12 -21
- package/dist/safety/permissions.js +81 -216
- package/dist/safety/permissions.js.map +1 -1
- package/dist/safety/ssrf.d.ts +29 -0
- package/dist/safety/ssrf.js +185 -0
- package/dist/safety/ssrf.js.map +1 -0
- package/dist/server/index.js +64 -10
- package/dist/server/index.js.map +1 -1
- package/dist/setup/first-run.d.ts +0 -24
- package/dist/setup/first-run.js +10 -344
- package/dist/setup/first-run.js.map +1 -1
- package/dist/setup/key-store.d.ts +12 -0
- package/dist/setup/key-store.js +108 -0
- package/dist/setup/key-store.js.map +1 -0
- package/dist/setup/provider-registry.js +31 -18
- package/dist/setup/provider-registry.js.map +1 -1
- package/dist/setup/provider-test.d.ts +7 -0
- package/dist/setup/provider-test.js +73 -10
- package/dist/setup/provider-test.js.map +1 -1
- package/dist/setup/provider-wizard.d.ts +4 -1
- package/dist/setup/provider-wizard.js +92 -26
- package/dist/setup/provider-wizard.js.map +1 -1
- package/dist/setup/xiaomi.d.ts +1 -1
- package/dist/setup/xiaomi.js +3 -3
- package/dist/setup/xiaomi.js.map +1 -1
- package/dist/tools/browser.js +14 -10
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/clipboard.js +7 -1
- package/dist/tools/clipboard.js.map +1 -1
- package/dist/tools/dictate.d.ts +60 -0
- package/dist/tools/dictate.js +983 -0
- package/dist/tools/dictate.js.map +1 -0
- package/dist/tools/dictate_patched.js +1057 -0
- package/dist/tools/edit-file.js +10 -2
- package/dist/tools/edit-file.js.map +1 -1
- package/dist/tools/http-request.js +14 -4
- package/dist/tools/http-request.js.map +1 -1
- package/dist/tools/image-read.js +34 -2
- package/dist/tools/image-read.js.map +1 -1
- package/dist/tools/index.d.ts +16 -1
- package/dist/tools/index.js +59 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp.js +12 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/read-file.js +10 -14
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/telegram-audio-policy.d.ts +30 -0
- package/dist/tools/telegram-audio-policy.js +49 -0
- package/dist/tools/telegram-audio-policy.js.map +1 -0
- package/dist/tools/telegram-bot.js +1136 -537
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/tools/telegram-voice.d.ts +18 -5
- package/dist/tools/telegram-voice.js +54 -12
- package/dist/tools/telegram-voice.js.map +1 -1
- package/dist/tools/telegram.d.ts +3 -3
- package/dist/tools/telegram.js +5 -84
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/tools.d.ts +2 -14
- package/dist/tools/tools.js +79 -144
- package/dist/tools/tools.js.map +1 -1
- package/dist/tools/web-fetch.js +39 -7
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts +0 -20
- package/dist/tools/web-search.js +40 -137
- package/dist/tools/web-search.js.map +1 -1
- package/dist/util/errors.js +1 -15
- package/dist/util/errors.js.map +1 -1
- package/dist/util/json-repair.d.ts +11 -0
- package/dist/util/json-repair.js +31 -0
- package/dist/util/json-repair.js.map +1 -0
- package/dist/util/rate-limiter.js +2 -8
- package/dist/util/rate-limiter.js.map +1 -1
- package/dist/viz/index.js +793 -792
- package/dist/viz/index.js.map +1 -1
- package/package.json +12 -32
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findInvocable = findInvocable;
|
|
4
|
+
exports.expandCommand = expandCommand;
|
|
5
|
+
exports.expandAgentTask = expandAgentTask;
|
|
6
|
+
exports.expandSkillTask = expandSkillTask;
|
|
7
|
+
exports.splitArgs = splitArgs;
|
|
8
|
+
/**
|
|
9
|
+
* Plugin command expansion — turns "/name args" into the task prompt that
|
|
10
|
+
* runs through the normal agent loop.
|
|
11
|
+
*
|
|
12
|
+
* Substitutions (Claude Code compatible):
|
|
13
|
+
* $ARGUMENTS — the full argument string
|
|
14
|
+
* $1 … $9 — whitespace-split positional arguments
|
|
15
|
+
* !`cmd` — replaced with the command's stdout. Gated by the same
|
|
16
|
+
* safety posture as run_shell: auto mode runs it,
|
|
17
|
+
* read-only skips it, normal mode asks via confirmFn.
|
|
18
|
+
* @path — left as-is: the agent has read_file and the prompt
|
|
19
|
+
* tells it to read referenced files itself.
|
|
20
|
+
*
|
|
21
|
+
* Frontmatter `model:` and `allowed-tools:` are parsed but ignored — aura is
|
|
22
|
+
* provider-agnostic and its permission system governs tools (documented in
|
|
23
|
+
* docs/PLUGINS.md).
|
|
24
|
+
*/
|
|
25
|
+
const child_process_1 = require("child_process");
|
|
26
|
+
/**
|
|
27
|
+
* Resolve "/name" against loaded plugins. Accepts bare names ("review"),
|
|
28
|
+
* plugin-qualified names ("pr-tools:review"), and falls back through
|
|
29
|
+
* commands → skills → agents. Ambiguous bare names across plugins return
|
|
30
|
+
* the candidate list instead of guessing.
|
|
31
|
+
*/
|
|
32
|
+
function findInvocable(plugins, rawName) {
|
|
33
|
+
const name = rawName.replace(/^\//, '');
|
|
34
|
+
// Qualified: plugin:name (also covers subdir commands like git:commit —
|
|
35
|
+
// try both interpretations).
|
|
36
|
+
if (name.includes(':')) {
|
|
37
|
+
const [pluginName, ...rest] = name.split(':');
|
|
38
|
+
const inner = rest.join(':');
|
|
39
|
+
const plugin = plugins.find(p => p.name === pluginName);
|
|
40
|
+
if (plugin) {
|
|
41
|
+
const cmd = plugin.commands.find(c => c.name === inner);
|
|
42
|
+
if (cmd)
|
|
43
|
+
return { kind: 'command', command: cmd };
|
|
44
|
+
const skill = plugin.skills.find(s => s.name === inner);
|
|
45
|
+
if (skill)
|
|
46
|
+
return { kind: 'skill', skill };
|
|
47
|
+
const agent = plugin.agents.find(a => a.name === inner);
|
|
48
|
+
if (agent)
|
|
49
|
+
return { kind: 'agent', agent };
|
|
50
|
+
}
|
|
51
|
+
// Fall through: the colon may be a subdir namespace, not a plugin name.
|
|
52
|
+
}
|
|
53
|
+
const commands = plugins.flatMap(p => p.commands).filter(c => c.name === name);
|
|
54
|
+
if (commands.length === 1)
|
|
55
|
+
return { kind: 'command', command: commands[0] };
|
|
56
|
+
if (commands.length > 1) {
|
|
57
|
+
return { kind: 'ambiguous', candidates: commands.map(c => `${c.pluginName}:${c.name}`) };
|
|
58
|
+
}
|
|
59
|
+
const skills = plugins.flatMap(p => p.skills).filter(s => s.name === name);
|
|
60
|
+
if (skills.length === 1)
|
|
61
|
+
return { kind: 'skill', skill: skills[0] };
|
|
62
|
+
if (skills.length > 1) {
|
|
63
|
+
return { kind: 'ambiguous', candidates: skills.map(s => `${s.pluginName}:${s.name}`) };
|
|
64
|
+
}
|
|
65
|
+
const agents = plugins.flatMap(p => p.agents).filter(a => a.name === name);
|
|
66
|
+
if (agents.length === 1)
|
|
67
|
+
return { kind: 'agent', agent: agents[0] };
|
|
68
|
+
if (agents.length > 1) {
|
|
69
|
+
return { kind: 'ambiguous', candidates: agents.map(a => `${a.pluginName}:${a.name}`) };
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/** Expand a command body with the given argument string into the final task prompt. */
|
|
74
|
+
async function expandCommand(command, argsStr, opts) {
|
|
75
|
+
let body = command.body;
|
|
76
|
+
const args = splitArgs(argsStr);
|
|
77
|
+
const usesPlaceholders = /\$ARGUMENTS|\$[1-9]/.test(body);
|
|
78
|
+
body = body.replace(/\$ARGUMENTS/g, argsStr);
|
|
79
|
+
body = body.replace(/\$([1-9])/g, (_, n) => args[Number(n) - 1] ?? '');
|
|
80
|
+
// !`cmd` shell preprocessing
|
|
81
|
+
const shellRefs = [...body.matchAll(/!`([^`]+)`/g)];
|
|
82
|
+
for (const ref of shellRefs) {
|
|
83
|
+
const cmd = ref[1];
|
|
84
|
+
let replacement;
|
|
85
|
+
if (opts.mode === 'read-only') {
|
|
86
|
+
replacement = `[shell preprocessing skipped in read-only mode: ${cmd}]`;
|
|
87
|
+
}
|
|
88
|
+
else if (opts.mode === 'normal') {
|
|
89
|
+
const approved = opts.confirmFn ? await opts.confirmFn(`Plugin command wants to run: $ ${cmd}`) : false;
|
|
90
|
+
replacement = approved
|
|
91
|
+
? await runPreprocess(cmd, opts)
|
|
92
|
+
: `[shell preprocessing declined: ${cmd}]`;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
replacement = await runPreprocess(cmd, opts);
|
|
96
|
+
}
|
|
97
|
+
body = body.replace(ref[0], replacement);
|
|
98
|
+
}
|
|
99
|
+
// No placeholders but args given → append them (Claude Code behavior).
|
|
100
|
+
if (!usesPlaceholders && argsStr.trim()) {
|
|
101
|
+
body = `${body}\n\nARGUMENTS: ${argsStr.trim()}`;
|
|
102
|
+
}
|
|
103
|
+
return body;
|
|
104
|
+
}
|
|
105
|
+
/** Build the task for a plugin agent: its system prompt preambles the task. */
|
|
106
|
+
function expandAgentTask(agent, task) {
|
|
107
|
+
return `${agent.systemPrompt}\n\n---\n\n${task.trim() || 'Proceed with your role as described above.'}`;
|
|
108
|
+
}
|
|
109
|
+
/** Build the task for a skill: SKILL.md body + the user's request. */
|
|
110
|
+
function expandSkillTask(skill, task) {
|
|
111
|
+
const header = `The following skill instructions apply to this task (from plugin "${skill.pluginName}", skill files live in ${skill.dir}):`;
|
|
112
|
+
return `${header}\n\n${skill.body}\n\n---\n\n${task.trim() || 'Apply this skill to the current project.'}`;
|
|
113
|
+
}
|
|
114
|
+
function runPreprocess(cmd, opts) {
|
|
115
|
+
return new Promise(resolve => {
|
|
116
|
+
(0, child_process_1.execFile)('bash', ['-c', cmd], { cwd: opts.cwd, timeout: opts.shellTimeoutMs ?? 30_000, maxBuffer: 1024 * 1024 }, (err, stdout, stderr) => {
|
|
117
|
+
if (err)
|
|
118
|
+
resolve(`[shell preprocessing failed: ${(stderr || err.message).trim().slice(0, 200)}]`);
|
|
119
|
+
else
|
|
120
|
+
resolve(stdout.trim().slice(0, 8000));
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/** Whitespace split honoring double/single quotes: a "b c" → ["a", "b c"]. */
|
|
125
|
+
function splitArgs(argsStr) {
|
|
126
|
+
const out = [];
|
|
127
|
+
const re = /"([^"]*)"|'([^']*)'|(\S+)/g;
|
|
128
|
+
let m;
|
|
129
|
+
while ((m = re.exec(argsStr)) !== null) {
|
|
130
|
+
out.push(m[1] ?? m[2] ?? m[3]);
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/plugins/commands.ts"],"names":[],"mappings":";;AAiCA,sCAuCC;AAaD,sCAoCC;AAGD,0CAEC;AAGD,0CAGC;AAgBD,8BAQC;AA5JD;;;;;;;;;;;;;;;;GAgBG;AACH,iDAAyC;AAUzC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAuB,EAAE,OAAe;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAExC,wEAAwE;IACxE,6BAA6B;IAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACxD,IAAI,GAAG;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACxD,IAAI,KAAK;gBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACxD,IAAI,KAAK;gBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QACD,wEAAwE;IAC1E,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAYD,uFAAuF;AAChF,KAAK,UAAU,aAAa,CACjC,OAAoC,EACpC,OAAe,EACf,IAAmB;IAEnB,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvE,6BAA6B;IAC7B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,WAAmB,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,WAAW,GAAG,mDAAmD,GAAG,GAAG,CAAC;QAC1E,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACxG,WAAW,GAAG,QAAQ;gBACpB,CAAC,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC;gBAChC,CAAC,CAAC,kCAAkC,GAAG,GAAG,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,uEAAuE;IACvE,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,GAAG,GAAG,IAAI,kBAAkB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,SAAgB,eAAe,CAAC,KAAkB,EAAE,IAAY;IAC9D,OAAO,GAAG,KAAK,CAAC,YAAY,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,4CAA4C,EAAE,CAAC;AAC1G,CAAC;AAED,sEAAsE;AACtE,SAAgB,eAAe,CAAC,KAAkB,EAAE,IAAY;IAC9D,MAAM,MAAM,GAAG,qEAAqE,KAAK,CAAC,UAAU,0BAA0B,KAAK,CAAC,GAAG,IAAI,CAAC;IAC5I,OAAO,GAAG,MAAM,OAAO,KAAK,CAAC,IAAI,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,0CAA0C,EAAE,CAAC;AAC7G,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,IAAmB;IACrD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,IAAA,wBAAQ,EACN,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EACnB,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,IAAI,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,EACjF,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtB,IAAI,GAAG;gBAAE,OAAO,CAAC,gCAAgC,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;;gBAC7F,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAgB,SAAS,CAAC,OAAe;IACvC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,4BAA4B,CAAC;IACxC,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal YAML frontmatter parser for plugin markdown files.
|
|
3
|
+
*
|
|
4
|
+
* Supports the subset actually used by Claude Code commands/agents/skills:
|
|
5
|
+
* scalar strings (quoted or bare), numbers, booleans, inline arrays
|
|
6
|
+
* ([a, b]) and block arrays (- item). Nested maps are skipped rather than
|
|
7
|
+
* parsed — no plugin frontmatter field aura consumes is nested. Deliberately
|
|
8
|
+
* dependency-free (aura's code standard: no new deps).
|
|
9
|
+
*/
|
|
10
|
+
export interface Frontmatter {
|
|
11
|
+
data: Record<string, unknown>;
|
|
12
|
+
body: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function parseFrontmatter(content: string): Frontmatter;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal YAML frontmatter parser for plugin markdown files.
|
|
4
|
+
*
|
|
5
|
+
* Supports the subset actually used by Claude Code commands/agents/skills:
|
|
6
|
+
* scalar strings (quoted or bare), numbers, booleans, inline arrays
|
|
7
|
+
* ([a, b]) and block arrays (- item). Nested maps are skipped rather than
|
|
8
|
+
* parsed — no plugin frontmatter field aura consumes is nested. Deliberately
|
|
9
|
+
* dependency-free (aura's code standard: no new deps).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parseFrontmatter = parseFrontmatter;
|
|
13
|
+
function parseFrontmatter(content) {
|
|
14
|
+
const normalized = content.replace(/^/, '');
|
|
15
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(normalized);
|
|
16
|
+
if (!match)
|
|
17
|
+
return { data: {}, body: normalized };
|
|
18
|
+
const data = {};
|
|
19
|
+
const lines = match[1].split(/\r?\n/);
|
|
20
|
+
let pendingArrayKey = null;
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
if (!line.trim() || line.trim().startsWith('#'))
|
|
23
|
+
continue;
|
|
24
|
+
// Block-array item under a pending key: " - value"
|
|
25
|
+
const item = /^\s+-\s+(.*)$/.exec(line);
|
|
26
|
+
if (item && pendingArrayKey) {
|
|
27
|
+
data[pendingArrayKey].push(scalar(item[1]));
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// Indented non-item line = nested structure we don't consume — skip.
|
|
31
|
+
if (/^\s/.test(line)) {
|
|
32
|
+
pendingArrayKey = null;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const kv = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
36
|
+
if (!kv) {
|
|
37
|
+
pendingArrayKey = null;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const [, key, rawValue] = kv;
|
|
41
|
+
if (rawValue === '') {
|
|
42
|
+
// Either a block array follows, or an empty value.
|
|
43
|
+
data[key] = [];
|
|
44
|
+
pendingArrayKey = key;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
pendingArrayKey = null;
|
|
48
|
+
if (rawValue.startsWith('[') && rawValue.endsWith(']')) {
|
|
49
|
+
data[key] = rawValue
|
|
50
|
+
.slice(1, -1)
|
|
51
|
+
.split(',')
|
|
52
|
+
.map(v => scalar(v.trim()))
|
|
53
|
+
.filter(v => v !== '');
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
data[key] = scalar(rawValue);
|
|
57
|
+
}
|
|
58
|
+
// Keys that collected no items and no value: normalize [] → undefined-ish
|
|
59
|
+
for (const [k, v] of Object.entries(data)) {
|
|
60
|
+
if (Array.isArray(v) && v.length === 0)
|
|
61
|
+
data[k] = '';
|
|
62
|
+
}
|
|
63
|
+
return { data, body: normalized.slice(match[0].length) };
|
|
64
|
+
}
|
|
65
|
+
function scalar(raw) {
|
|
66
|
+
const v = raw.trim();
|
|
67
|
+
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
68
|
+
return v.slice(1, -1);
|
|
69
|
+
}
|
|
70
|
+
if (v === 'true')
|
|
71
|
+
return true;
|
|
72
|
+
if (v === 'false')
|
|
73
|
+
return false;
|
|
74
|
+
if (/^-?\d+(\.\d+)?$/.test(v))
|
|
75
|
+
return Number(v);
|
|
76
|
+
return v;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/plugins/frontmatter.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAOH,4CAoDC;AApDD,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,mCAAmC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAElD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE1D,qDAAqD;QACrD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,IAAI,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,qEAAqE;QACrE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,eAAe,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAE3D,MAAM,EAAE,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,eAAe,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACpB,mDAAmD;YACnD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACf,eAAe,GAAG,GAAG,CAAC;YACtB,SAAS;QACX,CAAC;QACD,eAAe,GAAG,IAAI,CAAC;QAEvB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ;iBACjB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACZ,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;iBAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,0EAA0E;IAC1E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HookEntry, HookEvent } from './types.js';
|
|
2
|
+
export interface HookOutcome {
|
|
3
|
+
/** True when a PreToolUse hook blocked the call. */
|
|
4
|
+
block: boolean;
|
|
5
|
+
/** Reasons from blocking hooks / warnings from failing ones. */
|
|
6
|
+
messages: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Run every hook registered for `event` whose matcher covers this tool.
|
|
10
|
+
* Hook failures (bad command, timeout, non-2 exit) never block — they warn.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runHooks(event: HookEvent, toolName: string, toolInput: Record<string, unknown>, entries: HookEntry[], projectRoot: string, toolResponse?: string): Promise<HookOutcome>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runHooks = runHooks;
|
|
4
|
+
/**
|
|
5
|
+
* Plugin hook runner — executes Claude Code-style hooks around tool calls.
|
|
6
|
+
*
|
|
7
|
+
* Compatibility contract (matches Claude Code so published plugins work
|
|
8
|
+
* unmodified):
|
|
9
|
+
* - The hook command receives a JSON payload on stdin with the Claude Code
|
|
10
|
+
* tool name and input-key spelling (Bash/Write/Edit…, file_path/…).
|
|
11
|
+
* - Exit code 2 blocks the tool call (PreToolUse); stderr becomes the
|
|
12
|
+
* reason fed back to the model. Any other non-zero exit is a warning.
|
|
13
|
+
* - stdout JSON {"decision": "block", "reason": "…"} also blocks.
|
|
14
|
+
* - ${CLAUDE_PLUGIN_ROOT} in the command is replaced with the plugin dir;
|
|
15
|
+
* $CLAUDE_PROJECT_DIR is provided as an env var.
|
|
16
|
+
*
|
|
17
|
+
* Security note: hooks are user-installed code and run unsandboxed with the
|
|
18
|
+
* user's privileges by design — installing a plugin is trusting its author,
|
|
19
|
+
* exactly like installing an npm package. Documented in docs/SECURITY.md.
|
|
20
|
+
*/
|
|
21
|
+
const child_process_1 = require("child_process");
|
|
22
|
+
/** aura tool name → Claude Code tool name (what hook matchers/scripts expect). */
|
|
23
|
+
const CLAUDE_TOOL_ALIAS = {
|
|
24
|
+
run_shell: 'Bash',
|
|
25
|
+
write_file: 'Write',
|
|
26
|
+
edit_file: 'Edit',
|
|
27
|
+
read_file: 'Read',
|
|
28
|
+
list_dir: 'Glob',
|
|
29
|
+
search_code: 'Grep',
|
|
30
|
+
web_fetch: 'WebFetch',
|
|
31
|
+
web_search: 'WebSearch',
|
|
32
|
+
run_tests: 'Bash',
|
|
33
|
+
spawn_task: 'Task',
|
|
34
|
+
};
|
|
35
|
+
/** aura input shape → Claude Code input-key spelling, per tool. */
|
|
36
|
+
function toClaudeInput(auraName, input) {
|
|
37
|
+
switch (auraName) {
|
|
38
|
+
case 'write_file': return { file_path: input.path, content: input.content };
|
|
39
|
+
case 'edit_file': return { file_path: input.path, old_string: input.find, new_string: input.replace };
|
|
40
|
+
case 'read_file': return { file_path: input.path };
|
|
41
|
+
case 'run_shell': return { command: input.command, timeout: input.timeout };
|
|
42
|
+
default: return input;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const DEFAULT_TIMEOUT_S = 60;
|
|
46
|
+
/**
|
|
47
|
+
* Run every hook registered for `event` whose matcher covers this tool.
|
|
48
|
+
* Hook failures (bad command, timeout, non-2 exit) never block — they warn.
|
|
49
|
+
*/
|
|
50
|
+
async function runHooks(event, toolName, toolInput, entries, projectRoot, toolResponse) {
|
|
51
|
+
const outcome = { block: false, messages: [] };
|
|
52
|
+
const claudeName = CLAUDE_TOOL_ALIAS[toolName] ?? toolName;
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
if (entry.event !== event)
|
|
55
|
+
continue;
|
|
56
|
+
if (!matcherCovers(entry.matcher, claudeName, toolName))
|
|
57
|
+
continue;
|
|
58
|
+
const payload = JSON.stringify({
|
|
59
|
+
hook_event_name: event,
|
|
60
|
+
tool_name: claudeName,
|
|
61
|
+
tool_input: toClaudeInput(toolName, toolInput),
|
|
62
|
+
...(toolResponse !== undefined ? { tool_response: toolResponse.slice(0, 8000) } : {}),
|
|
63
|
+
cwd: projectRoot,
|
|
64
|
+
// aura-specific extras, namespaced so CC-written hooks are unaffected
|
|
65
|
+
aura: { tool_name: toolName, tool_input: toolInput },
|
|
66
|
+
});
|
|
67
|
+
const command = entry.command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, entry.pluginRoot);
|
|
68
|
+
const result = await execHook(command, payload, projectRoot, entry);
|
|
69
|
+
if (result.blocked) {
|
|
70
|
+
outcome.block = true;
|
|
71
|
+
if (result.reason)
|
|
72
|
+
outcome.messages.push(`[${entry.pluginName}] ${result.reason}`);
|
|
73
|
+
}
|
|
74
|
+
else if (result.warning) {
|
|
75
|
+
outcome.messages.push(`[${entry.pluginName}] ${result.warning}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return outcome;
|
|
79
|
+
}
|
|
80
|
+
function matcherCovers(matcher, claudeName, auraName) {
|
|
81
|
+
if (!matcher || matcher === '*' || matcher === '')
|
|
82
|
+
return true;
|
|
83
|
+
try {
|
|
84
|
+
const re = new RegExp(`^(?:${matcher})$`);
|
|
85
|
+
return re.test(claudeName) || re.test(auraName);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return matcher === claudeName || matcher === auraName;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function execHook(command, payload, cwd, entry) {
|
|
92
|
+
return new Promise(resolve => {
|
|
93
|
+
const timeoutMs = (entry.timeout ?? DEFAULT_TIMEOUT_S) * 1000;
|
|
94
|
+
let child;
|
|
95
|
+
try {
|
|
96
|
+
child = (0, child_process_1.spawn)(command, {
|
|
97
|
+
shell: true, cwd,
|
|
98
|
+
env: {
|
|
99
|
+
...process.env,
|
|
100
|
+
CLAUDE_PROJECT_DIR: cwd,
|
|
101
|
+
AURA_PROJECT_DIR: cwd,
|
|
102
|
+
CLAUDE_PLUGIN_ROOT: entry.pluginRoot,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
resolve({ blocked: false, warning: `hook failed to start: ${String(e)}` });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let stdout = '';
|
|
111
|
+
let stderr = '';
|
|
112
|
+
let settled = false;
|
|
113
|
+
const settle = (v) => {
|
|
114
|
+
if (!settled) {
|
|
115
|
+
settled = true;
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
resolve(v);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const timer = setTimeout(() => {
|
|
121
|
+
child.kill('SIGKILL');
|
|
122
|
+
settle({ blocked: false, warning: `hook timed out after ${timeoutMs / 1000}s` });
|
|
123
|
+
}, timeoutMs);
|
|
124
|
+
child.stdout?.on('data', d => { stdout += String(d); });
|
|
125
|
+
child.stderr?.on('data', d => { stderr += String(d); });
|
|
126
|
+
child.on('error', e => settle({ blocked: false, warning: `hook error: ${String(e)}` }));
|
|
127
|
+
child.on('close', code => {
|
|
128
|
+
// stdout JSON verdict wins regardless of exit code
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(stdout);
|
|
131
|
+
if (parsed?.decision === 'block') {
|
|
132
|
+
settle({ blocked: true, reason: String(parsed.reason ?? stderr.trim() ?? 'blocked') });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch { /* stdout wasn't JSON — fall through to exit-code semantics */ }
|
|
137
|
+
if (code === 2)
|
|
138
|
+
settle({ blocked: true, reason: stderr.trim() || 'blocked by hook' });
|
|
139
|
+
else if (code !== 0)
|
|
140
|
+
settle({ blocked: false, warning: `hook exited ${code}: ${stderr.trim().slice(0, 200)}` });
|
|
141
|
+
else
|
|
142
|
+
settle({ blocked: false });
|
|
143
|
+
});
|
|
144
|
+
child.stdin?.on('error', () => { });
|
|
145
|
+
child.stdin?.end(payload);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/plugins/hooks.ts"],"names":[],"mappings":";;AA0DA,4BAqCC;AA/FD;;;;;;;;;;;;;;;;GAgBG;AACH,iDAAsC;AAUtC,kFAAkF;AAClF,MAAM,iBAAiB,GAA2B;IAChD,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,OAAO;IACnB,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,mEAAmE;AACnE,SAAS,aAAa,CAAC,QAAgB,EAAE,KAA8B;IACrE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,YAAY,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5E,KAAK,WAAW,CAAC,CAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACvG,KAAK,WAAW,CAAC,CAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACpD,KAAK,WAAW,CAAC,CAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7E,OAAO,CAAC,CAAW,OAAO,KAAK,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;GAGG;AACI,KAAK,UAAU,QAAQ,CAC5B,KAAgB,EAChB,QAAgB,EAChB,SAAkC,EAClC,OAAoB,EACpB,WAAmB,EACnB,YAAqB;IAErB,MAAM,OAAO,GAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;IAE3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;YAAE,SAAS;QACpC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;YAAE,SAAS;QAElE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC9C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,EAAE,WAAW;YAChB,sEAAsE;YACtE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE;SACrD,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAEpE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;YACrB,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,OAA2B,EAAE,UAAkB,EAAE,QAAgB;IACtF,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;QAC1C,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CACf,OAAe,EACf,OAAe,EACf,GAAW,EACX,KAAgB;IAEhB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,iBAAiB,CAAC,GAAG,IAAI,CAAC;QAC9D,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE;gBACrB,KAAK,EAAE,IAAI,EAAE,GAAG;gBAChB,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,kBAAkB,EAAE,GAAG;oBACvB,gBAAgB,EAAE,GAAG;oBACrB,kBAAkB,EAAE,KAAK,CAAC,UAAU;iBACrC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,CAA0D,EAAE,EAAE;YAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;QACpE,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;QACnF,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YACvB,mDAAmD;YACnD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,MAAM,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACjC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;oBACvF,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,8DAA8D,CAAC,CAAC;YAE1E,IAAI,IAAI,KAAK,CAAC;gBAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAC;iBACjF,IAAI,IAAI,KAAK,CAAC;gBAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;;gBAC3G,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAgD,CAAC,CAAC,CAAC;QACjF,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LoadedPlugin } from './types.js';
|
|
2
|
+
export declare function pluginsDir(): string;
|
|
3
|
+
export declare function marketplacesDir(): string;
|
|
4
|
+
/** Load every plugin installed in the plugins dir. Never throws. */
|
|
5
|
+
export declare function loadAllPlugins(): LoadedPlugin[];
|
|
6
|
+
/** Load a single plugin directory. Returns null when it isn't a plugin. */
|
|
7
|
+
export declare function loadPlugin(dir: string): LoadedPlugin | null;
|