mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-01 14:43:28 +08:00
Compare commits
15 Commits
ecc-tools/
...
ecc-tools/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61a00bdeb4 | ||
|
|
10c8cfee17 | ||
|
|
3d4395c79d | ||
|
|
52a51cef54 | ||
|
|
31d8015a32 | ||
|
|
fe0ddf2466 | ||
|
|
21941f579a | ||
|
|
5a23c13ff0 | ||
|
|
0dba0fe0d1 | ||
|
|
8aa1ca8a2b | ||
|
|
8e839bb0e5 | ||
|
|
9c25dbc397 | ||
|
|
b133a0d4dd | ||
|
|
ae04e63200 | ||
|
|
ce03755091 |
@@ -1,349 +1,173 @@
|
||||
---
|
||||
name: everything-claude-code-conventions
|
||||
description: Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.
|
||||
---
|
||||
```markdown
|
||||
# everything-claude-code Development Patterns
|
||||
|
||||
# Everything Claude Code Conventions
|
||||
|
||||
> Generated from [affaan-m/everything-claude-code](https://github.com/affaan-m/everything-claude-code) on 2026-04-01
|
||||
> Auto-generated skill from repository analysis
|
||||
|
||||
## Overview
|
||||
|
||||
This skill teaches Claude the development patterns and conventions used in everything-claude-code.
|
||||
This skill documents the core development patterns, coding conventions, and workflows used in the `everything-claude-code` JavaScript repository. It is designed to help contributors understand how to add new skills, agents, commands, install targets, and maintain the codebase according to established conventions. The repository is framework-agnostic, uses conventional commits, and supports modular extension via skills, agents, and command workflows.
|
||||
|
||||
## Tech Stack
|
||||
## Coding Conventions
|
||||
|
||||
- **Primary Language**: JavaScript
|
||||
- **Architecture**: hybrid module organization
|
||||
- **Test Location**: separate
|
||||
- **File Naming:**
|
||||
Use `camelCase` for JavaScript files (e.g., `installManifests.js`), and descriptive names for markdown/config files (e.g., `SKILL.md`, `install-modules.json`).
|
||||
|
||||
## When to Use This Skill
|
||||
- **Import Style:**
|
||||
Use relative imports for modules:
|
||||
```js
|
||||
const registry = require('../lib/install-targets/registry');
|
||||
```
|
||||
|
||||
Activate this skill when:
|
||||
- Making changes to this repository
|
||||
- Adding new features following established patterns
|
||||
- Writing tests that match project conventions
|
||||
- Creating commits with proper message format
|
||||
- **Export Style:**
|
||||
Both CommonJS (`module.exports = ...`) and ES module (`export default ...`) styles may be used, depending on file context.
|
||||
|
||||
## Commit Conventions
|
||||
- **Commit Messages:**
|
||||
Follow [Conventional Commits](https://www.conventionalcommits.org/) with prefixes such as `fix`, `feat`, `docs`, `chore`.
|
||||
Example:
|
||||
```
|
||||
feat: add Gemini install target support
|
||||
```
|
||||
|
||||
Follow these commit message conventions based on 500 analyzed commits.
|
||||
- **Test Files:**
|
||||
Test files follow the `*.test.js` pattern and are colocated with the code under test or in a `tests/` directory.
|
||||
|
||||
### Commit Style: Conventional Commits
|
||||
## Workflows
|
||||
|
||||
### Prefixes Used
|
||||
### Add New Install Target
|
||||
**Trigger:** When supporting a new IDE, platform, or environment for ECC installation
|
||||
**Command:** `/add-install-target`
|
||||
|
||||
- `fix`
|
||||
- `feat`
|
||||
- `docs`
|
||||
- `chore`
|
||||
1. Create a new install target script, e.g., `scripts/lib/install-targets/{target}-project.js`, `.{target}/install.sh`, or `.{target}/install.js`.
|
||||
2. Add documentation for the new target, such as `.{target}/README.md`, `.{target}/README.zh-CN.md`, or `.{target}/GEMINI.md`.
|
||||
3. Update `manifests/install-modules.json` to register the new target.
|
||||
4. Update schemas:
|
||||
- `schemas/ecc-install-config.schema.json`
|
||||
- `schemas/install-modules.schema.json`
|
||||
5. Update logic in:
|
||||
- `scripts/lib/install-manifests.js`
|
||||
- `scripts/lib/install-targets/registry.js`
|
||||
6. Add or update tests in `tests/lib/install-targets.test.js`.
|
||||
7. Update `README.md` if public-facing install instructions change.
|
||||
|
||||
### Message Guidelines
|
||||
|
||||
- Average message length: ~57 characters
|
||||
- Keep first line concise and descriptive
|
||||
- Use imperative mood ("Add feature" not "Added feature")
|
||||
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/commands/add-or-update-command.md)
|
||||
**Example:**
|
||||
```js
|
||||
// scripts/lib/install-targets/gemini-project.js
|
||||
module.exports = function installGemini() {
|
||||
// Installation logic for Gemini
|
||||
};
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
fix: update ecc2 ratatui dependency
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
docs: tighten pr backlog classification
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
refactor: fold social graph ranking into lead intelligence
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
chore: ignore local orchestration artifacts
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/commands/add-new-agent-or-skill.md)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/commands/feature-development.md)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/enterprise/controls.md)
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
### Project Structure: Single Package
|
||||
|
||||
This project uses **hybrid** module organization.
|
||||
|
||||
### Configuration Files
|
||||
|
||||
- `.github/workflows/ci.yml`
|
||||
- `.github/workflows/maintenance.yml`
|
||||
- `.github/workflows/monthly-metrics.yml`
|
||||
- `.github/workflows/release.yml`
|
||||
- `.github/workflows/reusable-release.yml`
|
||||
- `.github/workflows/reusable-test.yml`
|
||||
- `.github/workflows/reusable-validate.yml`
|
||||
- `.opencode/package.json`
|
||||
- `.opencode/tsconfig.json`
|
||||
- `.prettierrc`
|
||||
- `eslint.config.js`
|
||||
- `package.json`
|
||||
|
||||
### Guidelines
|
||||
|
||||
- This project uses a hybrid organization
|
||||
- Follow existing patterns when adding new code
|
||||
|
||||
## Code Style
|
||||
|
||||
### Language: JavaScript
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
| Element | Convention |
|
||||
|---------|------------|
|
||||
| Files | camelCase |
|
||||
| Functions | camelCase |
|
||||
| Classes | PascalCase |
|
||||
| Constants | SCREAMING_SNAKE_CASE |
|
||||
|
||||
### Import Style: Relative Imports
|
||||
|
||||
### Export Style: Mixed Style
|
||||
|
||||
|
||||
*Preferred import style*
|
||||
|
||||
```typescript
|
||||
// Use relative imports
|
||||
import { Button } from '../components/Button'
|
||||
import { useAuth } from './hooks/useAuth'
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Test Framework
|
||||
|
||||
No specific test framework detected — use the repository's existing test patterns.
|
||||
|
||||
### File Pattern: `*.test.js`
|
||||
|
||||
### Test Types
|
||||
|
||||
- **Unit tests**: Test individual functions and components in isolation
|
||||
- **Integration tests**: Test interactions between multiple components/services
|
||||
|
||||
### Coverage
|
||||
|
||||
This project has coverage reporting configured. Aim for 80%+ coverage.
|
||||
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Error Handling Style: Try-Catch Blocks
|
||||
|
||||
|
||||
*Standard error handling pattern*
|
||||
|
||||
```typescript
|
||||
try {
|
||||
const result = await riskyOperation()
|
||||
return result
|
||||
} catch (error) {
|
||||
console.error('Operation failed:', error)
|
||||
throw new Error('User-friendly message')
|
||||
}
|
||||
```
|
||||
|
||||
## Common Workflows
|
||||
|
||||
These workflows were detected from analyzing commit patterns.
|
||||
|
||||
### Feature Development
|
||||
|
||||
Standard feature implementation workflow
|
||||
|
||||
**Frequency**: ~20 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Add feature implementation
|
||||
2. Add tests for feature
|
||||
3. Update documentation
|
||||
|
||||
**Files typically involved**:
|
||||
- `.opencode/*`
|
||||
- `.opencode/plugins/*`
|
||||
- `.opencode/plugins/lib/*`
|
||||
- `**/*.test.*`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
feat(team-builder): use `claude agents` command for agent discovery (#1021)
|
||||
fix: extract inline SessionStart bootstrap to separate file (#1035)
|
||||
feat: add hexagonal architecture SKILL. (#1034)
|
||||
```
|
||||
|
||||
### Add New Skill Or Agent
|
||||
|
||||
Adds a new agent or skill to the codebase, including documentation and configuration.
|
||||
|
||||
**Frequency**: ~3 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create a new SKILL.md or agent markdown file in the appropriate directory (skills/ or agents/).
|
||||
2. Optionally add supporting files such as YAML configs or example usage.
|
||||
3. Update relevant index or manifest files if needed.
|
||||
|
||||
**Files typically involved**:
|
||||
- `skills/*/SKILL.md`
|
||||
- `agents/*.md`
|
||||
- `.agents/skills/*/SKILL.md`
|
||||
- `.claude/skills/*/SKILL.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create a new SKILL.md or agent markdown file in the appropriate directory (skills/ or agents/).
|
||||
Optionally add supporting files such as YAML configs or example usage.
|
||||
Update relevant index or manifest files if needed.
|
||||
```
|
||||
|
||||
### Add Or Update Command
|
||||
|
||||
Adds or updates a command markdown file, defining new CLI commands or workflows.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create or update a markdown file in the commands/ or .claude/commands/ directory.
|
||||
2. Document the command's usage, arguments, and output.
|
||||
3. Optionally update related documentation or index files.
|
||||
|
||||
**Files typically involved**:
|
||||
- `commands/*.md`
|
||||
- `.claude/commands/*.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create or update a markdown file in the commands/ or .claude/commands/ directory.
|
||||
Document the command's usage, arguments, and output.
|
||||
Optionally update related documentation or index files.
|
||||
```
|
||||
|
||||
### Add Or Update Install Target
|
||||
|
||||
Adds or updates an install target, including scripts, schemas, and manifest entries for new integrations.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Add new install scripts (e.g., install.sh, install.js) in a dedicated directory.
|
||||
2. Update manifests/install-modules.json and relevant schema files.
|
||||
3. Update or add code in scripts/lib/install-manifests.js and install-targets/*.
|
||||
4. Add or update tests for install targets.
|
||||
|
||||
**Files typically involved**:
|
||||
- `manifests/install-modules.json`
|
||||
- `schemas/ecc-install-config.schema.json`
|
||||
- `schemas/install-modules.schema.json`
|
||||
- `scripts/lib/install-manifests.js`
|
||||
- `scripts/lib/install-targets/*.js`
|
||||
- `tests/lib/install-targets.test.js`
|
||||
- `.*/install.*`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Add new install scripts (e.g., install.sh, install.js) in a dedicated directory.
|
||||
Update manifests/install-modules.json and relevant schema files.
|
||||
Update or add code in scripts/lib/install-manifests.js and install-targets/*.
|
||||
Add or update tests for install targets.
|
||||
```
|
||||
|
||||
### Update Hooks Or Hook Scripts
|
||||
|
||||
Updates hook configuration or scripts to change automation, formatting, or session management behaviors.
|
||||
|
||||
**Frequency**: ~3 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Edit hooks/hooks.json to add or modify hook definitions.
|
||||
2. Update or add scripts in scripts/hooks/ or tests/hooks/.
|
||||
3. Optionally update related shell scripts or adapters.
|
||||
|
||||
**Files typically involved**:
|
||||
- `hooks/hooks.json`
|
||||
- `scripts/hooks/*.js`
|
||||
- `scripts/hooks/*.sh`
|
||||
- `tests/hooks/*.test.js`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Edit hooks/hooks.json to add or modify hook definitions.
|
||||
Update or add scripts in scripts/hooks/ or tests/hooks/.
|
||||
Optionally update related shell scripts or adapters.
|
||||
```
|
||||
|
||||
### Dependency Bump Github Actions
|
||||
|
||||
Automated or manual updates to GitHub Actions dependencies for CI/CD workflows.
|
||||
|
||||
**Frequency**: ~4 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Update version numbers in .github/workflows/*.yml files for specific actions.
|
||||
2. Commit with a standardized message indicating the dependency and new version.
|
||||
|
||||
**Files typically involved**:
|
||||
- `.github/workflows/*.yml`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Update version numbers in .github/workflows/*.yml files for specific actions.
|
||||
Commit with a standardized message indicating the dependency and new version.
|
||||
```
|
||||
|
||||
|
||||
## Best Practices
|
||||
|
||||
Based on analysis of the codebase, follow these practices:
|
||||
|
||||
### Do
|
||||
|
||||
- Use conventional commit format (feat:, fix:, etc.)
|
||||
- Follow *.test.js naming pattern
|
||||
- Use camelCase for file names
|
||||
- Prefer mixed exports
|
||||
|
||||
### Don't
|
||||
|
||||
- Don't write vague commit messages
|
||||
- Don't skip tests for new features
|
||||
- Don't deviate from established patterns without discussion
|
||||
|
||||
---
|
||||
|
||||
*This skill was auto-generated by [ECC Tools](https://ecc.tools). Review and customize as needed for your team.*
|
||||
### Add New Skill or Agent
|
||||
**Trigger:** When introducing a new capability, workflow, or agent persona
|
||||
**Command:** `/add-skill`
|
||||
|
||||
1. Create a new `SKILL.md` in `skills/{skill-name}/` or `.agents/skills/{skill-name}/`.
|
||||
2. For agents, add definitions in `agents/{agent-name}.md` or `.codex/agents/{agent-name}.toml`.
|
||||
3. Update `manifests/install-modules.json` if the skill is installable.
|
||||
4. Update `AGENTS.md` and/or `README.md` to document the new skill/agent.
|
||||
5. Add supporting files as needed (e.g., `rules/`, `prompts/`, orchestration scripts).
|
||||
6. If orchestration is needed, add a shell or JS orchestrator (e.g., `scripts/{skill-name}.sh`).
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
# skills/mySkill/SKILL.md
|
||||
|
||||
## Overview
|
||||
Describes the "mySkill" capability for ECC.
|
||||
|
||||
## Usage
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Add or Update Command Workflow
|
||||
**Trigger:** When adding or improving CLI commands or workflows
|
||||
**Command:** `/add-command`
|
||||
|
||||
1. Create or modify a command markdown file in `commands/{command-name}.md` or `.claude/commands/{command-name}.md`.
|
||||
2. Add YAML frontmatter and sections for Purpose, Usage, and Output.
|
||||
3. Iterate based on review feedback (fix placeholders, add error handling, clarify protocol).
|
||||
4. Update related commands or documentation if part of a workflow.
|
||||
5. Document artifact storage locations if applicable.
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
---
|
||||
name: install
|
||||
description: Install a new ECC module
|
||||
---
|
||||
|
||||
## Purpose
|
||||
...
|
||||
|
||||
## Usage
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Agent or Skill Bundle Import
|
||||
**Trigger:** When bulk importing conventions, agent definitions, or skill documentation
|
||||
**Command:** `/import-bundle`
|
||||
|
||||
1. Add multiple files in `.claude/commands/`, `.claude/enterprise/`, `.claude/team/`, `.claude/research/`, `.claude/rules/`, `.codex/agents/`, `.claude/skills/`, `.agents/skills/`, etc.
|
||||
2. Include team config, identity, guardrails, research playbook, and skills documentation.
|
||||
3. No code/test changes—just documentation and config import.
|
||||
|
||||
---
|
||||
|
||||
### Dependency Update via Dependabot
|
||||
**Trigger:** When Dependabot creates a PR for a new dependency version
|
||||
**Command:** `/update-dependencies`
|
||||
|
||||
1. Update versions in `package.json`, `package-lock.json`, or `yarn.lock`.
|
||||
2. Update `.github/workflows/*.yml` for GitHub Actions if needed.
|
||||
3. Commit with a standard Dependabot message.
|
||||
4. Update `.github/dependabot.yml` for configuration if necessary.
|
||||
|
||||
---
|
||||
|
||||
### Refactor or Fix Skill or Agent
|
||||
**Trigger:** When a skill/agent needs to be removed, merged, or reworked
|
||||
**Command:** `/remove-skill`
|
||||
|
||||
1. Remove or modify `SKILL.md` in `skills/{skill-name}/` or `agents/{agent-name}.md`.
|
||||
2. Update `manifests/install-modules.json` and documentation.
|
||||
3. Restore or remove associated files as needed.
|
||||
4. Document the reason for the change (e.g., security, redundancy).
|
||||
|
||||
---
|
||||
|
||||
## Testing Patterns
|
||||
|
||||
- **Test Files:**
|
||||
All test files use the `*.test.js` pattern.
|
||||
- **Framework:**
|
||||
No specific testing framework detected; use standard Node.js assertions or your preferred test runner.
|
||||
- **Location:**
|
||||
Tests are typically placed in a `tests/` directory or alongside the source files.
|
||||
|
||||
**Example:**
|
||||
```js
|
||||
// tests/lib/install-targets.test.js
|
||||
const installGemini = require('../../scripts/lib/install-targets/gemini-project');
|
||||
|
||||
test('Gemini install target works', () => {
|
||||
expect(installGemini()).toBeDefined();
|
||||
});
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
| Command | Purpose |
|
||||
|---------------------|--------------------------------------------------------------|
|
||||
| /add-install-target | Add support for a new install target (IDE/platform) |
|
||||
| /add-skill | Add a new skill or agent to the ECC system |
|
||||
| /add-command | Add or update a CLI command or workflow |
|
||||
| /import-bundle | Bulk import agent/skill bundles or conventions documentation |
|
||||
| /update-dependencies| Update dependencies via Dependabot |
|
||||
| /remove-skill | Refactor, remove, or revert a skill or agent |
|
||||
```
|
||||
|
||||
42
.claude/commands/add-new-install-target.md
Normal file
42
.claude/commands/add-new-install-target.md
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: add-new-install-target
|
||||
description: Workflow command scaffold for add-new-install-target in everything-claude-code.
|
||||
allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
---
|
||||
|
||||
# /add-new-install-target
|
||||
|
||||
Use this workflow when working on **add-new-install-target** in `everything-claude-code`.
|
||||
|
||||
## Goal
|
||||
|
||||
Adds support for a new install target (e.g., Gemini, CodeBuddy) so ECC can be installed on a new platform or IDE.
|
||||
|
||||
## Common Files
|
||||
|
||||
- `manifests/install-modules.json`
|
||||
- `schemas/ecc-install-config.schema.json`
|
||||
- `schemas/install-modules.schema.json`
|
||||
- `scripts/lib/install-manifests.js`
|
||||
- `scripts/lib/install-targets/{target}-project.js`
|
||||
- `scripts/lib/install-targets/registry.js`
|
||||
|
||||
## Suggested Sequence
|
||||
|
||||
1. Understand the current state and failure mode before editing.
|
||||
2. Make the smallest coherent change that satisfies the workflow goal.
|
||||
3. Run the most relevant verification for touched files.
|
||||
4. Summarize what changed and what still needs review.
|
||||
|
||||
## Typical Commit Signals
|
||||
|
||||
- Create a new install target script (e.g., scripts/lib/install-targets/{target}-project.js, .{target}/install.sh, .{target}/install.js)
|
||||
- Add documentation for the new target (e.g., .{target}/README.md, .{target}/README.zh-CN.md, .{target}/GEMINI.md)
|
||||
- Update manifests/install-modules.json to register the new target
|
||||
- Update schemas/ecc-install-config.schema.json and schemas/install-modules.schema.json for schema validation
|
||||
- Update scripts/lib/install-manifests.js and scripts/lib/install-targets/registry.js to handle the new target
|
||||
|
||||
## Notes
|
||||
|
||||
- Treat this as a scaffold, not a hard-coded script.
|
||||
- Update the command if the workflow evolves materially.
|
||||
@@ -10,14 +10,16 @@ Use this workflow when working on **add-new-skill-or-agent** in `everything-clau
|
||||
|
||||
## Goal
|
||||
|
||||
Adds a new agent or skill to the codebase, including documentation and configuration.
|
||||
Adds a new skill or agent to the ECC system, including documentation and registration.
|
||||
|
||||
## Common Files
|
||||
|
||||
- `skills/*/SKILL.md`
|
||||
- `agents/*.md`
|
||||
- `.agents/skills/*/SKILL.md`
|
||||
- `.claude/skills/*/SKILL.md`
|
||||
- `skills/{skill-name}/SKILL.md`
|
||||
- `.agents/skills/{skill-name}/SKILL.md`
|
||||
- `agents/{agent-name}.md`
|
||||
- `.codex/agents/{agent-name}.toml`
|
||||
- `manifests/install-modules.json`
|
||||
- `AGENTS.md`
|
||||
|
||||
## Suggested Sequence
|
||||
|
||||
@@ -28,9 +30,11 @@ Adds a new agent or skill to the codebase, including documentation and configura
|
||||
|
||||
## Typical Commit Signals
|
||||
|
||||
- Create a new SKILL.md or agent markdown file in the appropriate directory (skills/ or agents/).
|
||||
- Optionally add supporting files such as YAML configs or example usage.
|
||||
- Update relevant index or manifest files if needed.
|
||||
- Create a new SKILL.md in skills/{skill-name}/ or .agents/skills/{skill-name}/
|
||||
- If agent-based, add agent definition(s) in agents/{agent-name}.md or .codex/agents/{agent-name}.toml
|
||||
- Update manifests/install-modules.json if the skill is installable
|
||||
- Update AGENTS.md and/or README.md to reflect the new skill/agent
|
||||
- If applicable, add supporting files (e.g., rules/, prompts/, or orchestration scripts)
|
||||
|
||||
## Notes
|
||||
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
name: add-or-update-command
|
||||
description: Workflow command scaffold for add-or-update-command in everything-claude-code.
|
||||
allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
---
|
||||
|
||||
# /add-or-update-command
|
||||
|
||||
Use this workflow when working on **add-or-update-command** in `everything-claude-code`.
|
||||
|
||||
## Goal
|
||||
|
||||
Adds or updates a command markdown file, defining new CLI commands or workflows.
|
||||
|
||||
## Common Files
|
||||
|
||||
- `commands/*.md`
|
||||
- `.claude/commands/*.md`
|
||||
|
||||
## Suggested Sequence
|
||||
|
||||
1. Understand the current state and failure mode before editing.
|
||||
2. Make the smallest coherent change that satisfies the workflow goal.
|
||||
3. Run the most relevant verification for touched files.
|
||||
4. Summarize what changed and what still needs review.
|
||||
|
||||
## Typical Commit Signals
|
||||
|
||||
- Create or update a markdown file in the commands/ or .claude/commands/ directory.
|
||||
- Document the command's usage, arguments, and output.
|
||||
- Optionally update related documentation or index files.
|
||||
|
||||
## Notes
|
||||
|
||||
- Treat this as a scaffold, not a hard-coded script.
|
||||
- Update the command if the workflow evolves materially.
|
||||
@@ -14,9 +14,9 @@ Standard feature implementation workflow
|
||||
|
||||
## Common Files
|
||||
|
||||
- `skills/remotion-video-creation/rules/assets/*`
|
||||
- `.opencode/*`
|
||||
- `.opencode/plugins/*`
|
||||
- `.opencode/plugins/lib/*`
|
||||
- `**/*.test.*`
|
||||
|
||||
## Suggested Sequence
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"version": "1.3",
|
||||
"schemaVersion": "1.0",
|
||||
"generatedBy": "ecc-tools",
|
||||
"generatedAt": "2026-04-01T01:39:13.874Z",
|
||||
"generatedAt": "2026-04-01T00:56:01.731Z",
|
||||
"repo": "https://github.com/affaan-m/everything-claude-code",
|
||||
"profiles": {
|
||||
"requested": "full",
|
||||
@@ -149,8 +149,8 @@
|
||||
".claude/team/everything-claude-code-team-config.json",
|
||||
".claude/enterprise/controls.md",
|
||||
".claude/commands/feature-development.md",
|
||||
".claude/commands/add-new-skill-or-agent.md",
|
||||
".claude/commands/add-or-update-command.md"
|
||||
".claude/commands/add-new-install-target.md",
|
||||
".claude/commands/add-new-skill-or-agent.md"
|
||||
],
|
||||
"packageFiles": {
|
||||
"runtime-core": [
|
||||
@@ -179,8 +179,8 @@
|
||||
],
|
||||
"workflow-pack": [
|
||||
".claude/commands/feature-development.md",
|
||||
".claude/commands/add-new-skill-or-agent.md",
|
||||
".claude/commands/add-or-update-command.md"
|
||||
".claude/commands/add-new-install-target.md",
|
||||
".claude/commands/add-new-skill-or-agent.md"
|
||||
]
|
||||
},
|
||||
"moduleFiles": {
|
||||
@@ -210,8 +210,8 @@
|
||||
],
|
||||
"workflow-pack": [
|
||||
".claude/commands/feature-development.md",
|
||||
".claude/commands/add-new-skill-or-agent.md",
|
||||
".claude/commands/add-or-update-command.md"
|
||||
".claude/commands/add-new-install-target.md",
|
||||
".claude/commands/add-new-skill-or-agent.md"
|
||||
]
|
||||
},
|
||||
"files": [
|
||||
@@ -292,13 +292,13 @@
|
||||
},
|
||||
{
|
||||
"moduleId": "workflow-pack",
|
||||
"path": ".claude/commands/add-new-skill-or-agent.md",
|
||||
"description": "Workflow command scaffold for add-new-skill-or-agent."
|
||||
"path": ".claude/commands/add-new-install-target.md",
|
||||
"description": "Workflow command scaffold for add-new-install-target."
|
||||
},
|
||||
{
|
||||
"moduleId": "workflow-pack",
|
||||
"path": ".claude/commands/add-or-update-command.md",
|
||||
"description": "Workflow command scaffold for add-or-update-command."
|
||||
"path": ".claude/commands/add-new-skill-or-agent.md",
|
||||
"description": "Workflow command scaffold for add-new-skill-or-agent."
|
||||
}
|
||||
],
|
||||
"workflows": [
|
||||
@@ -307,12 +307,12 @@
|
||||
"path": ".claude/commands/feature-development.md"
|
||||
},
|
||||
{
|
||||
"command": "add-new-skill-or-agent",
|
||||
"path": ".claude/commands/add-new-skill-or-agent.md"
|
||||
"command": "add-new-install-target",
|
||||
"path": ".claude/commands/add-new-install-target.md"
|
||||
},
|
||||
{
|
||||
"command": "add-or-update-command",
|
||||
"path": ".claude/commands/add-or-update-command.md"
|
||||
"command": "add-new-skill-or-agent",
|
||||
"path": ".claude/commands/add-new-skill-or-agent.md"
|
||||
}
|
||||
],
|
||||
"adapters": {
|
||||
@@ -321,8 +321,8 @@
|
||||
"identityPath": ".claude/identity.json",
|
||||
"commandPaths": [
|
||||
".claude/commands/feature-development.md",
|
||||
".claude/commands/add-new-skill-or-agent.md",
|
||||
".claude/commands/add-or-update-command.md"
|
||||
".claude/commands/add-new-install-target.md",
|
||||
".claude/commands/add-new-skill-or-agent.md"
|
||||
]
|
||||
},
|
||||
"codex": {
|
||||
|
||||
@@ -10,5 +10,5 @@
|
||||
"javascript"
|
||||
],
|
||||
"suggestedBy": "ecc-tools-repo-analysis",
|
||||
"createdAt": "2026-04-01T04:43:36.259Z"
|
||||
"createdAt": "2026-04-01T00:56:53.890Z"
|
||||
}
|
||||
@@ -18,4 +18,4 @@ Use this when the task is documentation-heavy, source-sensitive, or requires bro
|
||||
|
||||
- Primary language: JavaScript
|
||||
- Framework: Not detected
|
||||
- Workflows detected: 6
|
||||
- Workflows detected: 7
|
||||
@@ -25,8 +25,8 @@ Generated by ECC Tools from repository history. Review before treating it as a h
|
||||
## Detected Workflows
|
||||
|
||||
- feature-development: Standard feature implementation workflow
|
||||
- add-new-skill-or-agent: Adds a new agent or skill to the codebase, including documentation and configuration.
|
||||
- add-or-update-command: Adds or updates a command markdown file, defining new CLI commands or workflows.
|
||||
- add-new-install-target: Adds support for a new install target (e.g., Gemini, CodeBuddy) so ECC can be installed on a new platform or IDE.
|
||||
- add-new-skill-or-agent: Adds a new skill or agent to the ECC system, including documentation and registration.
|
||||
|
||||
## Review Reminder
|
||||
|
||||
|
||||
@@ -1,349 +1,173 @@
|
||||
---
|
||||
name: everything-claude-code-conventions
|
||||
description: Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.
|
||||
---
|
||||
```markdown
|
||||
# everything-claude-code Development Patterns
|
||||
|
||||
# Everything Claude Code Conventions
|
||||
|
||||
> Generated from [affaan-m/everything-claude-code](https://github.com/affaan-m/everything-claude-code) on 2026-04-01
|
||||
> Auto-generated skill from repository analysis
|
||||
|
||||
## Overview
|
||||
|
||||
This skill teaches Claude the development patterns and conventions used in everything-claude-code.
|
||||
This skill documents the core development patterns, coding conventions, and workflows used in the `everything-claude-code` JavaScript repository. It is designed to help contributors understand how to add new skills, agents, commands, install targets, and maintain the codebase according to established conventions. The repository is framework-agnostic, uses conventional commits, and supports modular extension via skills, agents, and command workflows.
|
||||
|
||||
## Tech Stack
|
||||
## Coding Conventions
|
||||
|
||||
- **Primary Language**: JavaScript
|
||||
- **Architecture**: hybrid module organization
|
||||
- **Test Location**: separate
|
||||
- **File Naming:**
|
||||
Use `camelCase` for JavaScript files (e.g., `installManifests.js`), and descriptive names for markdown/config files (e.g., `SKILL.md`, `install-modules.json`).
|
||||
|
||||
## When to Use This Skill
|
||||
- **Import Style:**
|
||||
Use relative imports for modules:
|
||||
```js
|
||||
const registry = require('../lib/install-targets/registry');
|
||||
```
|
||||
|
||||
Activate this skill when:
|
||||
- Making changes to this repository
|
||||
- Adding new features following established patterns
|
||||
- Writing tests that match project conventions
|
||||
- Creating commits with proper message format
|
||||
- **Export Style:**
|
||||
Both CommonJS (`module.exports = ...`) and ES module (`export default ...`) styles may be used, depending on file context.
|
||||
|
||||
## Commit Conventions
|
||||
- **Commit Messages:**
|
||||
Follow [Conventional Commits](https://www.conventionalcommits.org/) with prefixes such as `fix`, `feat`, `docs`, `chore`.
|
||||
Example:
|
||||
```
|
||||
feat: add Gemini install target support
|
||||
```
|
||||
|
||||
Follow these commit message conventions based on 500 analyzed commits.
|
||||
- **Test Files:**
|
||||
Test files follow the `*.test.js` pattern and are colocated with the code under test or in a `tests/` directory.
|
||||
|
||||
### Commit Style: Conventional Commits
|
||||
## Workflows
|
||||
|
||||
### Prefixes Used
|
||||
### Add New Install Target
|
||||
**Trigger:** When supporting a new IDE, platform, or environment for ECC installation
|
||||
**Command:** `/add-install-target`
|
||||
|
||||
- `fix`
|
||||
- `feat`
|
||||
- `docs`
|
||||
- `chore`
|
||||
1. Create a new install target script, e.g., `scripts/lib/install-targets/{target}-project.js`, `.{target}/install.sh`, or `.{target}/install.js`.
|
||||
2. Add documentation for the new target, such as `.{target}/README.md`, `.{target}/README.zh-CN.md`, or `.{target}/GEMINI.md`.
|
||||
3. Update `manifests/install-modules.json` to register the new target.
|
||||
4. Update schemas:
|
||||
- `schemas/ecc-install-config.schema.json`
|
||||
- `schemas/install-modules.schema.json`
|
||||
5. Update logic in:
|
||||
- `scripts/lib/install-manifests.js`
|
||||
- `scripts/lib/install-targets/registry.js`
|
||||
6. Add or update tests in `tests/lib/install-targets.test.js`.
|
||||
7. Update `README.md` if public-facing install instructions change.
|
||||
|
||||
### Message Guidelines
|
||||
|
||||
- Average message length: ~57 characters
|
||||
- Keep first line concise and descriptive
|
||||
- Use imperative mood ("Add feature" not "Added feature")
|
||||
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/commands/add-or-update-command.md)
|
||||
**Example:**
|
||||
```js
|
||||
// scripts/lib/install-targets/gemini-project.js
|
||||
module.exports = function installGemini() {
|
||||
// Installation logic for Gemini
|
||||
};
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
fix: update ecc2 ratatui dependency
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
docs: tighten pr backlog classification
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
refactor: fold social graph ranking into lead intelligence
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
chore: ignore local orchestration artifacts
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/commands/add-new-agent-or-skill.md)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/commands/feature-development.md)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add everything-claude-code ECC bundle (.claude/enterprise/controls.md)
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
### Project Structure: Single Package
|
||||
|
||||
This project uses **hybrid** module organization.
|
||||
|
||||
### Configuration Files
|
||||
|
||||
- `.github/workflows/ci.yml`
|
||||
- `.github/workflows/maintenance.yml`
|
||||
- `.github/workflows/monthly-metrics.yml`
|
||||
- `.github/workflows/release.yml`
|
||||
- `.github/workflows/reusable-release.yml`
|
||||
- `.github/workflows/reusable-test.yml`
|
||||
- `.github/workflows/reusable-validate.yml`
|
||||
- `.opencode/package.json`
|
||||
- `.opencode/tsconfig.json`
|
||||
- `.prettierrc`
|
||||
- `eslint.config.js`
|
||||
- `package.json`
|
||||
|
||||
### Guidelines
|
||||
|
||||
- This project uses a hybrid organization
|
||||
- Follow existing patterns when adding new code
|
||||
|
||||
## Code Style
|
||||
|
||||
### Language: JavaScript
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
| Element | Convention |
|
||||
|---------|------------|
|
||||
| Files | camelCase |
|
||||
| Functions | camelCase |
|
||||
| Classes | PascalCase |
|
||||
| Constants | SCREAMING_SNAKE_CASE |
|
||||
|
||||
### Import Style: Relative Imports
|
||||
|
||||
### Export Style: Mixed Style
|
||||
|
||||
|
||||
*Preferred import style*
|
||||
|
||||
```typescript
|
||||
// Use relative imports
|
||||
import { Button } from '../components/Button'
|
||||
import { useAuth } from './hooks/useAuth'
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Test Framework
|
||||
|
||||
No specific test framework detected — use the repository's existing test patterns.
|
||||
|
||||
### File Pattern: `*.test.js`
|
||||
|
||||
### Test Types
|
||||
|
||||
- **Unit tests**: Test individual functions and components in isolation
|
||||
- **Integration tests**: Test interactions between multiple components/services
|
||||
|
||||
### Coverage
|
||||
|
||||
This project has coverage reporting configured. Aim for 80%+ coverage.
|
||||
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Error Handling Style: Try-Catch Blocks
|
||||
|
||||
|
||||
*Standard error handling pattern*
|
||||
|
||||
```typescript
|
||||
try {
|
||||
const result = await riskyOperation()
|
||||
return result
|
||||
} catch (error) {
|
||||
console.error('Operation failed:', error)
|
||||
throw new Error('User-friendly message')
|
||||
}
|
||||
```
|
||||
|
||||
## Common Workflows
|
||||
|
||||
These workflows were detected from analyzing commit patterns.
|
||||
|
||||
### Feature Development
|
||||
|
||||
Standard feature implementation workflow
|
||||
|
||||
**Frequency**: ~20 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Add feature implementation
|
||||
2. Add tests for feature
|
||||
3. Update documentation
|
||||
|
||||
**Files typically involved**:
|
||||
- `.opencode/*`
|
||||
- `.opencode/plugins/*`
|
||||
- `.opencode/plugins/lib/*`
|
||||
- `**/*.test.*`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
feat(team-builder): use `claude agents` command for agent discovery (#1021)
|
||||
fix: extract inline SessionStart bootstrap to separate file (#1035)
|
||||
feat: add hexagonal architecture SKILL. (#1034)
|
||||
```
|
||||
|
||||
### Add New Skill Or Agent
|
||||
|
||||
Adds a new agent or skill to the codebase, including documentation and configuration.
|
||||
|
||||
**Frequency**: ~3 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create a new SKILL.md or agent markdown file in the appropriate directory (skills/ or agents/).
|
||||
2. Optionally add supporting files such as YAML configs or example usage.
|
||||
3. Update relevant index or manifest files if needed.
|
||||
|
||||
**Files typically involved**:
|
||||
- `skills/*/SKILL.md`
|
||||
- `agents/*.md`
|
||||
- `.agents/skills/*/SKILL.md`
|
||||
- `.claude/skills/*/SKILL.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create a new SKILL.md or agent markdown file in the appropriate directory (skills/ or agents/).
|
||||
Optionally add supporting files such as YAML configs or example usage.
|
||||
Update relevant index or manifest files if needed.
|
||||
```
|
||||
|
||||
### Add Or Update Command
|
||||
|
||||
Adds or updates a command markdown file, defining new CLI commands or workflows.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create or update a markdown file in the commands/ or .claude/commands/ directory.
|
||||
2. Document the command's usage, arguments, and output.
|
||||
3. Optionally update related documentation or index files.
|
||||
|
||||
**Files typically involved**:
|
||||
- `commands/*.md`
|
||||
- `.claude/commands/*.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create or update a markdown file in the commands/ or .claude/commands/ directory.
|
||||
Document the command's usage, arguments, and output.
|
||||
Optionally update related documentation or index files.
|
||||
```
|
||||
|
||||
### Add Or Update Install Target
|
||||
|
||||
Adds or updates an install target, including scripts, schemas, and manifest entries for new integrations.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Add new install scripts (e.g., install.sh, install.js) in a dedicated directory.
|
||||
2. Update manifests/install-modules.json and relevant schema files.
|
||||
3. Update or add code in scripts/lib/install-manifests.js and install-targets/*.
|
||||
4. Add or update tests for install targets.
|
||||
|
||||
**Files typically involved**:
|
||||
- `manifests/install-modules.json`
|
||||
- `schemas/ecc-install-config.schema.json`
|
||||
- `schemas/install-modules.schema.json`
|
||||
- `scripts/lib/install-manifests.js`
|
||||
- `scripts/lib/install-targets/*.js`
|
||||
- `tests/lib/install-targets.test.js`
|
||||
- `.*/install.*`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Add new install scripts (e.g., install.sh, install.js) in a dedicated directory.
|
||||
Update manifests/install-modules.json and relevant schema files.
|
||||
Update or add code in scripts/lib/install-manifests.js and install-targets/*.
|
||||
Add or update tests for install targets.
|
||||
```
|
||||
|
||||
### Update Hooks Or Hook Scripts
|
||||
|
||||
Updates hook configuration or scripts to change automation, formatting, or session management behaviors.
|
||||
|
||||
**Frequency**: ~3 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Edit hooks/hooks.json to add or modify hook definitions.
|
||||
2. Update or add scripts in scripts/hooks/ or tests/hooks/.
|
||||
3. Optionally update related shell scripts or adapters.
|
||||
|
||||
**Files typically involved**:
|
||||
- `hooks/hooks.json`
|
||||
- `scripts/hooks/*.js`
|
||||
- `scripts/hooks/*.sh`
|
||||
- `tests/hooks/*.test.js`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Edit hooks/hooks.json to add or modify hook definitions.
|
||||
Update or add scripts in scripts/hooks/ or tests/hooks/.
|
||||
Optionally update related shell scripts or adapters.
|
||||
```
|
||||
|
||||
### Dependency Bump Github Actions
|
||||
|
||||
Automated or manual updates to GitHub Actions dependencies for CI/CD workflows.
|
||||
|
||||
**Frequency**: ~4 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Update version numbers in .github/workflows/*.yml files for specific actions.
|
||||
2. Commit with a standardized message indicating the dependency and new version.
|
||||
|
||||
**Files typically involved**:
|
||||
- `.github/workflows/*.yml`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Update version numbers in .github/workflows/*.yml files for specific actions.
|
||||
Commit with a standardized message indicating the dependency and new version.
|
||||
```
|
||||
|
||||
|
||||
## Best Practices
|
||||
|
||||
Based on analysis of the codebase, follow these practices:
|
||||
|
||||
### Do
|
||||
|
||||
- Use conventional commit format (feat:, fix:, etc.)
|
||||
- Follow *.test.js naming pattern
|
||||
- Use camelCase for file names
|
||||
- Prefer mixed exports
|
||||
|
||||
### Don't
|
||||
|
||||
- Don't write vague commit messages
|
||||
- Don't skip tests for new features
|
||||
- Don't deviate from established patterns without discussion
|
||||
|
||||
---
|
||||
|
||||
*This skill was auto-generated by [ECC Tools](https://ecc.tools). Review and customize as needed for your team.*
|
||||
### Add New Skill or Agent
|
||||
**Trigger:** When introducing a new capability, workflow, or agent persona
|
||||
**Command:** `/add-skill`
|
||||
|
||||
1. Create a new `SKILL.md` in `skills/{skill-name}/` or `.agents/skills/{skill-name}/`.
|
||||
2. For agents, add definitions in `agents/{agent-name}.md` or `.codex/agents/{agent-name}.toml`.
|
||||
3. Update `manifests/install-modules.json` if the skill is installable.
|
||||
4. Update `AGENTS.md` and/or `README.md` to document the new skill/agent.
|
||||
5. Add supporting files as needed (e.g., `rules/`, `prompts/`, orchestration scripts).
|
||||
6. If orchestration is needed, add a shell or JS orchestrator (e.g., `scripts/{skill-name}.sh`).
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
# skills/mySkill/SKILL.md
|
||||
|
||||
## Overview
|
||||
Describes the "mySkill" capability for ECC.
|
||||
|
||||
## Usage
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Add or Update Command Workflow
|
||||
**Trigger:** When adding or improving CLI commands or workflows
|
||||
**Command:** `/add-command`
|
||||
|
||||
1. Create or modify a command markdown file in `commands/{command-name}.md` or `.claude/commands/{command-name}.md`.
|
||||
2. Add YAML frontmatter and sections for Purpose, Usage, and Output.
|
||||
3. Iterate based on review feedback (fix placeholders, add error handling, clarify protocol).
|
||||
4. Update related commands or documentation if part of a workflow.
|
||||
5. Document artifact storage locations if applicable.
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
---
|
||||
name: install
|
||||
description: Install a new ECC module
|
||||
---
|
||||
|
||||
## Purpose
|
||||
...
|
||||
|
||||
## Usage
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Agent or Skill Bundle Import
|
||||
**Trigger:** When bulk importing conventions, agent definitions, or skill documentation
|
||||
**Command:** `/import-bundle`
|
||||
|
||||
1. Add multiple files in `.claude/commands/`, `.claude/enterprise/`, `.claude/team/`, `.claude/research/`, `.claude/rules/`, `.codex/agents/`, `.claude/skills/`, `.agents/skills/`, etc.
|
||||
2. Include team config, identity, guardrails, research playbook, and skills documentation.
|
||||
3. No code/test changes—just documentation and config import.
|
||||
|
||||
---
|
||||
|
||||
### Dependency Update via Dependabot
|
||||
**Trigger:** When Dependabot creates a PR for a new dependency version
|
||||
**Command:** `/update-dependencies`
|
||||
|
||||
1. Update versions in `package.json`, `package-lock.json`, or `yarn.lock`.
|
||||
2. Update `.github/workflows/*.yml` for GitHub Actions if needed.
|
||||
3. Commit with a standard Dependabot message.
|
||||
4. Update `.github/dependabot.yml` for configuration if necessary.
|
||||
|
||||
---
|
||||
|
||||
### Refactor or Fix Skill or Agent
|
||||
**Trigger:** When a skill/agent needs to be removed, merged, or reworked
|
||||
**Command:** `/remove-skill`
|
||||
|
||||
1. Remove or modify `SKILL.md` in `skills/{skill-name}/` or `agents/{agent-name}.md`.
|
||||
2. Update `manifests/install-modules.json` and documentation.
|
||||
3. Restore or remove associated files as needed.
|
||||
4. Document the reason for the change (e.g., security, redundancy).
|
||||
|
||||
---
|
||||
|
||||
## Testing Patterns
|
||||
|
||||
- **Test Files:**
|
||||
All test files use the `*.test.js` pattern.
|
||||
- **Framework:**
|
||||
No specific testing framework detected; use standard Node.js assertions or your preferred test runner.
|
||||
- **Location:**
|
||||
Tests are typically placed in a `tests/` directory or alongside the source files.
|
||||
|
||||
**Example:**
|
||||
```js
|
||||
// tests/lib/install-targets.test.js
|
||||
const installGemini = require('../../scripts/lib/install-targets/gemini-project');
|
||||
|
||||
test('Gemini install target works', () => {
|
||||
expect(installGemini()).toBeDefined();
|
||||
});
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
| Command | Purpose |
|
||||
|---------------------|--------------------------------------------------------------|
|
||||
| /add-install-target | Add support for a new install target (IDE/platform) |
|
||||
| /add-skill | Add a new skill or agent to the ECC system |
|
||||
| /add-command | Add or update a CLI command or workflow |
|
||||
| /import-bundle | Bulk import agent/skill bundles or conventions documentation |
|
||||
| /update-dependencies| Update dependencies via Dependabot |
|
||||
| /remove-skill | Refactor, remove, or revert a skill or agent |
|
||||
```
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
],
|
||||
"commandFiles": [
|
||||
".claude/commands/feature-development.md",
|
||||
".claude/commands/add-new-skill-or-agent.md",
|
||||
".claude/commands/add-or-update-command.md"
|
||||
".claude/commands/add-new-install-target.md",
|
||||
".claude/commands/add-new-skill-or-agent.md"
|
||||
],
|
||||
"updatedAt": "2026-04-01T01:39:13.874Z"
|
||||
"updatedAt": "2026-04-01T00:56:01.731Z"
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
# Working Context
|
||||
|
||||
Last updated: 2026-04-01
|
||||
|
||||
## Purpose
|
||||
|
||||
Public ECC plugin repo for agents, skills, commands, hooks, rules, install surfaces, and ECC 2.0 platform buildout.
|
||||
|
||||
## Current Truth
|
||||
|
||||
- Default branch: `main`
|
||||
- Immediate blocker addressed: CI lockfile drift and hook validation breakage fixed in `a273c62`
|
||||
- Local full suite status after fix: `1723/1723` passing
|
||||
- Main active operational work:
|
||||
- keep default branch green
|
||||
- audit and classify remaining open PR backlog by full diff
|
||||
- continue ECC 2.0 control-plane and operator-surface buildout
|
||||
|
||||
## Current Constraints
|
||||
|
||||
- No merge by title or commit summary alone.
|
||||
- No arbitrary external runtime installs in shipped ECC surfaces.
|
||||
- Overlapping skills, hooks, or agents should be consolidated when overlap is material and runtime separation is not required.
|
||||
|
||||
## Active Queues
|
||||
|
||||
- PR backlog: audit and classify remaining open PRs into merge, port/rebuild, close, or park
|
||||
- Product:
|
||||
- selective install cleanup
|
||||
- control plane primitives
|
||||
- operator surface
|
||||
- self-improving skills
|
||||
- Security:
|
||||
- keep dependency posture clean
|
||||
- preserve self-contained hook and MCP behavior
|
||||
|
||||
## Open PR Classification
|
||||
|
||||
- Closed on 2026-04-01 under backlog hygiene / merge policy:
|
||||
- `#1069` `feat: add everything-claude-code ECC bundle`
|
||||
- `#1068` `feat: add everything-claude-code-conventions ECC bundle`
|
||||
- `#1064` `chore(deps-dev): bump @eslint/js from 9.39.2 to 10.0.1`
|
||||
- `#1063` `chore(deps-dev): bump eslint from 9.39.2 to 10.1.0`
|
||||
- Closed on 2026-04-01 because the content is sourced from external ecosystems and should only land via manual ECC-native re-port:
|
||||
- `#852` openclaw-user-profiler
|
||||
- `#851` openclaw-soul-forge
|
||||
- `#640` harper skills
|
||||
- Native-support candidates to fully diff-audit next:
|
||||
- `#1055` Dart / Flutter support
|
||||
- `#1043` C# reviewer and .NET skills
|
||||
- `#834` localized catalog sync and antigravity target filtering
|
||||
- Port or rebuild inside ECC after full audit:
|
||||
- `#894` Jira integration
|
||||
- `#844` ui-demo skill
|
||||
- `#814` + `#808` rebuild as a single consolidated notifications lane for Opencode and cross-harness surfaces
|
||||
|
||||
## Interfaces
|
||||
|
||||
- Public truth: GitHub issues and PRs
|
||||
- Internal execution truth: linked Linear work items under the ECC program
|
||||
- Current linked Linear items:
|
||||
- `ECC-206` ecosystem CI baseline
|
||||
- `ECC-207` PR backlog audit and merge-policy enforcement
|
||||
- `ECC-208` context hygiene
|
||||
|
||||
## Update Rule
|
||||
|
||||
Keep this file detailed for only the current sprint, blockers, and next actions. Summarize completed work into archive or repo docs once it is no longer actively shaping execution.
|
||||
|
||||
## Latest Execution Notes
|
||||
|
||||
- 2026-04-01: `main` CI was restored locally with `1723/1723` tests passing after lockfile and hook validation fixes.
|
||||
- 2026-04-01: Auto-generated ECC bundle PRs `#1068` and `#1069` were closed instead of merged; useful ideas must be ported manually after explicit diff audit.
|
||||
- 2026-04-01: Major-version ESLint bump PRs `#1063` and `#1064` were closed; revisit only inside a planned ESLint 10 migration lane.
|
||||
- 2026-04-01: Notification PRs `#808` and `#814` were identified as overlapping and should be rebuilt as one unified feature instead of landing as parallel branches.
|
||||
- 2026-04-01: External-source skill PRs `#640`, `#851`, and `#852` were closed under the new ingestion policy; copy ideas from audited source later rather than merging branded/source-import PRs directly.
|
||||
- 2026-04-01: The remaining low GitHub advisory on `ecc2/Cargo.lock` was addressed by moving `ratatui` to `0.30` with `crossterm_0_28`, which updated transitive `lru` from `0.12.5` to `0.16.3`. `cargo build --manifest-path ecc2/Cargo.toml` still passes.
|
||||
953
ecc2/Cargo.lock
generated
953
ecc2/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,7 @@ repository = "https://github.com/affaan-m/everything-claude-code"
|
||||
|
||||
[dependencies]
|
||||
# TUI
|
||||
ratatui = { version = "0.30", features = ["crossterm_0_28"] }
|
||||
ratatui = "0.29"
|
||||
crossterm = "0.28"
|
||||
|
||||
# Async runtime
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/hooks/post-bash-command-log.js\" audit"
|
||||
"command": "#!/bin/bash\nmkdir -p ~/.claude; INPUT=$(cat);\necho \"$INPUT\" | jq -r '\"[\" + (now | todate) + \"] \" + ((.tool_input.command // \"?\") | gsub(\"\n\"; \" \") | gsub(\"--token[= ][^ ]*\"; \"--token=<REDACTED>\") | gsub(\"Authorization:[: ]*[^ ]*[: ]*[^ ]*\"; \"Authorization:<REDACTED>\") | gsub(\"AKIA[A-Z0-9]{16}\"; \"<REDACTED>\") | gsub(\"ASIA[A-Z0-9]{16}\"; \"<REDACTED>\") | gsub(\"password[= ][^ ]*\"; \"password=<REDACTED>\") | gsub(\"ghp_[A-Za-z0-9_]+\"; \"<REDACTED>\") | gsub(\"gho_[A-Za-z0-9_]+\"; \"<REDACTED>\") | gsub(\"ghs_[A-Za-z0-9_]+\"; \"<REDACTED>\") | gsub(\"github_pat_[A-Za-z0-9_]+\"; \"<REDACTED>\"))' >> ~/.claude/bash-commands.log 2>/dev/null || true;\nprintf '%s\n' \"$INPUT\""
|
||||
}
|
||||
],
|
||||
"description": "Audit log all bash commands to ~/.claude/bash-commands.log"
|
||||
@@ -168,7 +168,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/hooks/post-bash-command-log.js\" cost"
|
||||
"command": "#!/bin/bash\nmkdir -p ~/.claude; INPUT=$(cat);\necho \"$INPUT\" | jq -r '\"[\" + (now | todate) + \"] tool=Bash command=\" + ((.tool_input.command // \"?\") | gsub(\"\n\"; \" \") | gsub(\"--token[= ][^ ]*\"; \"--token=<REDACTED>\") | gsub(\"Authorization:[: ]*[^ ]*[: ]*[^ ]*\"; \"Authorization:<REDACTED>\") | gsub(\"AKIA[A-Z0-9]{16}\"; \"<REDACTED>\") | gsub(\"ASIA[A-Z0-9]{16}\"; \"<REDACTED>\") | gsub(\"password[= ][^ ]*\"; \"password=<REDACTED>\") | gsub(\"ghp_[A-Za-z0-9_]+\"; \"<REDACTED>\") | gsub(\"gho_[A-Za-z0-9_]+\"; \"<REDACTED>\") | gsub(\"ghs_[A-Za-z0-9_]+\"; \"<REDACTED>\") | gsub(\"github_pat_[A-Za-z0-9_]+\"; \"<REDACTED>\"))' >> ~/.claude/cost-tracker.log 2>/dev/null || true;\nprintf '%s\n' \"$INPUT\""
|
||||
}
|
||||
],
|
||||
"description": "Cost tracker - log bash tool usage with timestamps"
|
||||
@@ -269,7 +269,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node -e \"const fs=require('fs');const path=require('path');const {spawnSync}=require('child_process');const raw=fs.readFileSync(0,'utf8');const rel=path.join('scripts','hooks','run-with-flags.js');const hasRunnerRoot=candidate=>{const value=typeof candidate==='string'?candidate.trim():'';return value.length>0&&fs.existsSync(path.join(path.resolve(value),rel));};const root=(()=>{const envRoot=process.env.CLAUDE_PLUGIN_ROOT||'';if(hasRunnerRoot(envRoot))return path.resolve(envRoot.trim());const home=require('os').homedir();const claudeDir=path.join(home,'.claude');if(hasRunnerRoot(claudeDir))return claudeDir;for(const candidate of [path.join(claudeDir,'plugins','everything-claude-code'),path.join(claudeDir,'plugins','everything-claude-code@everything-claude-code'),path.join(claudeDir,'plugins','marketplace','everything-claude-code')]){if(hasRunnerRoot(candidate))return candidate;}try{const cacheBase=path.join(claudeDir,'plugins','cache','everything-claude-code');for(const org of fs.readdirSync(cacheBase,{withFileTypes:true})){if(!org.isDirectory())continue;for(const version of fs.readdirSync(path.join(cacheBase,org.name),{withFileTypes:true})){if(!version.isDirectory())continue;const candidate=path.join(cacheBase,org.name,version.name);if(hasRunnerRoot(candidate))return candidate;}}}catch{}return claudeDir;})();const script=path.join(root,rel);if(fs.existsSync(script)){const result=spawnSync(process.execPath,[script,'stop:format-typecheck','scripts/hooks/stop-format-typecheck.js','standard,strict'],{input:raw,encoding:'utf8',env:process.env,cwd:process.cwd(),timeout:300000});const stdout=typeof result.stdout==='string'?result.stdout:'';if(stdout)process.stdout.write(stdout);else process.stdout.write(raw);if(result.stderr)process.stderr.write(result.stderr);if(result.error||result.status===null||result.signal){const reason=result.error?result.error.message:(result.signal?'signal '+result.signal:'missing exit status');process.stderr.write('[Stop] ERROR: hook runner failed: '+reason+String.fromCharCode(10));process.exit(1);}process.exit(Number.isInteger(result.status)?result.status:0);}process.stderr.write('[Stop] WARNING: could not resolve ECC plugin root; skipping hook'+String.fromCharCode(10));process.stdout.write(raw);\"",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js\" \"stop:format-typecheck\" \"scripts/hooks/stop-format-typecheck.js\" \"standard,strict\"",
|
||||
"timeout": 300
|
||||
}
|
||||
],
|
||||
|
||||
368
package-lock.json
generated
368
package-lock.json
generated
@@ -20,7 +20,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.39.2",
|
||||
"c8": "^11.0.0",
|
||||
"c8": "^10.1.2",
|
||||
"eslint": "^9.39.2",
|
||||
"globals": "^17.1.0",
|
||||
"markdownlint-cli": "^0.48.0"
|
||||
@@ -278,6 +278,49 @@
|
||||
"integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/@isaacs/cliui": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
|
||||
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"string-width": "^5.1.2",
|
||||
"string-width-cjs": "npm:string-width@^4.2.0",
|
||||
"strip-ansi": "^7.0.1",
|
||||
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
|
||||
"wrap-ansi": "^8.1.0",
|
||||
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
|
||||
"version": "9.2.2",
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
||||
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/string-width": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
||||
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"eastasianwidth": "^0.2.0",
|
||||
"emoji-regex": "^9.2.2",
|
||||
"strip-ansi": "^7.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@istanbuljs/schema": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
|
||||
@@ -316,6 +359,17 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@pkgjs/parseargs": {
|
||||
"version": "0.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
||||
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/debug": {
|
||||
"version": "4.1.12",
|
||||
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
|
||||
@@ -462,9 +516,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/c8": {
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz",
|
||||
"integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==",
|
||||
"version": "10.1.3",
|
||||
"resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz",
|
||||
"integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
@@ -475,7 +529,7 @@
|
||||
"istanbul-lib-coverage": "^3.2.0",
|
||||
"istanbul-lib-report": "^3.0.1",
|
||||
"istanbul-reports": "^3.1.6",
|
||||
"test-exclude": "^8.0.0",
|
||||
"test-exclude": "^7.0.1",
|
||||
"v8-to-istanbul": "^9.0.0",
|
||||
"yargs": "^17.7.2",
|
||||
"yargs-parser": "^21.1.1"
|
||||
@@ -484,7 +538,7 @@
|
||||
"c8": "bin/c8.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
"node": ">=18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"monocart-coverage-reports": "^2"
|
||||
@@ -757,6 +811,13 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/eastasianwidth": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
|
||||
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/emoji-regex": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||
@@ -1123,18 +1184,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/glob": {
|
||||
"version": "13.0.6",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
|
||||
"integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
|
||||
"version": "10.5.0",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
|
||||
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
|
||||
"deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"minimatch": "^10.2.2",
|
||||
"minipass": "^7.1.3",
|
||||
"path-scurry": "^2.0.2"
|
||||
"foreground-child": "^3.1.0",
|
||||
"jackspeak": "^3.1.2",
|
||||
"minimatch": "^9.0.4",
|
||||
"minipass": "^7.1.2",
|
||||
"package-json-from-dist": "^1.0.0",
|
||||
"path-scurry": "^1.11.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"bin": {
|
||||
"glob": "dist/esm/bin.mjs"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
@@ -1153,40 +1218,27 @@
|
||||
"node": ">=10.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/glob/node_modules/balanced-match": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
||||
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
}
|
||||
},
|
||||
"node_modules/glob/node_modules/brace-expansion": {
|
||||
"version": "5.0.5",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
|
||||
"integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
|
||||
"integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"balanced-match": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/glob/node_modules/minimatch": {
|
||||
"version": "10.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
|
||||
"integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
|
||||
"version": "9.0.9",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
|
||||
"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^5.0.5"
|
||||
"brace-expansion": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
@@ -1396,6 +1448,22 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/jackspeak": {
|
||||
"version": "3.4.3",
|
||||
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
|
||||
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"@isaacs/cliui": "^8.0.2"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@pkgjs/parseargs": "^0.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/js-yaml": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
|
||||
@@ -1530,14 +1598,11 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "11.2.7",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
|
||||
"integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
|
||||
"version": "10.4.3",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
|
||||
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
}
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/make-dir": {
|
||||
"version": "4.0.0",
|
||||
@@ -2310,6 +2375,13 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/package-json-from-dist": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
||||
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0"
|
||||
},
|
||||
"node_modules/parent-module": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
||||
@@ -2364,17 +2436,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/path-scurry": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
|
||||
"integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
|
||||
"version": "1.11.1",
|
||||
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
|
||||
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"lru-cache": "^11.0.0",
|
||||
"minipass": "^7.1.2"
|
||||
"lru-cache": "^10.2.0",
|
||||
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"node": ">=16 || 14 >=14.18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
@@ -2552,6 +2624,45 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width-cjs": {
|
||||
"name": "string-width",
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"emoji-regex": "^8.0.0",
|
||||
"is-fullwidth-code-point": "^3.0.0",
|
||||
"strip-ansi": "^6.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width-cjs/node_modules/ansi-regex": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width-cjs/node_modules/strip-ansi": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-ansi": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
|
||||
@@ -2568,6 +2679,30 @@
|
||||
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-ansi-cjs": {
|
||||
"name": "strip-ansi",
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
@@ -2595,18 +2730,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/test-exclude": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz",
|
||||
"integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==",
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz",
|
||||
"integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@istanbuljs/schema": "^0.1.2",
|
||||
"glob": "^13.0.6",
|
||||
"glob": "^10.4.1",
|
||||
"minimatch": "^10.2.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/test-exclude/node_modules/balanced-match": {
|
||||
@@ -2633,13 +2768,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/test-exclude/node_modules/minimatch": {
|
||||
"version": "10.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
|
||||
"integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
|
||||
"version": "10.2.4",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
|
||||
"integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
|
||||
"dev": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^5.0.5"
|
||||
"brace-expansion": "^5.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
@@ -2735,6 +2870,119 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi": {
|
||||
"version": "8.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
|
||||
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^6.1.0",
|
||||
"string-width": "^5.0.1",
|
||||
"strip-ansi": "^7.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi-cjs": {
|
||||
"name": "wrap-ansi",
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.0.0",
|
||||
"string-width": "^4.1.0",
|
||||
"strip-ansi": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"emoji-regex": "^8.0.0",
|
||||
"is-fullwidth-code-point": "^3.0.0",
|
||||
"strip-ansi": "^6.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi/node_modules/ansi-styles": {
|
||||
"version": "6.2.3",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
|
||||
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi/node_modules/emoji-regex": {
|
||||
"version": "9.2.2",
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
||||
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/wrap-ansi/node_modules/string-width": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
||||
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"eastasianwidth": "^0.2.0",
|
||||
"emoji-regex": "^9.2.2",
|
||||
"strip-ansi": "^7.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/y18n": {
|
||||
"version": "5.0.8",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
"cursor",
|
||||
"antigravity",
|
||||
"codex",
|
||||
"gemini",
|
||||
"opencode",
|
||||
"codebuddy"
|
||||
]
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const path = require('path');
|
||||
|
||||
const MAX_STDIN = 1024 * 1024;
|
||||
let raw = '';
|
||||
|
||||
const MODE_CONFIG = {
|
||||
audit: {
|
||||
fileName: 'bash-commands.log',
|
||||
format: command => `[${new Date().toISOString()}] ${command}`,
|
||||
},
|
||||
cost: {
|
||||
fileName: 'cost-tracker.log',
|
||||
format: command => `[${new Date().toISOString()}] tool=Bash command=${command}`,
|
||||
},
|
||||
};
|
||||
|
||||
function sanitizeCommand(command) {
|
||||
return String(command || '')
|
||||
.replace(/\n/g, ' ')
|
||||
.replace(/--token[= ][^ ]*/g, '--token=<REDACTED>')
|
||||
.replace(/Authorization:[: ]*[^ ]*[: ]*[^ ]*/gi, 'Authorization:<REDACTED>')
|
||||
.replace(/\bAKIA[A-Z0-9]{16}\b/g, '<REDACTED>')
|
||||
.replace(/\bASIA[A-Z0-9]{16}\b/g, '<REDACTED>')
|
||||
.replace(/password[= ][^ ]*/gi, 'password=<REDACTED>')
|
||||
.replace(/\bghp_[A-Za-z0-9_]+\b/g, '<REDACTED>')
|
||||
.replace(/\bgho_[A-Za-z0-9_]+\b/g, '<REDACTED>')
|
||||
.replace(/\bghs_[A-Za-z0-9_]+\b/g, '<REDACTED>')
|
||||
.replace(/\bgithub_pat_[A-Za-z0-9_]+\b/g, '<REDACTED>');
|
||||
}
|
||||
|
||||
function appendLine(filePath, line) {
|
||||
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
||||
fs.appendFileSync(filePath, `${line}\n`, 'utf8');
|
||||
}
|
||||
|
||||
function main() {
|
||||
const config = MODE_CONFIG[process.argv[2]];
|
||||
|
||||
process.stdin.setEncoding('utf8');
|
||||
process.stdin.on('data', chunk => {
|
||||
if (raw.length < MAX_STDIN) {
|
||||
const remaining = MAX_STDIN - raw.length;
|
||||
raw += chunk.substring(0, remaining);
|
||||
}
|
||||
});
|
||||
|
||||
process.stdin.on('end', () => {
|
||||
try {
|
||||
if (config) {
|
||||
const input = raw.trim() ? JSON.parse(raw) : {};
|
||||
const command = sanitizeCommand(input.tool_input?.command || '?');
|
||||
appendLine(path.join(os.homedir(), '.claude', config.fileName), config.format(command));
|
||||
}
|
||||
} catch {
|
||||
// Logging must never block the calling hook.
|
||||
}
|
||||
|
||||
process.stdout.write(raw);
|
||||
});
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
main();
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
sanitizeCommand,
|
||||
};
|
||||
@@ -1,104 +0,0 @@
|
||||
const assert = require('assert');
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const path = require('path');
|
||||
const { spawnSync } = require('child_process');
|
||||
|
||||
const scriptPath = path.join(__dirname, '..', '..', 'scripts', 'hooks', 'post-bash-command-log.js');
|
||||
const { sanitizeCommand } = require(scriptPath);
|
||||
|
||||
function test(name, fn) {
|
||||
try {
|
||||
fn();
|
||||
console.log(`PASS: ${name}`);
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.log(`FAIL: ${name}`);
|
||||
console.log(` ${error.message}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function runHook(mode, payload, homeDir) {
|
||||
return spawnSync('node', [scriptPath, mode], {
|
||||
input: JSON.stringify(payload),
|
||||
encoding: 'utf8',
|
||||
env: {
|
||||
...process.env,
|
||||
HOME: homeDir,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
let passed = 0;
|
||||
let failed = 0;
|
||||
|
||||
if (
|
||||
test('sanitizeCommand redacts common secret formats', () => {
|
||||
const input = 'gh pr create --token abc123 Authorization: Bearer hello password=swordfish ghp_abc github_pat_xyz';
|
||||
const sanitized = sanitizeCommand(input);
|
||||
assert.ok(!sanitized.includes('abc123'));
|
||||
assert.ok(!sanitized.includes('swordfish'));
|
||||
assert.ok(!sanitized.includes('ghp_abc'));
|
||||
assert.ok(!sanitized.includes('github_pat_xyz'));
|
||||
assert.ok(sanitized.includes('--token=<REDACTED>'));
|
||||
assert.ok(sanitized.includes('Authorization:<REDACTED>'));
|
||||
assert.ok(sanitized.includes('password=<REDACTED>'));
|
||||
})
|
||||
)
|
||||
passed++;
|
||||
else failed++;
|
||||
|
||||
if (
|
||||
test('audit mode logs sanitized bash commands and preserves stdout', () => {
|
||||
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ecc-bash-log-'));
|
||||
const payload = {
|
||||
tool_input: {
|
||||
command: 'git push --token abc123',
|
||||
},
|
||||
};
|
||||
|
||||
try {
|
||||
const result = runHook('audit', payload, homeDir);
|
||||
assert.strictEqual(result.status, 0, result.stdout + result.stderr);
|
||||
assert.strictEqual(result.stdout, JSON.stringify(payload));
|
||||
|
||||
const logFile = path.join(homeDir, '.claude', 'bash-commands.log');
|
||||
const logContent = fs.readFileSync(logFile, 'utf8');
|
||||
assert.ok(logContent.includes('--token=<REDACTED>'));
|
||||
assert.ok(!logContent.includes('abc123'));
|
||||
} finally {
|
||||
fs.rmSync(homeDir, { recursive: true, force: true });
|
||||
}
|
||||
})
|
||||
)
|
||||
passed++;
|
||||
else failed++;
|
||||
|
||||
if (
|
||||
test('cost mode writes command metrics log', () => {
|
||||
const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ecc-cost-log-'));
|
||||
const payload = {
|
||||
tool_input: {
|
||||
command: 'npm publish',
|
||||
},
|
||||
};
|
||||
|
||||
try {
|
||||
const result = runHook('cost', payload, homeDir);
|
||||
assert.strictEqual(result.status, 0, result.stdout + result.stderr);
|
||||
|
||||
const logFile = path.join(homeDir, '.claude', 'cost-tracker.log');
|
||||
const logContent = fs.readFileSync(logFile, 'utf8');
|
||||
assert.match(logContent, /tool=Bash command=npm publish/);
|
||||
} finally {
|
||||
fs.rmSync(homeDir, { recursive: true, force: true });
|
||||
}
|
||||
})
|
||||
)
|
||||
passed++;
|
||||
else failed++;
|
||||
|
||||
console.log(`\nPassed: ${passed}`);
|
||||
console.log(`Failed: ${failed}`);
|
||||
process.exit(failed > 0 ? 1 : 0);
|
||||
27
yarn.lock
27
yarn.lock
@@ -316,7 +316,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"brace-expansion@npm:^5.0.5":
|
||||
"brace-expansion@npm:^5.0.2, brace-expansion@npm:^5.0.5":
|
||||
version: 5.0.5
|
||||
resolution: "brace-expansion@npm:5.0.5"
|
||||
dependencies:
|
||||
@@ -796,9 +796,9 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"globals@npm:^17.1.0":
|
||||
version: 17.1.0
|
||||
resolution: "globals@npm:17.1.0"
|
||||
checksum: 10c0/4a4a17847676a09f164b8bdce7df105a4f484d6d44586e374087ba9ec7089cbf4c578b8648838dee9917074199c542ce157ea3c07b266f708dfb1652010900c8
|
||||
version: 17.4.0
|
||||
resolution: "globals@npm:17.4.0"
|
||||
checksum: 10c0/2be9e8c2b9035836f13d420b22f0247a328db82967d3bebfc01126d888ed609305f06c05895914e969653af5c6ba35fd7a0920f3e6c869afa60666c810630feb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -1424,12 +1424,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:^10.2.2, minimatch@npm:~10.2.4":
|
||||
version: 10.2.5
|
||||
resolution: "minimatch@npm:10.2.5"
|
||||
"minimatch@npm:^10.2.2":
|
||||
version: 10.2.4
|
||||
resolution: "minimatch@npm:10.2.4"
|
||||
dependencies:
|
||||
brace-expansion: "npm:^5.0.5"
|
||||
checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd
|
||||
brace-expansion: "npm:^5.0.2"
|
||||
checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -1442,6 +1442,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:~10.2.4":
|
||||
version: 10.2.5
|
||||
resolution: "minimatch@npm:10.2.5"
|
||||
dependencies:
|
||||
brace-expansion: "npm:^5.0.5"
|
||||
checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimist@npm:^1.2.8":
|
||||
version: 1.2.8
|
||||
resolution: "minimist@npm:1.2.8"
|
||||
|
||||
Reference in New Issue
Block a user