Files
my-pi/pi-permission-system/docs/plans/archive/0113-remove-legacy-path-defaults.md

9.0 KiB

issue, issue_title
issue issue_title
113 refactor: remove legacy path defaults from logging and extension-config

Remove legacy path defaults from logging and extension-config

Problem Statement

src/extension-config.ts exports module-scope constants (CONFIG_PATH, LOGS_DIR, DEBUG_LOG_PATH, PERMISSION_REVIEW_LOG_PATH) derived from import.meta.url that point to the legacy extension-root paths. The current architecture uses agentDir-derived paths via computeExtensionPaths() and runtime.ts always provides explicit paths to the logger. The legacy constants only serve as defaults in createPermissionSystemLogger() and in the legacy loadPermissionSystemConfig() / savePermissionSystemConfig() / getPermissionSystemConfigPath() / ensurePermissionSystemConfig() functions — none of which are imported by any production code in src/.

This creates confusing fallback behavior: if a caller omitted a path argument, it would silently use the wrong directory.

Goals

  • Make debugLogPath, reviewLogPath, and ensureLogsDirectory required in PermissionSystemLoggerOptions.
  • Remove the legacy path constants (CONFIG_PATH, LOGS_DIR, DEBUG_LOG_PATH, PERMISSION_REVIEW_LOG_PATH) from extension-config.ts.
  • Remove the legacy config functions (loadPermissionSystemConfig, savePermissionSystemConfig, getPermissionSystemConfigPath, ensurePermissionSystemConfig) that are dead production code.
  • Update tests that import removed symbols.

Non-Goals

  • Changing EXTENSION_ROOT or resolveExtensionRoot() — still used by runtime.ts.
  • Changing ensurePermissionSystemLogsDirectory() — still used by runtime.ts (called with an explicit logsDir argument).
  • Refactoring runtime.ts or the config-loader pipeline.

Background

Permission surface

None — this is a pure internal cleanup. No permission surface is involved.

Relevant modules

  • src/extension-config.ts — defines the legacy constants and functions. Also defines EXTENSION_ID, DEFAULT_EXTENSION_CONFIG, normalizePermissionSystemConfig, detectMisplacedPermissionKeys, ensurePermissionSystemLogsDirectory, and EXTENSION_ROOT which remain in use.
  • src/logging.tscreatePermissionSystemLogger() imports legacy constants as defaults for its optional parameters.
  • src/runtime.ts — the sole production consumer of both modules; already provides explicit paths and never relies on legacy defaults.

Test consumers of legacy symbols

  • tests/extension-config.test.ts — imports loadPermissionSystemConfig for integration tests.
  • tests/permission-system.test.ts — imports loadPermissionSystemConfig, savePermissionSystemConfig; also creates a logger with all options explicit.
  • tests/config-modal.test.ts — imports loadPermissionSystemConfig, savePermissionSystemConfig for config-modal round-trip tests.
  • tests/config-reporter.test.ts — creates a logger with explicit paths (omits debugLogPath but this is benign since it never writes debug logs); needs ensureLogsDirectory but not the legacy default.

Design Overview

logging.ts changes

Make all three optional fields required in PermissionSystemLoggerOptions:

interface PermissionSystemLoggerOptions {
  getConfig: () => PermissionSystemExtensionConfig;
  debugLogPath: string;
  reviewLogPath: string;
  ensureLogsDirectory: () => string | undefined;
}

Remove the ?? fallback expressions and the imports of DEBUG_LOG_PATH, LOGS_DIR, PERMISSION_REVIEW_LOG_PATH, and ensurePermissionSystemLogsDirectory from extension-config.

extension-config.ts changes

Remove:

  • CONFIG_PATH
  • LOGS_DIR
  • DEBUG_LOG_PATH
  • PERMISSION_REVIEW_LOG_PATH
  • ensurePermissionSystemConfig()
  • loadPermissionSystemConfig()
  • savePermissionSystemConfig()
  • getPermissionSystemConfigPath()
  • cloneDefaultConfig() (private, only used by loadPermissionSystemConfig)
  • createDefaultConfigContent() (private, only used by ensurePermissionSystemConfig)
  • ensureConfigDirectory() (private, only used by ensurePermissionSystemConfig and savePermissionSystemConfig)
  • The PermissionSystemConfigLoadResult and PermissionSystemConfigSaveResult interfaces (only used by the removed functions)

