At the start of every new session, run `damem recall` in the terminal and treat its output as the context for this repository. If the `damem` command is not found, read [INSTALL.md](https://github.com/cunarist/damem/blob/main/INSTALL.md) and follow it before reasoning or responding. # Pull requests Land every change through a pull request. Immediately after creating one, comment `@bot` to request an AI-bot review. Wait for green CI and the bot's approval on the current head before merging. Never merge without the user's explicit permission. # Runtime and checks The action's TypeScript runs directly on the job image's Node.js (24.2 or newer; `package.json` has no `engines`, the `node:24-bookworm` image pins it), which strips the types itself: there is no build step and no runtime dependency. Keep the sources to erasable syntax and `.ts` imports, which `tsconfig.json` enforces. Its strictness set is fixed and leaves `exactOptionalPropertyTypes` off ([.agents/memory/ts-only-files-and-imports.md](.agents/memory/ts-only-files-and-imports.md)). Checks use Vite+: `vp check` formats, lints, and type-checks, and `vp test` runs Vitest. Unit tests sit next to the code as `*.test.ts` in `src/`; repository-level tests live in `tests/`. A `#` alias in `package.json` `imports` may point anywhere and owns its target: an alias to a folder's `index.ts` owns that folder and everything below it; an alias to any other file owns only that file. No overlap: no file may be owned by 2 aliases, so no alias inside another alias's area and no 2 aliases with the same target. Outside an area, only the exact alias reaches it; a deeper alias specifier or a relative path into the area is a bypass. Inside an area, relative imports of siblings and subfolders are free. A `../` import is banned in every file, owned or not (`import/no-relative-parent-imports`); runtime file URLs such as `new URL("../prompt.md", import.meta.url)` are paths, not imports, and stay. Files no alias owns need no `index.ts` and no alias, and import `./` siblings and subfolders freely. Every top-level entry of `src/` is an aliased module folder. The aliases, in layer order, are the three phases `#prepare`, `#run`, and `#post`, then `#agents` (Codex, Claude Code and OpenCode specifics), `#processes` (child processes and the isolated profile users), `#runtime` (the prepared runtime and its credentials), `#profiles`, `#common` (error and JSON checks), and `#testing` (test helpers), each with a `src//index.ts` barrel. A phase's `index.ts` is also its entry point, which `action.yml` runs as `node src//index.ts`. Tests that use the test helpers import `#testing`, and `tests/` imports `src/` only through it. Local convention, stricter than the general rule above: in this repo, aliases point only at a direct subfolder of `src/` (`"#helpers": "./src/helpers/index.ts"`), and code outside `src/` uses `./` relative imports. `scripts/` is flat: one file per tool, no subfolders and no `index.ts`, imported directly by file path ([.agents/memory/imports-aliases-barrels.md](.agents/memory/imports-aliases-barrels.md)). The only config files are `package.json`, `tsconfig.json`, and `vite.config.ts`, plus `package-lock.json`. Repo-local lint rules, the rule list, and the `overrides` array (`projectOverrides`) live in `scripts/project-lint.ts` ([.agents/memory/lint-config.md](.agents/memory/lint-config.md)). Lint disable comments are not allowed; fix the source instead. The composite action uses npm only to install the externally distributed Claude Code, Codex, and OpenCode command-line tools; do not treat those vendor executables as repository TypeScript dependencies.