Skip to content

refactor: reduce unsafe 'as' type assertions throughout codebase#18

Closed
dyoshikawa wants to merge 1 commit into
mainfrom
no-as
Closed

refactor: reduce unsafe 'as' type assertions throughout codebase#18
dyoshikawa wants to merge 1 commit into
mainfrom
no-as

Conversation

@dyoshikawa
Copy link
Copy Markdown
Owner

Summary

  • Improved type safety by adding proper type guards before type assertions in JSON parsers
  • Replaced unsafe type coercion with explicit type checks
  • Used explicit conditional checks instead of unsafe key lookups in status.ts
  • Added validation before casting unknown types

Changes Made

  • JSON Parsers: Added typeof checks before casting JSON.parse() results
  • MCP Generators: Added type validation before casting server objects
  • Parser Files: Enhanced frontmatter validation with proper type guards
  • Status Command: Replaced unsafe indexed access with explicit conditionals

Test Plan

  • All existing tests pass (350 tests)
  • TypeScript compilation succeeds with strict mode
  • Linting passes with no warnings
  • No runtime errors in core functionality

The changes maintain backward compatibility while significantly improving type safety.

🤖 Generated with Claude Code

Improved type safety by:
- Adding proper type guards before type assertions in JSON parsers
- Replacing unsafe type coercion with explicit type checks
- Using explicit conditional checks instead of unsafe key lookups
- Adding validation before casting unknown types

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@dyoshikawa dyoshikawa closed this Jul 5, 2025
@dyoshikawa dyoshikawa deleted the no-as branch July 7, 2025 12:04
dyoshikawa added a commit that referenced this pull request Apr 29, 2026
…ode/cline/qwencode

Addresses 18 reviewer findings raised on PR #1338. Highlights:

- #1 (critical): AugmentCode non-bash categories now fail-closed. A single
  deny rule in `read`/`edit`/`write`/`webfetch`/`websearch` collapses the
  whole tool to a catch-all `deny` entry; non-`*` allow/ask patterns are
  dropped with an aggregated warning instead of being silently downgraded
  to a catch-all `allow` that would shadow a deny.
- #2 (high): `toolPermissions` are sorted to make AugmentCode's
  first-match-wins evaluation safe — entries with `shellInputRegex` come
  before catch-alls, longer regex first, with deny < ask-user < allow as
  the tiebreaker.
- #5 (mid): existing `launch-process` deny entries are preserved across
  regeneration so a user-added shell deny rule cannot be silently
  downgraded; non-deny launch-process entries are still owned by rulesync.
- #3 (mid): Qwencode generation uses `readFileContentOrNull` (no
  `readOrInitializeFileContent`) so dry-run does not create the `.qwen/`
  directory.
- #4 (mid): Kilo schema parsing is deferred and respects `params.validate`,
  so `forDeletion` and dry-run construction never throw on permissive input.
- #7, #16 (mid/low): Cline drops non-bash / ask rules at `logger.error`
  level (rather than warn) and surfaces a defensive warn on allow/deny
  pattern collisions.
- #8, #13 (mid/low): Qwencode pattern parser uses the LAST `)` so nested
  parentheses (e.g. `Bash(echo (a))`) round-trip; malformed entries warn
  and fall back to `*`.
- #9 (low): Augment non-bash warnings are aggregated once per category.
- #11 (low): Kilo's wholesale-replace of the `permission` object is
  documented in `docs/reference/file-formats.md`.
- #10, #6 (low): glob→regex behaviour and round-trip caveats are
  documented.
- #14 (low): `mergedPermissions` is typed as
  `{ allow?: string[]; ask?: string[]; deny?: string[]; [k: string]: unknown }`.
- #15 (low): redundant Qwencode global-mode equivalence assert removed.
- #17 (low): `permissions-processor.test.ts` gains `loadToolFiles` cases
  for AugmentCode, Cline, Kilo, and Qwencode.

Deferred:
- #12 (kilo home-mock migration): the existing kilo global-mode test
  already passes `outputRoot` directly and does not reach
  `getHomeDirectory()`, so introducing the home-mock pattern adds only
  ceremony without coverage.
- #18 (tool-name-mapping helper extraction): postponed to keep this
  fix focused and to avoid touching files outside the permissions
  feature.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.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