fullstack-agentic-flow 2.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/LICENSE +21 -0
- package/README.md +348 -0
- package/dist/src/cli/args.js +74 -0
- package/dist/src/cli/commands/doctor.js +133 -0
- package/dist/src/cli/commands/init.js +103 -0
- package/dist/src/cli/commands/shared.js +20 -0
- package/dist/src/cli/commands/tools.js +21 -0
- package/dist/src/cli/commands/update.js +21 -0
- package/dist/src/cli/main.js +6 -0
- package/dist/src/cli/output.js +11 -0
- package/dist/src/cli/prompter.js +13 -0
- package/dist/src/cli/report.js +13 -0
- package/dist/src/cli/run.js +48 -0
- package/dist/src/domain/canon-mapping.js +26 -0
- package/dist/src/domain/claude-md-mode.js +17 -0
- package/dist/src/domain/enum-parse.js +9 -0
- package/dist/src/domain/errors.js +13 -0
- package/dist/src/domain/pipeline-config.js +58 -0
- package/dist/src/domain/runtime.js +19 -0
- package/dist/src/domain/tool.js +129 -0
- package/dist/src/domain/topology.js +39 -0
- package/dist/src/install/adapters.js +39 -0
- package/dist/src/install/applier.js +150 -0
- package/dist/src/install/detect.js +70 -0
- package/dist/src/install/managed-section.js +35 -0
- package/dist/src/install/manifest.js +63 -0
- package/dist/src/install/planned-file.js +77 -0
- package/dist/src/install/planner.js +139 -0
- package/dist/src/install/rules-preset.js +37 -0
- package/dist/src/install/setup-guide.js +60 -0
- package/dist/src/io/fs.js +39 -0
- package/dist/src/io/paths.js +6 -0
- package/dist/src/io/shell.js +25 -0
- package/dist/src/registry/commands.js +52 -0
- package/dist/src/registry/subagents.js +52 -0
- package/dist/src/registry/tools.js +99 -0
- package/package.json +53 -0
- package/payload/ai-agents/agents/00-bootstrap.md +473 -0
- package/payload/ai-agents/agents/00a-scaffold.md +295 -0
- package/payload/ai-agents/agents/00b-module-scaffold.md +108 -0
- package/payload/ai-agents/agents/01-intake.md +308 -0
- package/payload/ai-agents/agents/01b-impact-analysis.md +274 -0
- package/payload/ai-agents/agents/02a-dependency-map.md +247 -0
- package/payload/ai-agents/agents/02b-backend-contract.md +434 -0
- package/payload/ai-agents/agents/02c-ui-contract.md +367 -0
- package/payload/ai-agents/agents/02d-interface-seam.md +373 -0
- package/payload/ai-agents/agents/03a-backend-sequence.md +233 -0
- package/payload/ai-agents/agents/03b-ui-sequence.md +230 -0
- package/payload/ai-agents/agents/04a-backend-implementer.md +290 -0
- package/payload/ai-agents/agents/04b-ui-implementer.md +302 -0
- package/payload/ai-agents/agents/05-ci-validator.md +125 -0
- package/payload/ai-agents/agents/06-qa-spec.md +249 -0
- package/payload/ai-agents/agents/07-security.md +228 -0
- package/payload/ai-agents/agents/08-performance.md +208 -0
- package/payload/ai-agents/agents/09a-feature-notes.md +156 -0
- package/payload/ai-agents/agents/09b-release.md +111 -0
- package/payload/ai-agents/architecture-context.template.md +554 -0
- package/payload/ai-agents/archive/README.md +22 -0
- package/payload/ai-agents/canon/backend-canon.md +295 -0
- package/payload/ai-agents/canon/frontend-canon.md +47 -0
- package/payload/ai-agents/canon/typed-data.md +158 -0
- package/payload/ai-agents/observations/README.md +11 -0
- package/payload/ai-agents/scripts/check-test-with-change.mjs +103 -0
- package/payload/ai-agents/scripts/check-typed-boundaries.mjs +329 -0
- package/payload/ai-agents/scripts/lib/config.mjs +63 -0
- package/payload/ai-agents/scripts/lib/glob.mjs +40 -0
- package/payload/ai-agents/state/README.md +108 -0
- package/payload/ai-agents/state/current-stage.md +10 -0
- package/payload/ai-agents/templates/README.md +22 -0
- package/payload/ai-agents/templates/ci/github-actions.rules.yml +35 -0
- package/payload/ai-agents/templates/ci/gitlab-ci.rules.yml +30 -0
- package/payload/ai-agents/toolchain.md +214 -0
- package/payload/commands/bootstrap.md +17 -0
- package/payload/commands/contract.md +64 -0
- package/payload/commands/finalize.md +26 -0
- package/payload/commands/impact.md +25 -0
- package/payload/commands/implement.md +58 -0
- package/payload/commands/intake.md +16 -0
- package/payload/commands/perf.md +20 -0
- package/payload/commands/qa.md +15 -0
- package/payload/commands/release.md +22 -0
- package/payload/commands/resume.md +52 -0
- package/payload/commands/scaffold-module.md +20 -0
- package/payload/commands/scaffold.md +35 -0
- package/payload/commands/seam.md +28 -0
- package/payload/commands/security.md +16 -0
- package/payload/commands/sequence.md +22 -0
- package/payload/commands/status.md +37 -0
- package/payload/legacy/v1-checksums.json +197 -0
- package/payload/root/contracts-README.md +19 -0
- package/payload/root/pipeline-section.md +33 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
/** Compiled location is dist/src/io/paths.js; the payload ships at the package root. */
|
|
4
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
export const PACKAGE_ROOT = join(here, '..', '..', '..');
|
|
6
|
+
export const PAYLOAD_DIR = join(PACKAGE_ROOT, 'payload');
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { delimiter, join } from 'node:path';
|
|
4
|
+
/** True when `name` resolves on PATH (honours PATHEXT on Windows). */
|
|
5
|
+
export function onPath(name) {
|
|
6
|
+
const extensions = process.platform === 'win32' ? (process.env['PATHEXT'] ?? '.EXE;.CMD;.BAT').split(';') : [''];
|
|
7
|
+
const dirs = (process.env['PATH'] ?? '').split(delimiter).filter((dir) => dir.length > 0);
|
|
8
|
+
return dirs.some((dir) => extensions.some((ext) => existsSync(join(dir, `${name}${ext}`))));
|
|
9
|
+
}
|
|
10
|
+
export class ShellResult {
|
|
11
|
+
command;
|
|
12
|
+
exitCode;
|
|
13
|
+
constructor(command, exitCode) {
|
|
14
|
+
this.command = command;
|
|
15
|
+
this.exitCode = exitCode;
|
|
16
|
+
}
|
|
17
|
+
get succeeded() {
|
|
18
|
+
return this.exitCode === 0;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Runs a documented install command in the target repo, attached to the terminal. */
|
|
22
|
+
export function runShell(command, cwd) {
|
|
23
|
+
const result = spawnSync(command, { cwd, shell: true, stdio: 'inherit' });
|
|
24
|
+
return new ShellResult(command, result.status ?? 1);
|
|
25
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** A pipeline slash command. Its body lives in payload/commands/{slug}.md and is runtime-neutral. */
|
|
2
|
+
export class PipelineCommand {
|
|
3
|
+
slug;
|
|
4
|
+
description;
|
|
5
|
+
agentFiles;
|
|
6
|
+
triggers;
|
|
7
|
+
constructor(slug, description,
|
|
8
|
+
/** Agent instruction files (in .ai-agents/agents/) this command dispatches to. */
|
|
9
|
+
agentFiles,
|
|
10
|
+
/** Phrases that should make a Codex skill trigger, besides the slash form. */
|
|
11
|
+
triggers) {
|
|
12
|
+
this.slug = slug;
|
|
13
|
+
this.description = description;
|
|
14
|
+
this.agentFiles = agentFiles;
|
|
15
|
+
this.triggers = triggers;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const COMMANDS = [
|
|
19
|
+
new PipelineCommand('scaffold', 'Establish conventions in an empty repo: one real vertical slice in the backend canon, test-first — run before /bootstrap', ['00a-scaffold.md'], 'starting a new project or empty repository'),
|
|
20
|
+
new PipelineCommand('bootstrap', "Generate this repository's architecture-context.md (topology, canon mapping, rules) — run once before anything else", ['00-bootstrap.md'], 'setting up the pipeline on an existing codebase'),
|
|
21
|
+
new PipelineCommand('scaffold-module', 'Create the canon skeleton for a new backend module (registration, layer folders, boot test)', ['00b-module-scaffold.md'], 'adding a new backend module'),
|
|
22
|
+
new PipelineCommand('intake', 'Start a new feature — gathers requirements conversationally, business language only', ['01-intake.md'], 'starting a new feature'),
|
|
23
|
+
new PipelineCommand('impact', 'Measure how much of the system a feature disturbs and set its risk class (--verify after implementation)', ['01b-impact-analysis.md'], 'asking how risky or how big a change is'),
|
|
24
|
+
new PipelineCommand('contract', 'Run dependency map, backend contract and UI contract in parallel, then freeze the interface seam', ['02a-dependency-map.md', '02b-backend-contract.md', '02c-ui-contract.md', '02d-interface-seam.md'], 'designing an approved feature'),
|
|
25
|
+
new PipelineCommand('seam', 'Export or import cross-repository contracts for split backend/frontend repos', ['02d-interface-seam.md'], 'syncing an API contract between repositories'),
|
|
26
|
+
new PipelineCommand('sequence', 'Break approved contracts into ordered, test-first tasks — both tracks in parallel', ['03a-backend-sequence.md', '03b-ui-sequence.md'], 'planning tasks after contracts are approved'),
|
|
27
|
+
new PipelineCommand('implement', 'Execute the next pending task test-first — one task, one commit, then stop', ['04a-backend-implementer.md', '04b-ui-implementer.md', '00b-module-scaffold.md'], 'implementing the next task'),
|
|
28
|
+
new PipelineCommand('qa', 'Generate the QA spec for the finished branch, before it merges — both tracks', ['06-qa-spec.md'], 'writing a QA or test plan for a finished feature branch'),
|
|
29
|
+
new PipelineCommand('security', 'Audit the branch diff for security issues before merging — both tracks', ['07-security.md'], 'security review of a feature branch'),
|
|
30
|
+
new PipelineCommand('perf', 'Audit the branch for performance problems before merging (mandatory for risk class L2+)', ['08-performance.md'], 'performance review of a feature branch'),
|
|
31
|
+
new PipelineCommand('finalize', "Close the feature on its branch: release note, archive, state reset — so nothing is left to do after the merge", ['09a-feature-notes.md'], 'finishing a feature branch after Gate 3'),
|
|
32
|
+
new PipelineCommand('release', 'Assemble the changelog from the features\' release notes and run the retrospective', ['09b-release.md'], 'cutting a release'),
|
|
33
|
+
new PipelineCommand('status', 'Dashboard — current feature, risk class, both tracks, open gate, next action', [], 'asking where the pipeline is'),
|
|
34
|
+
new PipelineCommand('resume', 'Resume from wherever this feature stopped', [], 'coming back to unfinished pipeline work'),
|
|
35
|
+
];
|
|
36
|
+
export class CommandCatalog {
|
|
37
|
+
commands;
|
|
38
|
+
constructor(commands) {
|
|
39
|
+
this.commands = commands;
|
|
40
|
+
}
|
|
41
|
+
all() {
|
|
42
|
+
return this.commands;
|
|
43
|
+
}
|
|
44
|
+
bySlug(slug) {
|
|
45
|
+
const command = this.commands.find((candidate) => candidate.slug === slug);
|
|
46
|
+
if (command === undefined) {
|
|
47
|
+
throw new Error(`Command /${slug} is not in the catalog`);
|
|
48
|
+
}
|
|
49
|
+
return command;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export const COMMAND_CATALOG = new CommandCatalog(COMMANDS);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** A Claude Code subagent registration: a thin pointer at the real instructions. */
|
|
2
|
+
export class SubagentDefinition {
|
|
3
|
+
name;
|
|
4
|
+
description;
|
|
5
|
+
agentFile;
|
|
6
|
+
requiresContext;
|
|
7
|
+
constructor(name, description, agentFile,
|
|
8
|
+
/** False only for agents that run before architecture-context.md can exist. */
|
|
9
|
+
requiresContext) {
|
|
10
|
+
this.name = name;
|
|
11
|
+
this.description = description;
|
|
12
|
+
this.agentFile = agentFile;
|
|
13
|
+
this.requiresContext = requiresContext;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const SUBAGENTS = [
|
|
17
|
+
new SubagentDefinition('scaffold', "Establish a new repository's conventions by building one real, thin vertical slice in the backend canon, test-first, so architecture-context.md can be derived from real code. Run before bootstrap on empty or near-empty repos.", '00a-scaffold.md', false),
|
|
18
|
+
new SubagentDefinition('bootstrap', "Generate this repository's architecture-context.md by scanning the codebase (using the code graphs when installed) and interviewing the developer. Records topology and canon mapping.", '00-bootstrap.md', false),
|
|
19
|
+
new SubagentDefinition('module-scaffold', 'Create the empty canon skeleton for a new backend module — registration, layer directories, route file, test directories and one boot test. No behaviour.', '00b-module-scaffold.md', true),
|
|
20
|
+
new SubagentDefinition('intake', 'Requirements intake for a new feature. Gathers the business need conversationally and writes state/current-feature.md.', '01-intake.md', true),
|
|
21
|
+
new SubagentDefinition('impact-analysis', 'Measure the blast radius of a feature with the code graphs, score ten risk dimensions, and set the risk class (predict); compare the actual diff with the prediction (verify).', '01b-impact-analysis.md', true),
|
|
22
|
+
new SubagentDefinition('dependency-map', "Map the feature's footprint across existing backend and frontend code, verified file by file. Runs in parallel with the two contract agents.", '02a-dependency-map.md', true),
|
|
23
|
+
new SubagentDefinition('backend-contract', 'Specify how the backend will be built — canon placement, named Data classes, use cases, the interface surface for the topology, and a test-first plan.', '02b-backend-contract.md', true),
|
|
24
|
+
new SubagentDefinition('ui-contract', 'Specify how the interface will be built — screens, composition, every required state, forms, interaction, responsive, accessibility, and named consumed types.', '02c-ui-contract.md', true),
|
|
25
|
+
new SubagentDefinition('interface-seam', 'Reconcile what the backend promises against what the UI consumes — API, GraphQL, MVC page contracts, or cross-repo contracts — and freeze it.', '02d-interface-seam.md', true),
|
|
26
|
+
new SubagentDefinition('backend-sequence', 'Break the approved backend contract into ordered single-commit, test-first tasks in canon order.', '03a-backend-sequence.md', true),
|
|
27
|
+
new SubagentDefinition('ui-sequence', 'Break the approved UI contract into ordered single-commit, test-first tasks, each screen with all its required states.', '03b-ui-sequence.md', true),
|
|
28
|
+
new SubagentDefinition('backend-implementer', 'Execute the next pending backend task with the TDD loop and commit it. Exactly one task per invocation.', '04a-backend-implementer.md', true),
|
|
29
|
+
new SubagentDefinition('ui-implementer', 'Execute the next pending UI task with the TDD loop and commit it. Approved components only, every required state. One task per invocation.', '04b-ui-implementer.md', true),
|
|
30
|
+
new SubagentDefinition('qa-spec', 'Produce the QA specification for a finished feature branch before it merges, using the impact regression scope, every UI state, the role matrix, and seam conformance.', '06-qa-spec.md', true),
|
|
31
|
+
new SubagentDefinition('security-review', "Audit a feature branch's diff for security issues across backend and frontend before it merges, against the intake's role matrix. Critical findings block the merge.", '07-security.md', true),
|
|
32
|
+
new SubagentDefinition('performance-review', "Audit a feature branch for performance problems before it merges, judged against the project's stated scale. Mandatory for risk class L2+.", '08-performance.md', true),
|
|
33
|
+
new SubagentDefinition('feature-notes', 'Close a feature on its branch after Gate 3: write its release note as a changeset, archive the contracts and reasoning, and reset the state directory.', '09a-feature-notes.md', true),
|
|
34
|
+
new SubagentDefinition('release-notes', "Assemble a release changelog from the features' changesets and run the observations retrospective. Release administration, not feature work.", '09b-release.md', true),
|
|
35
|
+
];
|
|
36
|
+
export class SubagentCatalog {
|
|
37
|
+
subagents;
|
|
38
|
+
constructor(subagents) {
|
|
39
|
+
this.subagents = subagents;
|
|
40
|
+
}
|
|
41
|
+
all() {
|
|
42
|
+
return this.subagents;
|
|
43
|
+
}
|
|
44
|
+
byName(name) {
|
|
45
|
+
const agent = this.subagents.find((candidate) => candidate.name === name);
|
|
46
|
+
if (agent === undefined) {
|
|
47
|
+
throw new Error(`Subagent ${name} is not in the catalog`);
|
|
48
|
+
}
|
|
49
|
+
return agent;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export const SUBAGENT_CATALOG = new SubagentCatalog(SUBAGENTS);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Runtime } from '../domain/runtime.js';
|
|
2
|
+
import { ExternalTool, InstallStep, ProbeKind, RuntimeSupport, StepLocation, ToolId, ToolProbe, ToolRole, } from '../domain/tool.js';
|
|
3
|
+
const shell = (description, command, requires, verified = true) => new InstallStep(description, command, StepLocation.Shell, requires, verified);
|
|
4
|
+
const inAgent = (description, command) => new InstallStep(description, command, StepLocation.AgentUi, [], true);
|
|
5
|
+
const binary = (name) => new ToolProbe(ProbeKind.Binary, [name]);
|
|
6
|
+
const paths = (...targets) => new ToolProbe(ProbeKind.AnyPath, targets);
|
|
7
|
+
/**
|
|
8
|
+
* Install commands are taken from each project's README as of September 2026.
|
|
9
|
+
* Steps marked `verified: false` are the closest documented equivalent; SETUP.md
|
|
10
|
+
* flags them so a human checks before relying on them.
|
|
11
|
+
*/
|
|
12
|
+
const TOOLS = [
|
|
13
|
+
new ExternalTool(ToolId.FindSkills, 'find-skills', 'vercel-labs/skills', ToolRole.Skill, 'Discovers installable agent skills for unfamiliar frameworks and libraries.', ['00a scaffold', '00 bootstrap'], [
|
|
14
|
+
new RuntimeSupport(Runtime.ClaudeCode, [shell('Install the find-skills skill', 'npx skills add vercel-labs/skills --skill find-skills -a claude-code -y', ['npx'])], paths('.claude/skills/find-skills', '~/.claude/skills/find-skills'), ''),
|
|
15
|
+
new RuntimeSupport(Runtime.Codex, [shell('Install the find-skills skill', 'npx skills add vercel-labs/skills --skill find-skills -a codex -y', ['npx'])], paths('.agents/skills/find-skills', '~/.codex/skills/find-skills'), ''),
|
|
16
|
+
], [], ['Ask: "find a skill for <framework or task>". Installing what it finds is always a human decision.']),
|
|
17
|
+
new ExternalTool(ToolId.Superpowers, 'superpowers', 'obra/superpowers', ToolRole.Plugin, 'Discipline skills: test-driven-development, systematic-debugging, verification-before-completion, code review.', ['00a', '00b', '04a', '04b', 'Gate 2'], [
|
|
18
|
+
new RuntimeSupport(Runtime.ClaudeCode, [shell('Install from the official marketplace (also enabled in .claude/settings.json)', 'claude plugin install superpowers@claude-plugins-official --scope project', ['claude'])], paths('~/.claude/plugins/marketplaces/claude-plugins-official', '~/.claude/plugins/cache/claude-plugins-official'), ''),
|
|
19
|
+
new RuntimeSupport(Runtime.Codex, [inAgent('Install from the Codex plugin menu', 'In Codex: /plugins → superpowers → Install Plugin')], paths('~/.codex/plugins'), ''),
|
|
20
|
+
], [], [
|
|
21
|
+
'Pipeline owns the workflow: brainstorming, writing-plans, executing-plans and subagent-driven-development are replaced by /intake → /contract → /sequence → /implement. See .ai-agents/toolchain.md §Precedence.',
|
|
22
|
+
]),
|
|
23
|
+
new ExternalTool(ToolId.ClaudeMem, 'claude-mem', 'thedotmack/claude-mem', ToolRole.Plugin, 'Session memory: captures what agents did and injects relevant context into later sessions. Recall only, never truth.', ['every agent (passive)', '/resume'], [
|
|
24
|
+
new RuntimeSupport(Runtime.ClaudeCode, [shell('Install and register hooks', 'npx claude-mem install', ['npx'])], paths('~/.claude-mem'), ''),
|
|
25
|
+
new RuntimeSupport(Runtime.Codex, [shell('Install (detects Codex CLI)', 'npx claude-mem install', ['npx'])], paths('~/.claude-mem'), 'Codex support is newer than Claude Code support; check the claude-mem release notes for the current capture coverage.'),
|
|
26
|
+
], [], ['Nothing to run. Data lives in ~/.claude-mem, outside the repo.']),
|
|
27
|
+
new ExternalTool(ToolId.Impeccable, 'impeccable', 'pbakaus/impeccable', ToolRole.Plugin, 'Design language, PRODUCT.md/DESIGN.md context, and a deterministic UI anti-pattern detector.', ['00a', '00 bootstrap', '02c', '04b', '05 CI', '06 QA'], [
|
|
28
|
+
new RuntimeSupport(Runtime.ClaudeCode, [shell('Install for detected harnesses', 'npx impeccable install', ['npx'])], paths('.impeccable', '.claude/skills/impeccable', '~/.claude/skills/impeccable'), ''),
|
|
29
|
+
new RuntimeSupport(Runtime.Codex, [shell('Install for Codex', 'npx impeccable install --providers=codex', ['npx'])], paths('.impeccable', '.agents/skills/impeccable', '~/.codex/skills/impeccable'), ''),
|
|
30
|
+
], [], ['/impeccable init (writes PRODUCT.md) and /impeccable document (writes DESIGN.md) during /scaffold', 'npx impeccable detect <path> in CI and the UI self-check']),
|
|
31
|
+
new ExternalTool(ToolId.TaskObserver, 'task-observer', 'rebelytics/one-skill-to-rule-them-all', ToolRole.Skill, 'Watches sessions for repeated corrections and proposes skill and agent improvements. Logs to .ai-agents/observations/.', ['every agent (passive)', '09 changelog retrospective'], [
|
|
32
|
+
new RuntimeSupport(Runtime.ClaudeCode, [shell('Install the task-observer skill', 'npx skills add rebelytics/one-skill-to-rule-them-all --skill task-observer -a claude-code -y', ['npx'])], paths('.claude/skills/task-observer', '~/.claude/skills/task-observer'), ''),
|
|
33
|
+
new RuntimeSupport(Runtime.Codex, [shell('Install the community Codex port', 'npx skills add AllstarGER/one-skill-to-rule-them-all --skill task-observer -a codex -y', ['npx'])], paths('.agents/skills/task-observer', '~/.codex/skills/task-observer'), 'Community port based on an older task-observer version.'),
|
|
34
|
+
], [], ['Activation instruction is in the pipeline section of CLAUDE.md / AGENTS.md.', 'Ask "any observations logged?" when closing a long session.']),
|
|
35
|
+
new ExternalTool(ToolId.Ponytail, 'ponytail', 'DietrichGebert/ponytail', ToolRole.Plugin, 'Least-code decision ladder and over-engineering review. Governs logic and dependencies, never types or tests.', ['02b', '02c', '04a', '04b', 'Gate 2'], [
|
|
36
|
+
new RuntimeSupport(Runtime.ClaudeCode, [
|
|
37
|
+
shell('Add the marketplace', 'claude plugin marketplace add DietrichGebert/ponytail', ['claude']),
|
|
38
|
+
shell('Install the plugin', 'claude plugin install ponytail@ponytail --scope project', ['claude']),
|
|
39
|
+
], paths('~/.claude/plugins/marketplaces/ponytail', '~/.claude/plugins/cache/ponytail'), ''),
|
|
40
|
+
new RuntimeSupport(Runtime.Codex, [
|
|
41
|
+
shell('Add the marketplace', 'codex plugin marketplace add DietrichGebert/ponytail', ['codex']),
|
|
42
|
+
shell('Install the plugin', 'codex plugin add ponytail@ponytail', ['codex']),
|
|
43
|
+
], paths('~/.codex/plugins'), ''),
|
|
44
|
+
], [], ['/ponytail lite while implementing; /ponytail-review on the staged diff before Gate 2.']),
|
|
45
|
+
new ExternalTool(ToolId.Headroom, 'headroom', 'headroomlabs-ai/headroom', ToolRole.Proxy, 'Local proxy that compresses tool output, logs and files before they reach the model. Wraps the session.', ['developer, around 00 bootstrap / 02a / 06 / 07'], [
|
|
46
|
+
new RuntimeSupport(Runtime.ClaudeCode, [shell('Install the CLI', 'uv tool install --python 3.13 "headroom-ai[all]"', ['uv'])], binary('headroom'), ''),
|
|
47
|
+
new RuntimeSupport(Runtime.Codex, [shell('Install the CLI', 'uv tool install --python 3.13 "headroom-ai[all]"', ['uv'])], binary('headroom'), ''),
|
|
48
|
+
], [], [
|
|
49
|
+
'Start sessions with: headroom wrap claude (or: headroom wrap codex)',
|
|
50
|
+
'Wrapping routes the agent through a local base URL; check the headroom release notes for long-context caveats.',
|
|
51
|
+
]),
|
|
52
|
+
new ExternalTool(ToolId.CodeReviewGraph, 'code-review-graph', 'tirth8205/code-review-graph', ToolRole.CodeGraph, 'Impact engine: incremental code graph with blast-radius and change-risk tools over MCP.', ['01b impact', '02a', '04a', '04b', '06', '07'], [
|
|
53
|
+
new RuntimeSupport(Runtime.ClaudeCode, [
|
|
54
|
+
shell('Install the CLI', 'uv tool install code-review-graph', ['uv']),
|
|
55
|
+
shell('Register the MCP server, hooks and skills', 'code-review-graph install --platform claude-code -y', ['code-review-graph']),
|
|
56
|
+
shell('Build the graph', 'code-review-graph build', ['code-review-graph']),
|
|
57
|
+
], binary('code-review-graph'), ''),
|
|
58
|
+
new RuntimeSupport(Runtime.Codex, [
|
|
59
|
+
shell('Install the CLI', 'uv tool install code-review-graph', ['uv']),
|
|
60
|
+
shell('Register the MCP server, hooks and skills', 'code-review-graph install --platform codex -y', ['code-review-graph']),
|
|
61
|
+
shell('Build the graph', 'code-review-graph build', ['code-review-graph']),
|
|
62
|
+
], binary('code-review-graph'), ''),
|
|
63
|
+
], ['.code-review-graph/'], [
|
|
64
|
+
'Agents run `code-review-graph update` before querying when the graph is older than HEAD.',
|
|
65
|
+
'Without MCP, the same answers come from the CLI: `code-review-graph impact --base main`, `code-review-graph detect-changes`.',
|
|
66
|
+
]),
|
|
67
|
+
new ExternalTool(ToolId.Graphify, 'graphify', 'safishamsi/graphify', ToolRole.CodeGraph, 'Architecture map: whole-repo knowledge graph across code, SQL, docs and config, with GRAPH_REPORT.md.', ['00 bootstrap', '00a', '01b', '08'], [
|
|
68
|
+
new RuntimeSupport(Runtime.ClaudeCode, [
|
|
69
|
+
shell('Install the CLI', 'uv tool install graphifyy', ['uv']),
|
|
70
|
+
shell('Install the /graphify skill', 'graphify install', ['graphify']),
|
|
71
|
+
shell('Rebuild on commit and checkout', 'graphify hook install', ['graphify']),
|
|
72
|
+
], binary('graphify'), ''),
|
|
73
|
+
new RuntimeSupport(Runtime.Codex, [
|
|
74
|
+
shell('Install the CLI', 'uv tool install graphifyy', ['uv']),
|
|
75
|
+
shell('Install the skill for Codex', 'graphify install --platform codex', ['graphify']),
|
|
76
|
+
shell('Rebuild on commit and checkout', 'graphify hook install', ['graphify']),
|
|
77
|
+
], binary('graphify'), ''),
|
|
78
|
+
], ['graphify-out/'], ['/graphify . once after install; the hook keeps it current. /bootstrap reads graphify-out/GRAPH_REPORT.md first.']),
|
|
79
|
+
];
|
|
80
|
+
export class ToolCatalog {
|
|
81
|
+
tools;
|
|
82
|
+
constructor(tools) {
|
|
83
|
+
this.tools = tools;
|
|
84
|
+
}
|
|
85
|
+
all() {
|
|
86
|
+
return this.tools;
|
|
87
|
+
}
|
|
88
|
+
byId(id) {
|
|
89
|
+
const tool = this.tools.find((candidate) => candidate.id === id);
|
|
90
|
+
if (tool === undefined) {
|
|
91
|
+
throw new Error(`Tool ${id} is not in the catalog`);
|
|
92
|
+
}
|
|
93
|
+
return tool;
|
|
94
|
+
}
|
|
95
|
+
forIds(ids) {
|
|
96
|
+
return this.tools.filter((tool) => ids.includes(tool.id));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export const TOOL_CATALOG = new ToolCatalog(TOOLS);
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fullstack-agentic-flow",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Gated multi-agent delivery pipeline for Claude Code and Codex: MVC, unified API, and split backend/frontend topologies, TDD-first, typed data, impact analysis.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"fullstack-agentic-flow": "dist/src/cli/main.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/src",
|
|
11
|
+
"payload",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.11"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.json",
|
|
20
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
21
|
+
"test": "npm run build && node --test \"dist/test/**/*.test.js\"",
|
|
22
|
+
"prepublishOnly": "npm test",
|
|
23
|
+
"prepare": "npm run build"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"claude-code",
|
|
27
|
+
"codex",
|
|
28
|
+
"agents",
|
|
29
|
+
"agent-skills",
|
|
30
|
+
"tdd",
|
|
31
|
+
"pipeline",
|
|
32
|
+
"laravel",
|
|
33
|
+
"nestjs",
|
|
34
|
+
"code-review",
|
|
35
|
+
"impact-analysis"
|
|
36
|
+
],
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
|
+
"typescript": "^5.6.0"
|
|
41
|
+
},
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://gitlab.com/mohd-arbaaz/fullstack-agentic-flow.git"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://gitlab.com/mohd-arbaaz/fullstack-agentic-flow#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://gitlab.com/mohd-arbaaz/fullstack-agentic-flow/-/issues"
|
|
52
|
+
}
|
|
53
|
+
}
|