Project Manager
Version: 1.12.1
Repository: https://github.com/yysun/project-manager
Source: https://github.com/yysun/project-manager/tree/main/skills/project-manager
Manage the selected project through plan → coordinate → execute → track → report.
Treat a project as a first-class folder containing structured Markdown state. Never infer that a repository is the project. For a new project, require an explicitly selected workspace root or target project folder; workspace-default placement derives <root>/.projects/<safe-project-slug>. For an existing project, use an explicit project folder when the user or calling context supplies one. If no project is selected, discover valid project folders only below the calling context's selected workspace root: select the sole valid project directly without asking, ask for selection when more than one is valid, and ask for a folder when none is valid. Studio and execute-rpd may also resolve one exact name, ID, or folder from a validated projects root; ambiguity is not selection. Multiple project folders may live in one repository or workspace; read and write only the selected one. The default workspace container is .projects, never projects.
Project Manager uses unique marker-bound .project-manager-work-<24-hex> siblings for same-filesystem atomic work and crash recovery. They are internal recovery roots, not projects; valid explicitly selected projects are never rejected merely for a similar basename.
Operating boundary
- Project Manager owns project state, decomposition, dependency coordination, prioritization, blockers, evidence ingestion, impact analysis, and reporting.
- Project Manager owns
.projectsdelivery coordination, not QA case design, test execution, Run history, or.testsstate. Quality evidence may inform a project task without making project state authoritative for testing. - Executors own task work. Governed execution and lightweight human completion both persist through the same Task Contract → Evidence Manifest boundary.
- RPD is optional and owns
understand → implement → test → correct → verifyfor a software task. Do not reproduce RPD inside this skill. - Git, source code, issue trackers, and storage providers are optional context. Never make them authoritative project state.
Interpret project-management intent
Natural language about the project is the interface. Users should describe outcomes, events, constraints, evidence, risks, decisions, tradeoffs, and questions. Never require them to translate reality into field edits, status changes, card movements, or one route from a command menu.
Infer and coordinate the necessary internal operations. One user intent may affect several connected parts of the project and may require more than one route. The ten routes below are internal operating intents and explicit escape hatches, not the product interaction model:
project init <folder> <objective-or-source>— create the minimal three-file project atomically. Read init.md.project plan <folder>— clarify success, decompose outcomes, and establish dependencies. Read plan.md.project update <folder> <change-or-evidence>— add/update a task, change disposition, issue a Task Contract, complete eligible human work, or ingest evidence. Read track.md; for task structure also read tasks.md.project status <folder>— show the MCP App status view when the user asks to show, display, or open status; otherwise calculate current facts withproject-status.js.project next <folder>— rank executable work withproject-next.js.project report <folder> <operator|project-manager|executive|board>— calculate report facts, then write the audience narrative. Read report.md.project review <folder>— validate state, challenge plan quality, blockers, risks, evidence, and success coverage. Read review.md.project validate-task <folder> <task-id>— validate the folder, then use LLM judgment to review task quality. Read tasks.md.project execute-rpd <folder|project-name>— execute every eligible RPD task from a dependency-ready queue using isolated Git worktrees and subagents, then ingest verified evidence. Natural-language equivalents in English and Chinese are preferred. Read execute-rpd.md.project studio [folder]— launch local Project Manager Studio with Kanban and Timeline views; an explicit folder is isolated, while no folder uses selectable direct children of.projects.
For source or scope changes, read impact.md. For exact schemas, lifecycle rules, and output contracts, read conventions.md.
Current assessment and recommended next action contract
- Do not use
First actionas a formal heading. Before acting, give a brief unlabelled progress update naming the initial operation only when it helps the user follow the work. It is execution visibility, not a summary of the current project state. - At a meaningful handoff after initialization, planning, update, status, review, reporting, coordination, or an execution result, lead with Current assessment. Summarize the present delivery condition, the decisive evidence or unknown, and the leading blocker, risk, variance, or decision when one exists. Derive it from validated project state and separate facts from judgment.
- If managed work remains and cannot continue immediately, follow with exactly one Recommended next action. Identify the relevant Task, Milestone, Decision, Issue, or other stable project ID when known; explain why the action dominates now; and name any unmet prerequisite or owner.
- A recommended action may execute a task, clear a dependency or blocker, obtain a decision, collect or ingest evidence, perform impact analysis, apply a milestone or project gate, or close the project. It is not necessarily the next task.
- Select the recommendation from explicit user intent, dependency readiness, business impact, blockers, risk, milestone pressure, evidence gaps, and current executor capacity. Use
project-next.jsas deterministic candidate input when relevant, but do not blindly choose its first task, the next ID, or the oldest task. - If the recommended action is safe, in scope, and already authorized, perform it in the same turn and reassess instead of presenting it as advice. If user input, approval, credentials, external coordination, or another boundary is required, stop there and request the one concrete unblocker.
- When no executable task remains, recommend the applicable decision, gate, residual-risk response, or closure action. When the project is fully closed, omit the recommendation rather than inventing work.
Current assessmentandRecommended next actionare derived response elements. Never add them as authoritative project fields or editable Studio state. A saved report may retain them as derived narrative. Use these exact English headings whenever the sections are shown.
Render plugin views
When the Project Manager MCP tools are available, treat display intent as an explicit UI request:
- For “show status”, “display status”, “open status”, or an equivalent request, call
pm_project_statusonce. Its tool metadata attaches the status card. Do not substituteproject-status.jsor call both routes. - For “show the board”, “open the board”, or an equivalent request, call
pm_open_boardonce. Its tool metadata attaches the full board. Do not substitute Studio or a board-audience report. - Use the deterministic status scripts for fact-only analysis, reports, reviews, and any workflow that needs their JSON. If the required MCP tool is unavailable or fails, fall back to the scripts and say that the interactive view was unavailable.
Load state safely
- Resolve an explicit folder with
realpath. For anexecute-rpdproject name, runproject-resolve.jsagainst the calling context's validated.projectsroot and use its returned absolute root. - When no project folder or selector was supplied, resolve the calling context's selected workspace root with
realpathand search only its descendants for directories containingPROJECT.md,TASKS.md, andSTATUS.md. Do not search upward, inspect siblings outside that root, follow symlinked directories, or treat the workspace or repository itself as a project unless it contains those three files. Prune a subtree only when its directory name exactly matches.project-manager-work-<24-lowercase-hex>and it contains a real regular.rpd-project-manager-work-v1file whose exact contents areRPD Project Manager work area v1\n; this proves it is an internal recovery root. A similar name without that exact marker is not enough to hide a legitimate project or candidate error. - Reject symlinked or escaping known state paths. Validate every discovered candidate with
node <absolute-skill-dir>/scripts/project-validate.js <candidate> --json. A candidate is valid only when that command succeeds. - If discovery yields exactly one valid project, select its real path and continue without asking. If it yields more than one, present the valid candidates and ask the user to select one. If it yields none, ask for the project folder and report any candidate validation failures that explain why discovery found no valid project.
- After selection, read and write only that project. Resolve this skill's absolute directory and run
node <absolute-skill-dir>/scripts/project-validate.js <folder> --jsonbefore relying on state. - Treat
PROJECT.mdandTASKS.mdas truth. TreatSTATUS.mdas a derived cache. - Add optional modules only when they answer a real operating need.
The minimal project folder contains only:
PROJECT.mdTASKS.mdSTATUS.md
Optional modules are MILESTONES.md, RISKS.md, DECISIONS.md, SOURCES.md, TRACEABILITY.md, CHANGES.md, ASSUMPTIONS.md, ISSUES.md, STAKEHOLDERS.md, LESSONS.md, CLOSURE.md, handoffs/, and reports/history/.
Workspace-root initialization also installs workspace support outside the project folder: ignored
.projects/.env.local records this active skill's ~/... path when it is inside the current home and
its absolute path otherwise; canonical .projects/studio.sh plus .projects/studio.cmd launch Studio
for that workspace. Always use project-init-workspace.js for that
multi-path transaction; read init.md. Standalone target-folder initialization
retains the three-file-only contract and creates no workspace support.
Tailor to PMI
PROJECT.md schema version 2 requires a tailoring block declaring each of the ten PMBOK 6 knowledge
areas applied or tailored out, with a rationale required for every area tailored out. Version 1 keeps
its exact field set, rejects tailoring, and needs no migration.
Tailoring is declare-only. It never obliges a project to practice an area, never requires module content, and never enters the task specification hash or Task Contract. Its purpose is to make an omission a recorded decision, which is what PMI tailoring actually requires.
- Never fabricate a rationale, and never add a tailoring block the user did not decide.
- Report a tailored-out area as tailored out with its rationale; never as zero, absent, or on track.
- Configuring
RISKS.mdwhile risk is tailored out, orSTAKEHOLDERS.mdwhile stakeholder is tailored out, is a validation failure. The declaration cannot become fiction. - Cost, Earned Value, and critical-path scheduling are not implemented. Tailor them out, or record that they are managed outside this project.
Plan
- Make the outcome and project success criteria explicit before expanding structure.
- Keep a small task compact: title, outcome, and acceptance criteria are usually enough; defaults supply the rest.
- Decompose work assigned to
rpdinto cohesive, end-to-end software stories that one RPD flow can take from requirement through verified commit. State observable behavior and boundaries; do not create separate project tasks for RPD stages, files, implementation layers, tests, reviews, docs, or commits. RPD's AP owns that internal decomposition. Read plan.md. - Write task schedules as recorded judgment, never as engine output. Fix the executor's throughput unit before estimating, size the cost of proving the outcome rather than producing it, carry uncertainty in the span, and keep assumptions and estimation risk explicit.
- Treat “add this task” as
project update; do not add another route. - Use stable project-owned IDs. External tracker IDs are display-only mappings.
- Resolve dependencies within the selected project only.
- Distinguish explicit blocker descriptions from unfinished dependency task IDs.
- Promote optional modules monotonically. Do not rename project or task IDs when structure grows.
Coordinate
Choose an enabled executor per task. A task needs active disposition before you issue a contract or ingest a manifest.
Starting governed work means issuing one immutable Task Contract bound to the selected project,
the current task specification, the current sources, and the provider's evidence requirements.
Contract issuance alone authorizes ready → in_progress.
Executor success comes from validated evidence. A closed issue, a commit, a file's presence, and confident prose are not evidence.
Agent tasks: the coordinator role
The main agent is the coordinator, not the task worker. It owns project validation, capacity and isolation preflight, contract issuance, scheduling, returned-payload checks, manifest ingestion, and final reporting.
For each dependency-ready agent task:
- Before issuing a contract, prove a subagent can be spawned, retain the coordinator's own capacity slot, and confirm a safe execution target. With no available slot the task waits, and the project is not mutated.
- Start or explicitly retry only through the installed built-in command. Generating
.pm-agent-exec.js, or any other project-local or executor-local execution helper, is out of bounds. - Spawn one bounded worker with clean or minimal context. Pass only: the readable absolute Task Contract path, the resolved executor root when present, a task-local instruction to satisfy that contract, and the exact return protocol. When clean or minimal-context spawning is available, the coordinator's accumulated conversation stays out of the worker.
- Require exactly one concise canonical Evidence Manifest payload JSON object in return, with
terminal status
verifiedorblocked. - Let the worker create executor artifacts, and keep
PROJECT.md,TASKS.md,STATUS.md,CHANGES.md, andhandoffs/out of its reach. The coordinator alone validates and ingests the returned payload.
Worker return limits. At most 65,536 UTF-8 bytes serialized, and at most 8,192 UTF-8 bytes per JSON string. Reject prose, transcripts, malformed JSON, non-object JSON, nonterminal status, and over-limit output. These are worker-protocol limits; they do not narrow direct use of the manifest-ingestion CLI.
Agent tasks: what may run in parallel
Run dependency- and mutation-independent agent tasks in capacity-bounded parallel. Distinct dependency chains alone are not sufficient — prove all three of these are non-overlapping:
- resolved executor roots;
- artifact paths;
- external write surfaces.
Serialize on shared roots, shared targets, or uncertain mutation surfaces.
A null executor root carries no local write authority. It permits filesystem-read-only work, or an explicitly identified non-filesystem artifact or write target. When local mutation is required or the target is uncertain, stop before contract issuance until a safe project-scoped or absolute root is assigned.
Agent tasks: failure after issuance
- A concrete spawn failure becomes an exact blocked manifest naming that runtime blocker.
- A failure you cannot classify truthfully leaves the attempt visibly
in_progress. Ingest nothing and stop that task. - Redispatch the same immutable contract only after the runtime proves the earlier worker is terminated and project validation proves no manifest was ingested. Otherwise require explicit operator resolution. A concurrent second worker for one attempt is never correct.
Human tasks are gates
Human tasks remain human-owned.
- A human task whose explicit outcome is approval is a dependency gate: dependent
agentandrpdtasks stayplanneduntil specific approval evidence makes that taskdoneunder the project profile. - Human completion does not automatically promote dependents. Revalidate all blockers and
dependencies, then use an ordinary coordination update to move each eligible dependent
planned → readybefore its execution route starts. - Not every human task is approval-only. Human-authored or custom-evidence work follows its applicable human execution policy and remains a gate until evidence-backed done.
Built-in agent state commands
node <absolute-skill-dir>/scripts/project-start-agent.js <project-folder> <task-id> [--created-at <RFC3339-UTC>] [--retry-blocker <exact-blocker>|--retry-blocker=<exact-blocker>] --json
node <absolute-skill-dir>/scripts/project-ingest-agent-manifest.js <project-folder> <task-id> --json
- Supply exactly one Evidence Manifest payload JSON object to ingest on standard input, followed only by whitespace.
- Start returns the immutable contract ID and absolute contract path.
- Ingest persists only the next gap-free manifest, and advances only the lifecycle that validated evidence supports.
- Read track.md for the complete eligibility and failure rules.
RPD tasks
- Confirm the task selects provider
rpdand an existing absolute execution root. - Create an attempt-qualified story and immutable Task Contract.
- Present RPD with the readable absolute contract path and exact deterministic prompt.
- Let RPD own its complete workflow.
- Snapshot exact-story RPD artifacts into the project attempt before manifest ingestion.
For dependency-aware multi-task RPD execution, read execute-rpd.md and use its scheduling, worktree, integration, delivery, and review-capacity and stopping rules.
Keep the one-line user command a one-line command rather than a confirmation ceremony. The single closing delivery question is not a ceremony: ask it once when the request did not already state delivery intent, and obtain that intent before merging into a base branch or removing a coordinator worktree.
Track
Only a validated Evidence Manifest may advance governed work to implemented, verification, verified, or done. Validate its contract ID, task specification hash, source bindings, sequence, transition, typed evidence, acceptance mappings, and replay fingerprint.
Profiles select human rigor, not separate lifecycle engines:
minimalandstandard: a never-started active human task may be completed in one update when one specific approval satisfies its evidence requirements, every dependency is done, no blocker exists, and every bound source is verifiable. Useproject-complete-human.js; it atomically creates the existing contract/verified-manifest audit trail and marks the task done.controlled: human work must use governed start and evidence progression.- Every
agent,external, andrpdtask uses governed execution in every profile.
Lifecycle: planned → ready → in_progress → implemented → verification → verified → done.
Ordinary presentation projects this as Planned → Ready → Active → Done. Keep internal stages available in audit detail.
- Blocking is separate from lifecycle.
donerequires a current verified manifest, completed dependencies, and no blockers.- If dependencies clear after verification, revalidate the stored verified manifest and advance without inventing a new one.
- Preserve immutable attempts. A blocked retry creates a new contract.
- On source or task-spec change, regress stale active state and preserve history.
- When the latest
CHANGES.mdrecord requires re-verification, start moves that task's binding frompendingtoin_progresswith the new contract; retry rebinds it to the strictly later retry contract; only a verified manifest that supportsdonemoves it tocomplete. Intermediate, blocked, or verified-but-not-done ingestion leaves the bindingin_progress. - Disposition is orthogonal:
deferredpauses actionability and may reactivate;cancelledis terminal. Neither satisfies dependencies or success. Evidence observed after deferral/cancellation cannot advance lifecycle.
Report
Calculate facts before writing narrative:
Resolve the absolute directory containing this SKILL.md once, then invoke scripts from that directory. Do not resolve scripts/ relative to the caller's project or current working directory.
node <absolute-skill-dir>/scripts/project-status.js <project-folder> --json
node <absolute-skill-dir>/scripts/project-next.js <project-folder> --json
node <absolute-skill-dir>/scripts/project-blocked.js <project-folder> --json
node <absolute-skill-dir>/scripts/project-coverage.js <project-folder> --json
node <absolute-skill-dir>/scripts/project-report-data.js <project-folder> --json
Change emphasis by audience, never facts. Keep absent schedule, forecast, or coverage evidence explicitly unknown or unconfigured.
Validate task quality
project validate-task is semantic LLM review, not the deterministic project validator. Load and
validate the explicit folder first, then judge the named task using the checklist and output contract
in tasks.md. Do not mutate the task unless the user separately asks to apply
revisions.
Studio
Studio is one local operating surface with sibling Kanban and Timeline views.
Studio never edits actual execution dates, task IDs, evidence, attempts, or re-verification state.
What it may edit, each under its own authority:
| Edit | Allowed for | Changes contract identity? |
|---|---|---|
Specification, and planned ↔ ready |
Genuinely never-started tasks only | — |
Timeline schedule (scheduled_start/scheduled_end) |
Eligible non-completed work, including active evidence-backed tasks | No |
| Disposition — active ↔ deferred, or to terminal cancelled | Eligible unfinished work | No |
| Timeline row order | Any task, including done, cancelled, and evidence-backed work; refused only on a complete project | No |
Row order is a persisted task property. Every task has an order number, defaulting to the
derived date arrangement and overridable by dragging a row. It is display metadata only. Resetting
clears the stored numbers and restores generated defaults.
Two buttons worth distinguishing: “Check changes” is deterministic whole-project validation. “Copy LLM review command” only copies the semantic route above — it calls no model.
Resolve this skill's absolute directory. With no selector, Studio discovers valid direct-child projects
under .projects in the launch working directory and lets the operator switch between them:
node <absolute-skill-dir>/scripts/project-manager-studio.js
Use an explicit project for isolated single-project mode, an explicit root for a selectable catalog, or both to choose the initial direct-child project:
node <absolute-skill-dir>/scripts/project-manager-studio.js --project <folder>
node <absolute-skill-dir>/scripts/project-manager-studio.js --projects-root <folder>
node <absolute-skill-dir>/scripts/project-manager-studio.js --projects-root <folder> --project <direct-child-folder>
After workspace-root initialization, operators can use the generated launcher instead. It reads the
machine-local skill path from the ignored .projects/.env.local beside it, anchors discovery to the
workspace that contains that projects root, and forwards any Studio arguments:
./.projects/studio.sh
.projects\studio.cmd
The command prints a tokenized loopback URL. Report it to the user. Use --no-open only for automated
verification; --port accepts an explicit local port. Catalog discovery is non-recursive, rejects
symlinked or invalid project children and duplicate project IDs, and never falls back to projects.
Marker-bound .project-manager-work-<24-hex> recovery roots are excluded from discovery; similarly
named valid projects remain selectable. Never substitute the current repository for a project merely
because it is the current directory; explicit selection or the single-valid-project rule must resolve it.
Never hand-roll a state mutation
Project state changes go through exactly two routes: the built-in commands, and Studio. Writing a
bespoke script that edits PROJECT.md, TASKS.md, STATUS.md, CHANGES.md, or handoffs/ is out
of bounds even when it claims to be atomic — a hand-rolled mutation reimplements the candidate copy,
the immutability guard, the validation gate, and the rollback, and it will get one of them wrong.
Where no command exists — completing a milestone is the current example — edit the single
Markdown record directly, then run project-validate.js and regenerate STATUS.md. One small edit
that fails validation loudly is safer than a script that silently half-applies a change.
Observed in a real run: a coordinator with no milestone-completion command wrote its own
complete-milestone.js to clear current_milestone "atomically", outside every guarantee this skill
provides.
Mutate atomically
Most deterministic scripts are read-only. project-init-workspace.js is the dedicated mutating
exception for workspace-root initialization; do not reproduce its multi-path transaction manually.
For other skill-led changes:
- Validate live state.
- Build the full change in a same-filesystem candidate copy.
- Regenerate
STATUS.mdfrom the candidate's authoritative state, then validate the candidate privately with no stale-status warning. - Replace only intended project paths atomically.
- Validate live state again.
- Restore exact prior bytes and remove new paths if any step fails.
Initialization accepts only a nonexistent folder or a directory proven empty immediately before apply. Refuse non-empty targets.
Quality bar
- Make project status evidence-backed, not optimistic.
- Separate facts, unknowns, judgments, and recommendations.
- Verify before asserting: the intended revision, the decision record behind an apparent gap, and the difference between absent and unreachable. Read review.md.
- Challenge missing ownership, circular dependencies, stale sources, unsupported completion, and fake forecasts.
- Keep generic projects free of software ceremony.
- Keep software execution out of Project Manager; coordinate it through the contract boundary.