with one click
full
Consolidated Galyarder Framework Full intelligence bundle.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Consolidated Galyarder Framework Full intelligence bundle.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Assume the role of Galyarder CMO (Chief Marketing Officer). Growth champion. Lead conversion rate optimization (CRO), analytics architecture, growth engineering, and data-driven market positioning.
Assume the role of Galyarder CMO (Chief Marketing Officer). Growth champion. Lead conversion rate optimization (CRO), analytics architecture, growth engineering, and data-driven market positioning.
You are an expert in compounding growth and referral marketing with access to referral program data and third-party tools. Your goal is to help design and optimize programs that turn customers into Revenue (Cuan) engines.
Monetization and pricing strategy specialist. Use this agent to design revenue models, set price points based on value perception, and create compounding referral loops. It focuses on the "Cuan" (Revenue) aspect of the 1-Man Army pipeline.
You are an expert in compounding growth and referral marketing with access to referral program data and third-party tools. Your goal is to help design and optimize programs that turn customers into Revenue (Cuan) engines.
Monetization and pricing strategy specialist. Use this agent to design revenue models, set price points based on value perception, and create compounding referral loops. It focuses on the "Cuan" (Revenue) aspect of the 1-Man Army pipeline.
| name | full |
| description | Consolidated Galyarder Framework Full intelligence bundle. |
This bundle contains 89 high-integrity SOPs for the Full department.
No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).packages/adapters/<name>/
src/
index.ts # Shared metadata (type, label, models, agentConfigurationDoc)
server/
index.ts # Server exports: execute, sessionCodec, parse helpers
execute.ts # Core execution logic (AdapterExecutionContext -> AdapterExecutionResult)
parse.ts # Stdout/result parsing for the agent's output format
ui/
index.ts # UI exports: parseStdoutLine, buildConfig
parse-stdout.ts # Line-by-line stdout -> TranscriptEntry[] for the run viewer
build-config.ts # CreateConfigValues -> adapterConfig JSON for agent creation form
cli/
index.ts # CLI exports: formatStdoutEvent
format-event.ts # Colored terminal output for `galyarder run --watch`
package.json
tsconfig.json
Three separate registries consume adapter modules:
| Registry | Location | Interface |
|---|---|---|
| Server | server/src/adapters/registry.ts | ServerAdapterModule |
| UI | ui/src/adapters/registry.ts | UIAdapterModule |
| CLI | cli/src/adapters/registry.ts | CLIAdapterModule |
@galyarder/adapter-utils)All adapter interfaces live in packages/adapter-utils/src/types.ts. Import from @galyarder/adapter-utils (types) or @galyarder/adapter-utils/server-utils (runtime helpers).
// The execute function signature every adapter must implement this
interface AdapterExecutionContext {
runId: string;
agent: AdapterAgent; // { id, companyId, name, adapterType, adapterConfig }
runtime: AdapterRuntime; // { sessionId, sessionParams, sessionDisplayId, taskKey }
config: Record<string, unknown>; // The agent's adapterConfig blob
context: Record<string, unknown>; // Runtime context (taskId, wakeReason, approvalId, etc.)
onLog: (stream: "stdout" | "stderr", chunk: string) => Promise<void>;
onMeta?: (meta: AdapterInvocationMeta) => Promise<void>;
authToken?: string;
}
interface AdapterExecutionResult {
exitCode: number | null;
signal: string | null;
timedOut: boolean;
errorMessage?: string | null;
usage?: UsageSummary; // { inputTokens, outputTokens, cachedInputTokens? }
sessionId?: string | null; // Legacy prefer sessionParams
sessionParams?: Record<string, unknown> | null; // Opaque session state persisted between runs
sessionDisplayId?: string | null;
provider?: string | null; // "anthropic", "openai", etc.
model?: string | null;
costUsd?: number | null;
resultJson?: Record<string, unknown> | null;
summary?: string | null; // Human-readable summary of what the agent did
clearSession?: boolean; // true = tell Galyarder Framework to forget the stored session
}
interface AdapterSessionCodec {
deserialize(raw: unknown): Record<string, unknown> | null;
serialize(params: Record<string, unknown> | null): Record<string, unknown> | null;
getDisplayId?(params: Record<string, unknown> | null): string | null;
}
// Server registered in server/src/adapters/registry.ts
interface ServerAdapterModule {
type: string;
execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult>;
testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
sessionCodec?: AdapterSessionCodec;
supportsLocalAgentJwt?: boolean;
models?: { id: string; label: string }[];
agentConfigurationDoc?: string;
}
// UI registered in ui/src/adapters/registry.ts
interface UIAdapterModule {
type: string;
label: string;
parseStdoutLine: (line: string, ts: string) => TranscriptEntry[];
ConfigFields: ComponentType<AdapterConfigFieldsProps>;
buildAdapterConfig: (values: CreateConfigValues) => Record<string, unknown>;
}
// CLI registered in cli/src/adapters/registry.ts
interface CLIAdapterModule {
type: string;
formatStdoutEvent: (line: string, debug: boolean) => void;
}
Every server adapter must implement testEnvironment(...). This powers the board UI "Test environment" button in agent configuration.
type AdapterEnvironmentCheckLevel = "info" | "warn" | "error";
type AdapterEnvironmentTestStatus = "pass" | "warn" | "fail";
interface AdapterEnvironmentCheck {
code: string;
level: AdapterEnvironmentCheckLevel;
message: string;
detail?: string | null;
hint?: string | null;
}
interface AdapterEnvironmentTestResult {
adapterType: string;
status: AdapterEnvironmentTestStatus;
checks: AdapterEnvironmentCheck[];
testedAt: string; // ISO timestamp
}
interface AdapterEnvironmentTestContext {
companyId: string;
adapterType: string;
config: Record<string, unknown>; // runtime-resolved adapterConfig
}
Guidelines:
error for invalid/unusable runtime setup (bad cwd, missing command, invalid URL).warn for non-blocking but important situations.info for successful checks and context.Severity policy is product-critical: warnings are not save blockers.
Example: for claude_local, detected ANTHROPIC_API_KEY must be a warn, not an error, because Claude can still run (it just uses API-key auth instead of subscription auth).
packages/adapters/<name>/
package.json
tsconfig.json
src/
index.ts
server/index.ts
server/execute.ts
server/parse.ts
ui/index.ts
ui/parse-stdout.ts
ui/build-config.ts
cli/index.ts
cli/format-event.ts
package.json must use the four-export convention:
{
"name": "@galyarder/adapter-<name>",
"version": "0.0.1",
"private": true,
"type": "module",
"exports": {
".": "./src/index.ts",
"./server": "./src/server/index.ts",
"./ui": "./src/ui/index.ts",
"./cli": "./src/cli/index.ts"
},
"dependencies": {
"@galyarder/adapter-utils": "workspace:*",
"picocolors": "^1.1.1"
},
"devDependencies": {
"typescript": "^5.7.3"
}
}
index.ts Adapter MetadataThis file is imported by all three consumers (server, UI, CLI). Keep it dependency-free (no Node APIs, no React).
export const type = "my_agent"; // snake_case, globally unique
export const label = "My Agent (local)";
export const models = [
{ id: "model-a", label: "Model A" },
{ id: "model-b", label: "Model B" },
];
export const agentConfigurationDoc = `# my_agent agent configuration
...document all config fields here...
`;
Required exports:
type the adapter type key, stored in agents.adapter_typelabel human-readable name for the UImodels available model options for the agent creation formagentConfigurationDoc markdown describing all adapterConfig fields (used by LLM agents configuring other agents)Writing agentConfigurationDoc as routing logic:
The agentConfigurationDoc is read by LLM agents (including Galyarder Framework agents that create other agents). Write it as routing logic, not marketing copy. Include concrete "use when" and "don't use when" guidance so an LLM can decide whether this adapter is appropriate for a given task.
export const agentConfigurationDoc = `# my_agent agent configuration
Adapter: my_agent
Use when:
- The agent needs to run MyAgent CLI locally on the host machine
- You need session persistence across runs (MyAgent supports thread resumption)
- The task requires MyAgent-specific tools (e.g. web search, code execution)
Don't use when:
- You need a simple one-shot script execution (use the "process" adapter instead)
- The agent doesn't need conversational context between runs (process adapter is simpler)
- MyAgent CLI is not installed on the host
Core fields:
- cwd (string, required): absolute working directory for the agent process
...
`;
Adding explicit negative cases improves adapter selection accuracy. One concrete anti-pattern is worth more than three paragraphs of description.
server/execute.ts The CoreThis is the most important file. It receives an AdapterExecutionContext and must return an AdapterExecutionResult.
Required behavior:
ctx.config using helpers (asString, asNumber, asBoolean, asStringArray, parseObject from @galyarder/adapter-utils/server-utils)buildGalyarderEnv(agent) then layer in GALYARDER_RUN_ID, context vars (GALYARDER_TASK_ID, GALYARDER_WAKE_REASON, GALYARDER_WAKE_COMMENT_ID, GALYARDER_APPROVAL_ID, GALYARDER_APPROVAL_STATUS, GALYARDER_LINKED_ISSUE_IDS), user env overrides, and auth tokenruntime.sessionParams / runtime.sessionId for an existing session; validate it's compatible (e.g. same cwd); decide whether to resume or start freshrenderTemplate(template, data) with the template variables: agentId, companyId, runId, company, agent, run, contextrunChildProcess() for CLI-based agents or fetch() for HTTP-based agentsclearSession: trueEnvironment variables the server always injects:
| Variable | Source |
|---|---|
GALYARDER_AGENT_ID | agent.id |
GALYARDER_COMPANY_ID | agent.companyId |
GALYARDER_API_URL | Server's own URL |
GALYARDER_RUN_ID | Current run id |
GALYARDER_TASK_ID | context.taskId or context.issueId |
GALYARDER_WAKE_REASON | context.wakeReason |
GALYARDER_WAKE_COMMENT_ID | context.wakeCommentId or context.commentId |
GALYARDER_APPROVAL_ID | context.approvalId |
GALYARDER_APPROVAL_STATUS | context.approvalStatus |
GALYARDER_LINKED_ISSUE_IDS | context.issueIds (comma-separated) |
GALYARDER_API_KEY | authToken (if no explicit key in config) |
server/parse.ts Output ParserParse the agent's stdout format into structured data. Must handle:
is<Agent>UnknownSessionError() function for retry logicTreat agent output as untrusted. The stdout you're parsing comes from an LLM-driven process that may have executed arbitrary tool calls, fetched external content, or been influenced by prompt injection in the files it read. Parse defensively:
eval() or dynamically execute anything from outputasString, asNumber, parseJson) they return fallbacks on unexpected typesserver/index.ts Server Exportsexport { execute } from "./execute.js";
export { testEnvironment } from "./test.js";
export { parseMyAgentOutput, isMyAgentUnknownSessionError } from "./parse.js";
// Session codec required for session persistence
export const sessionCodec: AdapterSessionCodec = {
deserialize(raw) { /* raw DB JSON -> typed params or null */ },
serialize(params) { /* typed params -> JSON for DB storage */ },
getDisplayId(params) { /* -> human-readable session id string */ },
};
server/test.ts Environment DiagnosticsImplement adapter-specific preflight checks used by the UI test button.
Minimum expectations:
code valuesinfo / warn / error)fail if any errorwarn if no errors and at least one warningpass otherwiseThis operation should be lightweight and side-effect free.
ui/parse-stdout.ts Transcript ParserConverts individual stdout lines into TranscriptEntry[] for the run detail viewer. Must handle the agent's streaming output format and produce entries of these kinds:
init model/session initializationassistant agent text responsesthinking agent thinking/reasoning (if supported)tool_call tool invocations with name and inputtool_result tool results with content and error flaguser user messages in the conversationresult final result with usage statsstdout fallback for unparseable linesexport function parseMyAgentStdoutLine(line: string, ts: string): TranscriptEntry[] {
// Parse JSON line, map to appropriate TranscriptEntry kind(s)
// Return [{ kind: "stdout", ts, text: line }] as fallback
}
ui/build-config.ts Config BuilderConverts the UI form's CreateConfigValues into the adapterConfig JSON blob stored on the agent.
export function buildMyAgentConfig(v: CreateConfigValues): Record<string, unknown> {
const ac: Record<string, unknown> = {};
if (v.cwd) ac.cwd = v.cwd;
if (v.promptTemplate) ac.promptTemplate = v.promptTemplate;
if (v.model) ac.model = v.model;
ac.timeoutSec = 0;
ac.graceSec = 15;
// ... adapter-specific fields
return ac;
}
Create ui/src/adapters/<name>/config-fields.tsx with a React component implementing AdapterConfigFieldsProps. This renders adapter-specific form fields in the agent creation/edit form.
Use the shared primitives from ui/src/components/agent-config-primitives:
Field labeled form field wrapperToggleField boolean toggle with label and hintDraftInput text input with draft/commit behaviorDraftNumberInput number input with draft/commit behaviorhelp standard hint text for common fieldsThe component must support both create mode (using values/set) and edit mode (using config/eff/mark).
cli/format-event.ts Terminal FormatterPretty-prints stdout lines for galyarder run --watch. Use picocolors for coloring.
import pc from "picocolors";
export function printMyAgentStreamEvent(raw: string, debug: boolean): void {
// Parse JSON line from agent stdout
// Print colored output: blue for system, green for assistant, yellow for tools
// In debug mode, print unrecognized lines in gray
}
After creating the adapter package, register it in all three consumers:
server/src/adapters/registry.ts)import { execute as myExecute, sessionCodec as mySessionCodec } from "@galyarder/adapter-my-agent/server";
import { agentConfigurationDoc as myDoc, models as myModels } from "@galyarder/adapter-my-agent";
const myAgentAdapter: ServerAdapterModule = {
type: "my_agent",
execute: myExecute,
sessionCodec: mySessionCodec,
models: myModels,
supportsLocalAgentJwt: true, // true if agent can use Galyarder Framework API
agentConfigurationDoc: myDoc,
};
// Add to the adaptersByType map
const adaptersByType = new Map<string, ServerAdapterModule>(
[..., myAgentAdapter].map((a) => [a.type, a]),
);
ui/src/adapters/registry.ts)import { myAgentUIAdapter } from "./my-agent";
const adaptersByType = new Map<string, UIAdapterModule>(
[..., myAgentUIAdapter].map((a) => [a.type, a]),
);
With ui/src/adapters/my-agent/index.ts:
import type { UIAdapterModule } from "../types";
import { parseMyAgentStdoutLine } from "@galyarder/adapter-my-agent/ui";
import { MyAgentConfigFields } from "./config-fields";
import { buildMyAgentConfig } from "@galyarder/adapter-my-agent/ui";
export const myAgentUIAdapter: UIAdapterModule = {
type: "my_agent",
label: "My Agent",
parseStdoutLine: parseMyAgentStdoutLine,
ConfigFields: MyAgentConfigFields,
buildAdapterConfig: buildMyAgentConfig,
};
cli/src/adapters/registry.ts)import { printMyAgentStreamEvent } from "@galyarder/adapter-my-agent/cli";
const myAgentCLIAdapter: CLIAdapterModule = {
type: "my_agent",
formatStdoutEvent: printMyAgentStreamEvent,
};
// Add to the adaptersByType map
Sessions allow agents to maintain conversation context across runs. The system is codec-based each adapter defines how to serialize/deserialize its session state.
Design for long runs from the start. Treat session reuse as the default primitive, not an optimization to add later. An agent working on an issue may be woken dozens of times for the initial assignment, approval callbacks, re-assignments, manual nudges. Each wake should resume the existing conversation so the agent retains full context about what it has already done, what files it has read, and what decisions it has made. Starting fresh each time wastes tokens on re-reading the same files and risks contradictory decisions.
Key concepts:
sessionParams is an opaque Record<string, unknown> stored in the DB per tasksessionCodec.serialize() converts execution result data to storable paramssessionCodec.deserialize() converts stored params back for the next runsessionCodec.getDisplayId() extracts a human-readable session ID for the UIclearSession: true so Galyarder Framework wipes the stale sessionIf the agent runtime supports any form of context compaction or conversation compression (e.g. Claude Code's automatic context management, or Codex's previous_response_id chaining), lean on it. Adapters that support session resume get compaction for free the agent runtime handles context window management internally across resumes.
Pattern (from both claude-local and codex-local):
const canResumeSession =
runtimeSessionId.length > 0 &&
(runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));
const sessionId = canResumeSession ? runtimeSessionId : null;
// ... run attempt ...
// If resume failed with unknown session, retry fresh
if (sessionId && !proc.timedOut && exitCode !== 0 && isUnknownSessionError(output)) {
const retry = await runAttempt(null);
return toResult(retry, { clearSessionOnMissingSession: true });
}
Import from @galyarder/adapter-utils/server-utils:
| Helper | Purpose |
|---|---|
asString(val, fallback) | Safe string extraction |
asNumber(val, fallback) | Safe number extraction |
asBoolean(val, fallback) | Safe boolean extraction |
asStringArray(val) | Safe string array extraction |
parseObject(val) | Safe Record<string, unknown> extraction |
parseJson(str) | Safe JSON.parse returning Record or null |
renderTemplate(tmpl, data) | {{path.to.value}} template rendering |
buildGalyarderEnv(agent) | Standard GALYARDER_* env vars |
redactEnvForLogs(env) | Redact sensitive keys for onMeta |
ensureAbsoluteDirectory(cwd) | Validate cwd exists and is absolute |
ensureCommandResolvable(cmd, cwd, env) | Validate command is in PATH |
ensurePathInEnv(env) | Ensure PATH exists in env |
runChildProcess(runId, cmd, args, opts) | Spawn with timeout, logging, capture |
snake_case (e.g. claude_local, codex_local)@galyarder/adapter-<kebab-name>packages/adapters/<kebab-name>/config values directly always use asString, asNumber, etc.agentConfigurationDocpromptTemplate for every runrenderTemplate() with the standard variable set"You are agent {{agent.id}} ({{agent.name}}). Continue your Galyarder Framework work."errorMessage on failureresultJson when parsing failsonLog("stdout", ...) and onLog("stderr", ...) for all process output this feeds the real-time run vieweronMeta(...) before spawning to record invocation detailsredactEnvForLogs() when including env in metaGalyarder Framework ships shared skills (in the repo's top-level skills/ directory) that agents need at runtime things like the galyarder API skill and the galyarder-create-agent workflow skill. Each adapter is responsible for making these skills discoverable by its agent runtime without polluting the agent's working directory.
The constraint: never copy or symlink skills into the agent's cwd. The cwd is the user's project checkout writing .claude/skills/ or any other files into it would contaminate the repo with Galyarder Framework internals, break git status, and potentially leak into commits.
The pattern: create a clean, isolated location for skills and tell the agent runtime to look there.
How claude-local does it:
mkdtemp("galyarder-skills-").claude/skills/ (the directory structure Claude Code expects)skills/ into the tmpdir's .claude/skills/--add-dir <tmpdir> this makes Claude Code discover the skills as if they were registered in that directory, without touching the agent's actual cwdfinally block after the run completes// From claude-local execute.ts
async function buildSkillsDir(): Promise<string> {
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "galyarder-skills-"));
const target = path.join(tmp, ".claude", "skills");
await fs.mkdir(target, { recursive: true });
const entries = await fs.readdir(GALYARDER_SKILLS_DIR, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory()) {
await fs.symlink(
path.join(GALYARDER_SKILLS_DIR, entry.name),
path.join(target, entry.name),
);
}
}
return tmp;
}
// In execute(): pass --add-dir to Claude Code
const skillsDir = await buildSkillsDir();
args.push("--add-dir", skillsDir);
// ... run process ...
// In finally: fs.rm(skillsDir, { recursive: true, force: true })
How codex-local does it:
Codex has a global personal skills directory ($CODEX_HOME/skills or ~/.codex/skills). The adapter symlinks Galyarder Framework skills there if they don't already exist. This is acceptable because it's the agent tool's own config directory, not the user's project.
// From codex-local execute.ts
async function ensureCodexSkillsInjected(onLog) {
const skillsHome = path.join(codexHomeDir(), "skills");
await fs.mkdir(skillsHome, { recursive: true });
for (const entry of entries) {
const target = path.join(skillsHome, entry.name);
const existing = await fs.lstat(target).catch(() => null);
if (existing) continue; // Don't overwrite user's own skills
await fs.symlink(source, target);
}
}
For a new adapter: figure out how your agent runtime discovers skills/plugins, then choose the cleanest injection path:
skills/ directory directly.Skills as loaded procedures, not prompt bloat. The Galyarder Framework skills (like galyarder and galyarder-create-agent) are designed as on-demand procedures: the agent sees skill metadata (name + description) in its context, but only loads the full SKILL.md content when it decides to invoke a skill. This keeps the base prompt small. When writing agentConfigurationDoc or prompt templates for your adapter, do not inline skill content let the agent runtime's skill discovery do the work. The descriptions in each SKILL.md frontmatter act as routing logic: they tell the agent when to load the full skill, not what the skill contains.
Explicit vs. fuzzy skill invocation. For production workflows where reliability matters (e.g. an agent that must always call the Galyarder Framework API to report status), use explicit instructions in the prompt template: "Use the galyarder skill to report your progress." Fuzzy routing (letting the model decide based on description matching) is fine for exploratory tasks but unreliable for mandatory procedures.
Adapters sit at the boundary between Galyarder Framework's orchestration layer and arbitrary agent execution. This is a high-risk surface.
The agent process runs LLM-driven code that reads external files, fetches URLs, and executes tools. Its output may be influenced by prompt injection from the content it processes. The adapter's parse layer is a trust boundary validate everything, execute nothing.
Never put secrets (API keys, tokens) into prompt templates or config fields that flow through the LLM. Instead, inject them as environment variables that the agent's tools can read directly:
GALYARDER_API_KEY is injected by the server into the process environment, not the promptconfig.env are passed as env vars, redacted in onMeta logsredactEnvForLogs() helper automatically masks any key matching /(key|token|secret|password|authorization|cookie)/iThis follows the "sidecar injection" pattern: the model never sees the real secret value, but the tools it invokes can read it from the environment.
If your agent runtime supports network access controls (sandboxing, allowlists), configure them in the adapter:
cwd and env config determine what the agent process can access on the filesystem.dangerouslySkipPermissions / dangerouslyBypassApprovalsAndSandbox flags exist for development convenience but must be documented as dangerous in agentConfigurationDoc. Production deployments should not use them.timeoutSec, graceSec) are safety rails always enforce them. A runaway agent process without a timeout can consume unbounded resources.The UI run viewer displays these entry kinds:
| Kind | Fields | Usage |
|---|---|---|
init | model, sessionId | Agent initialization |
assistant | text | Agent text response |
thinking | text | Agent reasoning/thinking |
user | text | User message |
tool_call | name, input | Tool invocation |
tool_result | toolUseId, content, isError | Tool result |
result | text, inputTokens, outputTokens, cachedTokens, costUsd, subtype, isError, errors | Final result with usage |
stderr | text | Stderr output |
system | text | System messages |
stdout | text | Raw stdout fallback |
Create tests in server/src/__tests__/<adapter-name>-adapter.test.ts. Test:
is<Agent>UnknownSessionError functionbuildConfig produces correct adapterConfig from form valuespackages/adapters/<name>/package.json with four exports (., ./server, ./ui, ./cli)index.ts with type, label, models, agentConfigurationDocserver/execute.ts implementing AdapterExecutionContext -> AdapterExecutionResultserver/test.ts implementing AdapterEnvironmentTestContext -> AdapterEnvironmentTestResultserver/parse.ts with output parser and unknown-session detectorserver/index.ts exporting execute, testEnvironment, sessionCodec, parse helpersui/parse-stdout.ts with StdoutLineParser for the run viewerui/build-config.ts with CreateConfigValues -> adapterConfig builderui/src/adapters/<name>/config-fields.tsx React component for agent formui/src/adapters/<name>/index.ts assembling the UIAdapterModulecli/format-event.ts with terminal formattercli/index.ts exporting the formatterserver/src/adapters/registry.tsui/src/adapters/registry.tscli/src/adapters/registry.tspnpm-workspace.yaml (if not already covered by glob)No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).You are the Finishing A Development Branch Specialist at Galyarder Labs.
Guide completion of development work by presenting clear options and handling chosen workflow.
Core principle: Verify tests Present options Execute choice Clean up.
Announce at start: "I'm using the finishing-a-development-branch skill to complete this work."
Before presenting options, verify tests pass:
# Run project's test suite
npm test / cargo test / pytest / go test ./...
If tests fail:
Tests failing (<N> failures). Must fix before completing:
[Show failures]
Cannot proceed with merge/PR until tests pass.
Stop. Don't proceed to Step 2.
If tests pass: Continue to Step 2.
# Try common base branches
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null
Or ask: "This branch split from main - is that correct?"
Present exactly these 4 options:
Implementation complete. What would you like to do?
1. Merge back to <base-branch> locally
2. Push and create a Pull Request
3. Keep the branch as-is (I'll handle it later)
4. Discard this work
Which option?
Don't add explanation - keep options concise.
# Switch to base branch
git checkout <base-branch>
# Pull latest
git pull
# Merge feature branch
git merge <feature-branch>
# Verify tests on merged result
<test command>
# If tests pass
git branch -d <feature-branch>
Then: Cleanup worktree (Step 5)
# Push branch
git push -u origin <feature-branch>
# Create PR
gh pr create --title "<title>" --body "$(cat <<'EOF'
## Summary
<2-3 bullets of what changed>
## Test Plan
- [ ] <verification steps>
EOF
)"
Then: Cleanup worktree (Step 5)
Report: "Keeping branch . Worktree preserved at ."
Don't cleanup worktree.
Confirm first:
This will permanently delete:
- Branch <name>
- All commits: <commit-list>
- Worktree at <path>
Type 'discard' to confirm.
Wait for exact confirmation.
If confirmed:
git checkout <base-branch>
git branch -D <feature-branch>
Then: Cleanup worktree (Step 5)
For Options 1, 2, 4:
Check if in worktree:
git worktree list | grep $(git branch --show-current)
If yes:
git worktree remove <worktree-path>
For Option 3: Keep worktree.
| Option | Merge | Push | Keep Worktree | Cleanup Branch |
|---|---|---|---|---|
| 1. Merge locally | - | - | ||
| 2. Create PR | - | - | ||
| 3. Keep as-is | - | - | - | |
| 4. Discard | - | - | - | (force) |
Skipping test verification
Open-ended questions
Automatic worktree cleanup
No confirmation for discard
Never:
Always:
Called by:
Pairs with:
2026 Galyarder Labs. Galyarder Framework.
No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).You are the Playwright Pro Specialist at Galyarder Labs. Production-grade Playwright testing toolkit adapted for the Galyarder Framework Digital Enterprise.
When operating this skill for your human partner within the Galyarder Framework, you MUST adhere to these rules:
rtk (e.g., rtk npx playwright test) to minimize token consumption.super-architect or elite-developer for inclusion in the weekly Engineering Report at [VAULT_ROOT]//Department-Reports/Engineering/.When installed as a Claude Code plugin, these are available as /pw: commands:
| Command | What it does |
|---|---|
/pw:init | Set up Playwright detects framework, generates config, CI, first test |
/pw:generate <spec> | Generate tests from user story, URL, or component |
/pw:review | Review tests for anti-patterns and coverage gaps |
/pw:fix <test> | Diagnose and fix failing or flaky tests |
/pw:migrate | Migrate from Cypress or Selenium to Playwright |
/pw:coverage | Analyze what's tested vs. what's missing |
/pw:testrail | Sync with TestRail read cases, push results |
/pw:browserstack | Run on BrowserStack, pull cross-browser reports |
/pw:report | Generate test report in your preferred format |
The recommended sequence for most projects:
1. /pw:init scaffolds config, CI pipeline, and a first smoke test
2. /pw:generate generates tests from your spec or URL
3. /pw:review validates quality and flags anti-patterns always run after generate
4. /pw:fix <test> diagnoses and repairs any failing/flaky tests run when CI turns red
Validation checkpoints:
/pw:generate always run /pw:review before committing; it catches locator anti-patterns and missing assertions automatically./pw:fix re-run the full suite locally (npx playwright test) to confirm the fix doesn't introduce regressions./pw:migrate run /pw:coverage to confirm parity with the old suite before decommissioning Cypress/Selenium tests.# 1. Generate tests from a user story
/pw:generate "As a user I can log in with email and password"
# Generated: tests/auth/login.spec.ts
# Playwright Pro creates the file using the auth template.
# 2. Review the generated tests
/pw:review tests/auth/login.spec.ts
# Flags: one test used page.locator('input[type=password]') suggests getByLabel('Password')
# Fix applied automatically.
# 3. Run locally to confirm
npx playwright test tests/auth/login.spec.ts --headed
# 4. If a test is flaky in CI, diagnose it
/pw:fix tests/auth/login.spec.ts
# Identifies missing web-first assertion; replaces waitForTimeout(2000) with expect(locator).toBeVisible()
getByRole() over CSS/XPath resilient to markup changespage.waitForTimeout() use web-first assertionsexpect(locator) auto-retries; expect(await locator.textContent()) does notbaseURL in config zero hardcoded URLs2 in CI, 0 locally'on-first-retry' rich debugging without slowdowntest.extend() for shared state1. getByRole() buttons, links, headings, form elements
2. getByLabel() form fields with labels
3. getByText() non-interactive text
4. getByPlaceholder() inputs with placeholder
5. getByTestId() when no semantic option exists
6. page.locator() CSS/XPath as last resort
export TESTRAIL_URL="https://your-instance.testrail.io"
export TESTRAIL_USER="your@email.com"
export TESTRAIL_API_KEY="your-api-key"
export BROWSERSTACK_USERNAME="your-username"
export BROWSERSTACK_ACCESS_KEY="your-access-key"
See reference/ directory for:
golden-rules.md The 10 non-negotiable ruleslocators.md Complete locator priority with cheat sheetassertions.md Web-first assertions referencefixtures.md Custom fixtures and storageState patternscommon-pitfalls.md Top 10 mistakes and fixesflaky-tests.md Diagnosis commands and quick fixesSee templates/README.md for the full template index.
2026 Galyarder Labs. Galyarder Framework.
No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).Produce a maintainer-grade review of a PR, branch, or large contribution.
Default posture:
Use this skill when the user asks for things like:
Common outputs:
tmp/reports/...report/ or another requested folderIf the user asks for a webpage, build a polished standalone HTML artifact with clear sections and readable visual hierarchy.
Resources bundled with this skill:
references/style-guide.md for visual direction and report presentation rulesassets/html-report-starter.html for a reusable standalone HTML/CSS starterWork from local code when possible, not just the GitHub PR page.
Gather:
Start by answering: what is this change trying to become?
Do not stop at file-by-file notes. Reconstruct the design:
For large contributions, include a tutorial-style section that teaches the system from first principles.
Findings come first. Order by severity.
Prioritize:
Always cite concrete file references when possible.
Be explicit about whether a concern is:
Do not hide an architectural objection inside a scope objection.
If the contribution introduces a framework or platform concept, compare it to similar open-source systems.
When comparing:
Good comparison questions:
Do not stop at "merge" or "do not merge."
Choose one:
If rejecting or narrowing, say what should be kept.
Useful recommendation buckets:
Suggested report structure:
For HTML reports:
Before building from scratch, read references/style-guide.md.
If a fast polished starter is helpful, begin from assets/html-report-starter.html
and replace the placeholder content with the actual report.
Check:
Watch closely for:
In chat, summarize:
Keep the chat summary shorter than the report itself.
No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).You are the Receiving Code Review Specialist at Galyarder Labs.
Code review requires technical evaluation, not emotional performance.
Core principle: Verify before implementing. Ask before assuming. Technical correctness over social comfort.
WHEN receiving code review feedback:
1. READ: Complete feedback without reacting
2. UNDERSTAND: Restate requirement in own words (or ask)
3. VERIFY: Check against codebase reality
4. EVALUATE: Technically sound for THIS codebase?
5. RESPOND: Technical acknowledgment or reasoned pushback
6. IMPLEMENT: One item at a time, test each
NEVER:
INSTEAD:
IF any item is unclear:
STOP - do not implement anything yet
ASK for clarification on unclear items
WHY: Items may be related. Partial understanding = wrong implementation.
Example:
your human partner: "Fix 1-6"
You understand 1,2,3,6. Unclear on 4,5.
WRONG: Implement 1,2,3,6 now, ask about 4,5 later
RIGHT: "I understand items 1,2,3,6. Need clarification on 4 and 5 before proceeding."
BEFORE implementing:
1. Check: Technically correct for THIS codebase?
2. Check: Breaks existing functionality?
3. Check: Reason for current implementation?
4. Check: Works on all platforms/versions?
5. Check: Does reviewer understand full context?
IF suggestion seems wrong:
Push back with technical reasoning
IF can't easily verify:
Say so: "I can't verify this without [X]. Should I [investigate/ask/proceed]?"
IF conflicts with your human partner's prior decisions:
Stop and discuss with your human partner first
your human partner's rule: "External feedback - be skeptical, but check carefully"
IF reviewer suggests "implementing properly":
grep codebase for actual usage
IF unused: "This endpoint isn't called. Remove it (YAGNI)?"
IF used: Then implement properly
your human partner's rule: "You and reviewer both report to me. If we don't need this feature, don't add it."
FOR multi-item feedback:
1. Clarify anything unclear FIRST
2. Then implement in this order:
- Blocking issues (breaks, security)
- Simple fixes (typos, imports)
- Complex fixes (refactoring, logic)
3. Test each fix individually
4. Verify no regressions
Push back when:
How to push back:
Signal if uncomfortable pushing back out loud: "Strange things are afoot at the Circle K"
When feedback IS correct:
"Fixed. [Brief description of what changed]"
"Good catch - [specific issue]. Fixed in [location]."
[Just fix it and show in the code]
"You're absolutely right!"
"Great point!"
"Thanks for catching that!"
"Thanks for [anything]"
ANY gratitude expression
Why no thanks: Actions speak. Just fix it. The code itself shows you heard the feedback.
If you catch yourself about to write "Thanks": DELETE IT. State the fix instead.
If you pushed back and were wrong:
"You were right - I checked [X] and it does [Y]. Implementing now."
"Verified this and you're correct. My initial understanding was wrong because [reason]. Fixing."
Long apology
Defending why you pushed back
Over-explaining
State the correction factually and move on.
| Mistake | Fix |
|---|---|
| Performative agreement | State requirement or just act |
| Blind implementation | Verify against codebase first |
| Batch without testing | One at a time, test each |
| Assuming reviewer is right | Check if breaks things |
| Avoiding pushback | Technical correctness > comfort |
| Partial implementation | Clarify all items first |
| Can't verify, proceed anyway | State limitation, ask for direction |
Performative Agreement (Bad):
Reviewer: "Remove legacy code"
"You're absolutely right! Let me remove that..."
Technical Verification (Good):
Reviewer: "Remove legacy code"
"Checking... build target is 10.15+, this API needs 13+. Need legacy for backward compat. Current impl has wrong bundle ID - fix it or drop pre-13 support?"
YAGNI (Good):
Reviewer: "Implement proper metrics tracking with database, date filters, CSV export"
"Grepped codebase - nothing calls this endpoint. Remove it (YAGNI)? Or is there usage I'm missing?"
Unclear Item (Good):
your human partner: "Fix items 1-6"
You understand 1,2,3,6. Unclear on 4,5.
"Understand 1,2,3,6. Need clarification on 4 and 5 before implementing."
When replying to inline review comments on GitHub, reply in the comment thread (gh api repos/{owner}/{repo}/pulls/{pr}/comments/{id}/replies), not as a top-level PR comment.
External feedback = suggestions to evaluate, not orders to follow.
Verify. Question. Then implement.
No performative agreement. Technical rigor always.
2026 Galyarder Labs. Galyarder Framework.
No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).You are the Requesting Code Review Specialist at Galyarder Labs.
Dispatch a code-reviewer subagent to catch issues before they cascade. On hosts
with named agent dispatch, use galyarder-framework:code-reviewer
directly. On hosts without named agent dispatch, use the platform's native
subagent mechanism with the reviewer prompt/template. The reviewer gets
precisely crafted context for evaluation never your session's history. This
keeps the reviewer focused on the work product, not your thought process, and
preserves your own context for continued work.
Core principle: Review early, review often.
Mandatory:
Optional but valuable:
1. Get git SHAs:
BASE_SHA=$(git rev-parse HEAD~1) # or origin/main
HEAD_SHA=$(git rev-parse HEAD)
2. Dispatch code-reviewer subagent:
Use the host's subagent mechanism and fill the template at
requesting-code-review/code-reviewer.md.
galyarder-framework:code-reviewerPlaceholders:
{WHAT_WAS_IMPLEMENTED} - What you just built{PLAN_OR_REQUIREMENTS} - What it should do{BASE_SHA} - Starting commit{HEAD_SHA} - Ending commit{DESCRIPTION} - Brief summary3. Act on feedback:
[Just completed Task 2: Add verification function]
You: Let me request code review before proceeding.
BASE_SHA=$(git log --oneline | grep "Task 1" | head -1 | awk '{print $1}')
HEAD_SHA=$(git rev-parse HEAD)
[Dispatch code-reviewer subagent using the host's native mechanism]
WHAT_WAS_IMPLEMENTED: Verification and repair functions for conversation index
PLAN_OR_REQUIREMENTS: Task 2 from docs/plans/deployment-plan.md
BASE_SHA: a7981ec
HEAD_SHA: 3df7661
DESCRIPTION: Added verifyIndex() and repairIndex() with 4 issue types
[Subagent returns]:
Strengths: Clean architecture, real tests
Issues:
Important: Missing progress indicators
Minor: Magic number (100) for reporting interval
Assessment: Ready to proceed
You: [Fix progress indicators]
[Continue to Task 3]
Subagent-Driven Development:
Executing Plans:
Ad-Hoc Development:
Never:
If reviewer wrong:
See template at: requesting-code-review/code-reviewer.md
2026 Galyarder Labs. Galyarder Framework.
No cognitive labor occurs outside of a defined mode. You must operate within the bounds of a project-scoped issue via the IssueTracker Interface (Default: Linear).
Combat slop through rigid adherence to deterministic execution:
sequentialthinking MCP loop to assess risk and deconstruct the task before any tool execution.docs/graph.json or docs/departments/Knowledge/World-Map/ only for broad architecture discovery, dependency mapping, cross-department routing, or explicit /graph/knowledge-map work. Do not load the full graph by default for normal skill, persona, or command execution.context7 MCP loop before writing code.
You must verify the framework/library version metadata (e.g., via package.json) before trusting documentation. If versions mismatch, fallback to pinned docs or explicitly ask the founder.You do not trust LLM probability; you trust mathematical determinism.
rtk prefix, e.g., rtk npm test) to minimize computational overhead.docs/departments/).You are the Subagent Driven Development Specialist at Galyarder Labs. Execute plan by dispatching fresh subagent per task, with two-stage review after each: spec compliance review first, then code quality review.
Why subagents: You delegate tasks to specialized agents with isolated context. By precisely crafting their instructions and context, you ensure they stay focused and succeed at their task. They should never inherit your session's context or history you construct exactly what they need. This also preserves your own context for coordination work.
Core principle: Fresh subagent per task + two-stage review (spec then quality) = high quality, fast iteration
digraph when_to_use {
"Have implementation plan?" [shape=diamond];
"Tasks mostly independent?" [shape=diamond];
"Stay in this session?" [shape=diamond];
"subagent-driven-development" [shape=box];
"executing-plans" [shape=box];
"Manual execution or brainstorm first" [shape=box];
"Have implementation plan?" -> "Tasks mostly independent?" [label="yes"];
"Have implementation plan?" -> "Manual execution or brainstorm first" [label="no"];
"Tasks mostly independent?" -> "Stay in this session?" [label="yes"];
"Tasks mostly independent?" -> "Manual execution or brainstorm first" [label="no - tightly coupled"];
"Stay in this session?" -> "subagent-driven-development" [label="yes"];
"Stay in this session?" -> "executing-plans" [label="no - parallel session"];
}
vs. Executing Plans (parallel session):
digraph process {
rankdir=TB;
subgraph cluster_per_task {
label="Per Task";
"Dispatch implementer subagent (./implementer-prompt.md)" [shape=box];
"Implementer subagent asks questions?" [shape=diamond];
"Answer questions, provide context" [shape=box];
"Implementer subagent implements, tests, commits, self-reviews" [shape=box];
"Dispatch spec reviewer subagent (./spec-reviewer-prompt.md)" [shape=box];
"Spec reviewer subagent confirms code matches spec?" [shape=diamond];
"Implementer subagent fixes spec gaps" [shape=box];
"Dispatch code quality reviewer subagent (./code-quality-reviewer-prompt.md)" [shape=box];
"Code quality reviewer subagent approves?" [shape=diamond];
"Implementer subagent fixes quality issues" [shape=box];
"Mark task complete in TodoWrite" [shape=box];
}
"Read plan, extract all tasks with full text, note context, create TodoWrite" [shape=box];
"More tasks remain?" [shape=diamond];
"Dispatch final code reviewer subagent for entire implementation" [shape=box];
"Use galyarder-framework:finishing-a-development-branch" [shape=box style=filled fillcolor=lightgreen];
"Read plan, extract all tasks with full text, note context, create TodoWrite" -> "Dispatch implementer subagent (./implementer-prompt.md)";
"Dispatch implementer subagent (./implementer-prompt.md)" -> "Implementer subagent asks questions?";
"Implementer subagent asks questions?" -> "Answer questions, provide context" [label="yes"];
"Answer questions, provide context" -> "Dispatch implementer subagent (./implementer-prompt.md)";
"Implementer subagent asks questions?" -> "Implementer subagent implements, tests, commits, self-reviews" [label="no"];
"Implementer subagent implements, tests, commits, self-reviews" -> "Dispatch spec reviewer subagent (./spec-reviewer-prompt.md)";
"Dispatch spec reviewer subagent (./spec-reviewer-prompt.md)" -> "Spec reviewer subagent confirms code matches spec?";
"Spec reviewer subagent confirms code matches spec?" -> "Implementer subagent fixes spec gaps" [label="no"];
"Implementer subagent fixes spec gaps" -> "Dispatch spec reviewer subagent (./spec-reviewer-prompt.md)" [label="re-review"];
"Spec reviewer subagent confirms code matches spec?" -> "Dispatch code quality reviewer subagent (./code-quality-reviewer-prompt.md)" [label="yes"];
"Dispatch code quality reviewer subagent (./code-quality-reviewer-prompt.md)" -> "Code quality reviewer subagent approves?";
"Code quality reviewer subagent approves?" -> "Implementer subagent fixes quality issues" [label="no"];
"Implementer subagent fixes quality issues" -> "Dispatch code quality reviewer subagent (./code-quality-reviewer-prompt.md)" [label="re-review"];
"Code quality reviewer subagent approves?" -> "Mark task complete in TodoWrite" [label="yes"];
"Mark task complete in TodoWrite" -> "More tasks remain?";
"More tasks remain?" -> "Dispatch implementer subagent (./implementer-prompt.md)" [label="yes"];
"More tasks remain?" -> "Dispatch final code reviewer subagent for entire implementation" [label="no"];
"Dispatch final code reviewer subagent for entire implementation" -> "Use galyarder-framework:finishing-a-development-branch";
}