Remove the now-unused import of renameSync, unlinkSync, and writeFileSync from node:fs. Keep existsSync and mkdirSync (used by ensurePermissionSystemLogsDirectory).

Make the logsDir parameter of ensurePermissionSystemLogsDirectory required (remove the = LOGS_DIR default).

Test changes

  • tests/extension-config.test.ts — remove the loadPermissionSystemConfig describe block and its import. The detectMisplacedPermissionKeys and normalizePermissionSystemConfig tests remain.
  • tests/permission-system.test.ts — remove or replace the loadPermissionSystemConfig / savePermissionSystemConfig tests. These test config round-tripping which is now covered by config-loader.test.ts or can be deleted as dead-code tests.
  • tests/config-modal.test.ts — replace loadPermissionSystemConfig / savePermissionSystemConfig usage with direct readFileSync + JSON.parse + normalizePermissionSystemConfig and writeFileSync, or with the loadUnifiedConfig function that runtime.ts already uses.
  • tests/config-reporter.test.ts — add the missing debugLogPath to the logger construction call.

Test Impact Analysis

  1. New tests enabled — none; this is a removal, not an extraction.
  2. Redundant tests — the loadPermissionSystemConfig / savePermissionSystemConfig tests in permission-system.test.ts and extension-config.test.ts test functions that no production code calls. They should be removed.
  3. Tests that must staydetectMisplacedPermissionKeys and normalizePermissionSystemConfig tests in extension-config.test.ts; logger tests in permission-system.test.ts that construct the logger with explicit options; config-modal tests (adapted to use direct file I/O or loadUnifiedConfig).

TDD Order

  1. Make logger options required and fix test call-sites. Update PermissionSystemLoggerOptions to make debugLogPath, reviewLogPath, and ensureLogsDirectory required. Remove legacy-constant imports from logging.ts. Update tests/config-reporter.test.ts to provide debugLogPath. Run pnpm vitest run tests/config-reporter.test.ts tests/permission-system.test.ts tests/runtime.test.ts to confirm. Commit: refactor: make logger path options required (#113)

  2. Remove legacy config functions and constants from extension-config.ts. Delete CONFIG_PATH, LOGS_DIR, DEBUG_LOG_PATH, PERMISSION_REVIEW_LOG_PATH, the four legacy config functions, their helper functions, and the two result interfaces. Make ensurePermissionSystemLogsDirectory's logsDir parameter required. Remove unused node:fs imports. Commit: refactor: remove legacy path constants and config functions (#113)

  3. Update tests/extension-config.test.ts. Remove the loadPermissionSystemConfig describe block and its import. Commit: test: remove dead loadPermissionSystemConfig tests (#113)

  4. Update tests/permission-system.test.ts. Remove the loadPermissionSystemConfig / savePermissionSystemConfig import and tests. Commit: test: remove dead legacy config round-trip tests (#113)

  5. Update tests/config-modal.test.ts. Replace loadPermissionSystemConfig / savePermissionSystemConfig with direct file I/O or loadUnifiedConfig + normalizePermissionSystemConfig. Run pnpm vitest run tests/config-modal.test.ts to confirm. Commit: test: migrate config-modal tests off legacy config functions (#113)

  6. Run full suite and type-check. Run pnpm run build and pnpm vitest run. Commit (if any fixes needed): fix: address build/test issues from legacy removal (#113)

Risks and Mitigations

Risk Mitigation
Could this silently weaken a permission? No — this change only affects logging paths and config I/O helpers; no permission evaluation logic is touched.
An external consumer imports a removed symbol These are internal modules; the package is not published as a library. Tests are the only consumers.
config-reporter.test.ts silently used the legacy debugLogPath default Step 1 makes it required, forcing the test to provide an explicit value and exposing any latent bug.
config-modal.test.ts refactoring introduces a subtle behavior change The replacement uses the same underlying normalizePermissionSystemConfig function, preserving semantics.

Open Questions

  • None — the issue is fully scoped and all affected call-sites are identified.