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

149 lines
9.0 KiB
Markdown

---
issue: 113
issue_title: "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.ts`** — `createPermissionSystemLogger()` 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`:
```typescript
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 stay**`detectMisplacedPermissionKeys` 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.