@chamba/claude-extras 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/assets/agents/implementer.md +16 -0
- package/assets/agents/reviewer.md +19 -0
- package/assets/agents/tester.md +14 -0
- package/assets/commands/orq.md +20 -0
- package/assets/commands/recall.md +10 -0
- package/assets/commands/workspace.md +12 -0
- package/assets/commands/worktrees.md +13 -0
- package/assets/hooks/PostToolUse-validate-worktree.sh +26 -0
- package/assets/hooks/PreToolUse-warn-destructive.sh +23 -0
- package/bin/chamba-install +2 -0
- package/dist/cli.js +167 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 chamba contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# @chamba/claude-extras
|
|
2
|
+
|
|
3
|
+
Optional **Claude Code** extras for [chamba](https://github.com/thelord07/chamba):
|
|
4
|
+
slash commands, subagents and hooks on top of the chamba MCP server.
|
|
5
|
+
|
|
6
|
+
> Cursor, VS Code and other MCP editors don't need this — they get everything via
|
|
7
|
+
> the [`@chamba/mcp`](https://www.npmjs.com/package/@chamba/mcp) server. This package
|
|
8
|
+
> is Claude-Code-specific sugar.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx @chamba/claude-extras install # add commands, agents, hooks + register MCP
|
|
14
|
+
npx @chamba/claude-extras install --force # overwrite existing files
|
|
15
|
+
npx @chamba/claude-extras uninstall # remove them
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
It installs into `~/.claude/`:
|
|
19
|
+
|
|
20
|
+
- **Slash commands**: `/orq`, `/workspace`, `/worktrees`, `/recall`
|
|
21
|
+
- **Subagents**: `implementer`, `reviewer`, `tester`
|
|
22
|
+
- **Hooks**: warn on destructive commands, validate worktree edits
|
|
23
|
+
|
|
24
|
+
…and registers the `chamba` MCP server in `~/.claude.json`. It never overwrites your
|
|
25
|
+
existing files and preserves any other MCP servers.
|
|
26
|
+
|
|
27
|
+
Then, in Claude Code: `/orq add a health check endpoint`
|
|
28
|
+
|
|
29
|
+
## License
|
|
30
|
+
|
|
31
|
+
MIT
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: implementer
|
|
3
|
+
description: Implements a single, well-scoped coding subtask from a reviewed plan
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are the **implementer**. You receive one concrete subtask from a plan that
|
|
7
|
+
has already been reviewed and approved.
|
|
8
|
+
|
|
9
|
+
- Implement exactly that subtask — no scope creep. If the task is ambiguous or
|
|
10
|
+
bigger than described, stop and report back instead of guessing.
|
|
11
|
+
- Match the surrounding code's style, naming and conventions.
|
|
12
|
+
- If you were given a git worktree path, do all your edits there; never touch
|
|
13
|
+
files outside your assigned worktree.
|
|
14
|
+
- Do not write tests (that's the tester's job) unless the subtask explicitly says so.
|
|
15
|
+
- When done, report: what you changed, the files touched, and anything the tester
|
|
16
|
+
or reviewer should know.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reviewer
|
|
3
|
+
description: Strict critic that audits a plan or a diff before it ships
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are the **reviewer**, a strict but fair critic. Your job is to find problems
|
|
7
|
+
before they ship, not to be agreeable.
|
|
8
|
+
|
|
9
|
+
When reviewing a plan, you may call `chamba_review_plan` for the heuristic checks,
|
|
10
|
+
then add judgement the heuristics can't: missing edge cases, unclear ownership,
|
|
11
|
+
risky assumptions, scope that's too big for one pass.
|
|
12
|
+
|
|
13
|
+
When reviewing a diff, check for: correctness bugs, missing tests, unhandled
|
|
14
|
+
errors, security/permissions issues, and anything that violates the project's
|
|
15
|
+
stated conventions.
|
|
16
|
+
|
|
17
|
+
Output a verdict (`approved` or `changes requested`) followed by a concise,
|
|
18
|
+
prioritized list of concrete issues. Do not rewrite the code yourself — describe
|
|
19
|
+
what must change and why.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tester
|
|
3
|
+
description: Writes and runs tests for a change, reports pass/fail honestly
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are the **tester**. You make sure a change actually works.
|
|
7
|
+
|
|
8
|
+
- Write or extend tests that cover the new behaviour and the obvious edge cases.
|
|
9
|
+
- Use the project's existing test runner and conventions (don't introduce a new one).
|
|
10
|
+
- Run the tests and report results honestly. If they fail, show the output and
|
|
11
|
+
explain what's broken — never claim green when it's red.
|
|
12
|
+
- Prefer fast, deterministic tests. Avoid network and real external services;
|
|
13
|
+
use the project's in-memory fakes where they exist.
|
|
14
|
+
- Report: what you tested, the commands you ran, and the actual result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Orchestrate a task end-to-end using chamba's MCP tools
|
|
3
|
+
argument-hint: <task>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are orchestrating this task with chamba's MCP tools: **$ARGUMENTS**
|
|
7
|
+
|
|
8
|
+
Follow the orchestrator-worker flow. chamba provides context, plan validation,
|
|
9
|
+
worktrees and vault writing; you do the reasoning and the code.
|
|
10
|
+
|
|
11
|
+
1. Call `chamba_load_context` with the task to pull workspace + relevant notes.
|
|
12
|
+
2. Call `chamba_generate_plan` to get a plan template, then fill it in concretely
|
|
13
|
+
(goal, acceptance criteria, subtasks with workers, risks, files).
|
|
14
|
+
3. Call `chamba_review_plan` with your plan. If `approved` is false, fix the
|
|
15
|
+
reported issues and review again (max 3 rounds).
|
|
16
|
+
4. Show me the approved plan and wait for my go-ahead.
|
|
17
|
+
5. If this is a git repo, call `chamba_create_worktree` per worker for isolation.
|
|
18
|
+
6. Implement the change, write/extend tests, and run them.
|
|
19
|
+
7. When done, call `chamba_summarize_to_vault` with a summary of what changed.
|
|
20
|
+
8. Leave any worktree branches open — do not merge. Tell me the merge command.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Search chamba's cross-session memory
|
|
3
|
+
argument-hint: <query>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Search chamba's persistent memory for: **$ARGUMENTS**
|
|
7
|
+
|
|
8
|
+
Call `chamba_recall` with the query and summarize the matching memories, citing
|
|
9
|
+
each memory's key and path. If nothing matches, say so and offer to save a new
|
|
10
|
+
memory with `chamba_remember`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Initialize, show or reload the chamba workspace map
|
|
3
|
+
argument-hint: init | show | reload
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Manage the chamba workspace map (`.chamba/workspace.md`) for: **$ARGUMENTS**
|
|
7
|
+
|
|
8
|
+
- For `init` (or empty): call `chamba_workspace_init`. If it reports the file
|
|
9
|
+
already exists, show me the current contents and ask before changing anything.
|
|
10
|
+
- For `show`: call `chamba_workspace_show` and render the result.
|
|
11
|
+
- For `reload`: call `chamba_workspace_reload` and show me the proposed diff.
|
|
12
|
+
Do NOT apply it automatically — I may have hand-edited the file.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: List chamba git worktrees, or clean one up (keeping its branch)
|
|
3
|
+
argument-hint: list | cleanup <branch>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Manage chamba git worktrees for: **$ARGUMENTS**
|
|
7
|
+
|
|
8
|
+
- For `list` (or empty): call `chamba_list_worktrees` and show the table.
|
|
9
|
+
- For `cleanup <branch>`: call `chamba_cleanup_worktree` with that branch.
|
|
10
|
+
Remember: this removes only the worktree directory — the branch is KEPT for you
|
|
11
|
+
to review and merge by hand. Report the suggested `git merge --no-ff` command.
|
|
12
|
+
|
|
13
|
+
Never delete a branch or merge automatically.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# chamba PostToolUse hook: nudge when edits land outside a chamba worktree.
|
|
3
|
+
#
|
|
4
|
+
# When a task is assigned a worktree under .chamba/worktrees/, edits should stay
|
|
5
|
+
# inside it. This hook inspects the edited file path (from the tool call JSON on
|
|
6
|
+
# stdin) and, if CHAMBA_WORKTREE is set and the path is outside it, emits a
|
|
7
|
+
# non-blocking warning. It never blocks — it only informs.
|
|
8
|
+
#
|
|
9
|
+
# Register in ~/.claude/settings.json under hooks.PostToolUse (matcher: "Edit|Write").
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
input="$(cat)"
|
|
13
|
+
|
|
14
|
+
[ -z "${CHAMBA_WORKTREE:-}" ] && { printf '{}\n'; exit 0; }
|
|
15
|
+
|
|
16
|
+
file_path="$(printf '%s' "$input" | sed -n 's/.*"file_path"[[:space:]]*:[[:space:]]*"\(.*\)".*/\1/p')"
|
|
17
|
+
[ -z "$file_path" ] && { printf '{}\n'; exit 0; }
|
|
18
|
+
|
|
19
|
+
case "$file_path" in
|
|
20
|
+
"$CHAMBA_WORKTREE"*)
|
|
21
|
+
printf '{}\n'
|
|
22
|
+
;;
|
|
23
|
+
*)
|
|
24
|
+
printf '{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"chamba: edited %s outside the assigned worktree (%s)."}}\n' "$file_path" "$CHAMBA_WORKTREE"
|
|
25
|
+
;;
|
|
26
|
+
esac
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# chamba PreToolUse hook: warn on obviously destructive shell commands.
|
|
3
|
+
#
|
|
4
|
+
# Claude Code passes the tool call as JSON on stdin. This hook scans Bash
|
|
5
|
+
# commands for destructive patterns and asks for confirmation by emitting a
|
|
6
|
+
# permissionDecision of "ask". Anything else is allowed through untouched.
|
|
7
|
+
#
|
|
8
|
+
# Register in ~/.claude/settings.json under hooks.PreToolUse (matcher: "Bash").
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
input="$(cat)"
|
|
12
|
+
|
|
13
|
+
# Pull the command out of the JSON without requiring jq.
|
|
14
|
+
command="$(printf '%s' "$input" | sed -n 's/.*"command"[[:space:]]*:[[:space:]]*"\(.*\)".*/\1/p')"
|
|
15
|
+
|
|
16
|
+
case "$command" in
|
|
17
|
+
*"rm -rf"*|*"git push --force"*|*"git reset --hard"*|*":(){:|:&};:"*)
|
|
18
|
+
printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"ask","permissionDecisionReason":"chamba: this command looks destructive — confirm before running."}}\n'
|
|
19
|
+
;;
|
|
20
|
+
*)
|
|
21
|
+
printf '{}\n'
|
|
22
|
+
;;
|
|
23
|
+
esac
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// src/cli.ts
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { NodeFilesystem } from "@chamba/adapters";
|
|
5
|
+
import { joinPath as joinPath2 } from "@chamba/core";
|
|
6
|
+
|
|
7
|
+
// src/installer.ts
|
|
8
|
+
import { joinPath } from "@chamba/core";
|
|
9
|
+
var CATEGORIES = [
|
|
10
|
+
{ dir: "commands", label: "slash commands" },
|
|
11
|
+
{ dir: "agents", label: "subagents" },
|
|
12
|
+
{ dir: "hooks", label: "hooks" }
|
|
13
|
+
];
|
|
14
|
+
var MCP_SERVER_NAME = "chamba";
|
|
15
|
+
var MCP_SERVER_ENTRY = { command: "npx", args: ["-y", "@chamba/mcp"] };
|
|
16
|
+
var Installer = class {
|
|
17
|
+
constructor(opts) {
|
|
18
|
+
this.opts = opts;
|
|
19
|
+
}
|
|
20
|
+
opts;
|
|
21
|
+
/** True if Claude Code seems present (a config dir or file already exists). */
|
|
22
|
+
async detectClaudeCode() {
|
|
23
|
+
return await this.opts.fs.exists(this.opts.claudeDir) || await this.opts.fs.exists(this.opts.claudeJsonPath);
|
|
24
|
+
}
|
|
25
|
+
async install(options = {}) {
|
|
26
|
+
const claudeDetected = await this.detectClaudeCode();
|
|
27
|
+
const installed = [];
|
|
28
|
+
const skipped = [];
|
|
29
|
+
const counts = {};
|
|
30
|
+
for (const { dir } of CATEGORIES) {
|
|
31
|
+
const names = await this.assetNames(dir);
|
|
32
|
+
counts[dir] = 0;
|
|
33
|
+
const targetDir = joinPath(this.opts.claudeDir, dir);
|
|
34
|
+
await this.opts.fs.mkdir(targetDir);
|
|
35
|
+
for (const name of names) {
|
|
36
|
+
const target = joinPath(targetDir, name);
|
|
37
|
+
if (!options.force && await this.opts.fs.exists(target)) {
|
|
38
|
+
skipped.push(`${dir}/${name}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const content = await this.opts.fs.readFile(joinPath(this.opts.assetsDir, dir, name));
|
|
42
|
+
await this.opts.fs.writeFile(target, content);
|
|
43
|
+
installed.push(`${dir}/${name}`);
|
|
44
|
+
counts[dir] = (counts[dir] ?? 0) + 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const { mcpAdded, mcpAlreadyPresent } = await this.addMcpServer();
|
|
48
|
+
return { installed, skipped, counts, mcpAdded, mcpAlreadyPresent, claudeDetected };
|
|
49
|
+
}
|
|
50
|
+
async uninstall() {
|
|
51
|
+
const removed = [];
|
|
52
|
+
for (const { dir } of CATEGORIES) {
|
|
53
|
+
const names = await this.assetNames(dir);
|
|
54
|
+
for (const name of names) {
|
|
55
|
+
const target = joinPath(this.opts.claudeDir, dir, name);
|
|
56
|
+
if (await this.opts.fs.exists(target)) {
|
|
57
|
+
await this.opts.fs.remove(target);
|
|
58
|
+
removed.push(`${dir}/${name}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const mcpRemoved = await this.removeMcpServer();
|
|
63
|
+
return { removed, mcpRemoved };
|
|
64
|
+
}
|
|
65
|
+
async assetNames(dir) {
|
|
66
|
+
try {
|
|
67
|
+
const entries = await this.opts.fs.readDir(joinPath(this.opts.assetsDir, dir));
|
|
68
|
+
return entries.filter((e) => e.isFile).map((e) => e.name).sort();
|
|
69
|
+
} catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async readClaudeJson() {
|
|
74
|
+
try {
|
|
75
|
+
const text = await this.opts.fs.readFile(this.opts.claudeJsonPath);
|
|
76
|
+
const parsed = JSON.parse(text);
|
|
77
|
+
return typeof parsed === "object" && parsed !== null ? parsed : {};
|
|
78
|
+
} catch {
|
|
79
|
+
return {};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async addMcpServer() {
|
|
83
|
+
const config = await this.readClaudeJson();
|
|
84
|
+
const servers = asRecord(config.mcpServers) ?? {};
|
|
85
|
+
if (MCP_SERVER_NAME in servers) {
|
|
86
|
+
return { mcpAdded: false, mcpAlreadyPresent: true };
|
|
87
|
+
}
|
|
88
|
+
servers[MCP_SERVER_NAME] = MCP_SERVER_ENTRY;
|
|
89
|
+
config.mcpServers = servers;
|
|
90
|
+
await this.opts.fs.writeFile(this.opts.claudeJsonPath, `${JSON.stringify(config, null, 2)}
|
|
91
|
+
`);
|
|
92
|
+
return { mcpAdded: true, mcpAlreadyPresent: false };
|
|
93
|
+
}
|
|
94
|
+
async removeMcpServer() {
|
|
95
|
+
const config = await this.readClaudeJson();
|
|
96
|
+
const servers = asRecord(config.mcpServers);
|
|
97
|
+
if (!servers || !(MCP_SERVER_NAME in servers)) return false;
|
|
98
|
+
delete servers[MCP_SERVER_NAME];
|
|
99
|
+
config.mcpServers = servers;
|
|
100
|
+
await this.opts.fs.writeFile(this.opts.claudeJsonPath, `${JSON.stringify(config, null, 2)}
|
|
101
|
+
`);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
function asRecord(value) {
|
|
106
|
+
return typeof value === "object" && value !== null ? value : null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/cli.ts
|
|
110
|
+
function buildInstaller() {
|
|
111
|
+
const home = homedir();
|
|
112
|
+
const assetsDir = fileURLToPath(new URL("../assets", import.meta.url));
|
|
113
|
+
return new Installer({
|
|
114
|
+
fs: new NodeFilesystem(),
|
|
115
|
+
assetsDir,
|
|
116
|
+
claudeDir: joinPath2(home, ".claude"),
|
|
117
|
+
claudeJsonPath: joinPath2(home, ".claude.json")
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function summarize(result) {
|
|
121
|
+
const part = (dir) => `${result.counts[dir] ?? 0} ${labelFor(dir)}`;
|
|
122
|
+
const mcpSentence = result.mcpAdded ? "Added chamba MCP server to ~/.claude.json" : result.mcpAlreadyPresent ? "chamba MCP server already present in ~/.claude.json" : "Could not add chamba MCP server to ~/.claude.json";
|
|
123
|
+
const lines = [];
|
|
124
|
+
lines.push(`Installed ${CATEGORIES.map(({ dir }) => part(dir)).join(", ")}. ${mcpSentence}`);
|
|
125
|
+
if (result.skipped.length > 0) {
|
|
126
|
+
lines.push(`Skipped ${result.skipped.length} existing file(s): ${result.skipped.join(", ")}`);
|
|
127
|
+
lines.push("Re-run with --force to overwrite them.");
|
|
128
|
+
}
|
|
129
|
+
if (!result.claudeDetected) {
|
|
130
|
+
lines.push(
|
|
131
|
+
"Note: Claude Code was not detected (~/.claude not found). Files were created anyway."
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return lines.join("\n");
|
|
135
|
+
}
|
|
136
|
+
function labelFor(dir) {
|
|
137
|
+
return CATEGORIES.find((c) => c.dir === dir)?.label ?? dir;
|
|
138
|
+
}
|
|
139
|
+
async function main() {
|
|
140
|
+
const [command, ...rest] = process.argv.slice(2);
|
|
141
|
+
const installer = buildInstaller();
|
|
142
|
+
if (command === "uninstall") {
|
|
143
|
+
const result = await installer.uninstall();
|
|
144
|
+
process.stdout.write(
|
|
145
|
+
`Removed ${result.removed.length} file(s). ${result.mcpRemoved ? "Removed" : "Did not find"} chamba MCP server in ~/.claude.json
|
|
146
|
+
`
|
|
147
|
+
);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (command === void 0 || command === "install") {
|
|
151
|
+
const force = rest.includes("--force");
|
|
152
|
+
const result = await installer.install({ force });
|
|
153
|
+
process.stdout.write(`${summarize(result)}
|
|
154
|
+
`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
process.stderr.write(
|
|
158
|
+
`Unknown command "${command}". Usage: chamba-install [install|uninstall] [--force]
|
|
159
|
+
`
|
|
160
|
+
);
|
|
161
|
+
process.exitCode = 1;
|
|
162
|
+
}
|
|
163
|
+
main().catch((err) => {
|
|
164
|
+
process.stderr.write(`chamba-install failed: ${err.message}
|
|
165
|
+
`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@chamba/claude-extras",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Optional Claude Code extras for chamba: slash commands, subagents and hooks installer",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"chamba-install": "./bin/chamba-install"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"bin",
|
|
13
|
+
"assets"
|
|
14
|
+
],
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/thelord07/chamba.git",
|
|
18
|
+
"directory": "packages/claude-extras"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/thelord07/chamba#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/thelord07/chamba/issues"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"chamba",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"mcp",
|
|
28
|
+
"slash-commands",
|
|
29
|
+
"subagents",
|
|
30
|
+
"hooks"
|
|
31
|
+
],
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@chamba/adapters": "0.1.0",
|
|
34
|
+
"@chamba/core": "0.1.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
38
|
+
"tsup": "^8.0.0",
|
|
39
|
+
"typescript": "^5.6.0",
|
|
40
|
+
"vitest": "^2.0.0"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsup src/cli.ts --format esm --clean",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"typecheck": "tsc --noEmit"
|
|
49
|
+
}
|
|
50
|
+
}
|