Skip to content

feat(telemetry): track project languages, runtimes, and frameworks on check#458

Merged
rhuanbarreto merged 8 commits into
mainfrom
rhuan/posthog-stack-tracking
Jul 7, 2026
Merged

feat(telemetry): track project languages, runtimes, and frameworks on check#458
rhuanbarreto merged 8 commits into
mainfrom
rhuan/posthog-stack-tracking

Conversation

@rhuanbarreto

Copy link
Copy Markdown
Contributor

Summary

  • Enriches the check_completed PostHog event with detected project stack (languages, runtimes, frameworks) from the existing detectStack() helper
  • Runs stack detection in parallel with rule loading — zero added latency
  • Gracefully degrades: if detection fails, the event fires without stack properties

Changed files

File Change
src/helpers/telemetry.ts Add optional languages, runtimes, frameworks to trackCheckResult() type
src/commands/check.ts Import detectStack, run in parallel with rule loading, pass to telemetry
tests/commands/check-action.test.ts Mock detectStack, verify stack data flows to telemetry + graceful failure
tests/helpers/telemetry.test.ts Exercise new optional stack fields

Test plan

  • bun run validate passes (1392 tests, 43 ADR rules, 0 violations)
  • New test: stack data (languages/runtimes/frameworks) is included in trackCheckResult call
  • New test: telemetry still fires when detectStack() throws (graceful degradation)
  • Existing telemetry tests updated to exercise new optional fields

https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP

… check

Enrich the `check_completed` PostHog event with the project's detected
stack (languages, runtimes, frameworks) by wiring the existing
`detectStack()` helper into `trackCheckResult()`.

Stack detection runs in parallel with rule loading so it adds no
latency. Failures are silently caught — telemetry still fires without
stack data.

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_688f98ef-3ed9-4c41-9d8d-5fd35ee1ffa8)

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@rhuanbarreto, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 35 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c842f398-cdfc-4586-9478-437d4fbffed8

📥 Commits

Reviewing files that changed from the base of the PR and between e184439 and 43ccdc5.

📒 Files selected for processing (1)
  • src/helpers/stack-detect.ts
📝 Walkthrough

Walkthrough

This change adds stack detection to the check command and includes detected languages, runtimes, and frameworks in check_completed telemetry. detectStack now uses sentinel-based caching, expanded language classification, and broader framework detection logic. New and updated tests cover the command flow, telemetry payloads, detection cases, and cache behavior. A memory note was added about attaching .catch() at promise creation time to avoid unhandled rejection windows.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding stack metadata to check telemetry.
Description check ✅ Passed The description matches the changeset and clearly describes the telemetry and stack-detection updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 6, 2026

Copy link
Copy Markdown

Deploying archgate-cli with  Cloudflare Pages  Cloudflare Pages

Latest commit: 43ccdc5
Status: ✅  Deploy successful!
Preview URL: https://8ed81ebe.archgate-cli.pages.dev
Branch Preview URL: https://rhuan-posthog-stack-tracking.archgate-cli.pages.dev

View logs

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Code Coverage

Metric Value
Lines 90.4% (7610 / 8421)
Threshold 90% minimum — met
Platforms Linux + Windows

Full HTML report available in workflow artifacts.

Per-directory breakdown
Directory Coverage Lines
src/commands/ 88.7% 2003 / 2258
src/engine/ 91.2% 1632 / 1789
src/formats/ 100.0% 142 / 142
src/helpers/ 90.6% 3833 / 4232

Languages added: Ruby (Gemfile, .ruby-version), Java (pom.xml,
build.gradle, build.gradle.kts), PHP (composer.json), Swift
(Package.swift), Elixir (mix.exs), Dart (pubspec.yaml), C#
(global.json, Directory.Build.props), Scala (build.sbt), Zig
(build.zig).

Frameworks added:
- Config-file: Nuxt, Astro, Svelte (nuxt/astro/svelte.config.*)
- JS/TS deps: Vue, Angular, Solid, Ember, Koa, Elysia, NestJS, Gatsby
- Non-JS: Rails (bin/rails, config/routes.rb), Django (manage.py),
  Laravel (artisan), Flutter (pubspec.yaml flutter: key), Phoenix
  (mix.exs :phoenix dep)

Also extracts hasConfig() helper to reduce config-extension boilerplate.

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_d8b8f160-4a49-4fa3-acc5-e268455b414a)

Caching: sentinel-based disk cache at ~/.archgate/cache/ — stats ~20
marker files (~1ms) to fingerprint the project; on cache hit, skips the
full detection scan entirely. Cache invalidates when any sentinel file
(package.json, Gemfile, go.mod, etc.) is added, removed, or modified.

New framework detections:
- Python: FastAPI, Streamlit, Flask (from requirements.txt / pyproject.toml)
- UI: MUI, Chakra UI, Headless UI, Radix, shadcn
- TanStack: Query, Router, Start, Form, Table
- CSS: Tailwind CSS (config file + dep)
- Server: tRPC
- ORM: Prisma, Drizzle
- Testing: Jest, Vitest, Playwright, Cypress, Storybook

Split tests into stack-detect.test.ts (languages/runtimes/config) and
stack-detect-frameworks.test.ts (dep-based/non-JS/caching) to stay
under the 500-line lint limit.

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_18b65e62-7c8c-43cb-b260-95a73b349e3d)

