@hybridlabor-api/aos 4.7.2 → 4.9.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/.agents/agents.md +1 -1
- package/.agents/nodes.json +1 -1
- package/.agents/vendor-manifest.json +23 -1
- package/.claude/agents/godmode-media-eventtech.md +1 -1
- package/.claude/hooks/conventional-commits.mjs +125 -0
- package/.claude/hooks/env-file-protection.mjs +105 -0
- package/.claude/hooks/go-gate.mjs +101 -81
- package/.claude/settings.json +13 -0
- package/.opencode/agents/godmode-media-eventtech.md +1 -1
- package/.opencode/plugins/bdb-aos.js +31 -4
- package/README.de.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/THIRD_PARTY_NOTICES.md +88 -0
- package/docs/skills_table.md +1 -1
- package/installer.js +309 -101
- package/package.json +6 -2
- package/packages/aos-cli/README.md +80 -0
- package/packages/aos-cli/bin/aos-cli.mjs +134 -0
- package/packages/aos-cli/core-skills.json +12 -0
- package/packages/aos-cli/extensions/aos.ts +321 -0
- package/packages/aos-cli/package-lock.json +1923 -0
- package/packages/aos-cli/package.json +29 -0
- package/packages/aos-cli/scripts/check-theme.mjs +63 -0
- package/packages/aos-cli/themes/aos.json +97 -0
- package/scripts/build-plugin-manifest.mjs +131 -0
- package/scripts/validate-skills.mjs +81 -6
- package/skills/basic/ao-orchestrator/SKILL.md +116 -0
- package/skills/global_config/agenttrail/SKILL.md +6 -1
- package/skills/global_config/ask-tim/SKILL.md +4 -4
- package/skills/global_config/bash-script-generator/SKILL.md +201 -0
- package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
- package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
- package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
- package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
- package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
- package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
- package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
- package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
- package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
- package/skills/global_config/bash-script-validator/SKILL.md +249 -0
- package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
- package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
- package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
- package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
- package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
- package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
- package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
- package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
- package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
- package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
- package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
- package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
- package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
- package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
- package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
- package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
- package/skills/global_config/ci-pipeline/SKILL.md +135 -0
- package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
- package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
- package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
- package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
- package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
- package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
- package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
- package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
- package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
- package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
- package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
- package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
- package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
- package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
- package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
- package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
- package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
- package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
- package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
- package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
- package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
- package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
- package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
- package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
- package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
- package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
- package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
- package/skills/global_config/github-actions-generator/SKILL.md +353 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
- package/skills/global_config/github-actions-generator/examples/README.md +147 -0
- package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
- package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
- package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
- package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
- package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
- package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
- package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
- package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
- package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
- package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
- package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
- package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
- package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
- package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
- package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
- package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
- package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
- package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
- package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
- package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
- package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
- package/skills/global_config/github-actions-templates/SKILL.md +7 -0
- package/skills/global_config/github-actions-validator/SKILL.md +576 -0
- package/skills/global_config/github-actions-validator/examples/README.md +88 -0
- package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
- package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
- package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
- package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
- package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
- package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
- package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
- package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
- package/skills/global_config/github-actions-validator/references/runners.md +317 -0
- package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
- package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
- package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
- package/skills/global_config/makefile-generator/SKILL.md +614 -0
- package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
- package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
- package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
- package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
- package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
- package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
- package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
- package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
- package/skills/global_config/makefile-validator/SKILL.md +244 -0
- package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
- package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
- package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
- package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
- package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
- package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
- package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
- package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
- package/skills/global_config/requesting-code-review/SKILL.md +98 -0
- package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
- package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
- package/skills/global_config/verification-before-completion/SKILL.md +123 -0
- package/skills/global_config/writing-plans/SKILL.md +126 -46
- package/skills/global_config/writing-plans-legacy/SKILL.md +139 -0
package/.agents/agents.md
CHANGED
package/.agents/nodes.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"description": "Pinned upstream vendor repositories tracked for AOS skills and tools",
|
|
5
|
-
"updated_at": "2026-09-
|
|
5
|
+
"updated_at": "2026-09-25T19:27:14Z",
|
|
6
6
|
"vendors": {
|
|
7
7
|
"superdesign-skill": {
|
|
8
8
|
"upstream": "https://github.com/superdesigndev/superdesign-skill",
|
|
@@ -51,6 +51,28 @@
|
|
|
51
51
|
"pinned_commit": "e482e579415fde18357cafce70f177ae19fd7f03",
|
|
52
52
|
"purpose": "Markdown-only fallback store for skills and auxiliary subagents",
|
|
53
53
|
"target": "lib/ecc-store-index.json"
|
|
54
|
+
},
|
|
55
|
+
"superpowers": {
|
|
56
|
+
"upstream": "https://github.com/obra/superpowers",
|
|
57
|
+
"pinned_commit": "8ca22dba9a94f28898bbce59f2537ff4d87c747d",
|
|
58
|
+
"purpose": "Evidence-before-claims, code review dispatch, branch finishing, worktree isolation and parallel agent dispatch workflow skills",
|
|
59
|
+
"target_skill": "skills/global_config/{verification-before-completion,requesting-code-review,finishing-a-development-branch,using-git-worktrees,dispatching-parallel-agents}"
|
|
60
|
+
},
|
|
61
|
+
"cc-devops-skills": {
|
|
62
|
+
"upstream": "https://github.com/akin-ozer/cc-devops-skills",
|
|
63
|
+
"pinned_commit": "276af751e659315aaf56d3ad13d7c26f4e72e28a",
|
|
64
|
+
"purpose": "Generator/validator pairs for GitHub Actions, Dockerfile, bash scripts and Makefiles, with reference libraries",
|
|
65
|
+
"target_skill": "skills/global_config/{github-actions,dockerfile,bash-script,makefile}-{generator,validator}"
|
|
66
|
+
},
|
|
67
|
+
"claude-code-templates": {
|
|
68
|
+
"upstream": "https://github.com/davila7/claude-code-templates",
|
|
69
|
+
"pinned_commit": "691832ad9c2506d15a8b752826135f0afa83d197",
|
|
70
|
+
"purpose": "Conventional-commit enforcement and .env write protection, ported from Python to .mjs for both Claude Code and Antigravity",
|
|
71
|
+
"target": ".claude/hooks/{conventional-commits,env-file-protection}.mjs",
|
|
72
|
+
"source_commits": {
|
|
73
|
+
"conventional-commits.py": "92fdaa1f87b45cfc7b881f03ee69d2bad27b09d3",
|
|
74
|
+
"env-file-protection.json": "36fa6dbd5d8a45a62628b634aa48410f4d39682d"
|
|
75
|
+
}
|
|
54
76
|
}
|
|
55
77
|
}
|
|
56
78
|
}
|
|
@@ -5,7 +5,7 @@ model: sonnet
|
|
|
5
5
|
---
|
|
6
6
|
Creative-Tech & Show-Control Specialist. Governs 3D modeling, spatial design, TouchDesigner networks, Unreal Engine scenes, DaVinci Resolve color/edit, DMX/grandMA3 lighting, and Resolume media servers.
|
|
7
7
|
|
|
8
|
-
**Primary skills:** godmode-eventtech, godmode-media-creation, godmode-3d-creation, bdbmediastorm,
|
|
8
|
+
**Primary skills:** godmode-eventtech, godmode-media-creation, godmode-3d-creation, bdbmediastorm, mcp-manage, threejs-skills, spline-3d-integration
|
|
9
9
|
|
|
10
10
|
**MCP servers used:** bdb_td_minddesigner, bdb_unreal_mcp, bdb_davinci_mcp, bdb_grandma3_mcp, bdb_resolume_mcp, adobe_uxp_mcp, bdb_after_effects_mcp, bdb_rhino_mcp
|
|
11
11
|
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// PreToolUse gate that enforces Conventional Commits on `git commit` across harnesses:
|
|
3
|
+
// - Claude Code (.claude/hooks/conventional-commits.mjs)
|
|
4
|
+
// - Antigravity / Gemini CLI (hooks.json PreToolUse)
|
|
5
|
+
//
|
|
6
|
+
// Why this exists: release-please (.github/workflows/release-please.yml) parses
|
|
7
|
+
// commit subjects to compute the version bump and the changelog. It only reads
|
|
8
|
+
// Conventional Commit prefixes, so an unprefixed subject is invisible to it —
|
|
9
|
+
// exactly the prefix used for a user-facing addition decides a minor bump.
|
|
10
|
+
//
|
|
11
|
+
// Ported from davila7/claude-code-templates (MIT), which ships this as
|
|
12
|
+
// conventional-commits.py. Ported to .mjs rather than vendored verbatim: every
|
|
13
|
+
// other AOS hook is .mjs, node is already a hard install dependency, and
|
|
14
|
+
// `python3` does not exist on a stock Windows install — where the AOS installer
|
|
15
|
+
// does run — so a python hook would break every commit there.
|
|
16
|
+
//
|
|
17
|
+
// Deliberately fails OPEN, unlike go-gate. A regex that cannot read the message
|
|
18
|
+
// must not block a legitimate commit; blocking a human's work is the worse
|
|
19
|
+
// failure here, because the consequence (history AOS does not recognise) is
|
|
20
|
+
// recoverable with a rebase, and a wedged commit flow is not.
|
|
21
|
+
|
|
22
|
+
import { readFileSync } from "node:fs";
|
|
23
|
+
|
|
24
|
+
const TYPES = ["feat", "fix", "docs", "style", "refactor", "perf", "test", "chore", "ci", "build", "revert"];
|
|
25
|
+
|
|
26
|
+
const CONVENTIONAL = new RegExp(`^(${TYPES.join("|")})(\\(.+\\))?:\\s.+`);
|
|
27
|
+
|
|
28
|
+
const COMMIT = /git\s+commit\b/;
|
|
29
|
+
|
|
30
|
+
function readStdin() {
|
|
31
|
+
try {
|
|
32
|
+
return readFileSync(0, "utf8");
|
|
33
|
+
} catch {
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function respond(isAgy, allowed, reason = "", message = "") {
|
|
39
|
+
if (isAgy) {
|
|
40
|
+
if (allowed) {
|
|
41
|
+
console.log(JSON.stringify({ decision: "allow" }));
|
|
42
|
+
} else {
|
|
43
|
+
console.log(JSON.stringify({ decision: "deny", reason }));
|
|
44
|
+
}
|
|
45
|
+
process.exit(0);
|
|
46
|
+
} else {
|
|
47
|
+
if (allowed) {
|
|
48
|
+
process.exit(0);
|
|
49
|
+
} else {
|
|
50
|
+
process.stderr.write(`${reason}\n`);
|
|
51
|
+
process.exit(2);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Returns the commit message, or null when it cannot be read. Null means
|
|
57
|
+
// "cannot tell" and must be treated as allowed.
|
|
58
|
+
function extractMessage(command) {
|
|
59
|
+
// -m "msg" / -m 'msg'
|
|
60
|
+
const inline = command.match(/git\s+commit[\s\S]*?-m\s+(?:"([^"]+)"|'([^']+)')/);
|
|
61
|
+
if (inline) return inline[1] ?? inline[2];
|
|
62
|
+
|
|
63
|
+
// -m "$(cat <<'EOF' ... EOF)"
|
|
64
|
+
const heredoc = command.match(/git\s+commit[\s\S]*?-m\s+"?\$\(cat\s+<<['"]?EOF['"]?\s*\n([\s\S]+?)\nEOF/);
|
|
65
|
+
if (heredoc) return heredoc[1].trim();
|
|
66
|
+
|
|
67
|
+
// Plain `git commit` (editor) or a message the hook cannot see: fail open.
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function reasonFor(message) {
|
|
72
|
+
return [
|
|
73
|
+
"Blocked by conventional-commits hook: this commit subject is not in Conventional Commits format.",
|
|
74
|
+
"",
|
|
75
|
+
`Your message: ${message.slice(0, 120)}`,
|
|
76
|
+
"",
|
|
77
|
+
"Required: type(scope): description",
|
|
78
|
+
`Types: ${TYPES.join(", ")}`,
|
|
79
|
+
"",
|
|
80
|
+
"Good: feat: add user authentication",
|
|
81
|
+
"Good: fix(api): handle null responses",
|
|
82
|
+
"Bad: Added new feature (no type)",
|
|
83
|
+
"Bad: feature: add login (wrong type, use 'feat')",
|
|
84
|
+
"",
|
|
85
|
+
"AOS reserves feat: for user-facing additions -- it always bumps the minor",
|
|
86
|
+
"version, however small. Housekeeping belongs under chore: or fix:.",
|
|
87
|
+
].join("\n");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function main() {
|
|
91
|
+
const rawInput = readStdin();
|
|
92
|
+
let input = {};
|
|
93
|
+
if (rawInput.trim()) {
|
|
94
|
+
try {
|
|
95
|
+
input = JSON.parse(rawInput);
|
|
96
|
+
} catch {
|
|
97
|
+
// Unparseable input: fail open, no stdout (isAgy unknown).
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const isAgy = !!(input?.toolCall || input?.conversationId || input?.artifactDirectoryPath || input?.workspacePaths);
|
|
103
|
+
|
|
104
|
+
const command =
|
|
105
|
+
input?.toolCall?.args?.CommandLine ||
|
|
106
|
+
input?.toolCall?.args?.command ||
|
|
107
|
+
input?.tool_input?.command ||
|
|
108
|
+
input?.command ||
|
|
109
|
+
"";
|
|
110
|
+
|
|
111
|
+
if (typeof command !== "string" || !COMMIT.test(command)) {
|
|
112
|
+
respond(isAgy, true);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const message = extractMessage(command);
|
|
117
|
+
if (message === null || CONVENTIONAL.test(message)) {
|
|
118
|
+
respond(isAgy, true);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
respond(isAgy, false, reasonFor(message), message);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
main();
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// PreToolUse gate that refuses writes and edits to .env files, across harnesses:
|
|
3
|
+
// - Claude Code (.claude/hooks/env-file-protection.mjs)
|
|
4
|
+
// - Antigravity / Gemini CLI (hooks.json PreToolUse)
|
|
5
|
+
//
|
|
6
|
+
// Why: a .env is a live secret store. An agent that rewrites one to "add a
|
|
7
|
+
// variable" routinely reorders it, drops a line, or writes an empty value
|
|
8
|
+
// straight over a real credential — and the file is usually gitignored, so
|
|
9
|
+
// nothing catches it until something fails to authenticate in production.
|
|
10
|
+
//
|
|
11
|
+
// Upstream (davila7/claude-code-templates, MIT) does this as an inline `echo`
|
|
12
|
+
// guarded by a matcher `if` field. That is Claude-Code-only: Antigravity and
|
|
13
|
+
// the Gemini CLI ignore `if`, so the same entry would fire on every single
|
|
14
|
+
// Write and block all file creation. Implemented as a script with the path
|
|
15
|
+
// check in code, so one implementation behaves correctly on both.
|
|
16
|
+
//
|
|
17
|
+
// Deliberately fails OPEN. A hook that cannot read its input must not wedge
|
|
18
|
+
// every write in the session; missing a protection is recoverable, freezing
|
|
19
|
+
// the agent is not.
|
|
20
|
+
|
|
21
|
+
import { readFileSync } from "node:fs";
|
|
22
|
+
import { basename } from "node:path";
|
|
23
|
+
|
|
24
|
+
// Templates are committed on purpose and hold no live secret. Blocking them
|
|
25
|
+
// would contradict this hook's own advice below ("write it to .env.example").
|
|
26
|
+
const TEMPLATE_FILE = /^\.env\.(example|sample|template|dist)$/i;
|
|
27
|
+
const ENV_FILE = /^\.env(\..*)?$/i;
|
|
28
|
+
|
|
29
|
+
function readStdin() {
|
|
30
|
+
try {
|
|
31
|
+
return readFileSync(0, "utf8");
|
|
32
|
+
} catch {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function respond(isAgy, allowed, reason = "") {
|
|
38
|
+
if (isAgy) {
|
|
39
|
+
console.log(JSON.stringify(allowed ? { decision: "allow" } : { decision: "deny", reason }));
|
|
40
|
+
process.exit(0);
|
|
41
|
+
} else {
|
|
42
|
+
if (allowed) {
|
|
43
|
+
process.exit(0);
|
|
44
|
+
} else {
|
|
45
|
+
process.stderr.write(`${reason}\n`);
|
|
46
|
+
process.exit(2);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function reasonFor(filePath) {
|
|
52
|
+
return [
|
|
53
|
+
"Blocked by env-file-protection hook: writes to .env files are protected.",
|
|
54
|
+
"",
|
|
55
|
+
`Target: ${filePath}`,
|
|
56
|
+
"",
|
|
57
|
+
"A .env holds live credentials and is almost always gitignored, so an",
|
|
58
|
+
"overwrite fails silently and surfaces later as an auth error. To change",
|
|
59
|
+
"one anyway, either:",
|
|
60
|
+
"",
|
|
61
|
+
` 1. Edit it yourself outside the agent session, or`,
|
|
62
|
+
" 2. Ask for the new value to be written to .env.example (safe to commit)",
|
|
63
|
+
" and set the real value from your own shell.",
|
|
64
|
+
"",
|
|
65
|
+
"If the repo keeps a checked-in env template with a different name, this",
|
|
66
|
+
"hook does not apply to it -- only to .env and .env.*.",
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function main() {
|
|
71
|
+
const rawInput = readStdin();
|
|
72
|
+
let input = {};
|
|
73
|
+
if (rawInput.trim()) {
|
|
74
|
+
try {
|
|
75
|
+
input = JSON.parse(rawInput);
|
|
76
|
+
} catch {
|
|
77
|
+
process.exit(0);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const isAgy = !!(input?.toolCall || input?.conversationId || input?.artifactDirectoryPath || input?.workspacePaths);
|
|
82
|
+
|
|
83
|
+
const filePath =
|
|
84
|
+
input?.toolCall?.args?.filePath ||
|
|
85
|
+
input?.toolCall?.args?.file_path ||
|
|
86
|
+
input?.tool_input?.file_path ||
|
|
87
|
+
input?.file_path ||
|
|
88
|
+
"";
|
|
89
|
+
|
|
90
|
+
if (typeof filePath !== "string" || !filePath.trim()) {
|
|
91
|
+
respond(isAgy, true);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// basename(), so a path like /srv/app/.env matches but /srv/app/env-notes.md does not.
|
|
96
|
+
const name = basename(filePath);
|
|
97
|
+
if (!ENV_FILE.test(name) || TEMPLATE_FILE.test(name)) {
|
|
98
|
+
respond(isAgy, true);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
respond(isAgy, false, reasonFor(filePath));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
main();
|
|
@@ -1,51 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// PreToolUse gate for outward-facing / hard-to-reverse
|
|
2
|
+
// PreToolUse gate for outward-facing / hard-to-reverse commands across harnesses:
|
|
3
|
+
// - Antigravity / Gemini CLI (hooks.json PreToolUse)
|
|
4
|
+
// - Claude Code (.claude/hooks/go-gate.mjs)
|
|
3
5
|
//
|
|
4
|
-
// Scope
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
// Scope:
|
|
7
|
+
// 1. git push
|
|
8
|
+
// 2. npm publish
|
|
9
|
+
// 3. npm version
|
|
10
|
+
// 4. gh pr merge
|
|
11
|
+
// 5. gh release create
|
|
12
|
+
// 6. git reset --hard
|
|
13
|
+
// 7. git clean -f (force clean untracked files)
|
|
14
|
+
// 8. rm -r / rm -rf (recursive deletions)
|
|
9
15
|
//
|
|
10
|
-
// Gate validity: open
|
|
11
|
-
//
|
|
12
|
-
// message closes it again — matches "no silent retries" / "a fresh GO per
|
|
13
|
-
// action" from CLAUDE.md.
|
|
14
|
-
//
|
|
15
|
-
// Transcript format (v3.13 audit BLOCKER-1): Claude Code transcript JSONL
|
|
16
|
-
// entries carry the entry kind in a top-level `type` field ("user"), with the
|
|
17
|
-
// payload nested under `message.content` — a top-level `role` exists on zero
|
|
18
|
-
// lines of a real transcript, so matching on it blocked the gate forever.
|
|
19
|
-
// Two traps the parser below handles explicitly:
|
|
20
|
-
// 1. `message.content` is EITHER a plain string OR an array of typed blocks
|
|
21
|
-
// — always run it through extractText(), never assume one shape.
|
|
22
|
-
// 2. Tool results are ALSO `type: "user"` entries (their blocks are
|
|
23
|
-
// `tool_result`), and subagent turns are user entries flagged
|
|
24
|
-
// `isSidechain: true`. Neither is the human: entries with no text block
|
|
25
|
-
// are skipped, and sidechain entries are skipped outright — so the scan
|
|
26
|
-
// lands on the last message a human actually typed.
|
|
27
|
-
//
|
|
28
|
-
// Fails closed: if the transcript can't be read or parsed, block rather than
|
|
29
|
-
// guess.
|
|
30
|
-
//
|
|
31
|
-
// Why a PreToolUse hook and not a CLAUDE.md rule: per
|
|
32
|
-
// code.claude.com/docs/en/hooks-guide, "PreToolUse hooks fire before any
|
|
33
|
-
// permission-mode check, in every permission mode, including dontAsk. A hook
|
|
34
|
-
// that returns permissionDecision: 'deny' blocks the tool even in
|
|
35
|
-
// bypassPermissions mode or with --dangerously-skip-permissions." Exiting 2
|
|
36
|
-
// blocks unconditionally the same way. So this gate cannot be sidestepped by
|
|
37
|
-
// switching permission modes -- which prose in CLAUDE.md never could
|
|
38
|
-
// guarantee. (Hooks can tighten restrictions but not loosen them: a hook
|
|
39
|
-
// returning "allow" still can't override a deny rule from settings.)
|
|
16
|
+
// Gate validity: open ONLY if the LAST human-typed user message in the transcript
|
|
17
|
+
// is the literal word "GO" (case-insensitive, trimmed). Any other message closes it.
|
|
40
18
|
|
|
41
19
|
import { readFileSync } from "node:fs";
|
|
42
20
|
|
|
43
21
|
const GUARDED_PATTERNS = [
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
22
|
+
/(?:^|[;&|]\s*)git\s+push\b/i,
|
|
23
|
+
/(?:^|[;&|]\s*)npm\s+publish\b/i,
|
|
24
|
+
/(?:^|[;&|]\s*)npm\s+version\b/i,
|
|
25
|
+
/(?:^|[;&|]\s*)gh\s+pr\s+merge\b/i,
|
|
26
|
+
/(?:^|[;&|]\s*)gh\s+release\s+create\b/i,
|
|
27
|
+
/(?:^|[;&|]\s*)git\s+reset\s+--hard\b/i,
|
|
28
|
+
/(?:^|[;&|]\s*)git\s+clean\s+-[a-zA-Z]*f\b/i,
|
|
29
|
+
/(?:^|[;&|]\s*)rm\s+(?:-\w*[rR]\w*|--recursive)\b/i,
|
|
49
30
|
];
|
|
50
31
|
|
|
51
32
|
function readStdin() {
|
|
@@ -56,16 +37,31 @@ function readStdin() {
|
|
|
56
37
|
}
|
|
57
38
|
}
|
|
58
39
|
|
|
59
|
-
function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
40
|
+
function respond(isAgy, allowed, reason = "", command = "") {
|
|
41
|
+
if (isAgy) {
|
|
42
|
+
if (allowed) {
|
|
43
|
+
console.log(JSON.stringify({ decision: "allow" }));
|
|
44
|
+
} else {
|
|
45
|
+
console.log(JSON.stringify({
|
|
46
|
+
decision: "deny",
|
|
47
|
+
reason: `[MECHANICAL GO-GATE BLOCKED] Der Befehl "${command.slice(0, 100)}" wurde blockiert. Er erfordert ein frisches, isoliertes "GO" als letzte Benutzereingabe. ${reason}`
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
process.exit(0);
|
|
51
|
+
} else {
|
|
52
|
+
// Claude Code harness
|
|
53
|
+
if (allowed) {
|
|
54
|
+
process.exit(0);
|
|
55
|
+
} else {
|
|
56
|
+
process.stderr.write(
|
|
57
|
+
`Blocked by go-gate hook: command "${command.slice(0, 80)}" requires a fresh, literal "GO" as your last message. ${reason}\n`
|
|
58
|
+
);
|
|
59
|
+
process.exit(2);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
66
62
|
}
|
|
67
63
|
|
|
68
|
-
function
|
|
64
|
+
function extractClaudeText(content) {
|
|
69
65
|
if (typeof content === "string") return content;
|
|
70
66
|
if (Array.isArray(content)) {
|
|
71
67
|
return content
|
|
@@ -76,13 +72,15 @@ function extractText(content) {
|
|
|
76
72
|
return "";
|
|
77
73
|
}
|
|
78
74
|
|
|
79
|
-
function
|
|
80
|
-
if (!
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
|
|
75
|
+
function extractAgyText(rawContent) {
|
|
76
|
+
if (!rawContent || typeof rawContent !== "string") return "";
|
|
77
|
+
// Strip metadata tags if present
|
|
78
|
+
let text = rawContent.replace(/<ADDITIONAL_METADATA>[\s\S]*?<\/ADDITIONAL_METADATA>/gi, "");
|
|
79
|
+
const match = text.match(/<USER_REQUEST>([\s\S]*?)<\/USER_REQUEST>/i);
|
|
80
|
+
if (match) {
|
|
81
|
+
text = match[1];
|
|
82
|
+
}
|
|
83
|
+
return text.trim();
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
function lastUserMessageIsGo(transcriptPath) {
|
|
@@ -99,54 +97,76 @@ function lastUserMessageIsGo(transcriptPath) {
|
|
|
99
97
|
try {
|
|
100
98
|
entry = JSON.parse(lines[i]);
|
|
101
99
|
} catch {
|
|
102
|
-
continue; // tolerate partial/trailing lines
|
|
100
|
+
continue; // tolerate partial/trailing lines
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 1. Antigravity transcript entry format
|
|
104
|
+
if (entry.type === "USER_INPUT" || entry.source === "USER_EXPLICIT") {
|
|
105
|
+
const text = extractAgyText(entry.content);
|
|
106
|
+
if (!text) continue;
|
|
107
|
+
const isGo = /^GO$/i.test(text.trim());
|
|
108
|
+
return { ok: isGo, reason: `last user message was: ${JSON.stringify(text)}` };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 2. Claude Code transcript entry format
|
|
112
|
+
if (entry.type === "user" || entry.role === "user") {
|
|
113
|
+
if (entry.isSidechain === true) continue;
|
|
114
|
+
const content = entry.message?.content ?? entry.content;
|
|
115
|
+
const text = extractClaudeText(content).trim();
|
|
116
|
+
if (!text) continue;
|
|
117
|
+
const isGo = /^GO$/i.test(text);
|
|
118
|
+
return { ok: isGo, reason: `last user message was: ${JSON.stringify(text)}` };
|
|
103
119
|
}
|
|
104
|
-
if (!isHumanUserEntry(entry)) continue;
|
|
105
|
-
// Tool results are user-role entries with no text block; extractText()
|
|
106
|
-
// lifts only text blocks, so those yield "" and are skipped -- the scan
|
|
107
|
-
// lands on the last entry a human actually typed.
|
|
108
|
-
const content = entry.message?.content ?? entry.content;
|
|
109
|
-
const text = extractText(content).trim();
|
|
110
|
-
if (!text) continue;
|
|
111
|
-
return { ok: text.toUpperCase() === "GO", reason: `last user message was: ${JSON.stringify(text)}` };
|
|
112
120
|
}
|
|
121
|
+
|
|
113
122
|
return { ok: false, reason: "no user message found in transcript" };
|
|
114
123
|
}
|
|
115
124
|
|
|
116
125
|
function main() {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
126
|
+
const rawInput = readStdin();
|
|
127
|
+
let input = {};
|
|
128
|
+
if (rawInput.trim()) {
|
|
129
|
+
try {
|
|
130
|
+
input = JSON.parse(rawInput);
|
|
131
|
+
} catch (e) {
|
|
132
|
+
// If we cannot parse hook input, fail closed
|
|
133
|
+
respond(true, false, `could not parse hook input: ${e.message}`, "unknown");
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
123
136
|
}
|
|
124
137
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
138
|
+
// Detect harness
|
|
139
|
+
const isAgy = !!(input?.toolCall || input?.conversationId || input?.artifactDirectoryPath || input?.workspacePaths);
|
|
140
|
+
|
|
141
|
+
const command =
|
|
142
|
+
input?.toolCall?.args?.CommandLine ||
|
|
143
|
+
input?.toolCall?.args?.command ||
|
|
144
|
+
input?.tool_input?.command ||
|
|
145
|
+
input?.command ||
|
|
146
|
+
"";
|
|
147
|
+
|
|
148
|
+
if (typeof command !== "string" || !command.trim()) {
|
|
149
|
+
respond(isAgy, true);
|
|
128
150
|
return;
|
|
129
151
|
}
|
|
130
152
|
|
|
131
153
|
const isGuarded = GUARDED_PATTERNS.some((re) => re.test(command));
|
|
132
154
|
if (!isGuarded) {
|
|
133
|
-
|
|
155
|
+
respond(isAgy, true);
|
|
134
156
|
return;
|
|
135
157
|
}
|
|
136
158
|
|
|
137
|
-
const transcriptPath = input?.transcript_path;
|
|
159
|
+
const transcriptPath = input?.transcriptPath || input?.transcript_path;
|
|
138
160
|
if (!transcriptPath) {
|
|
139
|
-
|
|
161
|
+
respond(isAgy, false, "no transcriptPath in hook input — cannot verify GO", command);
|
|
140
162
|
return;
|
|
141
163
|
}
|
|
142
164
|
|
|
143
165
|
const result = lastUserMessageIsGo(transcriptPath);
|
|
144
166
|
if (result.ok) {
|
|
145
|
-
|
|
167
|
+
respond(isAgy, true, "", command);
|
|
146
168
|
} else {
|
|
147
|
-
|
|
148
|
-
`command "${command.slice(0, 80)}" requires a fresh, literal "GO" as your last message. ${result.reason}.`
|
|
149
|
-
);
|
|
169
|
+
respond(isAgy, false, result.reason, command);
|
|
150
170
|
}
|
|
151
171
|
}
|
|
152
172
|
|
package/.claude/settings.json
CHANGED
|
@@ -7,6 +7,19 @@
|
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/go-gate.mjs\""
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "command",
|
|
13
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/conventional-commits.mjs\""
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
19
|
+
"hooks": [
|
|
20
|
+
{
|
|
21
|
+
"type": "command",
|
|
22
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/env-file-protection.mjs\""
|
|
10
23
|
}
|
|
11
24
|
]
|
|
12
25
|
},
|
|
@@ -5,7 +5,7 @@ model: opencode/muse-spark-1.3-contributor-free
|
|
|
5
5
|
---
|
|
6
6
|
Creative-Tech & Show-Control Specialist. Governs 3D modeling, spatial design, TouchDesigner networks, Unreal Engine scenes, DaVinci Resolve color/edit, DMX/grandMA3 lighting, and Resolume media servers.
|
|
7
7
|
|
|
8
|
-
**Primary skills:** godmode-eventtech, godmode-media-creation, godmode-3d-creation, bdbmediastorm,
|
|
8
|
+
**Primary skills:** godmode-eventtech, godmode-media-creation, godmode-3d-creation, bdbmediastorm, mcp-manage, threejs-skills, spline-3d-integration
|
|
9
9
|
|
|
10
10
|
**MCP servers used:** bdb_td_minddesigner, bdb_unreal_mcp, bdb_davinci_mcp, bdb_grandma3_mcp, bdb_resolume_mcp, adobe_uxp_mcp, bdb_after_effects_mcp, bdb_rhino_mcp
|
|
11
11
|
|
|
@@ -19,10 +19,14 @@ import os from 'node:os';
|
|
|
19
19
|
import path from 'node:path';
|
|
20
20
|
|
|
21
21
|
const GUARDED_PATTERNS = [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
/(?:^|[;&|]\s*)git\s+push\b/i,
|
|
23
|
+
/(?:^|[;&|]\s*)npm\s+publish\b/i,
|
|
24
|
+
/(?:^|[;&|]\s*)npm\s+version\b/i,
|
|
25
|
+
/(?:^|[;&|]\s*)gh\s+pr\s+merge\b/i,
|
|
26
|
+
/(?:^|[;&|]\s*)gh\s+release\s+create\b/i,
|
|
27
|
+
/(?:^|[;&|]\s*)git\s+reset\s+--hard\b/i,
|
|
28
|
+
/(?:^|[;&|]\s*)git\s+clean\s+-[a-zA-Z]*f\b/i,
|
|
29
|
+
/(?:^|[;&|]\s*)rm\s+(?:-\w*[rR]\w*|--recursive)\b/i,
|
|
26
30
|
];
|
|
27
31
|
|
|
28
32
|
let lastHumanPrompt = '';
|
|
@@ -176,6 +180,29 @@ export default async function bdbAosPlugin(input) {
|
|
|
176
180
|
});
|
|
177
181
|
}
|
|
178
182
|
} catch {}
|
|
183
|
+
|
|
184
|
+
// Recognize and wire /startcycle-graph workflow
|
|
185
|
+
const graphMatch = fullText.match(/^\/startcycle-graph(?:\s+(.*))?$/is);
|
|
186
|
+
if (graphMatch) {
|
|
187
|
+
const goal = (graphMatch[1] || '').trim();
|
|
188
|
+
const graphInstructions = [
|
|
189
|
+
`[AOS Autonomous Graph Workflow Engine - Active]`,
|
|
190
|
+
`Goal: "${goal || 'Execute planned architecture cycle'}"`,
|
|
191
|
+
`State Schema: .agents/state.schema.json`,
|
|
192
|
+
`Persisted State: production_artifacts/state.json`,
|
|
193
|
+
`Available Nodes: .agents/nodes.json (Architect -> TechLead -> Build [UI_UX, Engineering, Media] -> Reviewer -> Shipping)`,
|
|
194
|
+
`Rule: Nodes never call each other. Dispatch each node turn in sequence, evaluate state.json, and enforce Reviewer & Shipping gates before completion.`
|
|
195
|
+
].join('\n');
|
|
196
|
+
|
|
197
|
+
msgOutput.parts.unshift({
|
|
198
|
+
id: `startcycle-${Date.now()}`,
|
|
199
|
+
sessionID: msgInput.sessionID,
|
|
200
|
+
messageID: msgInput.messageID || '',
|
|
201
|
+
type: 'text',
|
|
202
|
+
text: graphInstructions,
|
|
203
|
+
synthetic: true,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
179
206
|
},
|
|
180
207
|
|
|
181
208
|
'tool.execute.before': async (toolInput, toolOutput) => {
|
package/README.de.md
CHANGED
|
@@ -164,7 +164,7 @@ Nachfolgend finden Sie die vollständige Übersicht aller in diesem Paket enthal
|
|
|
164
164
|
#### 🎨 Frontend & UI/UX
|
|
165
165
|
| Skill-Name | Beschreibung |
|
|
166
166
|
|------------|-------------|
|
|
167
|
-
| `
|
|
167
|
+
| `mcp-manage` | Manages the BDB specialized MCP servers including Unreal Engine, Rhino 7/8, DaVinci Resolve, grandMA3, Resolume, GitHub, Chrome DevTools, and TouchDesigner. |
|
|
168
168
|
| `api-design-principles` | Master REST and GraphQL API design principles to build intuitive, scalable, and maintainable APIs that delight developers and stand the test of time. |
|
|
169
169
|
| `api-patterns` | API design principles and decision-making. REST vs GraphQL vs tRPC selection, response formats, versioning, pagination. |
|
|
170
170
|
| `database-design` | Database design principles and decision-making. Schema design, indexing strategy, ORM selection, serverless databases. |
|
package/README.md
CHANGED
|
@@ -377,7 +377,7 @@ While heavily optimized for the creative tech industry, these skills are deeply
|
|
|
377
377
|
|
|
378
378
|
| Skill | Description |
|
|
379
379
|
|-------|-------------|
|
|
380
|
-
| `
|
|
380
|
+
| `mcp-manage` | Manages the BDB specialized MCP servers including Unreal Engine, Rhino 7/8, DaVinci Resolve, grandMA3, Resolume, GitHub, Chrome DevTools, and TouchDesigner. |
|
|
381
381
|
| `n8n-code-javascript` | Write JavaScript code in n8n Code nodes. `$input`/`$json`/`$node` syntax, HTTP requests, DateTime handling. |
|
|
382
382
|
| `n8n-code-python` | Write Python code in n8n Code nodes. `_input`/`_json`/`_node` syntax and standard library. |
|
|
383
383
|
| `n8n-expression-syntax` | Validate n8n expression syntax and fix common errors. `{{}}` syntax, `$json`/`$node` variables. |
|
package/README.pt.md
CHANGED
|
@@ -167,7 +167,7 @@ Abaixo está a visão geral completa de todas as skills curadas de agentes inclu
|
|
|
167
167
|
#### 🎨 Frontend & UI/UX
|
|
168
168
|
| Nome da Skill | Descrição |
|
|
169
169
|
|------------|-------------|
|
|
170
|
-
| `
|
|
170
|
+
| `mcp-manage` | Gerencia os servidores MCP especializados da BDB incluindo Unreal Engine, Rhino 7/8, DaVinci Resolve, grandMA3, Resolume, GitHub, Chrome DevTools e TouchDesigner. |
|
|
171
171
|
| `api-design-principles` | Domine princípios de design de API REST e GraphQL para construir APIs intuitivas, escaláveis e de fácil manutenção que encantam os desenvolvedores e resistem ao teste do tempo. |
|
|
172
172
|
| `api-patterns` | Princípios de design de API e tomada de decisões. Seleção entre REST vs GraphQL vs tRPC, formatos de resposta, versionamento, paginação. |
|
|
173
173
|
| `database-design` | Princípios de design de banco de dados e tomada de decisões. Design de esquema, estratégia de indexação, seleção de ORM, bancos de dados serverless. |
|