agentic-forge 0.0.0 → 0.7.1
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/LICENSE +21 -21
- package/README.md +64 -24
- package/{src/claude → dist/authoring}/.claude/skills/workflow-builder/SKILL.md +2 -2
- package/{src/claude → dist/authoring}/.claude/skills/workflow-builder/references/REFERENCE.md +9 -3
- package/{src/claude → dist/authoring}/.claude/skills/workflow-builder/references/workflow-example.yaml +15 -8
- package/dist/checkpoints/manager.d.ts +5 -0
- package/dist/checkpoints/manager.js +87 -0
- package/dist/checkpoints/manager.js.map +1 -0
- package/{src → dist}/claude/.claude/skills/analyze/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/create-checkpoint/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/create-log/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/fix-analyze/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/git-branch/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/git-commit/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/git-pr/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/sdlc-plan/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/sdlc-review/SKILL.md +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/authoring-dir.d.ts +2 -0
- package/dist/commands/authoring-dir.js +9 -0
- package/dist/commands/authoring-dir.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +2 -0
- package/dist/commands/config-cmd.js +30 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/{src/commands/index.ts → dist/commands/index.d.ts} +2 -10
- package/dist/commands/index.js +14 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +83 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/release-notes.d.ts +5 -0
- package/dist/commands/release-notes.js +68 -0
- package/dist/commands/release-notes.js.map +1 -0
- package/dist/commands/resume.d.ts +5 -0
- package/dist/commands/resume.js +79 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/run.d.ts +27 -0
- package/dist/commands/run.js +243 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/shortcuts.d.ts +2 -0
- package/dist/commands/shortcuts.js +11 -0
- package/dist/commands/shortcuts.js.map +1 -0
- package/dist/commands/skills-dir.d.ts +2 -0
- package/dist/commands/skills-dir.js +9 -0
- package/dist/commands/skills-dir.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.js +99 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.js +65 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.js +26 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/workflows.d.ts +4 -0
- package/dist/commands/workflows.js +111 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +110 -0
- package/dist/config.js.map +1 -0
- package/dist/console.d.ts +103 -0
- package/dist/console.js +670 -0
- package/dist/console.js.map +1 -0
- package/dist/executor.d.ts +27 -0
- package/dist/executor.js +236 -0
- package/dist/executor.js.map +1 -0
- package/dist/git/worktree.d.ts +23 -0
- package/dist/git/worktree.js +170 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/logging/logger.d.ts +27 -0
- package/dist/logging/logger.js +69 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/orchestrator.d.ts +44 -0
- package/dist/orchestrator.js +587 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/parser.d.ts +17 -0
- package/dist/parser.js +184 -0
- package/dist/parser.js.map +1 -0
- package/dist/progress.d.ts +29 -0
- package/dist/progress.js +275 -0
- package/dist/progress.js.map +1 -0
- package/dist/ralph-loop.d.ts +26 -0
- package/dist/ralph-loop.js +194 -0
- package/dist/ralph-loop.js.map +1 -0
- package/dist/renderer.d.ts +15 -0
- package/dist/renderer.js +123 -0
- package/dist/renderer.js.map +1 -0
- package/dist/runner.d.ts +84 -0
- package/dist/runner.js +529 -0
- package/dist/runner.js.map +1 -0
- package/dist/signal-manager.d.ts +16 -0
- package/dist/signal-manager.js +50 -0
- package/dist/signal-manager.js.map +1 -0
- package/dist/steps/base.d.ts +28 -0
- package/dist/steps/base.js +23 -0
- package/dist/steps/base.js.map +1 -0
- package/dist/steps/conditional-step.d.ts +12 -0
- package/dist/steps/conditional-step.js +106 -0
- package/dist/steps/conditional-step.js.map +1 -0
- package/{src/steps/index.ts → dist/steps/index.d.ts} +1 -9
- package/dist/steps/index.js +8 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/parallel-step.d.ts +11 -0
- package/dist/steps/parallel-step.js +166 -0
- package/dist/steps/parallel-step.js.map +1 -0
- package/dist/steps/prompt-step.d.ts +8 -0
- package/dist/steps/prompt-step.js +94 -0
- package/dist/steps/prompt-step.js.map +1 -0
- package/dist/steps/ralph-loop-step.d.ts +8 -0
- package/dist/steps/ralph-loop-step.js +132 -0
- package/dist/steps/ralph-loop-step.js.map +1 -0
- package/dist/steps/serial-step.d.ts +10 -0
- package/dist/steps/serial-step.js +57 -0
- package/dist/steps/serial-step.js.map +1 -0
- package/dist/types.d.ts +118 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -2
- package/.gitattributes +0 -24
- package/.github/workflows/ci.yml +0 -70
- package/.markdownlint-cli2.jsonc +0 -16
- package/.prettierignore +0 -3
- package/.prettierrc +0 -6
- package/.vscode/agentic-forge.code-workspace +0 -26
- package/CHANGELOG.md +0 -100
- package/CLAUDE.md +0 -158
- package/CONTRIBUTING.md +0 -152
- package/biome.json +0 -21
- package/scripts/copy-assets.js +0 -21
- package/src/checkpoints/manager.ts +0 -119
- package/src/cli.ts +0 -182
- package/src/commands/config-cmd.ts +0 -28
- package/src/commands/init.ts +0 -96
- package/src/commands/release-notes.ts +0 -85
- package/src/commands/resume.ts +0 -103
- package/src/commands/run.ts +0 -234
- package/src/commands/shortcuts.ts +0 -11
- package/src/commands/skills-dir.ts +0 -11
- package/src/commands/status.ts +0 -112
- package/src/commands/update.ts +0 -64
- package/src/commands/version.ts +0 -27
- package/src/commands/workflows.ts +0 -129
- package/src/config.ts +0 -129
- package/src/console.ts +0 -790
- package/src/executor.ts +0 -354
- package/src/git/worktree.ts +0 -236
- package/src/logging/logger.ts +0 -95
- package/src/orchestrator.ts +0 -815
- package/src/parser.ts +0 -225
- package/src/progress.ts +0 -306
- package/src/ralph-loop.ts +0 -260
- package/src/renderer.ts +0 -164
- package/src/runner.ts +0 -634
- package/src/signal-manager.ts +0 -55
- package/src/steps/base.ts +0 -71
- package/src/steps/conditional-step.ts +0 -144
- package/src/steps/parallel-step.ts +0 -213
- package/src/steps/prompt-step.ts +0 -121
- package/src/steps/ralph-loop-step.ts +0 -186
- package/src/steps/serial-step.ts +0 -84
- package/src/types.ts +0 -141
- package/tests/config.test.ts +0 -219
- package/tests/console.test.ts +0 -506
- package/tests/executor.test.ts +0 -339
- package/tests/init.test.ts +0 -86
- package/tests/logger.test.ts +0 -110
- package/tests/parser.test.ts +0 -290
- package/tests/progress.test.ts +0 -345
- package/tests/ralph-loop.test.ts +0 -418
- package/tests/renderer.test.ts +0 -350
- package/tests/runner.test.ts +0 -497
- package/tests/setup.test.ts +0 -7
- package/tests/signal-manager.test.ts +0 -26
- package/tests/steps.test.ts +0 -412
- package/tests/worktree.test.ts +0 -411
- package/tsconfig.json +0 -18
- package/vitest.config.ts +0 -8
- /package/{src → dist}/agents/explorer.md +0 -0
- /package/{src → dist}/agents/reviewer.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/bug.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/debt.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/doc.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/security.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/style.md +0 -0
- /package/{src → dist}/claude/.claude/skills/orchestrate/SKILL.md +0 -0
- /package/{src → dist}/claude/.claude/skills/sdlc-plan/references/bug.md +0 -0
- /package/{src → dist}/claude/.claude/skills/sdlc-plan/references/chore.md +0 -0
- /package/{src → dist}/claude/.claude/skills/sdlc-plan/references/feature.md +0 -0
- /package/{src → dist}/prompts/agentic-system.md +0 -0
- /package/{src → dist}/templates/analysis/bug.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/debt.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/doc.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/security.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/style.md.j2 +0 -0
- /package/{src → dist}/templates/analysis-summary.md.j2 +0 -0
- /package/{src → dist}/templates/checkpoint.md.j2 +0 -0
- /package/{src → dist}/templates/implementation-report.md.j2 +0 -0
- /package/{src → dist}/templates/memory.md.j2 +0 -0
- /package/{src → dist}/templates/plan-bug.md.j2 +0 -0
- /package/{src → dist}/templates/plan-chore.md.j2 +0 -0
- /package/{src → dist}/templates/plan-feature.md.j2 +0 -0
- /package/{src → dist}/templates/progress.json.j2 +0 -0
- /package/{src → dist}/templates/ralph-report.md.j2 +0 -0
- /package/{src → dist}/workflows/analyze-codebase-merge.yaml +0 -0
- /package/{src → dist}/workflows/analyze-codebase.yaml +0 -0
- /package/{src → dist}/workflows/analyze-single.yaml +0 -0
- /package/{src → dist}/workflows/demo.yaml +0 -0
- /package/{src → dist}/workflows/one-shot.yaml +0 -0
- /package/{src → dist}/workflows/plan-build-review.yaml +0 -0
- /package/{src → dist}/workflows/ralph-loop.yaml +0 -0
package/CLAUDE.md
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# Claude Context: agentic-forge Repository
|
|
2
|
-
|
|
3
|
-
## Project Overview
|
|
4
|
-
|
|
5
|
-
Agentic Forge is a TypeScript/Node.js package that provides YAML-based workflow orchestration for Claude Code. It bundles skills, agents, and prompts as package data, enabling autonomous multi-step task execution.
|
|
6
|
-
|
|
7
|
-
## Purpose
|
|
8
|
-
|
|
9
|
-
The agentic-forge repository aims to:
|
|
10
|
-
|
|
11
|
-
1. **Share Best Practices**: Provide battle-tested automation patterns and workflows
|
|
12
|
-
2. **Accelerate Development**: Offer ready-to-use components that solve common problems
|
|
13
|
-
3. **Automate Development**: Offer reusable and flexible workflows that enable the automation of development tasks during the whole SDLC life-cycle
|
|
14
|
-
|
|
15
|
-
## Repository Structure
|
|
16
|
-
|
|
17
|
-
### `src/`
|
|
18
|
-
|
|
19
|
-
TypeScript source code for the CLI and workflow orchestration engine.
|
|
20
|
-
|
|
21
|
-
#### `agents/`
|
|
22
|
-
|
|
23
|
-
Bundled sub-agent configurations for specialized, autonomous task execution (`explorer.md`, `reviewer.md`). Agents should be self-contained and focused on a specific domain or task.
|
|
24
|
-
|
|
25
|
-
#### `claude/.claude/skills/`
|
|
26
|
-
|
|
27
|
-
Bundled skills loaded via `--add-dir`. Skills are reusable Claude Code slash commands. Each skill is a directory in kebab-case containing a `SKILL.md` file.
|
|
28
|
-
|
|
29
|
-
#### `commands/`
|
|
30
|
-
|
|
31
|
-
CLI command implementations (`run`, `init`, `update`, `skills-dir`, `workflows`, etc.).
|
|
32
|
-
|
|
33
|
-
#### `prompts/`
|
|
34
|
-
|
|
35
|
-
System prompt templates used by the workflow runner.
|
|
36
|
-
|
|
37
|
-
#### `steps/`
|
|
38
|
-
|
|
39
|
-
Workflow step handlers (prompt, parallel, serial, conditional, ralph-loop).
|
|
40
|
-
|
|
41
|
-
#### `workflows/`
|
|
42
|
-
|
|
43
|
-
Bundled YAML workflow definitions (7 workflows: `plan-build-review`, `one-shot`, `ralph-loop`, `analyze-codebase`, `analyze-codebase-merge`, `analyze-single`, `demo`).
|
|
44
|
-
|
|
45
|
-
### `tests/`
|
|
46
|
-
|
|
47
|
-
Vitest test suite for all TypeScript source code.
|
|
48
|
-
|
|
49
|
-
### `agentic/`
|
|
50
|
-
|
|
51
|
-
Runtime directory for workflow configuration, outputs, and logs.
|
|
52
|
-
|
|
53
|
-
## Development Guidelines
|
|
54
|
-
|
|
55
|
-
### Language Style
|
|
56
|
-
|
|
57
|
-
Use US English spelling in all code, comments, documentation, and UI strings when a word has both UK and US variants (e.g., "analyze" not "analyse", "color" not "colour", "canceled" not "cancelled").
|
|
58
|
-
|
|
59
|
-
### Naming Conventions
|
|
60
|
-
|
|
61
|
-
- **Agents**: Use descriptive names with domain prefix (e.g., `explorer.md`, `reviewer.md`)
|
|
62
|
-
- **Skills**: Directory name in kebab-case with `SKILL.md` inside (e.g., `analyze/SKILL.md`, `git-commit/SKILL.md`)
|
|
63
|
-
- **Workflows**: Descriptive kebab-case YAML files (e.g., `plan-build-review.yaml`)
|
|
64
|
-
|
|
65
|
-
### Documentation Guidelines
|
|
66
|
-
|
|
67
|
-
- **Character encoding**: Code files must use ASCII only. Documentation and markdown files (skills, agents, READMEs) may use minimal emojis where they add clarity (e.g., checkmarks, robot emoji for Claude attribution). Avoid decorative emoji use.
|
|
68
|
-
- **Workflow diagrams**: Use arrow notation (`->`) for workflow documentation instead of long multi-line ASCII boxes. Example: `Plan -> Implement -> Review -> Output` is preferred over complex box diagrams
|
|
69
|
-
|
|
70
|
-
### File Formats
|
|
71
|
-
|
|
72
|
-
- **Agents**: Markdown (`.md`) files in `src/agents/`
|
|
73
|
-
- **Skills**: `SKILL.md` files in skill directories: `src/claude/.claude/skills/<skill-name>/SKILL.md`
|
|
74
|
-
- **Workflows**: YAML files in `src/workflows/`
|
|
75
|
-
- **TypeScript Source**: TypeScript modules in `src/` with root `package.json`
|
|
76
|
-
|
|
77
|
-
**Placeholder Convention:**
|
|
78
|
-
|
|
79
|
-
Prompt templates use **Mustache/Handlebars-style placeholders** with the following format:
|
|
80
|
-
|
|
81
|
-
```markdown
|
|
82
|
-
## {{section_title}}
|
|
83
|
-
|
|
84
|
-
{{content}}
|
|
85
|
-
|
|
86
|
-
<!--
|
|
87
|
-
Instructions:
|
|
88
|
-
- Replace {{content}} with the actual content
|
|
89
|
-
- Additional guidance for this section
|
|
90
|
-
- Suggested elements (include others as needed):
|
|
91
|
-
- Element 1
|
|
92
|
-
- Element 2
|
|
93
|
-
-->
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**Key principles:**
|
|
97
|
-
|
|
98
|
-
- Use `{{variable_name}}` for all placeholders (not `<placeholder>` or other formats)
|
|
99
|
-
- Include HTML comments with instructions below each section
|
|
100
|
-
- Mark suggested elements as "include others as needed" to allow flexibility
|
|
101
|
-
- Required sections must be present; optional sections can be omitted
|
|
102
|
-
- Section names must match the template exactly (case-sensitive)
|
|
103
|
-
|
|
104
|
-
**Validation:**
|
|
105
|
-
|
|
106
|
-
Use the `/normalize` command to validate prompt files against templates:
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
# Validate all prompts in the repository
|
|
110
|
-
/normalize
|
|
111
|
-
|
|
112
|
-
# Validate specific files or directories
|
|
113
|
-
/normalize src/claude/.claude/skills/
|
|
114
|
-
|
|
115
|
-
# Auto-fix non-compliant files
|
|
116
|
-
/normalize --autofix src/claude/.claude/skills/
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Shell Commands
|
|
120
|
-
|
|
121
|
-
Run shell commands directly without prefixing with `cd` to the repository root. The working directory is already set correctly, and unnecessary `cd` prefixes create distinct command strings that trigger extra permission prompts.
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
# Good
|
|
125
|
-
git status
|
|
126
|
-
pnpm test
|
|
127
|
-
|
|
128
|
-
# Bad - unnecessary cd causes extra permission approval
|
|
129
|
-
cd "c:/Repositories/agentic-forge" && git status
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Code Style and Formatting
|
|
133
|
-
|
|
134
|
-
CI validates format, lint, and tests on all pull requests. Run locally before opening a pull request:
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
pnpm check # Format and lint (biome)
|
|
138
|
-
pnpm test # Vitest tests
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Technical Considerations
|
|
142
|
-
|
|
143
|
-
### Workflow Engine Changes
|
|
144
|
-
|
|
145
|
-
When modifying the workflow engine in `src/`, you must update the workflow-builder skill reference files to keep them in sync:
|
|
146
|
-
|
|
147
|
-
- `src/claude/.claude/skills/workflow-builder/references/REFERENCE.md` - Complete schema reference
|
|
148
|
-
- `src/claude/.claude/skills/workflow-builder/references/workflow-example.yaml` - Annotated reference workflow
|
|
149
|
-
|
|
150
|
-
Changes to workflow settings, step types, or features require updates to both files.
|
|
151
|
-
|
|
152
|
-
### Node.js Development
|
|
153
|
-
|
|
154
|
-
- **Always use `pnpm` for package management**: This repository uses pnpm for all Node.js operations
|
|
155
|
-
- **Building**: Use `pnpm build` (runs `tsc` + asset copy script)
|
|
156
|
-
- **Testing**: Use `pnpm test` (runs Vitest)
|
|
157
|
-
- **Linting**: Use `pnpm check` (runs Biome)
|
|
158
|
-
- **Development**: Use `pnpm dev` for TypeScript watch mode
|
package/CONTRIBUTING.md
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
# Contributing to Agentic Forge
|
|
2
|
-
|
|
3
|
-
Thank you for your interest in contributing! This guide will help you get started.
|
|
4
|
-
|
|
5
|
-
## Ways to Contribute
|
|
6
|
-
|
|
7
|
-
- **Report bugs** - Found something broken? [Open an issue](https://github.com/e-stpierre/agentic-forge/issues)
|
|
8
|
-
- **Suggest features** - Have an idea for a new workflow or enhancement? [Let us know](https://github.com/e-stpierre/agentic-forge/issues)
|
|
9
|
-
- **Improve docs** - Fix typos, clarify explanations, add examples
|
|
10
|
-
- **Write code** - Bug fixes, new skills, improvements to existing ones
|
|
11
|
-
|
|
12
|
-
## Development Setup
|
|
13
|
-
|
|
14
|
-
### Prerequisites
|
|
15
|
-
|
|
16
|
-
- [Claude Code](https://claude.ai/code) installed
|
|
17
|
-
- Git
|
|
18
|
-
- Node.js 20+
|
|
19
|
-
- [pnpm](https://pnpm.io/) for package management
|
|
20
|
-
|
|
21
|
-
### Local Development
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
# Clone the repo
|
|
25
|
-
git clone https://github.com/e-stpierre/agentic-forge.git
|
|
26
|
-
cd agentic-forge
|
|
27
|
-
|
|
28
|
-
# Install dependencies
|
|
29
|
-
pnpm install
|
|
30
|
-
|
|
31
|
-
# Build
|
|
32
|
-
pnpm build
|
|
33
|
-
|
|
34
|
-
# Run tests
|
|
35
|
-
pnpm test
|
|
36
|
-
|
|
37
|
-
# Run format and lint checks
|
|
38
|
-
pnpm check
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Making Changes
|
|
42
|
-
|
|
43
|
-
### Branch Naming
|
|
44
|
-
|
|
45
|
-
- `feature/description` - New features
|
|
46
|
-
- `fix/description` - Bug fixes
|
|
47
|
-
- `doc/description` - Documentation updates
|
|
48
|
-
- `refactor/description` - Refactoring
|
|
49
|
-
|
|
50
|
-
### Commit Messages
|
|
51
|
-
|
|
52
|
-
Write clear, concise commit messages that describe the change. For example: `Add retry logic to workflow executor` or `Fix validation error in analyze skill`.
|
|
53
|
-
|
|
54
|
-
### Code Formatting
|
|
55
|
-
|
|
56
|
-
Run format, lint, and test checks locally before submitting a PR:
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
pnpm check # Format and lint (Biome)
|
|
60
|
-
pnpm test # Vitest tests
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Internal Tools
|
|
64
|
-
|
|
65
|
-
- **`/normalize`** - Validate prompt files and READMEs against templates. Use `--autofix` to auto-fix issues.
|
|
66
|
-
|
|
67
|
-
## Project Structure
|
|
68
|
-
|
|
69
|
-
```text
|
|
70
|
-
src/
|
|
71
|
-
agents/ # Sub-agent definitions (.md)
|
|
72
|
-
claude/.claude/ # Skills loaded via --add-dir
|
|
73
|
-
skills/ # Bundled skills (slash commands)
|
|
74
|
-
commands/ # CLI command implementations
|
|
75
|
-
prompts/ # System prompt templates
|
|
76
|
-
steps/ # Workflow step handlers
|
|
77
|
-
workflows/ # YAML workflow definitions
|
|
78
|
-
*.ts # Core TypeScript modules
|
|
79
|
-
tests/ # Vitest test suite
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Naming Conventions
|
|
83
|
-
|
|
84
|
-
- **Agents**: descriptive with domain prefix (`explorer.md`, `reviewer.md`)
|
|
85
|
-
- **Skills**: directory name in kebab-case with `SKILL.md` inside (`analyze/SKILL.md`, `git-commit/SKILL.md`)
|
|
86
|
-
- **Workflows**: descriptive kebab-case YAML files (`plan-build-review.yaml`)
|
|
87
|
-
|
|
88
|
-
### Prompt Templates
|
|
89
|
-
|
|
90
|
-
All prompts must follow the templates in the repository. Use the `/normalize` command inside Claude Code to validate.
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
# Validate all prompts
|
|
94
|
-
/normalize
|
|
95
|
-
|
|
96
|
-
# Validate specific files
|
|
97
|
-
/normalize src/claude/.claude/skills/my-skill/
|
|
98
|
-
|
|
99
|
-
# Auto-fix non-compliant files
|
|
100
|
-
/normalize --autofix src/claude/.claude/skills/
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Pull Request Process
|
|
104
|
-
|
|
105
|
-
### Workflow
|
|
106
|
-
|
|
107
|
-
1. Fork the repository
|
|
108
|
-
2. Create a feature branch (`git checkout -b feature/my-feature`)
|
|
109
|
-
3. Make your changes
|
|
110
|
-
4. Run `pnpm check` to verify formatting
|
|
111
|
-
5. Run `pnpm test` to run the test suite
|
|
112
|
-
6. Run `/normalize` (inside Claude Code) to validate prompt files
|
|
113
|
-
7. Commit your changes with clear messages
|
|
114
|
-
8. Push to your fork
|
|
115
|
-
9. Open a pull request
|
|
116
|
-
|
|
117
|
-
### PR Checklist
|
|
118
|
-
|
|
119
|
-
- [ ] CI pipeline passes (format, lint, tests)
|
|
120
|
-
- [ ] Prompt templates validated (`/normalize`)
|
|
121
|
-
- [ ] CHANGELOG updated if applicable
|
|
122
|
-
- [ ] Changes tested with Claude Code
|
|
123
|
-
|
|
124
|
-
## Reporting Issues
|
|
125
|
-
|
|
126
|
-
### Bug Reports
|
|
127
|
-
|
|
128
|
-
Include:
|
|
129
|
-
|
|
130
|
-
- Steps to reproduce
|
|
131
|
-
- Expected vs actual behavior
|
|
132
|
-
- Agentic Forge version
|
|
133
|
-
- Claude Code version
|
|
134
|
-
|
|
135
|
-
### Feature Requests
|
|
136
|
-
|
|
137
|
-
Include:
|
|
138
|
-
|
|
139
|
-
- Description of the feature
|
|
140
|
-
- Use case / motivation
|
|
141
|
-
|
|
142
|
-
## Code of Conduct
|
|
143
|
-
|
|
144
|
-
Be respectful and constructive. We're all here to build useful tools together.
|
|
145
|
-
|
|
146
|
-
## Questions?
|
|
147
|
-
|
|
148
|
-
[Open an issue](https://github.com/e-stpierre/agentic-forge/issues) with the `question` label.
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
Thank you for contributing to Agentic Forge!
|
package/biome.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
|
3
|
-
"organizeImports": {
|
|
4
|
-
"enabled": true
|
|
5
|
-
},
|
|
6
|
-
"linter": {
|
|
7
|
-
"enabled": true,
|
|
8
|
-
"rules": {
|
|
9
|
-
"recommended": true
|
|
10
|
-
}
|
|
11
|
-
},
|
|
12
|
-
"formatter": {
|
|
13
|
-
"enabled": true,
|
|
14
|
-
"indentStyle": "tab",
|
|
15
|
-
"lineWidth": 100
|
|
16
|
-
},
|
|
17
|
-
"files": {
|
|
18
|
-
"include": ["src/**/*.ts", "tests/**/*.ts", "scripts/**/*.js", "vitest.config.ts"],
|
|
19
|
-
"ignore": ["node_modules", "dist", "src/agentic_forge"]
|
|
20
|
-
}
|
|
21
|
-
}
|
package/scripts/copy-assets.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { cpSync, existsSync } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
|
|
5
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
-
const root = join(__dirname, "..");
|
|
7
|
-
const src = join(root, "src");
|
|
8
|
-
const dist = join(root, "dist");
|
|
9
|
-
|
|
10
|
-
const assets = ["agents", "claude", "prompts", "templates", "workflows"];
|
|
11
|
-
|
|
12
|
-
for (const asset of assets) {
|
|
13
|
-
const srcPath = join(src, asset);
|
|
14
|
-
const distPath = join(dist, asset);
|
|
15
|
-
if (existsSync(srcPath)) {
|
|
16
|
-
cpSync(srcPath, distPath, { recursive: true });
|
|
17
|
-
console.log(`Copied ${asset} -> dist/${asset}`);
|
|
18
|
-
} else {
|
|
19
|
-
console.warn(`Warning: ${srcPath} not found, skipping`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/** Checkpoint management for workflow sessions. */
|
|
2
|
-
|
|
3
|
-
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import yaml from "js-yaml";
|
|
6
|
-
|
|
7
|
-
// --- Path helper ---
|
|
8
|
-
|
|
9
|
-
export function getCheckpointPath(workflowId: string, repoRoot?: string): string {
|
|
10
|
-
const root = repoRoot ?? process.cwd();
|
|
11
|
-
return path.join(root, "agentic", "outputs", workflowId, "checkpoint.md");
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// --- Create checkpoint ---
|
|
15
|
-
|
|
16
|
-
export function createCheckpoint(
|
|
17
|
-
workflowId: string,
|
|
18
|
-
step: string,
|
|
19
|
-
context: string,
|
|
20
|
-
progress: string,
|
|
21
|
-
notes = "",
|
|
22
|
-
issues = "",
|
|
23
|
-
repoRoot?: string,
|
|
24
|
-
): string {
|
|
25
|
-
const checkpointPath = getCheckpointPath(workflowId, repoRoot);
|
|
26
|
-
const dir = path.dirname(checkpointPath);
|
|
27
|
-
mkdirSync(dir, { recursive: true });
|
|
28
|
-
|
|
29
|
-
const existing = readCheckpoints(workflowId, repoRoot);
|
|
30
|
-
const checkpointNum = existing.length + 1;
|
|
31
|
-
const checkpointId = `chk-${String(checkpointNum).padStart(3, "0")}`;
|
|
32
|
-
|
|
33
|
-
const timestamp = new Date().toISOString();
|
|
34
|
-
|
|
35
|
-
const frontmatter: Record<string, unknown> = {
|
|
36
|
-
checkpoint_id: checkpointId,
|
|
37
|
-
step,
|
|
38
|
-
created: timestamp,
|
|
39
|
-
workflow_id: workflowId,
|
|
40
|
-
status: "in_progress",
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const entryLines: string[] = [
|
|
44
|
-
"---",
|
|
45
|
-
yaml.dump(frontmatter, { flowLevel: -1 }).trim(),
|
|
46
|
-
"---",
|
|
47
|
-
"",
|
|
48
|
-
"## Context",
|
|
49
|
-
"",
|
|
50
|
-
context,
|
|
51
|
-
"",
|
|
52
|
-
"## Progress",
|
|
53
|
-
"",
|
|
54
|
-
progress,
|
|
55
|
-
"",
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
if (notes) {
|
|
59
|
-
entryLines.push("## Notes for Next Session", "", notes, "");
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (issues) {
|
|
63
|
-
entryLines.push("## Issues Discovered", "", issues, "");
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
entryLines.push("---\n");
|
|
67
|
-
const entry = entryLines.join("\n");
|
|
68
|
-
|
|
69
|
-
appendFileSync(checkpointPath, entry, "utf-8");
|
|
70
|
-
|
|
71
|
-
return checkpointId;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// --- Read checkpoints ---
|
|
75
|
-
|
|
76
|
-
export function readCheckpoints(workflowId: string, repoRoot?: string): Record<string, unknown>[] {
|
|
77
|
-
const checkpointPath = getCheckpointPath(workflowId, repoRoot);
|
|
78
|
-
|
|
79
|
-
if (!existsSync(checkpointPath)) {
|
|
80
|
-
return [];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const content = readFileSync(checkpointPath, "utf-8");
|
|
84
|
-
const checkpoints: Record<string, unknown>[] = [];
|
|
85
|
-
|
|
86
|
-
const parts = content.split("---");
|
|
87
|
-
|
|
88
|
-
let i = 1;
|
|
89
|
-
while (i < parts.length - 1) {
|
|
90
|
-
const frontmatterStr = parts[i].trim();
|
|
91
|
-
const body = i + 1 < parts.length ? parts[i + 1].trim() : "";
|
|
92
|
-
|
|
93
|
-
if (frontmatterStr) {
|
|
94
|
-
try {
|
|
95
|
-
const frontmatter = yaml.load(frontmatterStr) as Record<string, unknown> | null;
|
|
96
|
-
if (frontmatter && "checkpoint_id" in frontmatter) {
|
|
97
|
-
frontmatter.content = body;
|
|
98
|
-
checkpoints.push(frontmatter);
|
|
99
|
-
}
|
|
100
|
-
} catch {
|
|
101
|
-
// Invalid YAML, skip
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
i += 2;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return checkpoints;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// --- Get latest checkpoint ---
|
|
112
|
-
|
|
113
|
-
export function getLatestCheckpoint(
|
|
114
|
-
workflowId: string,
|
|
115
|
-
repoRoot?: string,
|
|
116
|
-
): Record<string, unknown> | null {
|
|
117
|
-
const checkpoints = readCheckpoints(workflowId, repoRoot);
|
|
118
|
-
return checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : null;
|
|
119
|
-
}
|
package/src/cli.ts
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/** CLI entry point for agentic-forge command. */
|
|
4
|
-
|
|
5
|
-
import { Command } from "commander";
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
cmdCancel,
|
|
9
|
-
cmdConfig,
|
|
10
|
-
cmdConfigure,
|
|
11
|
-
cmdInit,
|
|
12
|
-
cmdInput,
|
|
13
|
-
cmdList,
|
|
14
|
-
cmdReleaseNotes,
|
|
15
|
-
cmdResume,
|
|
16
|
-
cmdRun,
|
|
17
|
-
cmdSkillsDir,
|
|
18
|
-
cmdStatus,
|
|
19
|
-
cmdUpdate,
|
|
20
|
-
cmdVersion,
|
|
21
|
-
cmdWorkflows,
|
|
22
|
-
getVersion,
|
|
23
|
-
} from "./commands/index.js";
|
|
24
|
-
|
|
25
|
-
const program = new Command()
|
|
26
|
-
.name("agentic-forge")
|
|
27
|
-
.version(getVersion())
|
|
28
|
-
.description("Agentic workflow orchestration for Claude Code");
|
|
29
|
-
|
|
30
|
-
// run command
|
|
31
|
-
program
|
|
32
|
-
.command("run")
|
|
33
|
-
.argument("[workflow]", "workflow name or path to YAML file")
|
|
34
|
-
.option("--list", "list all available workflows")
|
|
35
|
-
.option("--var <key=value...>", "set workflow variable (can be used multiple times)")
|
|
36
|
-
.option("--from-step <step>", "resume from a specific step")
|
|
37
|
-
.option("--terminal-output <mode>", "terminal output granularity (base or all)")
|
|
38
|
-
.action(async (workflow: string | undefined, opts: Record<string, unknown>) => {
|
|
39
|
-
await cmdRun({
|
|
40
|
-
workflow,
|
|
41
|
-
listWorkflows: opts.list as boolean | undefined,
|
|
42
|
-
vars: opts.var as string[] | undefined,
|
|
43
|
-
fromStep: opts.fromStep as string | undefined,
|
|
44
|
-
terminalOutput: opts.terminalOutput as string | undefined,
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// resume command
|
|
49
|
-
program
|
|
50
|
-
.command("resume")
|
|
51
|
-
.argument("<workflow_id>", "workflow ID to resume")
|
|
52
|
-
.option("--terminal-output <mode>", "terminal output granularity (base or all)")
|
|
53
|
-
.action(async (workflowId: string, opts: Record<string, unknown>) => {
|
|
54
|
-
await cmdResume({
|
|
55
|
-
workflowId,
|
|
56
|
-
terminalOutput: opts.terminalOutput as string | undefined,
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// status command
|
|
61
|
-
program
|
|
62
|
-
.command("status")
|
|
63
|
-
.argument("<workflow_id>", "workflow ID")
|
|
64
|
-
.action((workflowId: string) => {
|
|
65
|
-
cmdStatus(workflowId);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// cancel command
|
|
69
|
-
program
|
|
70
|
-
.command("cancel")
|
|
71
|
-
.argument("<workflow_id>", "workflow ID to cancel")
|
|
72
|
-
.action((workflowId: string) => {
|
|
73
|
-
cmdCancel(workflowId);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// list command
|
|
77
|
-
program
|
|
78
|
-
.command("list")
|
|
79
|
-
.option("--status <status>", "filter by status (running, completed, failed, paused)")
|
|
80
|
-
.action((opts: Record<string, unknown>) => {
|
|
81
|
-
cmdList(opts.status as string | undefined);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// input command
|
|
85
|
-
program
|
|
86
|
-
.command("input")
|
|
87
|
-
.argument("<workflow_id>", "workflow ID")
|
|
88
|
-
.argument("<response>", "response to provide")
|
|
89
|
-
.action((workflowId: string, response: string) => {
|
|
90
|
-
cmdInput(workflowId, response);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// configure command
|
|
94
|
-
program
|
|
95
|
-
.command("configure")
|
|
96
|
-
.description("Configure plugin settings")
|
|
97
|
-
.action(() => {
|
|
98
|
-
cmdConfigure();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
// init command
|
|
102
|
-
program
|
|
103
|
-
.command("init")
|
|
104
|
-
.description("Copy bundled workflow templates to local project")
|
|
105
|
-
.option("--force", "overwrite existing workflow files")
|
|
106
|
-
.option("--list", "list available bundled workflows without copying")
|
|
107
|
-
.action((opts: Record<string, unknown>) => {
|
|
108
|
-
cmdInit({
|
|
109
|
-
force: opts.force as boolean | undefined,
|
|
110
|
-
listOnly: opts.list as boolean | undefined,
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// config command with subcommands
|
|
115
|
-
const configCmd = program.command("config").description("Get or set configuration");
|
|
116
|
-
|
|
117
|
-
configCmd
|
|
118
|
-
.command("get")
|
|
119
|
-
.argument("<key>", "configuration key (dot notation)")
|
|
120
|
-
.action((key: string) => {
|
|
121
|
-
cmdConfig("get", key);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
configCmd
|
|
125
|
-
.command("set")
|
|
126
|
-
.argument("<key>", "configuration key (dot notation)")
|
|
127
|
-
.argument("<value>", "value to set")
|
|
128
|
-
.action((key: string, value: string) => {
|
|
129
|
-
cmdConfig("set", key, value);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
// version command
|
|
133
|
-
program
|
|
134
|
-
.command("version")
|
|
135
|
-
.description("Show version information")
|
|
136
|
-
.action(() => {
|
|
137
|
-
cmdVersion();
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
// release-notes command
|
|
141
|
-
program
|
|
142
|
-
.command("release-notes")
|
|
143
|
-
.argument("[version]", "show release notes for a specific version")
|
|
144
|
-
.option("--latest", "show only the most recent version's release notes")
|
|
145
|
-
.action((specificVersion: string | undefined, opts: Record<string, unknown>) => {
|
|
146
|
-
cmdReleaseNotes({
|
|
147
|
-
specificVersion,
|
|
148
|
-
latest: opts.latest as boolean | undefined,
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
// skills-dir command
|
|
153
|
-
program
|
|
154
|
-
.command("skills-dir")
|
|
155
|
-
.description("Print path to bundled skills directory")
|
|
156
|
-
.action(() => {
|
|
157
|
-
cmdSkillsDir();
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
// update command
|
|
161
|
-
program
|
|
162
|
-
.command("update")
|
|
163
|
-
.description("Update agentic-forge to the latest version")
|
|
164
|
-
.option("--check", "check for updates without installing")
|
|
165
|
-
.action((opts: Record<string, unknown>) => {
|
|
166
|
-
cmdUpdate({
|
|
167
|
-
check: opts.check as boolean | undefined,
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
// workflows command
|
|
172
|
-
program
|
|
173
|
-
.command("workflows")
|
|
174
|
-
.description("List available workflows with descriptions")
|
|
175
|
-
.option("-v, --verbose", "show workflow variables and full descriptions")
|
|
176
|
-
.action((opts: Record<string, unknown>) => {
|
|
177
|
-
cmdWorkflows({
|
|
178
|
-
verbose: opts.verbose as boolean | undefined,
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
program.parse();
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/** Config command handler. */
|
|
2
|
-
|
|
3
|
-
import { getConfigValue, setConfigValue } from "../config.js";
|
|
4
|
-
|
|
5
|
-
export function cmdConfig(configCommand: string, key: string, value?: string): void {
|
|
6
|
-
if (configCommand === "get") {
|
|
7
|
-
const result = getConfigValue(key);
|
|
8
|
-
if (result === null) {
|
|
9
|
-
process.stderr.write(`Key not found: ${key}\n`);
|
|
10
|
-
process.exit(1);
|
|
11
|
-
}
|
|
12
|
-
if (typeof result === "object" && result !== null) {
|
|
13
|
-
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
14
|
-
} else {
|
|
15
|
-
process.stdout.write(`${result}\n`);
|
|
16
|
-
}
|
|
17
|
-
} else if (configCommand === "set") {
|
|
18
|
-
if (value === undefined) {
|
|
19
|
-
process.stderr.write("Usage: agentic-forge config set <key> <value>\n");
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
setConfigValue(key, value);
|
|
23
|
-
process.stdout.write(`Set ${key} = ${value}\n`);
|
|
24
|
-
} else {
|
|
25
|
-
process.stderr.write("Usage: agentic-forge config get|set <key> [value]\n");
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
}
|