Replace the regex-based pyproject.toml dependency extraction with
Bun's built-in TOML parser (Bun.TOML.parse). Properly reads
[project].dependencies per PEP 621 instead of pattern-matching
against raw text.

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_ffb958b7-3867-40fc-88cc-f7b96e8755c3)

…dation

- Cache reads use Bun.file().json() instead of readFileSync + JSON.parse
  (ARCH-010 compliance, removes the last two warnings)
- Cache payload validated with Zod safeParse instead of unsafe `as` cast
- pyproject.toml parsed with Bun.TOML.parse instead of regex

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_a06dc6a3-3856-4022-a4bd-da65131accf7)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/commands/check.ts`:
- Around line 64-68: The stack detection promise in check.ts should be bounded
so a slow detectStack() call cannot delay command completion. Update the
stackPromise setup in the main flow to use a timeout/race pattern similar to the
existing stdin-read guard, while preserving the current .catch(() => null)
fallback. Keep the change localized around detectStack and the later await
stackPromise usage so it still returns null on timeout or failure.

In `@src/helpers/stack-detect.ts`:
- Around line 93-102: `readCache` is still reading JSON with
`JSON.parse(readFileSync(...))`, which violates the Bun JSON-file guideline.
Update `readCache` to be async and load the cache via `await
Bun.file(cachePath).json()` while keeping the same null-on-missing/error
behavior, then update its caller in the stack detection flow to await it. Remove
the now-unused `readFileSync` import, and drop `existsSync` too if nothing else
in `stack-detect.ts` uses it.
- Around line 104-119: The writeCache helper still creates the cache directory
manually before writing, but Bun.write in writeCache already creates parent
directories automatically. Remove the redundant mkdirSync/join(cachePath, "..")
setup from writeCache, and drop the mkdirSync import if it is no longer used
elsewhere in src/helpers/stack-detect.ts.
- Around line 28-55: The sentinel list in stack-detect.ts is incomplete, so
cached stack results can miss changes in files that detectStackUncached()
already uses. Update SENTINEL_FILES to include the additional runtime/framework
markers it scans for, such as bunfig.toml, deno.jsonc, setup.py, manage.py,
artisan, bin/rails, config/routes.rb, and the various JS/TS framework config
patterns like next.config.*, remix.config.*, vite.config.*, nuxt.config.*,
astro.config.*, svelte.config.*, and tailwind.config.*. Keep the list aligned
with detectStackUncached() so Stack detection stays invalidated whenever any of
those markers change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 29feac15-a67d-455f-93f2-8b50edf9de83

📥 Commits

Reviewing files that changed from the base of the PR and between 67d0e2a and 5b45829.

📒 Files selected for processing (8)
  • .claude/agent-memory/archgate-developer/project_test_isolation_gotchas.md
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
  • src/helpers/telemetry.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • tests/helpers/stack-detect.test.ts
  • tests/helpers/telemetry.test.ts
📜 Review details
⏰ Context from checks skipped due to timeout. (3)
  • GitHub Check: Smoke Test (Windows) / Windows
  • GitHub Check: Analyze (csharp)
  • GitHub Check: Cloudflare Pages
⚠️ CI failures not shown inline (2)

GitHub Actions: DCO / DCO Sign-off Check: feat(telemetry): track project languages, runtimes, and frameworks on check

Conclusion: failure

View job details

##[group]Run base="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"
 �[36;1mbase="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"�[0m
 �[36;1mhead="5b45829692a2fea22407bcc1baa7c810088c7f1c"�[0m
 �[36;1mfailed=0�[0m
 �[36;1m�[0m
 �[36;1mfor sha in $(git rev-list --no-merges "$base".."$head"); do�[0m
 �[36;1m  if ! git log -1 --format='%B' "$sha" | grep -qiE '^Signed-off-by: .+ <.+>'; then�[0m
 �[36;1m    echo "::error::Commit $sha is missing a DCO Signed-off-by line."�[0m

GitHub Actions: DCO / 0_DCO Sign-off Check.txt: feat(telemetry): track project languages, runtimes, and frameworks on check

Conclusion: failure

View job details

##[group]Run base="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"
 �[36;1mbase="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"�[0m
 �[36;1mhead="5b45829692a2fea22407bcc1baa7c810088c7f1c"�[0m
 �[36;1mfailed=0�[0m
 �[36;1m�[0m
 �[36;1mfor sha in $(git rev-list --no-merges "$base".."$head"); do�[0m
 �[36;1m  if ! git log -1 --format='%B' "$sha" | grep -qiE '^Signed-off-by: .+ <.+>'; then�[0m
 �[36;1m    echo "::error::Commit $sha is missing a DCO Signed-off-by line."�[0m
🧰 Additional context used
📓 Path-based instructions (11)
tests/**/*.test.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-005-testing-standards.md)

tests/**/*.test.ts: Use Bun's built-in test runner (bun:test) for all test files, and place tests under tests/ mirroring the src/ directory structure with <module-name>.test.ts naming.
Use temp directories (mkdtemp) for filesystem tests, and clean them up in afterEach or afterAll.
Close external SDK instances (servers, clients, transports, connections) in afterEach or afterAll, managing their lifecycle in hooks rather than inside individual test bodies.
When a test creates a temporary git repository and runs git commit, configure local user.email and user.name immediately after git init.
Test public module interfaces, not private implementation details.
Use descriptive test names that explain the expected behavior.
Every runnable test()/it() must contain at least one expect() assertion; smoke tests must make the contract explicit with expect(() => fn()).not.toThrow() or await expect(promise).resolves.toBeUndefined().
Use test.skip, test.skipIf, or test.todo for intentionally empty or disabled tests; do not use bare return or empty callbacks to skip work.
If the first expect() is being added to a previously assertion-less test file, add expect to the bun:test import.
When mocking fetch in tests, assign directly to globalThis.fetch and restore the original or use mock.restore() afterward.
Wrap spyOn() and inline mockImplementation() usage in try/finally, or create and restore spies in hooks, so mockRestore() always runs.
Only raise a per-test timeout above the global bun test --timeout 60000; never set a shorter per-test timeout.
Mock first-party modules with import * as mod plus spyOn(mod, "fn"), not mock.module().
When a test needs to redirect user-scope paths, mock os.homedir() instead of relying on HOME/Bun.env.HOME; restore the spy in test hooks.
Do not depend on network access in unit tests.
Do not leave temp files after test runs.
Do not leave external SDK instances open after tests...

Files:

  • tests/helpers/telemetry.test.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • tests/helpers/stack-detect.test.ts
**/*.{ts,tsx,js,jsx,mjs,cjs}

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-006-dependency-policy.md)

**/*.{ts,tsx,js,jsx,mjs,cjs}: Use Bun built-ins for file I/O (Bun.file, Bun.write), HTTP, subprocess execution (Bun.spawn), globbing (Bun.Glob), and testing (bun:test).
Do not use Node.js-specific APIs when Bun alternatives exist; for example, use Bun.file() instead of fs.readFile() for simple reads.
Prefer node: built-in modules such as node:util, node:path, and node:fs over npm alternatives.
Do not use utility libraries for single functions, such as importing lodash for one helper like pick.
Do not use path aliases (tsconfig paths); use relative imports with Bun's native module resolution.
Do not install packages globally during development; use bunx for one-off tools.

Files:

  • tests/helpers/telemetry.test.ts
  • src/helpers/telemetry.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
  • tests/helpers/stack-detect.test.ts
tests/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-009-platform-detection-helper.md)

In test files, use _resetPlatformCache() to simulate different platforms instead of mocking or mutating process.platform directly.

Files:

  • tests/helpers/telemetry.test.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • tests/helpers/stack-detect.test.ts
{src,tests}/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/LEGAL-001-spdx-license-headers.md)

{src,tests}/**/*.ts: Every TypeScript source file in src/ and tests/ must begin with // SPDX-License-Identifier: Apache-2.0 followed by // Copyright 2026 Archgate.
If a TypeScript file has a shebang line (for example #!/usr/bin/env bun in src/cli.ts), the SPDX license header must appear immediately after the shebang.
Use single-line // comments for the SPDX header; do not use block comments (/* */) or alternate license identifiers.

Files:

  • tests/helpers/telemetry.test.ts
  • src/helpers/telemetry.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
  • tests/helpers/stack-detect.test.ts
**

⚙️ CodeRabbit configuration file

**: # CLAUDE.md

Archgate is a CLI tool for AI governance via Architecture Decision Records (ADRs) — combining human-readable docs with machine-checkable rules. The CLI dogfoods itself via ADRs in .archgate/adrs/. AI features are delivered as a Claude Code plugin (../plugins/claude-code), not via direct API calls.

Technology Stack

  • Runtime: Bun (>=1.2.21) — not Node.js compatible
  • Language: TypeScript (strict mode, ESNext, ES modules)
  • CLI framework: Commander.js (@commander-js/extra-typings)
  • Linter: Oxlint | Formatter: Oxfmt | Dead exports: Knip | Commits: Conventional Commits

Commands

bun run src/cli.ts <command>  # run CLI locally
bun run lint                  # oxlint
bun run typecheck             # tsc --build
bun run format                # oxfmt --write
bun run format:check          # oxfmt --check
bun run test                  # all tests (not bare `bun test` — picks up --timeout; see GEN-003)
bun run knip                  # dead export detection
bun run validate              # MANDATORY: lint + typecheck + format:check + test + ADR check + knip + build check
bun run build:check            # verify build compiles (CI builds binaries via release workflow)
bun run commit                # conventional commit wizard

Validation Gate

bun run validate must pass before any task is considered complete. Fail-fast pipeline: lint → typecheck → format:check → test → ADR check → knip → build check. Mirrors CI in .github/workflows/code-pull-request.yml.

Git Hooks (Git 2.54+)

Config-based hooks in .githooks run validation locally before commits and pushes:

  • pre-commit: lint + typecheck + format:check (~15s)
  • pre-push: full bun run validate (~60s, mirrors CI)

Activate once per clone:

git config --local include.path ../.githooks

Opt out of a specific hook: git config --local hook.<name>.enabled false. Skip all hooks for a single commit: git commit --no-verify.

#...

Files:

  • tests/helpers/telemetry.test.ts
  • src/helpers/telemetry.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
  • tests/helpers/stack-detect.test.ts

⚙️ CodeRabbit configuration file

**: This project uses Archgate — an AI governance framework based on
Architecture Decision Records (ADRs). The ADRs in .archgate/adrs/
are the authoritative rules for this codebase. Each ADR has a companion
.rules.ts file with automated checks that run via archgate check.

When reviewing, you must:

  1. Treat ADR violations as blocking issues, not suggestions.
  2. Cite the specific ADR ID when flagging a violation (e.g., "Violates ARCH-006").
  3. Focus on semantic and contextual violations that automated rules cannot catch —
    the .rules.ts files already cover syntactic/structural patterns.
  4. If you are unsure whether something violates an ADR, flag it as a question
    rather than approving it.

Files:

  • tests/helpers/telemetry.test.ts
  • src/helpers/telemetry.ts
  • tests/commands/check-action.test.ts
  • tests/helpers/stack-detect-frameworks.test.ts
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
  • tests/helpers/stack-detect.test.ts
src/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-002-error-handling.md)

src/**/*.ts: Use logError() from src/helpers/log.ts for user-facing errors instead of printing errors directly.
Exit with code 1 for expected failures such as missing config, invalid input, or validation violations.
Let unexpected errors crash naturally so they are treated as internal errors with exit code 2.
Include actionable suggestions in user-facing error messages whenever possible.
Write user-facing errors to stderr via logError(); do not send them to stdout.
When findProjectRoot() returns null for commands that do not require .archgate/, fall back to process.cwd() as the path key or working directory.
Catch ExitPromptError from Inquirer in the top-level error boundary and treat it as user cancellation: exit with code 130 without logging an error or sending it to Sentry.
Do not use console.error() directly; use logError() for consistent formatting.
Do not exit with codes other than 0, 1, 2, or 130.
Do not send user-cancellation errors such as Inquirer ExitPromptError to Sentry; filter them in beforeSend.

src/**/*.ts: Use styleText(format, text) from node:util for all terminal colors and formatting in CLI source files; do not use raw ANSI escape codes or third-party color libraries.
Commands that produce structured results and support --json must emit machine-readable JSON to stdout with no colors or decorative formatting.
When a command supports --json, use formatJSON() from src/helpers/output.ts for JSON serialization, and pass forcePretty: true when the user explicitly provided --json.
Use isAgentContext() from src/helpers/output.ts to enable auto-JSON behavior for commands that support both human-readable and JSON output modes.
CLI output must not include emoji; use text symbols and colors instead.
Send normal command output to stdout with console.log(), and send errors, warnings, and debug messages to stderr via logError(), logWarn(), and logDebug().
Keep CLI output concise and scannabl...

Files:

  • src/helpers/telemetry.ts
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
src/{helpers,engine}/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-002-error-handling.md)

Do not use console.log(), console.warn(), or console.info() directly in helper or engine files; use logInfo() or logWarn() instead. Command files are exempt because they are the I/O layer.

Files:

  • src/helpers/telemetry.ts
  • src/helpers/stack-detect.ts
src/**/!(*platform).ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-009-platform-detection-helper.md)

src/**/!(*platform).ts: In src/ TypeScript source files, do not read process.platform directly; use src/helpers/platform.ts (isWindows(), isMacOS(), isLinux(), isWSL(), getPlatformInfo()) for all platform detection.
Use the centralized platform helper instead of duplicating OS/WSL detection logic inline anywhere in src/ TypeScript source.
When behavior differs between Linux and Windows, account for WSL by using isWSL() rather than assuming `

