diff --git a/.claude/skills/js-project-structure/assets/.env.example b/.claude/skills/js-project-structure/assets/.env.example new file mode 100644 index 0000000..9408395 --- /dev/null +++ b/.claude/skills/js-project-structure/assets/.env.example @@ -0,0 +1,82 @@ +# GitHub App Setup Instructions + +This project uses GitHub MCP (Model Context Protocol) to interact with the GitHub API. To use GitHub-dependent features, you need to configure a GitHub App. + +## Setup Steps + +### 1. Create a GitHub App (One-time) + +Visit https://github.com/settings/apps and create a new GitHub App: + +- **App name**: torq-mcp (or your organization name) +- **Homepage URL**: https://github.com/mrbalov (your GitHub profile) +- **Permissions**: + - Contents: Read & write + - Pull requests: Read & write + - Issues: Read & write + - Workflows: Read & write + +### 2. Generate Private Key + +After creating the app: +1. Scroll to "Private keys" section +2. Click "Generate a private key" +3. Save the downloaded `.pem` file securely + +### 3. Install App to Your Organization + +1. Go to "Install App" in the app settings +2. Select your GitHub organization +3. Authorize the app + +Note the **Installation ID** from the URL (e.g., https://github.com/settings/installations/12345678) + +### 4. Configure .env + +Create a `.env` file in the project root: + +```env +GITHUB_APP_ID=123456 +GITHUB_APP_PRIVATE_KEY_PATH=/path/to/private-key.pem +GITHUB_INSTALLATION_ID=12345678 +``` + +### 5. Verify Setup + +Test the configuration: + +```bash +# This should display your GitHub user info +npx @anthropic-ai/claude-code-mcp github user +``` + +## Publishing to npm + +For automatic publishing via semantic-release: + +1. Configure **OIDC Trusted Publishing** on npm (recommended) + - No secrets needed in GitHub + - GitHub Actions automatically exchanges tokens + - See: https://docs.npmjs.com/creating-and-viewing-access-tokens#creating-automation-tokens + +2. OR configure **npm authentication**: + - Create an npm automation token + - Add to GitHub Secrets as `NPM_TOKEN` + - Workflow will use it for publishing + +## Troubleshooting + +**"Cannot find private key"** +- Verify path in `.env` is absolute and file exists +- Check file permissions: `chmod 600 /path/to/key.pem` + +**"App not authorized"** +- Confirm app is installed on your organization +- Check Installation ID in `.env` matches + +**GitHub Actions fails to publish** +- Verify OIDC is configured on npm +- Check GitHub Actions has `id-token: write` permission +- View workflow logs for detailed errors + +See `.mcp.json` for MCP server configuration details. diff --git a/.claude/skills/js-project-structure/assets/commitlint.config.js b/.claude/skills/js-project-structure/assets/commitlint.config.js new file mode 100644 index 0000000..bc4bcb9 --- /dev/null +++ b/.claude/skills/js-project-structure/assets/commitlint.config.js @@ -0,0 +1,18 @@ +/** + * Commitlint configuration for conventional commits + * Extends @commitlint/config-conventional with torq-specific rules + * + * Rules: + * - type-enum: Allowed commit types + * - scope-empty: Scope is required (never empty) + * - subject-case: Subject must be lowercase + * - subject-full-stop: No period at end + */ + +export default { + extends: ['@commitlint/config-conventional'], + rules: { + 'scope-empty': [2, 'never'], + 'subject-case': [2, 'never', ['start-case', 'pascal-case', 'upper-case']], + }, +}; diff --git a/.claude/skills/js-project-structure/assets/validate-branch-name.config.js b/.claude/skills/js-project-structure/assets/validate-branch-name.config.js new file mode 100644 index 0000000..2954c01 --- /dev/null +++ b/.claude/skills/js-project-structure/assets/validate-branch-name.config.js @@ -0,0 +1,12 @@ +/** + * Validate branch name configuration + * Enforces semantic branch naming: /- + */ + +export default { + pattern: /^(feat|fix|chore|docs|test|refactor|perf)\/(\d+)-([a-z0-9\-]+)$|^(main|master|develop)$/, + errorMsg: + 'Branch name must match pattern: /-\n' + + 'Types: feat, fix, chore, docs, test, refactor, perf\n' + + 'Examples: feat/1-add-auth, fix/42-resolve-bug', +}; diff --git a/.claude/skills/js-project-structure/evals/evals.json b/.claude/skills/js-project-structure/evals/evals.json new file mode 100644 index 0000000..e61cd51 --- /dev/null +++ b/.claude/skills/js-project-structure/evals/evals.json @@ -0,0 +1,205 @@ +{ + "version": "1.0.0", + "name": "js-project-structure", + "description": "Evaluation tests for js-project-structure skill", + "tests": [ + { + "id": "test-1-project-creation", + "name": "Create new local project", + "description": "Initialize a new JavaScript project locally without remote GitHub repo", + "steps": [ + "Run: bash scripts/init-project.sh test-lib-local empty-scope 'A test library' no", + "Verify: test-lib-local directory created", + "Verify: package.json exists with name 'test-lib-local'", + "Verify: All required files present (tsconfig.json, eslint.config.mjs, .prettierrc, etc.)", + "Verify: .git directory initialized", + "Verify: Initial commit created with message 'chore: initialize project from torq template'", + "Verify: node_modules installed" + ], + "expected": { + "exitCode": 0, + "files": [ + "test-lib-local/package.json", + "test-lib-local/tsconfig.json", + "test-lib-local/eslint.config.mjs", + "test-lib-local/.prettierrc", + "test-lib-local/commitlint.config.js", + "test-lib-local/.releaserc.json", + "test-lib-local/.github/workflows/verify.yml", + "test-lib-local/.github/workflows/publish.yml", + "test-lib-local/.husky/commit-msg", + "test-lib-local/.husky/pre-push" + ], + "gitBranch": "main", + "gitCommits": "≥1" + } + }, + { + "id": "test-2-scoped-package", + "name": "Create scoped npm package", + "description": "Initialize project with @scope namespace", + "steps": [ + "Run: bash scripts/init-project.sh test-scoped '@torqlab' 'A scoped test lib' no", + "Verify: package.json name is '@torqlab/test-scoped'", + "Verify: All configuration files customized", + "Verify: Git initialized and first commit created" + ], + "expected": { + "packageName": "@torqlab/test-scoped", + "files": [ + "test-scoped/package.json" + ] + } + }, + { + "id": "test-3-validation-setup", + "name": "Validate project setup", + "description": "Run validation checks on initialized project", + "steps": [ + "Create test project via init-project.sh", + "Run: bash scripts/validate-setup.sh test-lib-local", + "Verify: All checks pass (0 errors)" + ], + "expected": { + "exitCode": 0, + "checksPass": [ + "configuration files", + "directories", + "git repository", + "git hooks", + "dependencies", + "typescript", + "eslint", + "prettier" + ] + } + }, + { + "id": "test-4-husky-hooks", + "name": "Test commit-msg hook", + "description": "Verify commitlint validation works", + "steps": [ + "Create test project", + "cd into project", + "Try bad commit: git commit --allow-empty -m 'bad message'", + "Verify: Commit is rejected by hook", + "Try good commit: git commit --allow-empty -m 'feat(core): add feature'", + "Verify: Commit succeeds" + ], + "expected": { + "badCommitRejected": true, + "goodCommitAccepted": true, + "hookInstalled": true + } + }, + { + "id": "test-5-branch-validation", + "name": "Test branch name validation", + "description": "Verify branch naming convention is enforced", + "steps": [ + "Create test project", + "cd into project", + "Create branch with bad name: git checkout -b bad-branch-name", + "Try to push (dry-run to origin): pre-push hook should validate", + "Create branch with good name: git checkout -b feat/1-test-feature", + "Verify branch name is accepted by validate-branch-name" + ], + "expected": { + "badBranchRejected": true, + "goodBranchAccepted": true + } + }, + { + "id": "test-6-build-pipeline", + "name": "Test build scripts", + "description": "Verify build process works", + "steps": [ + "Create test project", + "cd into project", + "Run: bun run build", + "Verify: dist/ directory created", + "Verify: dist/index.mjs (ESM) exists", + "Verify: dist/index.cjs (CommonJS) exists", + "Verify: dist/index.d.ts (types) exists" + ], + "expected": { + "exitCode": 0, + "outputDir": "dist", + "files": [ + "dist/index.mjs", + "dist/index.cjs", + "dist/index.d.ts" + ] + } + }, + { + "id": "test-7-linting", + "name": "Test ESLint integration", + "description": "Verify linting works without errors", + "steps": [ + "Create test project", + "cd into project", + "Run: bun run lint", + "Verify: No ESLint errors (exit code 0)" + ], + "expected": { + "exitCode": 0, + "errors": 0 + } + }, + { + "id": "test-8-formatting", + "name": "Test Prettier integration", + "description": "Verify code formatting is correct", + "steps": [ + "Create test project", + "cd into project", + "Run: bun run format:check", + "Verify: Code already formatted (exit code 0)" + ], + "expected": { + "exitCode": 0, + "message": "All matched files use Prettier code style" + } + }, + { + "id": "test-9-tests", + "name": "Test runner (Bun)", + "description": "Verify test execution works", + "steps": [ + "Create test project", + "cd into project", + "Run: bun test", + "Verify: Tests execute (at least placeholder test)" + ], + "expected": { + "exitCode": 0, + "testsRun": "≥1" + } + }, + { + "id": "test-10-config-files", + "name": "Validate config files", + "description": "Verify all config files are valid", + "steps": [ + "Create test project", + "Validate package.json: JSON parse succeeds", + "Validate tsconfig.json: JSON parse succeeds", + "Validate .releaserc.json: JSON parse succeeds", + "Validate commitlint.config.js: Can be imported", + "Validate eslint.config.mjs: Can be imported", + "Validate .prettierrc: JSON parse succeeds" + ], + "expected": { + "allValid": true, + "parseErrors": 0 + } + } + ], + "cleanup": { + "description": "Remove test artifacts after evaluation", + "commands": [ + "rm -rf test-lib-local test-scoped test-lib-local-remote" + ] + } +} diff --git a/.claude/skills/js-project-structure/references/TORQ_PROJECT_STANDARDS.md b/.claude/skills/js-project-structure/references/TORQ_PROJECT_STANDARDS.md new file mode 100644 index 0000000..a6a38f7 --- /dev/null +++ b/.claude/skills/js-project-structure/references/TORQ_PROJECT_STANDARDS.md @@ -0,0 +1,215 @@ +# Torq Project Standards + +This document defines the standardization approach for all TypeScript/Node.js projects within the torq ecosystem. + +## Philosophy + +All torq projects follow a **single-source-of-truth template** approach: +- One canonical template repository (torqlab/js-project-template) +- All new projects clone and customize from this template +- Consistent tooling, git workflow, and publishing pipeline +- Low overhead for new projects, high consistency across org + +## Core Standards + +### 1. Version Control & Git Workflow + +**Branch Naming**: `/-` +- Types: `feat`, `fix`, `chore`, `docs`, `test`, `refactor`, `perf` +- Ticket ID: numeric (links to GitHub issues/Jira) +- Example: `feat/42-add-user-auth`, `fix/99-resolve-race-condition` + +**Commit Format** (Conventional Commits): +``` +(, #): + + + +Addresses # +``` +- Type & Scope: Required +- Scope examples: `api`, `types`, `auth`, `db`, `ui` +- Subject: Imperative mood, lowercase, max 50 chars, no period + +**Validation**: Enforced via Git hooks +- commit-msg hook: Validates format via commitlint +- pre-push hook: Validates branch name, runs linting, tests + +### 2. Versioning & Publishing + +**Semantic Versioning**: Automatic via semantic-release +- `feat` commits → MINOR bump (1.0.0 → 1.1.0) +- `fix` & `perf` commits → PATCH bump (1.0.0 → 1.0.1) +- `feat!` → MAJOR bump (1.0.0 → 2.0.0, breaking change) +- `chore`, `docs`, `test` → No version bump + +**Publishing**: Automatic when merged to main +- Runs on GitHub Actions +- Uses OIDC Trusted Publishing (keyless, secure) +- Publishes to npm automatically +- Creates GitHub releases & tags + +### 3. Code Quality + +**TypeScript**: Strict mode +- `strict: true` in tsconfig.json +- Dual-format output: ESM + CommonJS +- Type declarations (.d.ts) included + +**ESLint**: Code rules via eslint-config-prettier +- Immutability: Only `const`, no `let`/`var` +- Max line length: 100 characters +- JSDoc required for all functions +- Node.js built-ins use `node:` prefix + +**Prettier**: Code formatting +- Print width: 100 characters +- Single quotes for strings +- Trailing commas in objects/arrays +- 2-space indentation +- Semicolons required + +**Integration**: No conflicts via eslint-config-prettier +- ESLint handles logic rules (errors) +- Prettier handles formatting (style) +- ESLint rules that conflict with Prettier are disabled + +### 4. Testing + +**Test Runner**: Bun (built-in, zero-config) +- Located in `src/**/*.test.ts` +- Run with `bun test` +- Integrated in pre-push hook + +**Coverage**: Not enforced, but encouraged +- No minimum threshold required +- Developers responsible for adequate coverage + +### 5. Build & Distribution + +**Build Outputs**: +- ESM: `dist/index.mjs` (modern JavaScript, tree-shakeable) +- CommonJS: `dist/index.cjs` (legacy compatibility) +- Types: `dist/index.d.ts` (TypeScript declarations) + +**Build Scripts**: +```bash +bun run build # Full build (types + ESM + CJS) +bun run build:types # Just .d.ts files +bun run build:esm # Just .mjs modules +bun run build:cjs # Just .cjs modules +``` + +**Package Distribution**: +- Main entry: `dist/index.cjs` (CommonJS default) +- Module entry: `dist/index.mjs` (Modern tooling prefers ESM) +- Types entry: `dist/index.d.ts` (TypeScript) +- Exports configured in package.json for both formats + +### 6. Configuration Files + +| File | Purpose | +|------|---------| +| `package.json` | Project metadata, scripts, dependencies | +| `tsconfig.json` | TypeScript strict mode, ES2022 target | +| `eslint.config.mjs` | Code quality rules (flat config) | +| `.prettierrc` | Code formatting rules | +| `commitlint.config.js` | Commit message validation | +| `.releaserc.json` | Semantic-release configuration | +| `.mcp.json` | GitHub MCP server config | +| `.env.example` | Environment setup template | + +### 7. Git Hooks + +**Husky** manages two hooks: + +**commit-msg** (before commit saved) +- Validates commit message format +- Enforced by commitlint +- Fails if message doesn't follow conventional format + +**pre-push** (before push to remote) +- Linting check: `bun run lint` +- Format check: `bun run format:check` +- Test check: `bun test` +- Branch validation: `npx validate-branch-name` +- Fails if any check fails (push blocked) + +### 8. CI/CD Workflows + +**verify.yml**: Runs on pull request +- Install dependencies +- Run linting +- Run formatting check +- Run tests +- Run build +- Parallel jobs for speed + +**publish.yml**: Runs on merge to main +- Install dependencies +- Run full verify pipeline +- Run semantic-release +- Publishes to npm (OIDC trusted) +- Creates GitHub release + +### 9. Development Commands + +```bash +bun install # Install dependencies +bun run build # Build project +bun run lint # Run ESLint +bun run format # Auto-format with Prettier +bun run format:check # Check formatting without changes +bun test # Run all tests +npm run prepare # Install git hooks +bun run clean # Remove dist/ directory +``` + +### 10. Node.js Version + +**Required**: Node.js 24+ +- Enforced via `.nvmrc` (managed by nvm) +- TypeScript target: ES2022 +- Modern JavaScript features expected + +## Monorepo Pattern + +For monorepos (multiple projects under torq/): + +1. **Shared configuration** via symlink: + ```bash + ln -s ../../.claude .claude + ``` + +2. **Per-project customization**: + - Each project has own package.json (name, description) + - Each project has own CI/CD workflow + - Each project publishes independently to npm + +3. **Benefits**: + - One update point for shared standards + - Independent versioning per project + - Consistent development experience + +## Standards Evolution + +Standards can evolve, but changes should: +1. Be documented with rationale +2. Be applied to new projects first +3. Provide migration path for existing projects +4. Maintain backward compatibility where possible + +Template repository serves as the canonical version. Changes are: +- Tagged with releases in the template repo +- Applied to new projects immediately +- Backported to existing projects via pull requests + +## References + +- [Conventional Commits](https://www.conventionalcommits.org/) +- [Semantic Versioning](https://semver.org/) +- [Semantic Release Documentation](https://semantic-release.gitbook.io/) +- [TypeScript Handbook](https://www.typescriptlang.org/docs/) +- [ESLint Documentation](https://eslint.org/) +- [Prettier Documentation](https://prettier.io/) +- [Bun Runtime](https://bun.sh/) diff --git a/.claude/skills/js-project-structure/scripts/init-project.sh b/.claude/skills/js-project-structure/scripts/init-project.sh new file mode 100755 index 0000000..98728aa --- /dev/null +++ b/.claude/skills/js-project-structure/scripts/init-project.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +set -euo pipefail + +# js-project-structure: init-project.sh +# Initializes a new JavaScript project from torq template + +PROJECT_NAME="${1:?Project name required (e.g., my-lib)}" +PROJECT_SCOPE="${2:-}" +PROJECT_DESC="${3:?Project description required}" +CREATE_REMOTE="${4:-no}" +ORG="${5:-}" + +TEMPLATE_REPO="https://github.com/torqlab/js-project-template.git" +PROJECT_DIR="${PROJECT_NAME}" + +echo "🚀 Initializing project: $PROJECT_NAME" +echo " Template: $TEMPLATE_REPO" +echo "" + +# Clone template +if [ -d "$PROJECT_DIR" ]; then + echo "❌ Directory already exists: $PROJECT_DIR" + exit 1 +fi + +echo "📦 Cloning template..." +git clone "$TEMPLATE_REPO" "$PROJECT_DIR" +cd "$PROJECT_DIR" + +# Remove original git history +rm -rf .git +git init +git branch -M main + +echo "✅ Template cloned" +echo "" + +# Customize package.json +echo "🔧 Customizing configuration..." + +FULL_NAME="$PROJECT_SCOPE/$PROJECT_NAME" +if [ -z "$PROJECT_SCOPE" ]; then + FULL_NAME="$PROJECT_NAME" +fi + +# Use sed to update package.json +if [[ "$OSTYPE" == "darwin"* ]]; then + # macOS sed syntax + sed -i '' "s|{{PROJECT_NAME}}|$FULL_NAME|g" package.json + sed -i '' "s|{{PROJECT_DESCRIPTION}}|$PROJECT_DESC|g" package.json +else + # Linux sed syntax + sed -i "s|{{PROJECT_NAME}}|$FULL_NAME|g" package.json + sed -i "s|{{PROJECT_DESCRIPTION}}|$PROJECT_DESC|g" package.json +fi + +echo "✅ Configuration customized" +echo "" + +# Create GitHub repo if requested +if [ "$CREATE_REMOTE" = "yes" ]; then + echo "🌐 Creating GitHub repository..." + + REPO_NAME="$PROJECT_NAME" + VISIBILITY="public" + + if [ -z "$ORG" ]; then + ORG=$(gh api user --jq '.login') + fi + + REPO_URL="https://github.com/$ORG/$REPO_NAME" + + # Create repo + gh repo create "$ORG/$REPO_NAME" --public --description "$PROJECT_DESC" --source=. --remote=origin --push 2>&1 | grep -E "created|error|fatal|https" || true + + echo "✅ Repository created: $REPO_URL" + echo "" +else + echo "📝 Local git repository initialized" + echo " To push later: git remote add origin " + echo "" +fi + +# Add files and create initial commit +git add . +git commit -m "chore: initialize project from torq template" + +# Install dependencies +echo "📥 Installing dependencies..." +if command -v bun &> /dev/null; then + bun install +else + npm install +fi +echo "✅ Dependencies installed" +echo "" + +# Install git hooks +echo "🔐 Installing git hooks..." +npm run prepare 2>/dev/null || true +echo "✅ Git hooks installed" +echo "" + +# Validate setup +echo "✓ Setup complete!" +echo "" +echo "📋 Project structure:" +echo " $PROJECT_DIR/" +echo " ├── .github/workflows/ # CI/CD workflows" +echo " ├── .husky/ # Git hooks" +echo " ├── src/ # Source code" +echo " ├── package.json # Dependencies" +echo " ├── tsconfig.json # TypeScript config" +echo " ├── eslint.config.mjs # Linting rules" +echo " ├── .releaserc.json # Publishing config" +echo " └── README.md # Documentation" +echo "" +echo "🚀 Next steps:" +echo " 1. cd $PROJECT_DIR" +echo " 2. git checkout -b feat/1-your-feature" +echo " 3. Start coding!" +echo " 4. git commit with conventional format" +echo " 5. git push and create PR" +echo " 6. Merge to main for automatic publishing" diff --git a/.claude/skills/js-project-structure/scripts/validate-setup.sh b/.claude/skills/js-project-structure/scripts/validate-setup.sh new file mode 100755 index 0000000..b2af693 --- /dev/null +++ b/.claude/skills/js-project-structure/scripts/validate-setup.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash +set -euo pipefail + +# js-project-structure: validate-setup.sh +# Validates that a project is properly configured + +PROJECT_DIR="${1:-.}" + +if [ ! -d "$PROJECT_DIR" ]; then + echo "❌ Directory not found: $PROJECT_DIR" + exit 1 +fi + +cd "$PROJECT_DIR" + +echo "🔍 Validating project setup..." +echo "" + +ERRORS=0 + +# Check required files +echo "📋 Checking configuration files..." +for file in package.json tsconfig.json eslint.config.mjs .prettierrc commitlint.config.js .releaserc.json .env.example .gitignore .mcp.json; do + if [ -f "$file" ]; then + echo " ✅ $file" + else + echo " ❌ Missing: $file" + ((ERRORS++)) + fi +done +echo "" + +# Check directories +echo "📁 Checking directories..." +for dir in .github .husky; do + if [ -d "$dir" ]; then + echo " ✅ $dir/" + else + echo " ❌ Missing: $dir/" + ((ERRORS++)) + fi +done +echo "" + +# Check git setup +echo "🔐 Checking git configuration..." +if [ -d ".git" ]; then + echo " ✅ Git repository initialized" + BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown") + echo " Current branch: $branch" +else + echo " ⚠️ Git repository not initialized" +fi +echo "" + +# Check husky hooks +echo "🪝 Checking git hooks..." +if [ -f ".husky/commit-msg" ]; then + echo " ✅ commit-msg hook" +else + echo " ❌ Missing: .husky/commit-msg" + ((ERRORS++)) +fi + +if [ -f ".husky/pre-push" ]; then + echo " ✅ pre-push hook" +else + echo " ❌ Missing: .husky/pre-push" + ((ERRORS++)) +fi +echo "" + +# Check node_modules +echo "📦 Checking dependencies..." +if [ -d "node_modules" ]; then + echo " ✅ Dependencies installed" +else + echo " ⚠️ Dependencies not installed (run: bun install)" +fi +echo "" + +# Check TypeScript +echo "🔷 Checking TypeScript..." +if command -v tsc &> /dev/null; then + echo " ✅ TypeScript installed" +else + echo " ⚠️ TypeScript not in PATH (run: bun install)" +fi +echo "" + +# Check ESLint +echo "🔍 Checking ESLint..." +if command -v eslint &> /dev/null || [ -f "node_modules/.bin/eslint" ]; then + echo " ✅ ESLint installed" +else + echo " ⚠️ ESLint not installed (run: bun install)" +fi +echo "" + +# Check Prettier +echo "✨ Checking Prettier..." +if command -v prettier &> /dev/null || [ -f "node_modules/.bin/prettier" ]; then + echo " ✅ Prettier installed" +else + echo " ⚠️ Prettier not installed (run: bun install)" +fi +echo "" + +if [ $ERRORS -eq 0 ]; then + echo "✅ All checks passed! Project is ready to use." + echo "" + echo "Next steps:" + echo " 1. bun install # Install dependencies" + echo " 2. npm run prepare # Install git hooks" + echo " 3. git checkout -b feat/1-your-feature" + echo " 4. Start coding!" + exit 0 +else + echo "❌ Found $ERRORS issue(s). Run setup again or check SKILL.md for troubleshooting." + exit 1 +fi diff --git a/AGENTS.md b/AGENTS.md index a53051a..4225c0b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,15 +13,12 @@ This is a **project-level Claude collection** that serves as a centralized sourc - **Skills**: Comprehensive skill inventory organized by type (custom, open-source, agent skills) - **Workflows**: Structured development patterns for requirements, implementation, testing, and deployment - **Configurations**: Claude Code settings, hooks, and project conventions -- **Documentation**: SKILLS.md for complete skills reference, README.md for setup and usage +- **Documentation**: [SKILLS.md](./SKILLS.md) for complete skills reference, README.md for setup and usage ## Quick Links - **[README.md](./README.md)** — Complete setup guide, workflow patterns, and skill integration - **[SKILLS.md](./SKILLS.md)** — All available skills organized by type with decision trees -- **[SKILL.md files](./skills/)** — Detailed documentation for each custom skill -- **[.claude/settings.json](./.claude/settings.json)** — Plugin configuration -- **[.claude/rules/](./.claude/rules/)** — Project conventions and coding standards ## Repository Structure @@ -29,8 +26,8 @@ This is a **project-level Claude collection** that serves as a centralized sourc torq/claude/ ├── .claude/ │ ├── skills/ # Custom project-specific skills -│ ├── settings.json # Plugin configuration -│ └── settings.local.json # Local overrides +│ ├── settings.json # Claude configuration +│ └── settings.local.json # Local Claude overrides ├── README.md # Setup, workflows, and skill integration ├── SKILLS.md # Complete skills reference with decision trees ├── package.json # Project metadata