Add AGENTS.md for build, test, and style guidance
This commit is contained in:
142
AGENTS.md
Normal file
142
AGENTS.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# AGENTS.md (envsitter)
|
||||
|
||||
This repo contains `envsitter`: a TypeScript (ESM) library + CLI for safely inspecting and matching `.env` secrets without exposing values.
|
||||
|
||||
## Ground rules (security)
|
||||
|
||||
- Never print or log raw secret values from `.env` files or external providers.
|
||||
- Do not add any API that returns a plaintext value (no `getValue()` style APIs).
|
||||
- Prefer comparisons via deterministic fingerprints (HMAC) and boolean match results.
|
||||
- Prefer passing candidate secrets via stdin (to avoid shell history): `--candidate-stdin`.
|
||||
- Keep all generated peppers/secrets out of git (see `.gitignore`).
|
||||
|
||||
## Project layout
|
||||
|
||||
- `src/envsitter.ts`: main library surface (`EnvSitter`)
|
||||
- `src/cli.ts`: CLI entrypoint
|
||||
- `src/dotenv/parse.ts`: minimal dotenv parser
|
||||
- `src/pepper.ts`: pepper resolution + auto-create
|
||||
- `src/test/*.test.ts`: Node test suite (compiled to `dist/test/*.test.js`)
|
||||
|
||||
## Build / typecheck / test
|
||||
|
||||
There is no linter configured (no ESLint/Prettier). Use `tsc` + tests as quality gates.
|
||||
|
||||
### Install
|
||||
|
||||
- `npm install`
|
||||
|
||||
### Build
|
||||
|
||||
- `npm run build`
|
||||
- Runs `tsc -p tsconfig.json` and outputs to `dist/`
|
||||
|
||||
### Typecheck only
|
||||
|
||||
- `npm run typecheck`
|
||||
|
||||
### Run all tests
|
||||
|
||||
- `npm test`
|
||||
- Runs `npm run build` then `node scripts/run-tests.mjs`
|
||||
|
||||
### Run a single test file
|
||||
|
||||
Tests are written in TS but executed from compiled JS.
|
||||
|
||||
- `npm run build`
|
||||
- `node --test dist/test/envsitter.test.js`
|
||||
|
||||
### Run a single test by name/pattern
|
||||
|
||||
- `npm run build`
|
||||
- `node --test --test-name-pattern "outside-in" dist/test/envsitter.test.js`
|
||||
|
||||
(Use a substring/regex that matches the `test('name', ...)` title.)
|
||||
|
||||
### Bun
|
||||
|
||||
The CLI is runnable under Bun:
|
||||
|
||||
- `bun src/cli.ts keys --file .env`
|
||||
|
||||
Tests currently run under Node’s built-in test runner. If you add Bun tests, keep Node tests working.
|
||||
|
||||
## Code style and conventions
|
||||
|
||||
### TypeScript / module system
|
||||
|
||||
- This repo is ESM: `"type": "module"` in `package.json`.
|
||||
- TS config is strict and includes:
|
||||
- `strict: true`
|
||||
- `noUncheckedIndexedAccess: true`
|
||||
- `exactOptionalPropertyTypes: true`
|
||||
- Use ESM import specifiers with `.js` extensions when importing local TS modules.
|
||||
- Example: `import { parseDotenv } from '../dotenv/parse.js'`
|
||||
- Prefer `node:` specifiers for built-ins:
|
||||
- `import { readFile } from 'node:fs/promises'`
|
||||
|
||||
### Formatting
|
||||
|
||||
- No formatter is enforced.
|
||||
- Keep diffs small and consistent with existing file style.
|
||||
- Prefer 2-space indentation and trailing commas where already used.
|
||||
|
||||
### Imports
|
||||
|
||||
- Group imports by origin:
|
||||
1) `node:` built-ins
|
||||
2) third-party (if any)
|
||||
3) local `./` and `../`
|
||||
- Avoid unused imports; keep import lists minimal.
|
||||
|
||||
### Naming
|
||||
|
||||
- Types: `PascalCase` (`EnvSitterFingerprint`)
|
||||
- Functions/vars: `camelCase` (`resolvePepper`, `candidateValue`)
|
||||
- Constants: `camelCase` unless truly global constant.
|
||||
- File names: `kebab-case.ts` for tests; otherwise match existing structure.
|
||||
|
||||
### Types and optional properties (important)
|
||||
|
||||
`exactOptionalPropertyTypes` is enabled.
|
||||
|
||||
- Do not pass `undefined` as a value for an optional property.
|
||||
- Prefer conditional spreads:
|
||||
- `...(maybe ? { prop: maybe } : {})`
|
||||
- Prefer returning `undefined` by omitting optional properties rather than setting them.
|
||||
|
||||
### Error handling
|
||||
|
||||
- Prefer throwing `Error` with actionable messages.
|
||||
- Avoid empty `catch` blocks.
|
||||
- Avoid logging by default. If debugging output is needed:
|
||||
- Gate it behind `process.env.ENVSITTER_DEBUG === '1'`.
|
||||
|
||||
### Security-sensitive comparisons
|
||||
|
||||
- Use constant-time comparison for digests:
|
||||
- `timingSafeEqual` for fingerprint digest bytes.
|
||||
|
||||
### IO and side effects
|
||||
|
||||
- `.env` values should only exist in memory.
|
||||
- Pepper auto-creation is allowed, but must write only to the gitignored location:
|
||||
- default: `.envsitter/pepper`
|
||||
- Never write `.env` values elsewhere (no caches, no exports to new files).
|
||||
|
||||
## CLI behavior
|
||||
|
||||
- CLI should return useful exit codes:
|
||||
- `0` success / match found
|
||||
- `1` mismatch / no match found
|
||||
- `2` usage or runtime error
|
||||
- Prefer JSON output for machine consumption when `--json` is provided.
|
||||
- Never print secret values; only keys, booleans, metadata (length), and fingerprints.
|
||||
|
||||
## Editor/assistant rules
|
||||
|
||||
- No Cursor rules found in `.cursor/rules/` or `.cursorrules`.
|
||||
- No Copilot instructions found in `.github/copilot-instructions.md`.
|
||||
|
||||
If you add any of the above rule files later, update this document to summarize the relevant constraints.
|
||||
Reference in New Issue
Block a user