Files:

  • src/helpers/telemetry.ts
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
src/commands/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-001-command-structure.md)

src/commands/**/*.ts: Each command module under src/commands/ must export a register*Command(program) function, with one command per file (or one command group via index.ts).
Command files must be thin: they should only parse arguments, call engine/helpers, and format output; business logic must live in src/engine/, src/helpers/, or src/formats/.
Command modules must not use executableDir() for command discovery, must not call .parse() themselves, and must not spawn child processes for subcommand execution.
Subcommand groups should live in nested directories with an index.ts that composes child commands (for example, src/commands/adr/index.ts).

src/commands/**/*.ts: In command files under src/commands/**/*.ts, options that need type narrowing beyond plain strings MUST use new Option() with .addOption() instead of plain .option().
In src/commands/**/*.ts, import Option from @commander-js/extra-typings alongside Command so typed options get full type inference.
In src/commands/**/*.ts, enum-like options with a fixed set of allowed values must use .choices() on an Option to provide runtime validation and compile-time type narrowing.
In src/commands/**/*.ts, options that require type conversion must use .argParser() on an Option object, not a parser function passed as the third argument to .option().
In src/commands/**/*.ts, register typed options with .addOption() rather than .option().
In src/commands/**/*.ts, pass both the choices array and default values with as const when using .choices() and .default() to preserve literal types.
In src/commands/**/*.ts, do not add manual validation for choice options (for example if (!VALID.includes(val))), because Commander handles invalid-value rejection automatically.

