Skip to content

Presale Generator

Presale Generator takes a request for proposal and drives it through to a costed, planned presale, without you touching a spreadsheet by hand. Like every Speedwave plugin, it is written, developed, and shipped exclusively by Speednet.

You point Presale Generator at the input documents (an RFP, a brief, supporting material), and it extracts the requirements, separating functional from non-functional and finding actors and use cases. From there it builds a work-breakdown hierarchy of epics, features, and tasks, estimates each in hours, and produces a timeline and a team plan. It keeps every presale as versioned state, so you can iterate on it and compare versions as requirements change. It needs no credentials: there is no external system to authenticate against, since the worker only stores and computes state while the model does the analysis.

The plugin has three parts:

  • A worker exposing 53 pure-function tools that store and retrieve structured state: workflow phases and steps, iterations, deadlines, team matching, document extraction, artifacts, and the work-breakdown hierarchy.
  • A document-extraction layer written in Python, with several engines (markitdown, pdftotext, pandoc, openpyxl, python-docx, and docling) so the worker can read PDFs, Word, Excel, and other formats. See Office documents for how Speedwave handles these formats.
  • A resource bundle of 22 commands (18 top-level plus a 4-command iteration subcommand group) and 24 skills that drive the workflow, with estimation and breakdown running on the strongest available model.

You work one opportunity at a time. Create it with /presale:add, drop the source documents into its input folder, then select it with /presale:select so every later command acts on it.

From there, the workflow moves through fixed phases: extract, analyze, break down, estimate, timeline, team. Running /presale:continue tells you the current phase and the exact next command. The phase is computed, not assigned: it only advances once every step in it finishes, and prerequisites are enforced in order, so the breakdown command stops if analysis isn’t done yet. Everything is stored locally under the opportunity’s folder, versioned per iteration, and the workflow checkpoints after each phase so you can stop and resume later.

Versioning has its own subcommand group, /presale:iteration: create snapshots the current state with a trigger and reason, list shows every iteration recorded, switch makes a past one active again, and compare computes the delta between two.

The orchestrator skills run the workflow phases and spawn sub-skills in parallel.

SkillWhat it does
presale-rfp-analyzerOrchestrates RFP analysis, splitting the document into chunks handled by parallel agents
presale-breakdownOrchestrates the work-breakdown into epics, features, and tasks
presale-estimatorOrchestrates effort estimation, batching tasks across agents
presale-addCreates a new opportunity and its folder structure
presale-selectActivates an existing opportunity as the current one
presale-auto-assumeTurns each open gap into a documented assumption with confidence and risk
presale-cross-reference-builderMaps how artifacts relate to each other across the presale
presale-risk-aggregatorCollects, deduplicates, and prioritizes risks found across all phases
presale-team-compositionProposes a team from the tech stack and the estimates
presale-timelineBuilds the delivery schedule from the estimated breakdown, dependencies, capacity, and holidays
presale-use-casesDerives actors and use cases, with main, alternative, and exception flows

Thirteen more sub-skills do the per-chunk work behind the scenes. The orchestrators above spawn these, you never call them directly.

SkillWhat it does
presale-extract-actorsExtracts actors from a single RFP document chunk
presale-extract-business-goalsExtracts business goals from a single RFP document chunk
presale-extract-categoriesExtracts requirement categories from a single RFP document chunk
presale-extract-frExtracts functional requirements from a single RFP document chunk, with cross-reference context
presale-extract-nfrExtracts non-functional requirements from a single RFP document chunk, with cross-reference context
presale-extract-gapsExtracts gaps and open questions from a single RFP document chunk, with full cross-reference context
presale-extract-compareCompares extraction-engine outputs for a document and picks the best one
presale-breakdown-epic-planAssigns functional requirements to epics deterministically, replacing the parallel epic round to avoid duplicate epics
presale-breakdown-epicGroups functional requirements into epics
presale-breakdown-featureDecomposes epics into features
presale-breakdown-taskDecomposes features into tasks
presale-breakdown-decisionsIdentifies technical and architectural decisions from the work-breakdown scope
presale-estimate-taskEstimates a batch of tasks using a single-point, best-case method with work streams

Commands run under /presale::

CommandWhat it does
add, select, unselectCreate an opportunity, make it active, or clear the active one
list, status, healthShow opportunities, overall progress, or a health score
extractConverts source documents to markdown using whichever engine fits the format
analyze, analysisRun requirements analysis, or display its results
create-wbs, breakdownBuild the work-breakdown hierarchy, or display it
estimateEstimate effort in hours across the breakdown
actors, use-casesDisplay extracted actors and use cases
team, timelineDisplay the team composition or the delivery schedule
continueTells you the current phase and the exact next command
presaleEntry point that lists the available subcommands

Iteration commands run under /presale:iteration:

CommandWhat it does
createSnapshots the current state as a new iteration, with a trigger and reason
listLists all iterations recorded for the selected opportunity
switchMakes a past iteration the active one
compareComputes the delta between two iterations

None of these delete an opportunity’s data; unselect only clears which one is active.

The worker’s 53 tools are pure functions: they store and retrieve structured state, they don’t call out to any external system. Skills call them directly; you never invoke them yourself. Grouped by purpose:

GroupToolsWhat it does
State and workflowcreatePresaleState, validatePresaleState, updatePresaleState, setPhase, getValidTransitions, startStep, completeStep, failStep, getReadySteps, getWorkflowStatus, getStepRequirements, getRequiredStructure, getActivePresale, listPresalesCreate and validate an opportunity’s state, track which phase and step it’s in, and enforce that steps run in the right order
Document extractionlistInputDocuments, getExtractionStatus, extractDocument, getExtractionJob, validateExtractionQuality, finalizeComparison, initChunkExtraction, getNextChunkBatch, saveChunkResult, getChunkExtractionStatus, mergeChunkResults, cancelChunkExtraction, retryFailedChunk, getChunkContent, initDerivedExtraction, getNextDerivedBatchConvert source documents to markdown, split them into chunks for parallel agents, and merge the per-chunk results back together
Breakdown and artifactsgetBreakdownItems, buildBreakdownHierarchy, saveArtifact, getArtifact, getInputSchema, getTraceability, listArtifactTypes, getArtifactsSummary, scanArtifactsBuild the epic, feature, and task hierarchy, and save or fetch any extracted artifact (requirements, actors, goals, gaps) with its links back to the source
IterationscreateIteration, deleteIteration, getIteration, detectChanges, computeDelta, logChange, analyzeChangeImpactSnapshot and compare versions of the presale, and track what changed between them
Deadlines and teamsetDeadline, updateDeadline, clearDeadline, checkDeadline, getTeamSkills, getTeamAvailability, calculateTeamMatchTrack delivery deadlines and match the estimated work against team skills and availability

Presale Generator needs no credentials, so setup is just installing and enabling the plugin per project. See Using plugins for how to install a plugin and turn it on.

Once it’s enabled, start with /presale:add <name> to create an opportunity, add your source documents to its input folder, then /presale:select <name> to make it the active one. Check progress at any point with /presale:status, or /presale:health for just the health score.

The worker is a stateless Node.js MCP logic server. It has no credentials and no host-exposed ports: it is reached only by the MCP Hub on the project network, under the same hardening as every other worker, with all capabilities dropped, no new privileges, and a read-only filesystem. The Python extraction layer it ships only reads the documents you place in the opportunity’s input folder.