diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b13c61f..e54dd5e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -58,13 +58,13 @@ { "label": "docker:mongo:start", "type": "shell", - "command": "docker compose -f ${workspaceFolder}/docker-compose.yml up -d mongo", + "command": "/usr/local/bin/docker compose -f ${workspaceFolder}/docker-compose.yml up -d mongo --build", "problemMatcher": [] }, { "label": "docker:mongo:stop", "type": "shell", - "command": "docker compose -f ${workspaceFolder}/docker-compose.yml stop mongo", + "command": "/usr/local/bin/docker compose -f ${workspaceFolder}/docker-compose.yml stop mongo", "problemMatcher": [] }, { diff --git a/apps/web/.editorconfig b/apps/web/.editorconfig new file mode 100644 index 0000000..9580b34 --- /dev/null +++ b/apps/web/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[*.py] +indent_size = 4 + +[*.go] +indent_style = tab + +[*.cs] +indent_size = 4 + +[*.swift] +indent_size = 2 diff --git a/apps/web/.github/copilot-instructions.md b/apps/web/.github/copilot-instructions.md new file mode 100644 index 0000000..9ee97c1 --- /dev/null +++ b/apps/web/.github/copilot-instructions.md @@ -0,0 +1,11 @@ +# Copilot Instructions — Node/JS + +- Follow PROJECT_RULES.md. +- Use JSDoc for all exported/public APIs. +- Validate request payloads and environment variables. +- Use async/await. +- Add/update tests for new logic. +- Do not introduce secrets; use env vars and config schema. + +- For database writes, enforce ACID-compliant transactions and avoid partial writes. +- Prefer idempotent write operations when retries are possible. diff --git a/apps/web/.vscode/settings.json b/apps/web/.vscode/settings.json new file mode 100644 index 0000000..722d897 --- /dev/null +++ b/apps/web/.vscode/settings.json @@ -0,0 +1,45 @@ +{ + "editor.formatOnSave": true, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit", + "source.fixAll.eslint": "explicit" + }, + "[swift]": { + "editor.defaultFormatter": "sswg.swift-lang", + "editor.formatOnSave": true + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true + }, + "python.analysis.typeCheckingMode": "basic", + "python.analysis.autoImportCompletions": true, + "[go]": { + "editor.defaultFormatter": "golang.go", + "editor.formatOnSave": true + }, + "go.formatTool": "gofmt", + "go.useLanguageServer": true, + "[csharp]": { + "editor.formatOnSave": true + }, + "omnisharp.enableEditorConfigSupport": true, + "eslint.validate": [ + "javascript", + "javascriptreact" + ] +} diff --git a/apps/web/Makefile b/apps/web/Makefile new file mode 100644 index 0000000..302e2c0 --- /dev/null +++ b/apps/web/Makefile @@ -0,0 +1,18 @@ +# DevRules helper Makefile +# Usage in a repo: +# make devrules +# make devrules-force +# +# If DevRules is located elsewhere, override DEVRULES_DIR: +# make devrules DEVRULES_DIR=~/DevRules + +DEVRULES_DIR ?= ~/DevRules + +devrules: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . + +devrules-force: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . --force + +devrules-dry: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . --dry-run diff --git a/apps/web/PROJECT_RULES.md b/apps/web/PROJECT_RULES.md new file mode 100644 index 0000000..f8acc5a --- /dev/null +++ b/apps/web/PROJECT_RULES.md @@ -0,0 +1,44 @@ +# Project Rules — Node.js / JavaScript + +## Goals +- Production-grade JavaScript, predictable runtime behavior. + +## Engineering Best Practices +- **Design:** Apply SOLID where applicable; prefer composition over inheritance; keep responsibilities small. +- **Public API documentation (Tooltip-friendly):** All exported/public APIs MUST include JSDoc (`/** ... */`) + so code completion tooltips clearly explain intent. + - Include: 1-line summary, `@param` descriptions, `@returns` / `@throws`, and important edge cases. +- **Data integrity (ACID / DB writes):** If the project performs database writes, + multi-step writes MUST run inside explicit transactions with commit/rollback semantics. + +## See also +- JSDoc templates (TS/JS): ../../shared/doc-templates/jsdoc.md +- ACID violation checklist (DB writes): ../../shared/acid-violation-checklist.md +- Copilot self-correction prompt: ../../shared/copilot-self-correction-prompt.md + +## Language & Runtime +- Use JavaScript. +- Prefer a single module system consistently (ESM or CJS; match repo). +- Use Node LTS per repo configuration. + +## Style +- Prefer `async/await`. +- Use JSDoc for types and complex shapes when helpful. +- No `console.log` in production paths; use a logger abstraction. + +## Structure +- Keep layers separated: routes/controllers, services, repositories, domain, utils. +- Controllers must not contain DB logic; call services. + +## Validation & Errors +- Validate external inputs (HTTP, queue, env) with a schema library (zod/yup/etc). +- Centralized error handling; consistent error response shape. +- Do not leak internal stack traces. + +## Security +- Never commit secrets. +- Avoid `eval` and shell injection risks; sanitize paths and commands. + +## Testing +- Add tests (vitest/jest) for non-trivial logic. +- Mock external integrations (DB/HTTP). diff --git a/apps/web/justfile b/apps/web/justfile new file mode 100644 index 0000000..89c76fe --- /dev/null +++ b/apps/web/justfile @@ -0,0 +1,18 @@ +# DevRules helper justfile +# Usage in a repo: +# just devrules +# just devrules-force +# +# If DevRules is located elsewhere: +# just devrules DEVRULES_DIR=~/DevRules + +DEVRULES_DIR := env_var_or_default("DEVRULES_DIR", "~/DevRules") + +devrules: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . + +devrules-force: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . --force + +devrules-dry: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . --dry-run diff --git a/apps/web/package.json b/apps/web/package.json index 1baf3f7..92917a1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -6,7 +6,10 @@ "scripts": { "dev": "webpack serve --env development", "build": "webpack --env production", - "preview": "npx serve dist" + "preview": "npx serve dist", + "devrules": "node /private/var/folders/jb/5r_f1tv12yg07gd51_7fw53w0000gn/T/devrules-9Kyxxq/DevRules-main/tools/apply-rules.mjs --repo .", + "devrules:force": "node /private/var/folders/jb/5r_f1tv12yg07gd51_7fw53w0000gn/T/devrules-9Kyxxq/DevRules-main/tools/apply-rules.mjs --repo . --force", + "devrules:dry": "node /private/var/folders/jb/5r_f1tv12yg07gd51_7fw53w0000gn/T/devrules-9Kyxxq/DevRules-main/tools/apply-rules.mjs --repo . --dry-run" }, "dependencies": { "dotenv": "^17.2.3", @@ -24,6 +27,6 @@ "style-loader": "^4.0.0", "webpack": "^5.96.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4" + "webpack-dev-server": "^5.2.2" } } diff --git a/backend/.editorconfig b/backend/.editorconfig new file mode 100644 index 0000000..9580b34 --- /dev/null +++ b/backend/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[*.py] +indent_size = 4 + +[*.go] +indent_style = tab + +[*.cs] +indent_size = 4 + +[*.swift] +indent_size = 2 diff --git a/backend/.github/copilot-instructions.md b/backend/.github/copilot-instructions.md new file mode 100644 index 0000000..162bd0a --- /dev/null +++ b/backend/.github/copilot-instructions.md @@ -0,0 +1,11 @@ +# Copilot Instructions — Python/FastAPI + +- Follow PROJECT_RULES.md. +- Use Pydantic models for all request/response bodies. +- Keep routers thin; put logic into services. +- Use Depends() for db/auth/config. +- Add type hints. +- Add pytest tests for new endpoints and service logic. + +- Ensure public functions/classes/modules include clear docstrings visible in code completion tooltips. +- For database writes, enforce ACID-friendly transaction boundaries and avoid partial writes. diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json new file mode 100644 index 0000000..14c9782 --- /dev/null +++ b/backend/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "editor.formatOnSave": true, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "[swift]": { + "editor.defaultFormatter": "sswg.swift-lang", + "editor.formatOnSave": true + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true + }, + "python.analysis.typeCheckingMode": "basic", + "python.analysis.autoImportCompletions": true, + "[go]": { + "editor.defaultFormatter": "golang.go", + "editor.formatOnSave": true + }, + "go.formatTool": "gofmt", + "go.useLanguageServer": true, + "[csharp]": { + "editor.formatOnSave": true + }, + "omnisharp.enableEditorConfigSupport": true +} diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000..302e2c0 --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,18 @@ +# DevRules helper Makefile +# Usage in a repo: +# make devrules +# make devrules-force +# +# If DevRules is located elsewhere, override DEVRULES_DIR: +# make devrules DEVRULES_DIR=~/DevRules + +DEVRULES_DIR ?= ~/DevRules + +devrules: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . + +devrules-force: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . --force + +devrules-dry: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . --dry-run diff --git a/backend/PROJECT_RULES.md b/backend/PROJECT_RULES.md new file mode 100644 index 0000000..33d893e --- /dev/null +++ b/backend/PROJECT_RULES.md @@ -0,0 +1,40 @@ +# Project Rules — Python / FastAPI + +## Goals +- Clean, typed Python; predictable APIs; safe dependency management. + +## Engineering Best Practices +- **Design:** Apply SOLID where applicable; prefer composition over inheritance; keep responsibilities small. +- **Public API documentation (Tooltip-friendly):** Public modules, classes, and functions MUST include + docstrings that work well in IDE tooltips. + - Include: 1-line summary, Args/Returns/Raises (as applicable), and important edge cases. +- **Data integrity (ACID / DB writes):** If the project performs database writes, + multi-step writes MUST use explicit transactions with clear commit/rollback boundaries. + +## See also +- Python docstring templates: ../../shared/doc-templates/python-docstrings.md +- ACID violation checklist (DB writes): ../../shared/acid-violation-checklist.md +- Copilot self-correction prompt: ../../shared/copilot-self-correction-prompt.md + +## Style & Tooling +- Use type hints broadly; keep code mypy/pyright-friendly. +- Lint with ruff; format with black (or ruff-format if the repo uses it). +- Avoid mutable default args. + +## FastAPI Practices +- Use Pydantic models for request/response. +- Keep routers thin; business logic in services. +- Use `Depends()` for auth/db/config injection. +- Consistent error schema; no leaking internal exceptions. + +## Structure +- routers/, schemas/, services/, repositories/, core/ + +## Security +- Secrets via env/secret manager only. +- Strict CORS. +- Enforce authz per route. + +## Testing +- pytest. +- Test routers with TestClient; mock external deps. diff --git a/backend/app/controllers/repository_scan_controller.py b/backend/app/controllers/repository_scan_controller.py index 99ea7a0..cf95430 100644 --- a/backend/app/controllers/repository_scan_controller.py +++ b/backend/app/controllers/repository_scan_controller.py @@ -93,34 +93,65 @@ async def update_repository_scan(scan_id: str, payload: RepositoryScanUpdate) -> async def search_repository_scans(query: str, limit: int | None = None) -> List[RepositoryScanDocument]: - regex = {'$regex': query, '$options': 'i'} - cursor = collection.find({ - '$or': [ - {'repository_url': regex}, - {'repository_name': regex}, - {'repository_platform': regex}, - {'dependencies.library_path': regex}, - {'dependencies.libraries.library_name': regex}, - {'dependencies.libraries.library_version': regex}, - ] - }).sort('updatedAt', -1) + # Treat user input as a literal substring (not a regex) to avoid surprises + # with characters like '.', '*', '[', etc. + # + # Support multi-term search like "Newtonsoft.Json 11.0.2" by requiring each + # term to match at least one searchable field (AND across terms). + terms = [t for t in re.split(r"\s+", (query or "").strip()) if t] + if not terms: + return [] + + def _term_or(term: str) -> dict: + escaped = re.escape(term) + regex = {'$regex': escaped, '$options': 'i'} + return { + '$or': [ + {'repository_url': regex}, + {'repository_name': regex}, + {'repository_platform': regex}, + {'dependencies.library_path': regex}, + {'dependencies.libraries.library_name': regex}, + {'dependencies.libraries.library_version': regex}, + ] + } + + mongo_query = _term_or(terms[0]) if len(terms) == 1 else {'$and': [_term_or(t) for t in terms]} + cursor = collection.find(mongo_query).sort('updatedAt', -1) if limit and limit > 0: cursor = cursor.limit(limit) docs = [RepositoryScanDocument(**doc) async for doc in cursor] - # Filter dependencies/libraries to only the matching rows so search results are concise - pattern = re.compile(query, re.IGNORECASE) + # If the query matches repo-level metadata, return the full scan (including all dependencies). + # Otherwise, return a concise payload by filtering to matching dependency files / libraries. + patterns = [re.compile(re.escape(t), re.IGNORECASE) for t in terms] filtered_docs: List[RepositoryScanDocument] = [] for doc in docs: + repo_blob = " ".join([(doc.repository_url or ""), (doc.repository_name or ""), (doc.repository_platform or "")]) + repo_level_hit = all(p.search(repo_blob) for p in patterns) + if repo_level_hit: + filtered_docs.append(doc) + continue + filtered_deps = [] for dep in doc.dependencies or []: - matched_libs = [ - lib for lib in dep.libraries or [] - if pattern.search(lib.library_name or '') or pattern.search(lib.library_version or '') - ] - if matched_libs: + path_hit = any(p.search(dep.library_path or '') for p in patterns) + + matched_libs = [] + for lib in dep.libraries or []: + hay = f"{lib.library_name or ''} {lib.library_version or ''}" + if all(p.search(hay) for p in patterns): + matched_libs.append(lib) + + if path_hit: + # If the dependency file path matched, keep the whole file block (libraries included) + filtered_deps.append(dep) + elif matched_libs: + # Otherwise keep only the matching libraries filtered_deps.append(type(dep)(library_path=dep.library_path, libraries=matched_libs)) + if filtered_deps: doc.dependencies = filtered_deps filtered_docs.append(doc) + return filtered_docs diff --git a/backend/app/services/repo_scanner.py b/backend/app/services/repo_scanner.py index 8aebb99..e5a6b89 100644 --- a/backend/app/services/repo_scanner.py +++ b/backend/app/services/repo_scanner.py @@ -111,7 +111,7 @@ def clone_repository(repo_url: str, target_dir: str | None = None) -> str: clone_url, secret_used = _with_host_auth(repo_url) result = subprocess.run( - ["git", "clone", "--depth", "1", clone_url, tmpdir], + ["git", "clone", "--depth", "1", "--single-branch", "--filter=blob:none", clone_url, tmpdir], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, env=env, diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 079b862..3f2874f 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.9' services: api: build: . diff --git a/backend/justfile b/backend/justfile new file mode 100644 index 0000000..89c76fe --- /dev/null +++ b/backend/justfile @@ -0,0 +1,18 @@ +# DevRules helper justfile +# Usage in a repo: +# just devrules +# just devrules-force +# +# If DevRules is located elsewhere: +# just devrules DEVRULES_DIR=~/DevRules + +DEVRULES_DIR := env_var_or_default("DEVRULES_DIR", "~/DevRules") + +devrules: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . + +devrules-force: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . --force + +devrules-dry: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . --dry-run diff --git a/servers/mcp-licenguard/.editorconfig b/servers/mcp-licenguard/.editorconfig new file mode 100644 index 0000000..9580b34 --- /dev/null +++ b/servers/mcp-licenguard/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[*.py] +indent_size = 4 + +[*.go] +indent_style = tab + +[*.cs] +indent_size = 4 + +[*.swift] +indent_size = 2 diff --git a/servers/mcp-licenguard/.github/copilot-instructions.md b/servers/mcp-licenguard/.github/copilot-instructions.md new file mode 100644 index 0000000..9ee97c1 --- /dev/null +++ b/servers/mcp-licenguard/.github/copilot-instructions.md @@ -0,0 +1,11 @@ +# Copilot Instructions — Node/JS + +- Follow PROJECT_RULES.md. +- Use JSDoc for all exported/public APIs. +- Validate request payloads and environment variables. +- Use async/await. +- Add/update tests for new logic. +- Do not introduce secrets; use env vars and config schema. + +- For database writes, enforce ACID-compliant transactions and avoid partial writes. +- Prefer idempotent write operations when retries are possible. diff --git a/servers/mcp-licenguard/.vscode/settings.json b/servers/mcp-licenguard/.vscode/settings.json new file mode 100644 index 0000000..722d897 --- /dev/null +++ b/servers/mcp-licenguard/.vscode/settings.json @@ -0,0 +1,45 @@ +{ + "editor.formatOnSave": true, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit", + "source.fixAll.eslint": "explicit" + }, + "[swift]": { + "editor.defaultFormatter": "sswg.swift-lang", + "editor.formatOnSave": true + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true + }, + "python.analysis.typeCheckingMode": "basic", + "python.analysis.autoImportCompletions": true, + "[go]": { + "editor.defaultFormatter": "golang.go", + "editor.formatOnSave": true + }, + "go.formatTool": "gofmt", + "go.useLanguageServer": true, + "[csharp]": { + "editor.formatOnSave": true + }, + "omnisharp.enableEditorConfigSupport": true, + "eslint.validate": [ + "javascript", + "javascriptreact" + ] +} diff --git a/servers/mcp-licenguard/Makefile b/servers/mcp-licenguard/Makefile new file mode 100644 index 0000000..302e2c0 --- /dev/null +++ b/servers/mcp-licenguard/Makefile @@ -0,0 +1,18 @@ +# DevRules helper Makefile +# Usage in a repo: +# make devrules +# make devrules-force +# +# If DevRules is located elsewhere, override DEVRULES_DIR: +# make devrules DEVRULES_DIR=~/DevRules + +DEVRULES_DIR ?= ~/DevRules + +devrules: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . + +devrules-force: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . --force + +devrules-dry: + node $(DEVRULES_DIR)/tools/apply-rules.mjs --repo . --dry-run diff --git a/servers/mcp-licenguard/PROJECT_RULES.md b/servers/mcp-licenguard/PROJECT_RULES.md new file mode 100644 index 0000000..f8acc5a --- /dev/null +++ b/servers/mcp-licenguard/PROJECT_RULES.md @@ -0,0 +1,44 @@ +# Project Rules — Node.js / JavaScript + +## Goals +- Production-grade JavaScript, predictable runtime behavior. + +## Engineering Best Practices +- **Design:** Apply SOLID where applicable; prefer composition over inheritance; keep responsibilities small. +- **Public API documentation (Tooltip-friendly):** All exported/public APIs MUST include JSDoc (`/** ... */`) + so code completion tooltips clearly explain intent. + - Include: 1-line summary, `@param` descriptions, `@returns` / `@throws`, and important edge cases. +- **Data integrity (ACID / DB writes):** If the project performs database writes, + multi-step writes MUST run inside explicit transactions with commit/rollback semantics. + +## See also +- JSDoc templates (TS/JS): ../../shared/doc-templates/jsdoc.md +- ACID violation checklist (DB writes): ../../shared/acid-violation-checklist.md +- Copilot self-correction prompt: ../../shared/copilot-self-correction-prompt.md + +## Language & Runtime +- Use JavaScript. +- Prefer a single module system consistently (ESM or CJS; match repo). +- Use Node LTS per repo configuration. + +## Style +- Prefer `async/await`. +- Use JSDoc for types and complex shapes when helpful. +- No `console.log` in production paths; use a logger abstraction. + +## Structure +- Keep layers separated: routes/controllers, services, repositories, domain, utils. +- Controllers must not contain DB logic; call services. + +## Validation & Errors +- Validate external inputs (HTTP, queue, env) with a schema library (zod/yup/etc). +- Centralized error handling; consistent error response shape. +- Do not leak internal stack traces. + +## Security +- Never commit secrets. +- Avoid `eval` and shell injection risks; sanitize paths and commands. + +## Testing +- Add tests (vitest/jest) for non-trivial logic. +- Mock external integrations (DB/HTTP). diff --git a/servers/mcp-licenguard/justfile b/servers/mcp-licenguard/justfile new file mode 100644 index 0000000..89c76fe --- /dev/null +++ b/servers/mcp-licenguard/justfile @@ -0,0 +1,18 @@ +# DevRules helper justfile +# Usage in a repo: +# just devrules +# just devrules-force +# +# If DevRules is located elsewhere: +# just devrules DEVRULES_DIR=~/DevRules + +DEVRULES_DIR := env_var_or_default("DEVRULES_DIR", "~/DevRules") + +devrules: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . + +devrules-force: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . --force + +devrules-dry: + node {{DEVRULES_DIR}}/tools/apply-rules.mjs --repo . --dry-run diff --git a/servers/mcp-licenguard/package.json b/servers/mcp-licenguard/package.json index 6829561..e632f16 100644 --- a/servers/mcp-licenguard/package.json +++ b/servers/mcp-licenguard/package.json @@ -4,7 +4,10 @@ "private": true, "type": "module", "scripts": { - "dev": "node --watch src/index.js" + "dev": "node --watch src/index.js", + "devrules": "node /private/var/folders/jb/5r_f1tv12yg07gd51_7fw53w0000gn/T/devrules-1xuQ8M/DevRules-main/tools/apply-rules.mjs --repo .", + "devrules:force": "node /private/var/folders/jb/5r_f1tv12yg07gd51_7fw53w0000gn/T/devrules-1xuQ8M/DevRules-main/tools/apply-rules.mjs --repo . --force", + "devrules:dry": "node /private/var/folders/jb/5r_f1tv12yg07gd51_7fw53w0000gn/T/devrules-1xuQ8M/DevRules-main/tools/apply-rules.mjs --repo . --dry-run" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.22.0",