src/commands/**/*.ts: Commands that operate on .archgate/ project resources must use findProjectRoot() from src/helpers/paths.ts to locate the project root; direct use of `process.cw...

Files:

  • src/commands/check.ts
src/commands/{*.ts,*/index.ts}

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-015-cli-command-documentation-coverage.md)

Every top-level CLI command registered via register*Command(program) must live in src/commands/<name>.ts or src/commands/<name>/index.ts so it can be matched to a docs page.

Files:

  • src/commands/check.ts
{src/commands/{*.ts,*/index.ts},docs/src/content/docs/reference/cli/!(index).mdx}

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-015-cli-command-documentation-coverage.md)

{src/commands/{*.ts,*/index.ts},docs/src/content/docs/reference/cli/!(index).mdx}: When a top-level command is added, its docs page must be added in the same change; when a top-level command is removed, its matching docs page must be deleted in the same change.
Keep command and documentation stems aligned when renaming a top-level command file; renaming src/commands/<name>.ts or src/commands/<name>/index.ts must be paired with renaming docs/src/content/docs/reference/cli/<name>.mdx.

Files:

  • src/commands/check.ts
🧠 Learnings (2)
📚 Learning: 2026-07-02T16:03:33.031Z
Learnt from: rhuanbarreto
Repo: archgate/cli PR: 446
File: src/helpers/session-context-opencode.ts:81-100
Timestamp: 2026-07-02T16:03:33.031Z
Learning: For synchronous helper functions that use Bun’s sqlite sync API (i.e., they must remain synchronous), it’s acceptable to use `existsSync` from `node:fs` to check whether the SQLite database file exists. Avoid using `Bun.file(path).exists()` for this purpose because it’s async and would force the helper to become async (no equivalent synchronous Bun alternative). If the DB file is missing, throw/return a clear, actionable "No database found" error (per ARCH-006) rather than letting the sqlite open fail with a generic DB-open error.

Applied to files:

  • src/helpers/telemetry.ts
  • src/helpers/stack-detect.ts
📚 Learning: 2026-06-11T12:50:28.661Z
Learnt from: rhuanbarreto
Repo: archgate/cli PR: 406
File: .claude/agent-memory/archgate-developer/feedback_prefer_tests_over_adr_rules.md:8-18
Timestamp: 2026-06-11T12:50:28.661Z
Learning: In `archgate/cli`, for markdown files under `.claude/agent-memory/`, follow the established convention: use YAML frontmatter (with a `name:` field used as the document title) and do not require a top-level `#` (H1) heading. During code review, do not flag missing first-line/first-top-level H1 headings (e.g., MD041) for these agent-memory files since markdownlint is not part of the repo’s `bun run validate` lint pipeline (oxlint/oxfmt only).

