codex-workflow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/css-scss/SKILL.md +35 -0
- package/.agents/skills/express/SKILL.md +39 -0
- package/.agents/skills/fastify/SKILL.md +38 -0
- package/.agents/skills/modules/SKILL.md +44 -0
- package/.agents/skills/plan/SKILL.md +47 -0
- package/.agents/skills/react/SKILL.md +44 -0
- package/.agents/skills/review/SKILL.md +58 -0
- package/.agents/skills/spec/SKILL.md +47 -0
- package/.agents/skills/sqlite-queries/SKILL.md +25 -0
- package/.agents/skills/sqlite-schema/SKILL.md +24 -0
- package/.agents/skills/ts/SKILL.md +43 -0
- package/.agents/skills/verify/SKILL.md +40 -0
- package/AGENTS.md +155 -0
- package/README.md +80 -0
- package/bin/init.js +88 -0
- package/package.json +29 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: css-scss
|
|
3
|
+
description: Use for CSS or SCSS styling work. Covers naming, structure, nesting, and responsive patterns. Do not use for component logic — pair with react skill instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
CSS or SCSS changes: component styles, global styles, responsive layouts, design tokens.
|
|
8
|
+
|
|
9
|
+
## Naming and structure
|
|
10
|
+
- Use BEM for component classes: `block__element--modifier`.
|
|
11
|
+
- Prefer CSS modules for component-scoped styles; use global styles only for resets and design tokens.
|
|
12
|
+
- One SCSS file per component. Avoid cross-component style imports.
|
|
13
|
+
- Use variables / custom properties for colors, spacing, and typography. No magic numbers.
|
|
14
|
+
|
|
15
|
+
## SCSS rules
|
|
16
|
+
- Limit nesting to 3 levels. Deeper nesting is a structural problem.
|
|
17
|
+
- Use `@mixin` for repeated patterns with parameters; use `%placeholder` for static repeated rules.
|
|
18
|
+
- Do not `@extend` across files — output is unpredictable.
|
|
19
|
+
- Keep partials small and single-purpose. No `utils.scss` dumping ground.
|
|
20
|
+
|
|
21
|
+
## Responsive design
|
|
22
|
+
- Mobile-first: base styles for small screens, `@media (min-width: ...)` for larger.
|
|
23
|
+
- Use design-token breakpoints, not hardcoded pixel values.
|
|
24
|
+
- Prefer `flex` and `grid` over absolute positioning.
|
|
25
|
+
|
|
26
|
+
## Performance
|
|
27
|
+
- Avoid universal selectors and deep descendant chains.
|
|
28
|
+
- Minimize specificity. Prefer class selectors over element or ID selectors.
|
|
29
|
+
- Define `@font-face` and `@keyframes` once. Do not duplicate.
|
|
30
|
+
|
|
31
|
+
## Before handoff
|
|
32
|
+
- No hardcoded colors or spacing outside of tokens / variables.
|
|
33
|
+
- Nesting depth ≤ 3.
|
|
34
|
+
- No unused variables, mixins, or selectors.
|
|
35
|
+
- Responsive breakpoints use design tokens.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: express
|
|
3
|
+
description: Use for Express route, middleware, or router work. Pair with ts skill for TypeScript rules and sqlite-queries/sqlite-schema for database work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
Express route registration, middleware, router organization, error handling.
|
|
8
|
+
|
|
9
|
+
## Router design
|
|
10
|
+
- Split routes into `express.Router()` instances by feature domain. Mount them in the main app file.
|
|
11
|
+
- Keep route handlers thin: validate input, call a service, send response. No SQL or business logic in route files.
|
|
12
|
+
- Do not attach routes directly to the `app` instance except for top-level mounts.
|
|
13
|
+
|
|
14
|
+
## TypeScript
|
|
15
|
+
- Extend `Request` and `Response` via module augmentation when adding custom properties (e.g., `req.user`).
|
|
16
|
+
- Type request body, params, and query explicitly: `Request<Params, ResBody, ReqBody, Query>`.
|
|
17
|
+
- Do not use `any` for `req.body`. Validate and narrow at the route boundary.
|
|
18
|
+
|
|
19
|
+
## Validation
|
|
20
|
+
- Validate all request input at the route boundary before passing to services.
|
|
21
|
+
- Use a schema library (Zod, Joi, express-validator). Do not write manual `if` chains for input validation.
|
|
22
|
+
- Return consistent error shape on validation failure: `{ error: string }` with appropriate status code.
|
|
23
|
+
|
|
24
|
+
## Middleware
|
|
25
|
+
- Apply middleware at the router level, not globally, unless it genuinely applies to every route.
|
|
26
|
+
- Auth middleware must reject early. Never silently pass unauthenticated requests.
|
|
27
|
+
- One concern per middleware function.
|
|
28
|
+
|
|
29
|
+
## Error handling
|
|
30
|
+
- Use a centralized error-handling middleware with 4 arguments: `(err, req, res, next) => ...`.
|
|
31
|
+
- Always call `next(err)` for errors in non-error middleware. Do not send responses directly.
|
|
32
|
+
- Register the error handler last.
|
|
33
|
+
- Return consistent error shapes from the error handler.
|
|
34
|
+
|
|
35
|
+
## Before handoff
|
|
36
|
+
- All routes validate input before calling services.
|
|
37
|
+
- Error handler is registered last and uses the 4-argument signature.
|
|
38
|
+
- No SQL or business logic in route files.
|
|
39
|
+
- `tsc --noEmit` passes with typed request/response generics.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fastify
|
|
3
|
+
description: Use for Fastify route, plugin, schema, or hook work. Pair with ts skill for TypeScript rules and sqlite-queries/sqlite-schema for database work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
Fastify route registration, plugins, request/response schemas, hooks, error handling.
|
|
8
|
+
|
|
9
|
+
## Route design
|
|
10
|
+
- Register routes via plugins, not directly on the root instance.
|
|
11
|
+
- One plugin file per feature domain.
|
|
12
|
+
- Always define request and response JSON schemas. Fastify uses them for validation and serialization.
|
|
13
|
+
- Use TypeScript generics for typed request params, body, query, and reply: `RouteGenericInterface`.
|
|
14
|
+
|
|
15
|
+
## Schema and validation
|
|
16
|
+
- Define schemas as `const` objects with `as const` or use TypeBox for TypeScript-native schemas.
|
|
17
|
+
- Validate all incoming data through the schema — do not manually validate what the schema already covers.
|
|
18
|
+
- Return consistent error shapes: `{ error: string, message: string }` for all 4xx responses.
|
|
19
|
+
|
|
20
|
+
## Plugins and decorators
|
|
21
|
+
- Use `fastify.decorate` for instance-level shared values (db, config, auth).
|
|
22
|
+
- Wrap plugins with `fastify-plugin` only when you intend to share decorators across sibling plugins.
|
|
23
|
+
- Keep plugin files thin: register routes and hooks, delegate logic to service modules.
|
|
24
|
+
|
|
25
|
+
## Error handling
|
|
26
|
+
- Use `fastify.setErrorHandler` for centralized error handling.
|
|
27
|
+
- Use `@fastify/sensible` `httpErrors` for standard HTTP errors. Do not construct error objects manually.
|
|
28
|
+
- Do not swallow errors in route handlers. Let them propagate to the error handler.
|
|
29
|
+
|
|
30
|
+
## Hooks
|
|
31
|
+
- Use `onRequest` / `preHandler` for auth and validation that applies to multiple routes.
|
|
32
|
+
- Attach hooks at the plugin scope, not globally, unless they genuinely apply everywhere.
|
|
33
|
+
|
|
34
|
+
## Before handoff
|
|
35
|
+
- All routes have request and response schemas.
|
|
36
|
+
- No business logic in route handlers — logic lives in service modules.
|
|
37
|
+
- Error handler returns consistent shape.
|
|
38
|
+
- `tsc --noEmit` passes with typed route generics.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: modules
|
|
3
|
+
description: Use when adding feature logic, growing a source file past 150 lines, or touching mixed-responsibility modules. Do not use for small localized edits within one clear module.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
- Adding feature logic.
|
|
8
|
+
- Growing a non-test source file past 150 lines.
|
|
9
|
+
- Touching a mixed-responsibility module.
|
|
10
|
+
- Introducing or refactoring a subsystem.
|
|
11
|
+
|
|
12
|
+
## Structure
|
|
13
|
+
- `src/services/<name>/` — feature and use-case orchestration.
|
|
14
|
+
- `src/routes/` — HTTP transport only.
|
|
15
|
+
- `src/infrastructure/` — SQLite, S3, Playwright, and other external adapters.
|
|
16
|
+
- `index.ts` — narrow public surface for a slice only.
|
|
17
|
+
- Entrypoints and bootstrap files must be thin.
|
|
18
|
+
|
|
19
|
+
## Boundary rules
|
|
20
|
+
- Each module has one role: entrypoint, route, service, repository, adapter, type module, or utility.
|
|
21
|
+
- If a file owns more than one role, split it before adding behavior.
|
|
22
|
+
- Routes: parse input, call services, shape responses. No SQL or storage.
|
|
23
|
+
- Services: coordinate repositories, adapters, domain rules. One use case or related workflow.
|
|
24
|
+
- Infrastructure: talks to external systems. Not hidden inside services.
|
|
25
|
+
- `utils.ts`: genuinely cross-cutting pure helpers only. No feature logic.
|
|
26
|
+
|
|
27
|
+
## Size rules
|
|
28
|
+
- Non-test source files: target `<=150` lines. `>200` requires a split or written exception.
|
|
29
|
+
- Functions: target `<=60` lines. `>80` requires a split or written reason.
|
|
30
|
+
- Prefer extracting a cohesive module over adding private helpers that only make a large file slightly smaller.
|
|
31
|
+
|
|
32
|
+
## Good decomposition
|
|
33
|
+
- `src/services/worker/run-worker.ts`, `src/services/worker/scan-page.ts`
|
|
34
|
+
- `src/infrastructure/sqlite/pages-repository.ts`, `src/infrastructure/sqlite/queue-repository.ts`
|
|
35
|
+
|
|
36
|
+
## Bad decomposition
|
|
37
|
+
- `src/worker-utils.ts`, `src/db-helpers.ts`, `src/services.ts`
|
|
38
|
+
|
|
39
|
+
## Before handoff
|
|
40
|
+
- Each changed file has one clear responsibility.
|
|
41
|
+
- Entrypoints stayed thin.
|
|
42
|
+
- Feature logic lives in a named service slice.
|
|
43
|
+
- Infrastructure is isolated from transport.
|
|
44
|
+
- No changed non-test file exceeded size rules without documentation.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan
|
|
3
|
+
description: Use after spec approval to break work into small, resumable tasks saved in plans/<slug>/tasks.md. Do not use before spec approval or for ad-hoc notes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
Only after the spec is approved.
|
|
8
|
+
|
|
9
|
+
## Process
|
|
10
|
+
1. Read the approved spec from `plans/<slug>/spec.md`.
|
|
11
|
+
2. Reuse the same `<slug>` as the spec.
|
|
12
|
+
3. Split work into the smallest tasks that each produce a reviewable diff.
|
|
13
|
+
4. Order tasks to reduce risk and unblock verification early.
|
|
14
|
+
5. For each task: list exact file paths, write a concrete acceptance check, leave `Resume:` empty.
|
|
15
|
+
6. Save to `plans/<slug>/tasks.md`. Ask for approval.
|
|
16
|
+
|
|
17
|
+
## Template
|
|
18
|
+
|
|
19
|
+
```md
|
|
20
|
+
# Task plan
|
|
21
|
+
Spec: `plans/<slug>/spec.md`
|
|
22
|
+
Next task: <task-id>
|
|
23
|
+
|
|
24
|
+
## Tasks
|
|
25
|
+
### <task-id>. <task name>
|
|
26
|
+
- Status: `todo`
|
|
27
|
+
- Scope: <one sentence — what changes and why>
|
|
28
|
+
- Touches: <exact file paths created, modified, or deleted>
|
|
29
|
+
- Depends on: <task-id or none>
|
|
30
|
+
- Acceptance: <concrete command, assertion, or observable result>
|
|
31
|
+
- Resume:
|
|
32
|
+
- Notes / risks:
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Rules
|
|
36
|
+
- Each task must be reviewable in isolation — one diff, one concern.
|
|
37
|
+
- A task that needs more than one review round is too large. Split it.
|
|
38
|
+
- Avoid bundling unrelated work.
|
|
39
|
+
- Put risky or enabling work early.
|
|
40
|
+
- Acceptance criteria must be concrete.
|
|
41
|
+
- Good: "`npm test` passes", "GET /api/health returns 200"
|
|
42
|
+
- Bad: "it works", "handles edge cases", "code is clean"
|
|
43
|
+
- Never use "correctly", "properly", or "appropriate" without a measurable check.
|
|
44
|
+
- Include migration, compatibility, or cleanup tasks when needed.
|
|
45
|
+
- Use explicit statuses: `todo`, `in_progress`, `done`.
|
|
46
|
+
- Update `Resume:` at every handoff: `<last file touched> — <what was done> — <next step to take>`.
|
|
47
|
+
- End by asking for approval and stating the save path.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react
|
|
3
|
+
description: Use for React component work. Covers component design, hooks, TypeScript, and performance patterns. Pair with ts skill for TypeScript rules and css-scss for styles.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
React component creation or modification, hooks, state management, event handling.
|
|
8
|
+
|
|
9
|
+
## Component design
|
|
10
|
+
- Functional components only. No class components.
|
|
11
|
+
- One component, one responsibility. Keep components small and focused.
|
|
12
|
+
- Co-locate component, styles, and tests in one directory.
|
|
13
|
+
- Keep JSX readable: extract complex expressions into named variables before the return.
|
|
14
|
+
- Props interface must be explicit and minimal. No catch-all `[key: string]: any`.
|
|
15
|
+
|
|
16
|
+
## Hooks
|
|
17
|
+
- Prefer built-in hooks before writing custom hooks.
|
|
18
|
+
- Extract a custom hook when the same stateful logic appears in 2+ components.
|
|
19
|
+
- One hook, one concern. Do not bundle unrelated state into one hook.
|
|
20
|
+
- Respect rules of hooks: no conditional calls, no calls outside React functions.
|
|
21
|
+
|
|
22
|
+
## TypeScript
|
|
23
|
+
- Type all props with an interface named `<ComponentName>Props`.
|
|
24
|
+
- Type event handlers explicitly: `React.ChangeEvent<HTMLInputElement>`, not `any`.
|
|
25
|
+
- Use `React.ReactNode` for children props.
|
|
26
|
+
- Do not use `as` to silence type errors on props or event targets.
|
|
27
|
+
|
|
28
|
+
## State and data flow
|
|
29
|
+
- Lift state only as far as necessary.
|
|
30
|
+
- Prefer props over context for state that belongs to a small subtree.
|
|
31
|
+
- Use context for genuinely cross-cutting state (theme, auth, locale).
|
|
32
|
+
- Do not store server data in local component state — fetch in a parent or data layer.
|
|
33
|
+
|
|
34
|
+
## Performance
|
|
35
|
+
- Wrap expensive children in `React.memo` only after profiling confirms a problem.
|
|
36
|
+
- `useCallback` and `useMemo` are optimizations — do not add preemptively.
|
|
37
|
+
- Avoid inline object / array literals in JSX props passed to memoized children.
|
|
38
|
+
- Use stable, unique keys. Do not use array indexes for reorderable lists.
|
|
39
|
+
|
|
40
|
+
## Before handoff
|
|
41
|
+
- No `useEffect` with missing dependencies (ESLint `exhaustive-deps` passes).
|
|
42
|
+
- No prop drilling past 2 levels without context or composition.
|
|
43
|
+
- All event handlers are typed.
|
|
44
|
+
- No `any` in component props or hooks.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review
|
|
3
|
+
description: Use after implementing a task to review the diff for correctness, regressions, and missing tests before handoff. Do not use for planning or verification evidence gathering.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
After implementation, before handoff.
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
- Review only the changed code and its immediate context.
|
|
11
|
+
- Do not flag issues in unchanged code unless security-critical.
|
|
12
|
+
- Adapt to the existing codebase style; do not propose rewrites for preference.
|
|
13
|
+
|
|
14
|
+
## Checklist
|
|
15
|
+
|
|
16
|
+
### Critical — must fix before merge
|
|
17
|
+
- Security: hardcoded secrets, injection vectors, unchecked auth, unsafe deserialization.
|
|
18
|
+
- Correctness: logic errors, data loss paths, race conditions, broken contracts.
|
|
19
|
+
|
|
20
|
+
### High — should fix
|
|
21
|
+
- Missing or swallowed error handling.
|
|
22
|
+
- Missing or broken tests for changed behavior.
|
|
23
|
+
- Backward-incompatible changes without migration path.
|
|
24
|
+
|
|
25
|
+
### Medium — worth fixing
|
|
26
|
+
- Boundary violations, mixed responsibilities, unclear control flow.
|
|
27
|
+
- Weak input validation at trust boundaries.
|
|
28
|
+
- Unnecessary complexity or premature abstraction.
|
|
29
|
+
|
|
30
|
+
### Low — consider
|
|
31
|
+
- Naming, readability, minor duplication.
|
|
32
|
+
- Missing docs on non-obvious behavior.
|
|
33
|
+
|
|
34
|
+
## Noise control
|
|
35
|
+
- Report only issues you are >80% confident are real problems.
|
|
36
|
+
- Skip pure style preferences that don't violate project conventions.
|
|
37
|
+
- Consolidate similar issues: "5 functions missing error handling", not 5 separate items.
|
|
38
|
+
- No padding with praise or filler.
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
```md
|
|
43
|
+
# Review
|
|
44
|
+
Verdict: <pass | changes required>
|
|
45
|
+
|
|
46
|
+
## Findings
|
|
47
|
+
- [critical] file:location — description
|
|
48
|
+
- [high] file:location — description
|
|
49
|
+
- [medium] file:location — description
|
|
50
|
+
|
|
51
|
+
## Required fixes
|
|
52
|
+
1. <fix or none>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Rules
|
|
56
|
+
- Every finding must include a file reference and a concrete description.
|
|
57
|
+
- If severity is unclear, demote rather than promote.
|
|
58
|
+
- If no issues: state verdict and briefly say why the change is acceptable.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec
|
|
3
|
+
description: Use for large, risky, or unclear work. Produces an approval-ready spec before coding. Do not use for small, local, well-defined tasks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
New systems, large features, risky or unclear changes, cross-cutting work.
|
|
8
|
+
Not for small, local, well-defined tasks — use `$task` instead.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
1. Explore relevant code, docs, and recent changes. Do not skip this.
|
|
12
|
+
2. If the request spans multiple independent subsystems, decompose first — spec one subsystem at a time.
|
|
13
|
+
3. Restate the request in plain terms.
|
|
14
|
+
4. Identify missing decisions, assumptions, risks, and boundary questions.
|
|
15
|
+
5. Ask clarifying questions one at a time. Ask only what materially affects design or implementation.
|
|
16
|
+
6. Propose 2–3 approaches with trade-offs. Pick one and explain why.
|
|
17
|
+
7. Choose or reuse a stable `<slug>` for the work item.
|
|
18
|
+
8. Draft a concise spec using the template below. No filler.
|
|
19
|
+
9. Self-review: check for placeholders, contradictions, scope creep, and gaps.
|
|
20
|
+
10. Save to `plans/<slug>/spec.md`. Ask for approval.
|
|
21
|
+
|
|
22
|
+
## Template
|
|
23
|
+
|
|
24
|
+
```md
|
|
25
|
+
# Spec: <title>
|
|
26
|
+
|
|
27
|
+
## Problem
|
|
28
|
+
## Goals
|
|
29
|
+
## Non-goals
|
|
30
|
+
## Scope
|
|
31
|
+
## Constraints
|
|
32
|
+
## Assumptions
|
|
33
|
+
## Open questions
|
|
34
|
+
## Acceptance criteria
|
|
35
|
+
## Risks / compatibility notes
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Rules
|
|
39
|
+
- Do not write implementation tasks. Do not start coding.
|
|
40
|
+
- Cut features not required by the stated problem (YAGNI).
|
|
41
|
+
- Acceptance criteria must be explicit and testable.
|
|
42
|
+
- Bad: "handles errors correctly"
|
|
43
|
+
- Good: "returns 400 with `{ error: string }` on invalid input"
|
|
44
|
+
- Resolve or explicitly defer all open questions before presenting the spec.
|
|
45
|
+
- Reuse an existing slug when resuming work on the same item.
|
|
46
|
+
- Call out compatibility, migration, security, and operational concerns when relevant.
|
|
47
|
+
- End by asking for approval and stating the save path.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sqlite-queries
|
|
3
|
+
description: Use when editing better-sqlite3 queries, repositories, transactions, statements, or row mapping. Do not use for schema, migration, pragma, or index changes — use sqlite-schema instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
Query code, repositories, transactions, statements, and data access helpers.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
- Keep SQL close to the data-access layer; do not leak it across unrelated modules.
|
|
11
|
+
- Prefer explicit SQL over hidden query builders unless the project already standardizes one.
|
|
12
|
+
- Use prepared statements; do not interpolate untrusted values into SQL.
|
|
13
|
+
- Keep transactions small, deliberate, and scoped to a single consistency need.
|
|
14
|
+
- Return stable shapes from repositories; do not expose raw DB rows carelessly.
|
|
15
|
+
- Normalize nullability, defaults, and type conversion at the boundary.
|
|
16
|
+
- Avoid N+1 query patterns and repeated statement creation in hot paths.
|
|
17
|
+
- Make read/write intent obvious in naming and structure.
|
|
18
|
+
- Handle not-found, conflict, and constraint errors explicitly.
|
|
19
|
+
- Keep connection setup, pragmas, and repository logic separate.
|
|
20
|
+
|
|
21
|
+
## Before handoff
|
|
22
|
+
- Untrusted input is parameterized.
|
|
23
|
+
- Transaction boundaries are correct.
|
|
24
|
+
- Returned shapes are stable.
|
|
25
|
+
- Hot-path query behavior is reasonable.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sqlite-schema
|
|
3
|
+
description: Use when editing better-sqlite3 tables, columns, constraints, indexes, pragmas, or migrations. Do not use for query, transaction, or repository logic — use sqlite-queries instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
Tables, columns, constraints, indexes, pragmas, and migrations.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
- Keep schema changes backward-compatible unless the approved spec says otherwise.
|
|
11
|
+
- Prefer additive changes first; treat destructive changes as explicit migration work.
|
|
12
|
+
- Define primary keys, unique constraints, foreign keys, and defaults deliberately.
|
|
13
|
+
- Add indexes only for real query patterns; remove speculative indexes.
|
|
14
|
+
- Make migrations deterministic, idempotent when practical, and easy to review.
|
|
15
|
+
- Keep migration logic separate from request handling and app startup orchestration.
|
|
16
|
+
- Document required pragmas and connection assumptions explicitly.
|
|
17
|
+
- Preserve existing data unless a migration explicitly changes or drops it.
|
|
18
|
+
- Test schema changes against realistic existing data states when possible.
|
|
19
|
+
|
|
20
|
+
## Before handoff
|
|
21
|
+
- Migration path is clear.
|
|
22
|
+
- Roll-forward behavior is understood.
|
|
23
|
+
- Indexes and constraints match actual usage.
|
|
24
|
+
- Compatibility and data risks are named.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ts
|
|
3
|
+
description: Use for Node.js or TypeScript code changes. Do not use for SQLite-specific rules — pair with sqlite-schema or sqlite-queries instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
Node.js or TypeScript code changes.
|
|
8
|
+
|
|
9
|
+
## Type safety
|
|
10
|
+
- Prefer TypeScript for new code. Use explicit types, narrow unions, small interfaces.
|
|
11
|
+
- NodeNext ESM: keep `.js` in relative imports inside `.ts` files.
|
|
12
|
+
- No `any` without a written reason. Prefer `unknown` + type guards.
|
|
13
|
+
- No Enums. Use union types or `as const` objects.
|
|
14
|
+
- No `as` assertions on external data. Parse at runtime (Zod, superstruct, or manual checks).
|
|
15
|
+
- No `@ts-ignore` or `@ts-expect-error` without an explanatory comment.
|
|
16
|
+
- No inline ESLint rule disables. Fix the underlying issue.
|
|
17
|
+
- Use `import type` for type-only imports.
|
|
18
|
+
|
|
19
|
+
## Boundaries and errors
|
|
20
|
+
- Validate runtime input at process, HTTP, queue, CLI, and storage boundaries.
|
|
21
|
+
- Handle errors deliberately — do not swallow or over-generalize.
|
|
22
|
+
- Prefer typed error results over thrown exceptions for expected failures.
|
|
23
|
+
- Avoid magic objects with implicit shapes; use stable contracts.
|
|
24
|
+
|
|
25
|
+
## Module design
|
|
26
|
+
- Keep transport, domain, infrastructure, and data access code separate.
|
|
27
|
+
- Keep modules small and focused. No utility dumping grounds.
|
|
28
|
+
- Use `contracts.ts` for exported or cross-module boundary types.
|
|
29
|
+
- No wrappers that only forward arguments or rename obvious steps.
|
|
30
|
+
- In entrypoints: one exported start function, minimal helpers.
|
|
31
|
+
- Prefer role-local ENV parsing over shared config abstractions until duplication is concrete.
|
|
32
|
+
- Prefer plain objects over interface hierarchies when values stay inside one module.
|
|
33
|
+
|
|
34
|
+
## Control flow
|
|
35
|
+
- Prefer `async`/`await`. Keep control flow visible.
|
|
36
|
+
- Use `const` by default, `let` when reassignment is needed.
|
|
37
|
+
- Prefer standard library or existing project tools over new dependencies.
|
|
38
|
+
|
|
39
|
+
## Before handoff
|
|
40
|
+
- `tsc --noEmit` passes (or equivalent typecheck script).
|
|
41
|
+
- Linter passes without new suppressions.
|
|
42
|
+
- Types are explicit. Control flow and error paths are readable.
|
|
43
|
+
- Boundaries and responsibilities are clear. New abstractions are necessary and justified.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verify
|
|
3
|
+
description: Use after code review to confirm task completion with evidence before handoff. Do not use as a substitute for implementation or code review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
After review, before handoff.
|
|
8
|
+
|
|
9
|
+
## Process
|
|
10
|
+
1. Re-read the task acceptance criteria.
|
|
11
|
+
2. Map each criterion to evidence in code, tests, or observed behavior.
|
|
12
|
+
3. Run relevant checks.
|
|
13
|
+
4. Record anything not verified and why.
|
|
14
|
+
|
|
15
|
+
## Checks to run (use what is relevant)
|
|
16
|
+
- Tests
|
|
17
|
+
- Lint / formatting
|
|
18
|
+
- Type checks / build
|
|
19
|
+
- Contract or API checks
|
|
20
|
+
- Migration or config validation
|
|
21
|
+
- Manual behavior verification for changed paths
|
|
22
|
+
|
|
23
|
+
## Output
|
|
24
|
+
|
|
25
|
+
```md
|
|
26
|
+
# Verification
|
|
27
|
+
## Acceptance criteria
|
|
28
|
+
- <criterion> — <evidence>
|
|
29
|
+
|
|
30
|
+
## Checks run
|
|
31
|
+
- <command or check> — <result>
|
|
32
|
+
|
|
33
|
+
## Unverified items
|
|
34
|
+
- <none or item + reason>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Rules
|
|
38
|
+
- Do not claim verified without evidence.
|
|
39
|
+
- Name skipped checks explicitly.
|
|
40
|
+
- Do not mark the task done if verification is incomplete or failing.
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
Repository-wide workflow rules. Brief, strict, explicit.
|
|
5
|
+
Use skills for reusable procedures. Use nested `AGENTS.md` for subtree overrides.
|
|
6
|
+
All tasks, plans, and specs must be written in English.
|
|
7
|
+
|
|
8
|
+
## Commands
|
|
9
|
+
|
|
10
|
+
### $plan <description | path to spec file>
|
|
11
|
+
Use for new systems, large features, risky or unclear work.
|
|
12
|
+
|
|
13
|
+
Sequence:
|
|
14
|
+
1. Read description or file.
|
|
15
|
+
2. Use `spec` skill to produce an approval-ready spec.
|
|
16
|
+
3. **STOP. Wait for user approval.**
|
|
17
|
+
4. Use `plan` skill to produce a task plan.
|
|
18
|
+
5. **STOP. Wait for user approval.**
|
|
19
|
+
6. Implement the first task.
|
|
20
|
+
7. Use `review` skill.
|
|
21
|
+
8. Use `verify` skill.
|
|
22
|
+
9. Handoff.
|
|
23
|
+
10. **STOP. Wait for user approval before starting the next task.**
|
|
24
|
+
|
|
25
|
+
### $task <description>
|
|
26
|
+
Use for small, local, well-defined changes with low risk.
|
|
27
|
+
|
|
28
|
+
Sequence:
|
|
29
|
+
1. Restate the task.
|
|
30
|
+
2. Short plan.
|
|
31
|
+
3. Implement.
|
|
32
|
+
4. Use `review` skill.
|
|
33
|
+
5. Use `verify` skill.
|
|
34
|
+
6. Handoff.
|
|
35
|
+
|
|
36
|
+
Rule: if hidden complexity appears, switch to `$plan` immediately.
|
|
37
|
+
|
|
38
|
+
### $fix <description>
|
|
39
|
+
Same as `$task` with bug-fix framing. Identify root cause first. Minimal change only.
|
|
40
|
+
|
|
41
|
+
### $resume
|
|
42
|
+
Continue interrupted work in a new session with clean context.
|
|
43
|
+
|
|
44
|
+
Sequence:
|
|
45
|
+
1. Find the first `in_progress` task across all `plans/*/tasks.md`.
|
|
46
|
+
2. Read its `Resume:` field. If empty, read `Scope` and `Touches`.
|
|
47
|
+
3. If no `in_progress` task exists, take the first `todo` task.
|
|
48
|
+
4. Continue implementation from that point.
|
|
49
|
+
5. Follow the full-flow handoff sequence for the current task.
|
|
50
|
+
|
|
51
|
+
### $status
|
|
52
|
+
Show the state of all active plans.
|
|
53
|
+
|
|
54
|
+
Sequence:
|
|
55
|
+
1. Read all `plans/*/tasks.md`.
|
|
56
|
+
2. List each plan: slug, current task, status of all tasks.
|
|
57
|
+
|
|
58
|
+
### $done
|
|
59
|
+
Trigger completion sequence for the current in-progress task.
|
|
60
|
+
|
|
61
|
+
Sequence:
|
|
62
|
+
1. Use `review` skill.
|
|
63
|
+
2. Use `verify` skill.
|
|
64
|
+
3. Handoff.
|
|
65
|
+
|
|
66
|
+
## Stop points
|
|
67
|
+
Wait for user approval at:
|
|
68
|
+
- After spec (`$plan` flow).
|
|
69
|
+
- After task plan (`$plan` flow).
|
|
70
|
+
- After each task handoff (`$plan` flow).
|
|
71
|
+
|
|
72
|
+
## Workflow artifacts
|
|
73
|
+
Persist full-flow artifacts so work can resume across sessions.
|
|
74
|
+
|
|
75
|
+
Required paths:
|
|
76
|
+
- `plans/<slug>/spec.md` — approved specification.
|
|
77
|
+
- `plans/<slug>/tasks.md` — approved task plan with current statuses and Resume fields.
|
|
78
|
+
|
|
79
|
+
Rules:
|
|
80
|
+
- One stable `<slug>` per work item. Reuse it throughout.
|
|
81
|
+
- Keep `tasks.md` current after each handoff.
|
|
82
|
+
- Update `Resume:` in the active task at every handoff: `<last file touched> — <what was done> — <next step>`.
|
|
83
|
+
- Use explicit statuses: `todo`, `in_progress`, `done`.
|
|
84
|
+
- The next task to resume must be unambiguous.
|
|
85
|
+
|
|
86
|
+
## Definition of Ready
|
|
87
|
+
Start implementation only when all are true:
|
|
88
|
+
- Objective is clear.
|
|
89
|
+
- Scope and boundaries are clear.
|
|
90
|
+
- Constraints and compatibility expectations are clear.
|
|
91
|
+
- Acceptance criteria are explicit.
|
|
92
|
+
- Affected files, modules, or subsystems are known, or assumptions are stated.
|
|
93
|
+
- Open questions that materially affect implementation are resolved or explicitly documented.
|
|
94
|
+
|
|
95
|
+
## Definition of Done
|
|
96
|
+
A task is done only when all are true:
|
|
97
|
+
- Acceptance criteria are satisfied.
|
|
98
|
+
- Changes are minimal, coherent, and scoped to the task.
|
|
99
|
+
- Review found no unresolved critical issues.
|
|
100
|
+
- Relevant verification was completed, or any skipped checks are named with reason.
|
|
101
|
+
- Errors and edge cases introduced by the change are handled deliberately.
|
|
102
|
+
- Backward compatibility is preserved unless the spec explicitly changes it.
|
|
103
|
+
- Any required docs, config notes, or migration notes are updated.
|
|
104
|
+
|
|
105
|
+
## Engineering rules
|
|
106
|
+
- Prefer the smallest coherent change that satisfies the task.
|
|
107
|
+
- Follow existing project conventions unless the task explicitly includes a cleanup.
|
|
108
|
+
- Validate external input at the boundary.
|
|
109
|
+
- Keep control flow and error handling explicit.
|
|
110
|
+
- Avoid speculative abstractions, single-use wrappers, and unnecessary indirection.
|
|
111
|
+
- Add or update tests when behavior, contracts, or edge cases change.
|
|
112
|
+
- Prefer feature- or service-oriented slices over large multi-purpose modules.
|
|
113
|
+
- Non-test source files: target `<=150` lines. Exceed `200` only with documented reason.
|
|
114
|
+
- Test files: target `<=250` lines. Exceed `350` only with documented reason.
|
|
115
|
+
- Keep reusable workflow detail in skills. Keep `AGENTS.md` at the policy level.
|
|
116
|
+
- If a change alters workflow, commands, artifact formats, or architecture rules, update the affected skills in the same change.
|
|
117
|
+
|
|
118
|
+
## Required skills
|
|
119
|
+
- Large or unclear work: use `spec` first.
|
|
120
|
+
- After spec approval: use `plan`.
|
|
121
|
+
- After implementation: use `review`.
|
|
122
|
+
- Before handoff: use `verify`.
|
|
123
|
+
- TypeScript work that adds feature logic or grows a file past `150` lines: use `modules`.
|
|
124
|
+
|
|
125
|
+
## Stack-specific skills
|
|
126
|
+
- Node.js / TypeScript: use `ts`.
|
|
127
|
+
- SQLite schema, migrations, pragmas, indexes: use `sqlite-schema`.
|
|
128
|
+
- SQLite queries, transactions, repositories: use `sqlite-queries`.
|
|
129
|
+
- React components, hooks, state: use `react`.
|
|
130
|
+
- CSS / SCSS styles: use `css-scss`.
|
|
131
|
+
- Fastify routes, plugins, schemas: use `fastify`.
|
|
132
|
+
- Express routes, middleware, routers: use `express`.
|
|
133
|
+
|
|
134
|
+
## Handoff format
|
|
135
|
+
Use this format exactly:
|
|
136
|
+
|
|
137
|
+
```md
|
|
138
|
+
Flow: <plan|task|fix>
|
|
139
|
+
Task: <task name or short summary>
|
|
140
|
+
Summary:
|
|
141
|
+
- <what changed>
|
|
142
|
+
|
|
143
|
+
Files changed:
|
|
144
|
+
- <path> — <why>
|
|
145
|
+
|
|
146
|
+
Review:
|
|
147
|
+
- <pass/fail + key findings>
|
|
148
|
+
|
|
149
|
+
Verification:
|
|
150
|
+
- <checks run>
|
|
151
|
+
- <result>
|
|
152
|
+
|
|
153
|
+
Risks / follow-ups:
|
|
154
|
+
- <none or concrete item>
|
|
155
|
+
```
|
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# codex-workflow
|
|
2
|
+
|
|
3
|
+
Opinionated workflow for [Codex CLI](https://github.com/openai/codex) built for **Node.js / TypeScript fullstack applications**. Enforces a consistent development process across your backend (Fastify, Express, SQLite) and frontend (React, CSS/SCSS) projects.
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
Codex is powerful but stateless — every session starts fresh with no memory of what was planned or half-finished. Without structure, it improvises. This package gives Codex a shared rulebook: when to plan, when to just do, how to resume interrupted work, and how to hand off cleanly.
|
|
8
|
+
|
|
9
|
+
One source of truth. Install once per project, update from a single place.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx codex-workflow init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Copies `AGENTS.md` and `.agents/skills/` into your project. Codex picks them up automatically on the next session.
|
|
18
|
+
|
|
19
|
+
To update to the latest version:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx codex-workflow@latest init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
For projects that only need core workflow skills (no stack-specific rules):
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx codex-workflow init --no-stack-skills
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
Use these at the start of any Codex message:
|
|
34
|
+
|
|
35
|
+
| Command | When to use |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `$plan <description or spec file>` | New service, large feature, unclear or risky work |
|
|
38
|
+
| `$task <description>` | Small, well-defined change |
|
|
39
|
+
| `$fix <description>` | Bug fix |
|
|
40
|
+
| `$resume` | Continue interrupted work in a new session |
|
|
41
|
+
| `$status` | See what's in progress across all active plans |
|
|
42
|
+
| `$done` | Current task is ready — trigger review, verify, handoff |
|
|
43
|
+
|
|
44
|
+
## Example
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
$plan add user authentication with JWT
|
|
48
|
+
```
|
|
49
|
+
Codex produces a spec → you approve → Codex produces a task plan → you approve → implementation starts one task at a time.
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
$task add input validation to POST /api/users
|
|
53
|
+
```
|
|
54
|
+
Codex plans, implements, reviews, verifies, and hands off in one shot.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
$resume
|
|
58
|
+
```
|
|
59
|
+
New session, clean context. Codex finds the interrupted task, reads where it stopped, and continues.
|
|
60
|
+
|
|
61
|
+
## Skills included
|
|
62
|
+
|
|
63
|
+
| Skill | Use for |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `spec` | Writing approval-ready specs for large or unclear work |
|
|
66
|
+
| `plan` | Breaking approved specs into small, resumable tasks |
|
|
67
|
+
| `review` | Code review with severity levels before handoff |
|
|
68
|
+
| `verify` | Confirming completion with evidence |
|
|
69
|
+
| `ts` | Node.js / TypeScript type safety and module design |
|
|
70
|
+
| `modules` | Service boundaries and file size rules |
|
|
71
|
+
| `react` | React components, hooks, TypeScript, performance |
|
|
72
|
+
| `css-scss` | BEM naming, SCSS nesting, responsive patterns |
|
|
73
|
+
| `fastify` | Routes, plugins, schemas, error handling |
|
|
74
|
+
| `express` | Routers, middleware, validation, error handling |
|
|
75
|
+
| `sqlite-schema` | Migrations, indexes, constraints |
|
|
76
|
+
| `sqlite-queries` | Repositories, transactions, prepared statements |
|
|
77
|
+
|
|
78
|
+
## How it works
|
|
79
|
+
|
|
80
|
+
`AGENTS.md` in your project root defines the rules Codex follows. Skills in `.agents/skills/` are reusable procedures (spec writing, code review, verification) that Codex loads on demand. Planning artifacts live in `plans/<slug>/` — a spec and a task list that persist across sessions so nothing is lost when context resets.
|
package/bin/init.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
|
|
8
|
+
const CORE_SKILLS = ['spec', 'plan', 'review', 'verify'];
|
|
9
|
+
const STACK_SKILLS = ['ts', 'modules', 'sqlite-queries', 'sqlite-schema', 'react', 'css-scss', 'fastify', 'express'];
|
|
10
|
+
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const subcommand = args.find(a => !a.startsWith('-'));
|
|
13
|
+
|
|
14
|
+
if (!subcommand || subcommand !== 'init') {
|
|
15
|
+
console.log('Usage: npx codex-workflow init [--no-stack-skills]');
|
|
16
|
+
process.exit(subcommand ? 1 : 0);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const noStackSkills = args.includes('--no-stack-skills');
|
|
20
|
+
const forceYes = !process.stdin.isTTY;
|
|
21
|
+
const targetDir = process.cwd();
|
|
22
|
+
const sourceDir = path.join(__dirname, '..');
|
|
23
|
+
const skillsToCopy = noStackSkills ? CORE_SKILLS : [...CORE_SKILLS, ...STACK_SKILLS];
|
|
24
|
+
|
|
25
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
26
|
+
|
|
27
|
+
function ask(question) {
|
|
28
|
+
return new Promise(resolve => rl.question(question, resolve));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function copyFile(src, dest) {
|
|
32
|
+
if (fs.existsSync(dest)) {
|
|
33
|
+
if (forceYes) {
|
|
34
|
+
console.log(` overwriting ${path.relative(targetDir, dest)} (non-interactive)`);
|
|
35
|
+
} else {
|
|
36
|
+
const answer = await ask(` Overwrite ${path.relative(targetDir, dest)}? [y/N] `);
|
|
37
|
+
if (answer.trim().toLowerCase() !== 'y') {
|
|
38
|
+
console.log(` skipped ${path.relative(targetDir, dest)}`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
44
|
+
fs.copyFileSync(src, dest);
|
|
45
|
+
console.log(` copied ${path.relative(targetDir, dest)}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function copyDir(src, dest) {
|
|
49
|
+
if (!fs.existsSync(src)) {
|
|
50
|
+
console.warn(` warn: source not found, skipping ${src}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
54
|
+
const srcPath = path.join(src, entry.name);
|
|
55
|
+
const destPath = path.join(dest, entry.name);
|
|
56
|
+
if (entry.isDirectory()) {
|
|
57
|
+
await copyDir(srcPath, destPath);
|
|
58
|
+
} else {
|
|
59
|
+
await copyFile(srcPath, destPath);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function main() {
|
|
65
|
+
console.log('codex-workflow init\n');
|
|
66
|
+
|
|
67
|
+
await copyFile(
|
|
68
|
+
path.join(sourceDir, 'AGENTS.md'),
|
|
69
|
+
path.join(targetDir, 'AGENTS.md')
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
for (const skill of skillsToCopy) {
|
|
73
|
+
await copyDir(
|
|
74
|
+
path.join(sourceDir, '.agents', 'skills', skill),
|
|
75
|
+
path.join(targetDir, '.agents', 'skills', skill)
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
console.log('\nDone.');
|
|
80
|
+
console.log(`Skills installed: ${skillsToCopy.join(', ')}`);
|
|
81
|
+
rl.close();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
main().catch(err => {
|
|
85
|
+
console.error(err.message);
|
|
86
|
+
rl.close();
|
|
87
|
+
process.exit(1);
|
|
88
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codex-workflow",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Opinionated workflow for Codex CLI — consistent dev process across Node.js projects",
|
|
5
|
+
"bin": {
|
|
6
|
+
"codex-workflow": "bin/init.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"AGENTS.md",
|
|
10
|
+
".agents/",
|
|
11
|
+
"bin/"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"codex",
|
|
15
|
+
"workflow",
|
|
16
|
+
"agents",
|
|
17
|
+
"ai",
|
|
18
|
+
"openai"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"release:patch": "npm version patch && npm publish --access public",
|
|
22
|
+
"release:minor": "npm version minor && npm publish --access public",
|
|
23
|
+
"release:major": "npm version major && npm publish --access public"
|
|
24
|
+
},
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
}
|
|
29
|
+
}
|