Applied to files:

  • .claude/agent-memory/archgate-developer/project_test_isolation_gotchas.md
🪛 OpenGrep (1.23.0)
src/helpers/stack-detect.ts

[ERROR] 426-426: Dynamic command passed to child_process.exec/execSync. Use child_process.execFile or spawn with an argument array instead.

(coderabbit.command-injection.exec-js)

🔇 Additional comments (9)
.claude/agent-memory/archgate-developer/project_test_isolation_gotchas.md (1)

15-15: LGTM!

src/helpers/telemetry.ts (1)

320-343: LGTM!

src/commands/check.ts (1)

21-21: LGTM!

Also applies to: 176-178

tests/commands/check-action.test.ts (1)

22-22: LGTM!

Also applies to: 86-86, 121-125, 151-151, 414-444

tests/helpers/telemetry.test.ts (1)

178-178: LGTM!

Also applies to: 197-199

src/helpers/stack-detect.ts (1)

125-157: LGTM!

Also applies to: 180-181, 206-253, 273-458

tests/helpers/stack-detect-frameworks.test.ts (2)

17-291: LGTM!


297-341: 🩺 Stability & Availability

Cache writes may leak into real user-scope directory during tests.

detectStack() persists results via internalPath("cache", ...) (per src/helpers/stack-detect.ts), which per the project's key-paths convention resolves under ~/.archgate/. These caching tests (and every other test in this suite/stack-detect.test.ts that calls detectStack()) invoke that write path with no visible mock of internalPath/os.homedir() and no cleanup of the resulting cache file in afterEach, only the temp project dir is removed via safeRmSync. Left unaddressed, test runs (especially in CI) accumulate real cache files outside the temp sandbox.

Please confirm whether internalPath is already redirected in a global test setup; if not, mock it (or os.homedir()) to write into the temp dir, or add explicit cleanup for the cache file path used per test.

tests/helpers/stack-detect.test.ts (1)

18-321: LGTM!

Comment thread src/commands/check.ts
Comment thread src/helpers/stack-detect.ts
Comment thread src/helpers/stack-detect.ts Outdated
Comment thread src/helpers/stack-detect.ts
Add PackageJsonSchema and PyprojectSchema to validate external file
contents via safeParse instead of unsafe `as` casts. The file now has
zero type assertions — all external data (cache, package.json,
pyproject.toml) is validated through Zod before use.

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_598dab5b-e584-44f5-adf5-3831b5106aff)

- Bound stackPromise with 500ms timeout via Promise.race so
  pathological projects can't stall command exit (check.ts)
- Expand SENTINEL_FILES to cover all scanned markers: bunfig.toml,
  deno.jsonc, setup.py, manage.py, artisan, bin/rails, config/routes.rb,
  and JS/TS framework configs (next/remix/vite/nuxt/astro/svelte/tailwind)
- Drop redundant mkdirSync from writeCache — Bun.write() auto-creates
  parent dirs since v1.0.16

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_c30824c7-e0d8-45cc-be6b-ffd979f143d7)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/helpers/stack-detect.ts`:
- Around line 59-106: The stack fingerprint in SENTINEL_FILES is missing several
config variants that hasConfig() already checks, so framework detection can stay
cached when those files change. Add the missing sentinels for
tailwind.config.json, next.config.json, and the .cjs/.mts/.cts variants used by
the config lookup logic, keeping the list aligned with the detection helpers so
fingerprint invalidation stays accurate.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d0e3a053-7e22-4e06-829c-ddb970d19f36

📥 Commits

Reviewing files that changed from the base of the PR and between 5b45829 and e184439.

📒 Files selected for processing (2)
  • src/commands/check.ts
  • src/helpers/stack-detect.ts
📜 Review details
⏰ Context from checks skipped due to timeout. (6)
  • GitHub Check: Smoke Test (Windows) / Windows
  • GitHub Check: Analyze (javascript-typescript)
  • GitHub Check: Analyze (csharp)
  • GitHub Check: Analyze (javascript-typescript)
  • GitHub Check: Analyze (java-kotlin)
  • GitHub Check: Cloudflare Pages
⚠️ CI failures not shown inline (2)

GitHub Actions: DCO / DCO Sign-off Check: feat(telemetry): track project languages, runtimes, and frameworks on check

Conclusion: failure

View job details

##[group]Run base="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"
 �[36;1mbase="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"�[0m
 �[36;1mhead="e18443945c0527b63a66dc22ff0a4a94eb03eaa2"�[0m
 �[36;1mfailed=0�[0m
 �[36;1m�[0m
 �[36;1mfor sha in $(git rev-list --no-merges "$base".."$head"); do�[0m
 �[36;1m  if ! git log -1 --format='%B' "$sha" | grep -qiE '^Signed-off-by: .+ <.+>'; then�[0m
 �[36;1m    echo "::error::Commit $sha is missing a DCO Signed-off-by line."�[0m

GitHub Actions: DCO / 0_DCO Sign-off Check.txt: feat(telemetry): track project languages, runtimes, and frameworks on check

Conclusion: failure

View job details

##[group]Run base="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"
 �[36;1mbase="67d0e2ace0607873c32894f24c2d5e6c6bb13f1d"�[0m
 �[36;1mhead="e18443945c0527b63a66dc22ff0a4a94eb03eaa2"�[0m
 �[36;1mfailed=0�[0m
 �[36;1m�[0m
 �[36;1mfor sha in $(git rev-list --no-merges "$base".."$head"); do�[0m
 �[36;1m  if ! git log -1 --format='%B' "$sha" | grep -qiE '^Signed-off-by: .+ <.+>'; then�[0m
 �[36;1m    echo "::error::Commit $sha is missing a DCO Signed-off-by line."�[0m
🧰 Additional context used
📓 Path-based instructions (9)
src/commands/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-001-command-structure.md)

src/commands/**/*.ts: Each command module under src/commands/ must export a register*Command(program) function, with one command per file (or one command group via index.ts).
Command files must be thin: they should only parse arguments, call engine/helpers, and format output; business logic must live in src/engine/, src/helpers/, or src/formats/.
Command modules must not use executableDir() for command discovery, must not call .parse() themselves, and must not spawn child processes for subcommand execution.
Subcommand groups should live in nested directories with an index.ts that composes child commands (for example, src/commands/adr/index.ts).

src/commands/**/*.ts: In command files under src/commands/**/*.ts, options that need type narrowing beyond plain strings MUST use new Option() with .addOption() instead of plain .option().
In src/commands/**/*.ts, import Option from @commander-js/extra-typings alongside Command so typed options get full type inference.
In src/commands/**/*.ts, enum-like options with a fixed set of allowed values must use .choices() on an Option to provide runtime validation and compile-time type narrowing.
In src/commands/**/*.ts, options that require type conversion must use .argParser() on an Option object, not a parser function passed as the third argument to .option().
In src/commands/**/*.ts, register typed options with .addOption() rather than .option().
In src/commands/**/*.ts, pass both the choices array and default values with as const when using .choices() and .default() to preserve literal types.
In src/commands/**/*.ts, do not add manual validation for choice options (for example if (!VALID.includes(val))), because Commander handles invalid-value rejection automatically.

src/commands/**/*.ts: Commands that operate on .archgate/ project resources must use findProjectRoot() from src/helpers/paths.ts to locate the project root; direct use of `process.cw...

Files:

  • src/commands/check.ts
src/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-002-error-handling.md)

src/**/*.ts: Use logError() from src/helpers/log.ts for user-facing errors instead of printing errors directly.
Exit with code 1 for expected failures such as missing config, invalid input, or validation violations.
Let unexpected errors crash naturally so they are treated as internal errors with exit code 2.
Include actionable suggestions in user-facing error messages whenever possible.
Write user-facing errors to stderr via logError(); do not send them to stdout.
When findProjectRoot() returns null for commands that do not require .archgate/, fall back to process.cwd() as the path key or working directory.
Catch ExitPromptError from Inquirer in the top-level error boundary and treat it as user cancellation: exit with code 130 without logging an error or sending it to Sentry.
Do not use console.error() directly; use logError() for consistent formatting.
Do not exit with codes other than 0, 1, 2, or 130.
Do not send user-cancellation errors such as Inquirer ExitPromptError to Sentry; filter them in beforeSend.

src/**/*.ts: Use styleText(format, text) from node:util for all terminal colors and formatting in CLI source files; do not use raw ANSI escape codes or third-party color libraries.
Commands that produce structured results and support --json must emit machine-readable JSON to stdout with no colors or decorative formatting.
When a command supports --json, use formatJSON() from src/helpers/output.ts for JSON serialization, and pass forcePretty: true when the user explicitly provided --json.
Use isAgentContext() from src/helpers/output.ts to enable auto-JSON behavior for commands that support both human-readable and JSON output modes.
CLI output must not include emoji; use text symbols and colors instead.
Send normal command output to stdout with console.log(), and send errors, warnings, and debug messages to stderr via logError(), logWarn(), and logDebug().
Keep CLI output concise and scannabl...

Files:

  • src/commands/check.ts
  • src/helpers/stack-detect.ts
**/*.{ts,tsx,js,jsx,mjs,cjs}

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-006-dependency-policy.md)

**/*.{ts,tsx,js,jsx,mjs,cjs}: Use Bun built-ins for file I/O (Bun.file, Bun.write), HTTP, subprocess execution (Bun.spawn), globbing (Bun.Glob), and testing (bun:test).
Do not use Node.js-specific APIs when Bun alternatives exist; for example, use Bun.file() instead of fs.readFile() for simple reads.
Prefer node: built-in modules such as node:util, node:path, and node:fs over npm alternatives.
Do not use utility libraries for single functions, such as importing lodash for one helper like pick.
Do not use path aliases (tsconfig paths); use relative imports with Bun's native module resolution.
Do not install packages globally during development; use bunx for one-off tools.

Files:

  • src/commands/check.ts
  • src/helpers/stack-detect.ts
src/**/!(*platform).ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-009-platform-detection-helper.md)

src/**/!(*platform).ts: In src/ TypeScript source files, do not read process.platform directly; use src/helpers/platform.ts (isWindows(), isMacOS(), isLinux(), isWSL(), getPlatformInfo()) for all platform detection.
Use the centralized platform helper instead of duplicating OS/WSL detection logic inline anywhere in src/ TypeScript source.
When behavior differs between Linux and Windows, account for WSL by using isWSL() rather than assuming `

Files:

  • src/commands/check.ts
  • src/helpers/stack-detect.ts
src/commands/{*.ts,*/index.ts}

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-015-cli-command-documentation-coverage.md)

Every top-level CLI command registered via register*Command(program) must live in src/commands/<name>.ts or src/commands/<name>/index.ts so it can be matched to a docs page.

Files:

  • src/commands/check.ts
{src/commands/{*.ts,*/index.ts},docs/src/content/docs/reference/cli/!(index).mdx}

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-015-cli-command-documentation-coverage.md)

{src/commands/{*.ts,*/index.ts},docs/src/content/docs/reference/cli/!(index).mdx}: When a top-level command is added, its docs page must be added in the same change; when a top-level command is removed, its matching docs page must be deleted in the same change.
Keep command and documentation stems aligned when renaming a top-level command file; renaming src/commands/<name>.ts or src/commands/<name>/index.ts must be paired with renaming docs/src/content/docs/reference/cli/<name>.mdx.

Files:

  • src/commands/check.ts
{src,tests}/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/LEGAL-001-spdx-license-headers.md)

{src,tests}/**/*.ts: Every TypeScript source file in src/ and tests/ must begin with // SPDX-License-Identifier: Apache-2.0 followed by // Copyright 2026 Archgate.
If a TypeScript file has a shebang line (for example #!/usr/bin/env bun in src/cli.ts), the SPDX license header must appear immediately after the shebang.
Use single-line // comments for the SPDX header; do not use block comments (/* */) or alternate license identifiers.

Files:

  • src/commands/check.ts
  • src/helpers/stack-detect.ts
**

⚙️ CodeRabbit configuration file

**: # CLAUDE.md

Archgate is a CLI tool for AI governance via Architecture Decision Records (ADRs) — combining human-readable docs with machine-checkable rules. The CLI dogfoods itself via ADRs in .archgate/adrs/. AI features are delivered as a Claude Code plugin (../plugins/claude-code), not via direct API calls.

Technology Stack

  • Runtime: Bun (>=1.2.21) — not Node.js compatible
  • Language: TypeScript (strict mode, ESNext, ES modules)
  • CLI framework: Commander.js (@commander-js/extra-typings)
  • Linter: Oxlint | Formatter: Oxfmt | Dead exports: Knip | Commits: Conventional Commits

Commands

bun run src/cli.ts <command>  # run CLI locally
bun run lint                  # oxlint
bun run typecheck             # tsc --build
bun run format                # oxfmt --write
bun run format:check          # oxfmt --check
bun run test                  # all tests (not bare `bun test` — picks up --timeout; see GEN-003)
bun run knip                  # dead export detection
bun run validate              # MANDATORY: lint + typecheck + format:check + test + ADR check + knip + build check
bun run build:check            # verify build compiles (CI builds binaries via release workflow)
bun run commit                # conventional commit wizard

Validation Gate

bun run validate must pass before any task is considered complete. Fail-fast pipeline: lint → typecheck → format:check → test → ADR check → knip → build check. Mirrors CI in .github/workflows/code-pull-request.yml.

Git Hooks (Git 2.54+)

Config-based hooks in .githooks run validation locally before commits and pushes:

  • pre-commit: lint + typecheck + format:check (~15s)
  • pre-push: full bun run validate (~60s, mirrors CI)

Activate once per clone:

git config --local include.path ../.githooks

Opt out of a specific hook: git config --local hook.<name>.enabled false. Skip all hooks for a single commit: git commit --no-verify.

#...

Files:

  • src/commands/check.ts
  • src/helpers/stack-detect.ts

⚙️ CodeRabbit configuration file

**: This project uses Archgate — an AI governance framework based on
Architecture Decision Records (ADRs). The ADRs in .archgate/adrs/
are the authoritative rules for this codebase. Each ADR has a companion
.rules.ts file with automated checks that run via archgate check.

When reviewing, you must:

  1. Treat ADR violations as blocking issues, not suggestions.
  2. Cite the specific ADR ID when flagging a violation (e.g., "Violates ARCH-006").
  3. Focus on semantic and contextual violations that automated rules cannot catch —
    the .rules.ts files already cover syntactic/structural patterns.
  4. If you are unsure whether something violates an ADR, flag it as a question
    rather than approving it.

Files:

  • src/commands/check.ts
  • src/helpers/stack-detect.ts
src/{helpers,engine}/**/*.ts

📄 CodeRabbit inference engine (.archgate/adrs/ARCH-002-error-handling.md)

Do not use console.log(), console.warn(), or console.info() directly in helper or engine files; use logInfo() or logWarn() instead. Command files are exempt because they are the I/O layer.

Files:

  • src/helpers/stack-detect.ts
🧠 Learnings (1)
📚 Learning: 2026-07-02T16:03:33.031Z
Learnt from: rhuanbarreto
Repo: archgate/cli PR: 446
File: src/helpers/session-context-opencode.ts:81-100
Timestamp: 2026-07-02T16:03:33.031Z
Learning: For synchronous helper functions that use Bun’s sqlite sync API (i.e., they must remain synchronous), it’s acceptable to use `existsSync` from `node:fs` to check whether the SQLite database file exists. Avoid using `Bun.file(path).exists()` for this purpose because it’s async and would force the helper to become async (no equivalent synchronous Bun alternative). If the DB file is missing, throw/return a clear, actionable "No database found" error (per ARCH-006) rather than letting the sqlite open fail with a generic DB-open error.

Applied to files:

  • src/helpers/stack-detect.ts
🪛 OpenGrep (1.23.0)
src/helpers/stack-detect.ts

[ERROR] 464-464: Dynamic command passed to child_process.exec/execSync. Use child_process.execFile or spawn with an argument array instead.

(coderabbit.command-injection.exec-js)

🔇 Additional comments (1)
src/commands/check.ts (1)

66-70: LGTM!

Also applies to: 158-159, 179-181

Comment thread src/helpers/stack-detect.ts Outdated
Extract FRAMEWORK_CONFIGS as a single source of truth for framework
config basenames, their scanned extensions, and framework names. Both
sentinel generation and detection now derive from this list, so they
can never drift apart.

Covers all extension variants (cjs/mjs/mts/cts/json) that hasConfig()
scans — previously the sentinel list only tracked .ts/.js for most
frameworks, leaving config variants like next.config.json or
vite.config.mts uncovered.

Claude-Session: https://claude.ai/code/session_01H7XPPVhN1t6HzH8F3xN4DP
Signed-off-by: Rhuan Barreto <rhuan@barreto.work>
@cursor

cursor Bot commented Jul 7, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_b21f8b7f-9f9f-4190-a36b-81343eaeb164)

@rhuanbarreto rhuanbarreto merged commit 2d1c065 into main Jul 7, 2026
23 checks passed
@rhuanbarreto rhuanbarreto deleted the rhuan/posthog-stack-tracking branch July 7, 2026 00:51
@archgatebot archgatebot Bot mentioned this pull request Jul 7, 2026
rhuanbarreto pushed a commit that referenced this pull request Jul 7, 2026
# archgate

## [0.48.0](v0.47.0...v0.48.0)
(2026-07-07)

### Features

* **telemetry:** track project languages, runtimes, and frameworks on
check ([#458](#458))
([2d1c065](2d1c065))

### Performance Improvements

* reduce unnecessary allocations across engine and helpers
([#461](#461))
([49983a6](49983a6))

---
This PR was generated with
[simple-release](https://github.com/TrigenSoftware/simple-release).

<details>
<summary>📄 Cheatsheet</summary>
<br>



You can configure the bot's behavior through a pull request comment
using the `!simple-release/set-options` command.

### Command Format

````md
!simple-release/set-options

```json
{
  "bump": {},
  "publish": {}
}
```
````

### Useful Parameters

#### Bump

| Parameter | Type | Description |
|-----------|------|-------------|
| `version` | `string` | Force set specific version |
| `as` | `'major' \| 'minor' \| 'patch' \| 'prerelease'` | Release type
|
| `prerelease` | `string` | Pre-release identifier (e.g., "alpha",
"beta") |
| `firstRelease` | `boolean` | Whether this is the first release |
| `skip` | `boolean` | Skip version bump |
| `byProject` | `Record<string, object>` | Per-project bump options for
monorepos |

#### Publish

| Parameter | Type | Description |
|-----------|------|-------------|
| `skip` | `boolean` | Skip publishing |
| `access` | `'public' \| 'restricted'` | Package access level |
| `tag` | `string` | Tag for npm publication |

### Usage Examples

#### Force specific version

````md
!simple-release/set-options

```json
{
  "bump": {
    "version": "2.0.0"
  }
}
```
````

#### Force major bump

````md
!simple-release/set-options

```json
{
  "bump": {
    "as": "major"
  }
}
```
````

#### Create alpha pre-release

````md
!simple-release/set-options

```json
{
  "bump": {
    "prerelease": "alpha"
  }
}
```
````

#### Publish with specific access and tag

````md
!simple-release/set-options

```json
{
  "bump": {
    "prerelease": "beta"
  },
  "publish": {
    "access": "public",
    "tag": "beta"
  }
}
```
````

### Access Restrictions

The command can only be used by users with permissions:
- repository owner
- organization member
- collaborator

### Notes

- The last comment with `!simple-release/set-options` command takes
priority
- JSON must be valid, otherwise the command will be ignored
- Parameters apply only to the current release execution
- The command can be updated by editing the comment or adding a new one


</details>

<!--
  Please do not edit this comment.
  simple-release-pull-request: true
  simple-release-branch-from: release
  simple-release-branch-to: main
-->

Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant