shipwright-cli 3.1.0 → 3.3.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/.claude/agents/code-reviewer.md +2 -0
- package/.claude/agents/devops-engineer.md +2 -0
- package/.claude/agents/doc-fleet-agent.md +2 -0
- package/.claude/agents/pipeline-agent.md +2 -0
- package/.claude/agents/shell-script-specialist.md +2 -0
- package/.claude/agents/test-specialist.md +2 -0
- package/.claude/hooks/agent-crash-capture.sh +32 -0
- package/.claude/hooks/post-tool-use.sh +3 -2
- package/.claude/hooks/pre-tool-use.sh +35 -3
- package/README.md +22 -8
- package/claude-code/hooks/config-change.sh +18 -0
- package/claude-code/hooks/instructions-reloaded.sh +7 -0
- package/claude-code/hooks/worktree-create.sh +25 -0
- package/claude-code/hooks/worktree-remove.sh +20 -0
- package/config/code-constitution.json +130 -0
- package/config/defaults.json +25 -2
- package/config/policy.json +1 -1
- package/dashboard/middleware/auth.ts +134 -0
- package/dashboard/middleware/constants.ts +21 -0
- package/dashboard/public/index.html +8 -6
- package/dashboard/public/styles.css +176 -97
- package/dashboard/routes/auth.ts +38 -0
- package/dashboard/server.ts +117 -25
- package/dashboard/services/config.ts +26 -0
- package/dashboard/services/db.ts +118 -0
- package/dashboard/src/canvas/pixel-agent.ts +298 -0
- package/dashboard/src/canvas/pixel-sprites.ts +440 -0
- package/dashboard/src/canvas/shipyard-effects.ts +367 -0
- package/dashboard/src/canvas/shipyard-scene.ts +616 -0
- package/dashboard/src/canvas/submarine-layout.ts +267 -0
- package/dashboard/src/components/header.ts +8 -7
- package/dashboard/src/core/api.ts +5 -0
- package/dashboard/src/core/router.ts +1 -0
- package/dashboard/src/design/submarine-theme.ts +253 -0
- package/dashboard/src/main.ts +2 -0
- package/dashboard/src/types/api.ts +12 -1
- package/dashboard/src/views/activity.ts +2 -1
- package/dashboard/src/views/metrics.ts +69 -1
- package/dashboard/src/views/shipyard.ts +39 -0
- package/dashboard/types/index.ts +166 -0
- package/docs/plans/2026-02-28-compound-audit-and-shipyard-design.md +186 -0
- package/docs/plans/2026-02-28-skipper-shipwright-implementation-plan.md +1182 -0
- package/docs/plans/2026-02-28-skipper-shipwright-integration-design.md +531 -0
- package/docs/plans/2026-03-01-ai-powered-skill-injection-design.md +298 -0
- package/docs/plans/2026-03-01-ai-powered-skill-injection-plan.md +1109 -0
- package/docs/plans/2026-03-01-capabilities-cleanup-plan.md +658 -0
- package/docs/plans/2026-03-01-clean-architecture-plan.md +924 -0
- package/docs/plans/2026-03-01-compound-audit-cascade-design.md +191 -0
- package/docs/plans/2026-03-01-compound-audit-cascade-plan.md +921 -0
- package/docs/plans/2026-03-01-deep-integration-plan.md +851 -0
- package/docs/plans/2026-03-01-pipeline-audit-trail-design.md +145 -0
- package/docs/plans/2026-03-01-pipeline-audit-trail-plan.md +770 -0
- package/docs/plans/2026-03-01-refined-depths-brand-design.md +382 -0
- package/docs/plans/2026-03-01-refined-depths-implementation.md +599 -0
- package/docs/plans/2026-03-01-skipper-kernel-integration-design.md +203 -0
- package/docs/plans/2026-03-01-unified-platform-design.md +272 -0
- package/docs/plans/2026-03-07-claude-code-feature-integration-design.md +189 -0
- package/docs/plans/2026-03-07-claude-code-feature-integration-plan.md +1165 -0
- package/docs/research/BACKLOG_QUICK_REFERENCE.md +352 -0
- package/docs/research/CUTTING_EDGE_RESEARCH_2026.md +546 -0
- package/docs/research/RESEARCH_INDEX.md +439 -0
- package/docs/research/RESEARCH_SOURCES.md +440 -0
- package/docs/research/RESEARCH_SUMMARY.txt +275 -0
- package/docs/superpowers/specs/2026-03-10-pipeline-quality-revolution-design.md +341 -0
- package/package.json +2 -2
- package/scripts/lib/adaptive-model.sh +427 -0
- package/scripts/lib/adaptive-timeout.sh +316 -0
- package/scripts/lib/audit-trail.sh +309 -0
- package/scripts/lib/auto-recovery.sh +471 -0
- package/scripts/lib/bandit-selector.sh +431 -0
- package/scripts/lib/bootstrap.sh +104 -2
- package/scripts/lib/causal-graph.sh +455 -0
- package/scripts/lib/compat.sh +126 -0
- package/scripts/lib/compound-audit.sh +337 -0
- package/scripts/lib/constitutional.sh +454 -0
- package/scripts/lib/context-budget.sh +359 -0
- package/scripts/lib/convergence.sh +594 -0
- package/scripts/lib/cost-optimizer.sh +634 -0
- package/scripts/lib/daemon-adaptive.sh +14 -2
- package/scripts/lib/daemon-dispatch.sh +106 -17
- package/scripts/lib/daemon-failure.sh +34 -4
- package/scripts/lib/daemon-patrol.sh +25 -4
- package/scripts/lib/daemon-poll-github.sh +361 -0
- package/scripts/lib/daemon-poll-health.sh +299 -0
- package/scripts/lib/daemon-poll.sh +27 -611
- package/scripts/lib/daemon-state.sh +119 -66
- package/scripts/lib/daemon-triage.sh +10 -0
- package/scripts/lib/dod-scorecard.sh +442 -0
- package/scripts/lib/error-actionability.sh +300 -0
- package/scripts/lib/formal-spec.sh +461 -0
- package/scripts/lib/helpers.sh +180 -5
- package/scripts/lib/intent-analysis.sh +409 -0
- package/scripts/lib/loop-convergence.sh +350 -0
- package/scripts/lib/loop-iteration.sh +682 -0
- package/scripts/lib/loop-progress.sh +48 -0
- package/scripts/lib/loop-restart.sh +185 -0
- package/scripts/lib/memory-effectiveness.sh +506 -0
- package/scripts/lib/mutation-executor.sh +352 -0
- package/scripts/lib/outcome-feedback.sh +521 -0
- package/scripts/lib/pipeline-cli.sh +336 -0
- package/scripts/lib/pipeline-commands.sh +1216 -0
- package/scripts/lib/pipeline-detection.sh +101 -3
- package/scripts/lib/pipeline-execution.sh +897 -0
- package/scripts/lib/pipeline-github.sh +28 -3
- package/scripts/lib/pipeline-intelligence-compound.sh +431 -0
- package/scripts/lib/pipeline-intelligence-scoring.sh +407 -0
- package/scripts/lib/pipeline-intelligence-skip.sh +181 -0
- package/scripts/lib/pipeline-intelligence.sh +104 -1138
- package/scripts/lib/pipeline-quality-bash-compat.sh +182 -0
- package/scripts/lib/pipeline-quality-checks.sh +17 -711
- package/scripts/lib/pipeline-quality-gates.sh +563 -0
- package/scripts/lib/pipeline-stages-build.sh +730 -0
- package/scripts/lib/pipeline-stages-delivery.sh +965 -0
- package/scripts/lib/pipeline-stages-intake.sh +1133 -0
- package/scripts/lib/pipeline-stages-monitor.sh +407 -0
- package/scripts/lib/pipeline-stages-review.sh +1022 -0
- package/scripts/lib/pipeline-stages.sh +161 -2901
- package/scripts/lib/pipeline-state.sh +36 -5
- package/scripts/lib/pipeline-util.sh +487 -0
- package/scripts/lib/policy-learner.sh +438 -0
- package/scripts/lib/process-reward.sh +493 -0
- package/scripts/lib/project-detect.sh +649 -0
- package/scripts/lib/quality-profile.sh +334 -0
- package/scripts/lib/recruit-commands.sh +885 -0
- package/scripts/lib/recruit-learning.sh +739 -0
- package/scripts/lib/recruit-roles.sh +648 -0
- package/scripts/lib/reward-aggregator.sh +458 -0
- package/scripts/lib/rl-optimizer.sh +362 -0
- package/scripts/lib/root-cause.sh +427 -0
- package/scripts/lib/scope-enforcement.sh +445 -0
- package/scripts/lib/session-restart.sh +493 -0
- package/scripts/lib/skill-memory.sh +300 -0
- package/scripts/lib/skill-registry.sh +775 -0
- package/scripts/lib/spec-driven.sh +476 -0
- package/scripts/lib/test-helpers.sh +18 -7
- package/scripts/lib/test-holdout.sh +429 -0
- package/scripts/lib/test-optimizer.sh +511 -0
- package/scripts/shipwright-file-suggest.sh +45 -0
- package/scripts/skills/adversarial-quality.md +61 -0
- package/scripts/skills/api-design.md +44 -0
- package/scripts/skills/architecture-design.md +50 -0
- package/scripts/skills/brainstorming.md +43 -0
- package/scripts/skills/data-pipeline.md +44 -0
- package/scripts/skills/deploy-safety.md +64 -0
- package/scripts/skills/documentation.md +38 -0
- package/scripts/skills/frontend-design.md +45 -0
- package/scripts/skills/generated/.gitkeep +0 -0
- package/scripts/skills/generated/_refinements/.gitkeep +0 -0
- package/scripts/skills/generated/_refinements/adversarial-quality.patch.md +3 -0
- package/scripts/skills/generated/_refinements/architecture-design.patch.md +3 -0
- package/scripts/skills/generated/_refinements/brainstorming.patch.md +3 -0
- package/scripts/skills/generated/cli-version-management.md +29 -0
- package/scripts/skills/generated/collection-system-validation.md +99 -0
- package/scripts/skills/generated/large-scale-c-refactoring-coordination.md +97 -0
- package/scripts/skills/generated/pattern-matching-similarity-scoring.md +195 -0
- package/scripts/skills/generated/test-parallelization-detection.md +65 -0
- package/scripts/skills/observability.md +79 -0
- package/scripts/skills/performance.md +48 -0
- package/scripts/skills/pr-quality.md +49 -0
- package/scripts/skills/product-thinking.md +43 -0
- package/scripts/skills/security-audit.md +49 -0
- package/scripts/skills/systematic-debugging.md +40 -0
- package/scripts/skills/testing-strategy.md +47 -0
- package/scripts/skills/two-stage-review.md +52 -0
- package/scripts/skills/validation-thoroughness.md +55 -0
- package/scripts/sw +9 -3
- package/scripts/sw-activity.sh +9 -8
- package/scripts/sw-adaptive.sh +8 -7
- package/scripts/sw-adversarial.sh +2 -1
- package/scripts/sw-architecture-enforcer.sh +3 -1
- package/scripts/sw-auth.sh +12 -2
- package/scripts/sw-autonomous.sh +5 -1
- package/scripts/sw-changelog.sh +4 -1
- package/scripts/sw-checkpoint.sh +2 -1
- package/scripts/sw-ci.sh +15 -6
- package/scripts/sw-cleanup.sh +4 -26
- package/scripts/sw-code-review.sh +45 -20
- package/scripts/sw-connect.sh +2 -1
- package/scripts/sw-context.sh +2 -1
- package/scripts/sw-cost.sh +107 -5
- package/scripts/sw-daemon.sh +71 -11
- package/scripts/sw-dashboard.sh +3 -1
- package/scripts/sw-db.sh +71 -20
- package/scripts/sw-decide.sh +8 -2
- package/scripts/sw-decompose.sh +360 -17
- package/scripts/sw-deps.sh +4 -1
- package/scripts/sw-developer-simulation.sh +4 -1
- package/scripts/sw-discovery.sh +378 -5
- package/scripts/sw-doc-fleet.sh +4 -1
- package/scripts/sw-docs-agent.sh +3 -1
- package/scripts/sw-docs.sh +2 -1
- package/scripts/sw-doctor.sh +453 -2
- package/scripts/sw-dora.sh +4 -1
- package/scripts/sw-durable.sh +12 -7
- package/scripts/sw-e2e-orchestrator.sh +17 -16
- package/scripts/sw-eventbus.sh +13 -4
- package/scripts/sw-evidence.sh +364 -12
- package/scripts/sw-feedback.sh +550 -9
- package/scripts/sw-fix.sh +20 -1
- package/scripts/sw-fleet-discover.sh +6 -2
- package/scripts/sw-fleet-viz.sh +9 -4
- package/scripts/sw-fleet.sh +5 -1
- package/scripts/sw-github-app.sh +18 -4
- package/scripts/sw-github-checks.sh +3 -2
- package/scripts/sw-github-deploy.sh +3 -2
- package/scripts/sw-github-graphql.sh +18 -7
- package/scripts/sw-guild.sh +5 -1
- package/scripts/sw-heartbeat.sh +5 -30
- package/scripts/sw-hello.sh +67 -0
- package/scripts/sw-hygiene.sh +10 -3
- package/scripts/sw-incident.sh +273 -5
- package/scripts/sw-init.sh +18 -2
- package/scripts/sw-instrument.sh +10 -2
- package/scripts/sw-intelligence.sh +44 -7
- package/scripts/sw-jira.sh +5 -1
- package/scripts/sw-launchd.sh +2 -1
- package/scripts/sw-linear.sh +4 -1
- package/scripts/sw-logs.sh +4 -1
- package/scripts/sw-loop.sh +436 -1076
- package/scripts/sw-memory.sh +357 -3
- package/scripts/sw-mission-control.sh +6 -1
- package/scripts/sw-model-router.sh +483 -27
- package/scripts/sw-otel.sh +15 -4
- package/scripts/sw-oversight.sh +14 -5
- package/scripts/sw-patrol-meta.sh +334 -0
- package/scripts/sw-pipeline-composer.sh +7 -1
- package/scripts/sw-pipeline-vitals.sh +12 -6
- package/scripts/sw-pipeline.sh +54 -2653
- package/scripts/sw-pm.sh +16 -8
- package/scripts/sw-pr-lifecycle.sh +2 -1
- package/scripts/sw-predictive.sh +17 -5
- package/scripts/sw-prep.sh +185 -2
- package/scripts/sw-ps.sh +5 -25
- package/scripts/sw-public-dashboard.sh +17 -4
- package/scripts/sw-quality.sh +14 -6
- package/scripts/sw-reaper.sh +8 -25
- package/scripts/sw-recruit.sh +156 -2303
- package/scripts/sw-regression.sh +19 -12
- package/scripts/sw-release-manager.sh +3 -1
- package/scripts/sw-release.sh +4 -1
- package/scripts/sw-remote.sh +3 -1
- package/scripts/sw-replay.sh +7 -1
- package/scripts/sw-retro.sh +158 -1
- package/scripts/sw-review-rerun.sh +3 -1
- package/scripts/sw-scale.sh +14 -5
- package/scripts/sw-security-audit.sh +6 -1
- package/scripts/sw-self-optimize.sh +173 -6
- package/scripts/sw-session.sh +9 -3
- package/scripts/sw-setup.sh +3 -1
- package/scripts/sw-stall-detector.sh +406 -0
- package/scripts/sw-standup.sh +15 -7
- package/scripts/sw-status.sh +3 -1
- package/scripts/sw-strategic.sh +14 -6
- package/scripts/sw-stream.sh +13 -4
- package/scripts/sw-swarm.sh +20 -7
- package/scripts/sw-team-stages.sh +13 -6
- package/scripts/sw-templates.sh +7 -31
- package/scripts/sw-testgen.sh +17 -6
- package/scripts/sw-tmux-pipeline.sh +4 -1
- package/scripts/sw-tmux-role-color.sh +2 -0
- package/scripts/sw-tmux-status.sh +1 -1
- package/scripts/sw-tmux.sh +37 -1
- package/scripts/sw-trace.sh +3 -1
- package/scripts/sw-tracker-github.sh +3 -0
- package/scripts/sw-tracker-jira.sh +3 -0
- package/scripts/sw-tracker-linear.sh +3 -0
- package/scripts/sw-tracker.sh +3 -1
- package/scripts/sw-triage.sh +3 -2
- package/scripts/sw-upgrade.sh +3 -1
- package/scripts/sw-ux.sh +5 -2
- package/scripts/sw-webhook.sh +5 -2
- package/scripts/sw-widgets.sh +9 -4
- package/scripts/sw-worktree.sh +15 -3
- package/scripts/test-skill-injection.sh +1233 -0
- package/templates/pipelines/autonomous.json +27 -3
- package/templates/pipelines/cost-aware.json +34 -8
- package/templates/pipelines/deployed.json +12 -0
- package/templates/pipelines/enterprise.json +12 -0
- package/templates/pipelines/fast.json +6 -0
- package/templates/pipelines/full.json +27 -3
- package/templates/pipelines/hotfix.json +6 -0
- package/templates/pipelines/standard.json +12 -0
- package/templates/pipelines/tdd.json +12 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
# Skipper + Shipwright Integration Design
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-02-28
|
|
4
|
+
**Status**: Approved
|
|
5
|
+
**Direction**: Shipwright as a native Skipper Hand
|
|
6
|
+
**Depth**: Deep integration — full port to Rust
|
|
7
|
+
**Location**: Fork of Skipper
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
Shipwright orchestrates autonomous Claude Code agent teams for software delivery (Issue → Pipeline → PR → Deploy). Skipper is a Rust-based Agent Operating System that runs autonomous Hands on schedules with WASM sandboxing, 40 channel adapters, and 16 security layers.
|
|
12
|
+
|
|
13
|
+
This design ports Shipwright's complete feature set into a single `skipper-shipwright` crate within a fork of Skipper, creating a "Software Engineering Hand" that leverages Skipper's kernel, memory, channels, and existing Hands for cross-pollinated intelligence.
|
|
14
|
+
|
|
15
|
+
## Why This Combination
|
|
16
|
+
|
|
17
|
+
| Shipwright Brings | Skipper Brings |
|
|
18
|
+
| ----------------------------------------------------- | ---------------------------------------------------- |
|
|
19
|
+
| 12-stage delivery pipeline | Rust kernel with scheduling, RBAC, metering |
|
|
20
|
+
| Decision engine with autonomy tiers | WASM sandbox with dual metering |
|
|
21
|
+
| Failure pattern memory + learning | SQLite + vector embeddings for semantic search |
|
|
22
|
+
| GitHub API integration (GraphQL, Checks, Deployments) | 40 channel adapters (Slack, Discord, Telegram, etc.) |
|
|
23
|
+
| DORA metrics + self-optimization | 76+ REST/WS/SSE API endpoints |
|
|
24
|
+
| Multi-repo fleet orchestration | A2A protocol for cross-instance agents |
|
|
25
|
+
| Build loop with self-healing | Loop guard detection (SHA256) |
|
|
26
|
+
|
|
27
|
+
Key differentiator: Skipper's Collector, Researcher, and Predictor Hands become first-class signal sources for Shipwright's decision engine — OSINT-grade analysis, cross-referenced research, and calibrated forecasting feeding directly into what-to-build decisions.
|
|
28
|
+
|
|
29
|
+
## Crate Structure
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
skipper/
|
|
33
|
+
├── crates/
|
|
34
|
+
│ └── skipper-shipwright/
|
|
35
|
+
│ ├── Cargo.toml
|
|
36
|
+
│ ├── src/
|
|
37
|
+
│ │ ├── lib.rs # Public API, re-exports
|
|
38
|
+
│ │ ├── hand.rs # HandDefinition, activation, lifecycle
|
|
39
|
+
│ │ ├── config.rs # ShipwrightConfig types, TOML parsing
|
|
40
|
+
│ │ ├── pipeline/
|
|
41
|
+
│ │ │ ├── mod.rs # Pipeline engine
|
|
42
|
+
│ │ │ ├── stages.rs # 12 stage implementations
|
|
43
|
+
│ │ │ ├── templates.rs # fast/standard/full/hotfix/autonomous/cost-aware
|
|
44
|
+
│ │ │ ├── composer.rs # Dynamic pipeline composition
|
|
45
|
+
│ │ │ └── self_healing.rs # Build loop with retry, backtrack, convergence
|
|
46
|
+
│ │ ├── decision/
|
|
47
|
+
│ │ │ ├── mod.rs # Decision engine orchestrator
|
|
48
|
+
│ │ │ ├── signals.rs # 18 collectors + Skipper Hand signals
|
|
49
|
+
│ │ │ ├── scoring.rs # Value scoring (impact, urgency, effort, confidence, risk)
|
|
50
|
+
│ │ │ └── autonomy.rs # Tier enforcement, rate limiting, halt/resume
|
|
51
|
+
│ │ ├── memory/
|
|
52
|
+
│ │ │ ├── mod.rs # Memory system
|
|
53
|
+
│ │ │ ├── patterns.rs # Failure pattern storage & retrieval
|
|
54
|
+
│ │ │ ├── architecture.rs # Architecture rules & enforcement
|
|
55
|
+
│ │ │ └── learning.rs # A/B testing, outcome learning, weight adjustment
|
|
56
|
+
│ │ ├── fleet/
|
|
57
|
+
│ │ │ ├── mod.rs # Multi-repo orchestration
|
|
58
|
+
│ │ │ ├── daemon.rs # Issue watcher, auto-scaling, worker pool
|
|
59
|
+
│ │ │ ├── dispatch.rs # Job spawning, claim serialization
|
|
60
|
+
│ │ │ └── patrol.rs # Security, deps, coverage, DORA patrol checks
|
|
61
|
+
│ │ ├── github/
|
|
62
|
+
│ │ │ ├── mod.rs # GitHub API client
|
|
63
|
+
│ │ │ ├── graphql.rs # Cached GraphQL queries
|
|
64
|
+
│ │ │ ├── checks.rs # Check Runs API
|
|
65
|
+
│ │ │ ├── deployments.rs # Deployments API
|
|
66
|
+
│ │ │ └── pr.rs # PR lifecycle, reviewer selection
|
|
67
|
+
│ │ └── intelligence/
|
|
68
|
+
│ │ ├── mod.rs # Analysis engine
|
|
69
|
+
│ │ ├── prediction.rs # Risk scoring, anomaly detection
|
|
70
|
+
│ │ ├── dora.rs # DORA metrics
|
|
71
|
+
│ │ └── optimization.rs # Self-tuning, adaptive cycles
|
|
72
|
+
│ ├── agents/
|
|
73
|
+
│ │ └── shipwright/
|
|
74
|
+
│ │ ├── HAND.toml # Hand manifest
|
|
75
|
+
│ │ ├── SKILL.md # Domain expertise
|
|
76
|
+
│ │ └── system_prompt.md # Multi-phase operational playbook
|
|
77
|
+
│ └── tests/
|
|
78
|
+
│ ├── pipeline_tests.rs
|
|
79
|
+
│ ├── decision_tests.rs
|
|
80
|
+
│ ├── memory_tests.rs
|
|
81
|
+
│ ├── fleet_tests.rs
|
|
82
|
+
│ └── integration_tests.rs
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Pipeline Engine
|
|
86
|
+
|
|
87
|
+
### Stage Mapping
|
|
88
|
+
|
|
89
|
+
12 stages execute as Skipper workflow steps with sequential, conditional, and loop support:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
intake → plan → design → build ⟲ test → review → compound_quality → pr → merge → deploy → validate → monitor
|
|
93
|
+
↑ │
|
|
94
|
+
└─────────┘ (self-healing loop)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Key Types
|
|
98
|
+
|
|
99
|
+
```rust
|
|
100
|
+
pub enum Stage {
|
|
101
|
+
Intake, Plan, Design, Build, Test, Review,
|
|
102
|
+
CompoundQuality, Pr, Merge, Deploy, Validate, Monitor,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
pub struct Pipeline {
|
|
106
|
+
pub id: String,
|
|
107
|
+
pub issue: Option<u64>,
|
|
108
|
+
pub goal: String,
|
|
109
|
+
pub template: PipelineTemplate,
|
|
110
|
+
pub stages: Vec<StageConfig>,
|
|
111
|
+
pub state: PipelineState,
|
|
112
|
+
pub artifacts_dir: PathBuf,
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
pub struct StageConfig {
|
|
116
|
+
pub stage: Stage,
|
|
117
|
+
pub enabled: bool,
|
|
118
|
+
pub gate: Gate, // Auto or Approve
|
|
119
|
+
pub max_iterations: u32,
|
|
120
|
+
pub model: ModelChoice, // haiku/sonnet/opus routing
|
|
121
|
+
pub timeout_seconds: u64,
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
pub enum PipelineState {
|
|
125
|
+
Pending,
|
|
126
|
+
Running { current_stage: Stage, iteration: u32 },
|
|
127
|
+
Paused { at_stage: Stage, reason: String },
|
|
128
|
+
Completed { pr_url: Option<String> },
|
|
129
|
+
Failed { at_stage: Stage, error: String, retries: u32 },
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Build Loop & Self-Healing
|
|
134
|
+
|
|
135
|
+
```rust
|
|
136
|
+
pub struct BuildLoop {
|
|
137
|
+
pub max_iterations: u32,
|
|
138
|
+
pub max_restarts: u32,
|
|
139
|
+
pub fast_test_cmd: Option<String>,
|
|
140
|
+
pub fast_test_interval: u32,
|
|
141
|
+
pub convergence_window: u32,
|
|
142
|
+
pub progress: ProgressState,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
pub enum BuildOutcome {
|
|
146
|
+
TestsPassing,
|
|
147
|
+
Converging { issues_remaining: u32 },
|
|
148
|
+
Diverging,
|
|
149
|
+
Exhausted,
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Kernel's dual metering (fuel + epoch interruption) replaces bash timeouts. Skipper's loop guard detection (SHA256 of tool calls) replaces manual convergence checking.
|
|
154
|
+
|
|
155
|
+
### Templates
|
|
156
|
+
|
|
157
|
+
Six templates stored as Rust constants:
|
|
158
|
+
|
|
159
|
+
| Template | Stages | Gates |
|
|
160
|
+
| ---------- | -------------------------- | --------------------------------- |
|
|
161
|
+
| Fast | intake → build → test → pr | all auto |
|
|
162
|
+
| Standard | + plan, review | approve: plan, review, pr |
|
|
163
|
+
| Full | all 12 stages | approve: plan, review, pr, deploy |
|
|
164
|
+
| Hotfix | intake → build → test → pr | all auto, priority lane |
|
|
165
|
+
| Autonomous | all stages | all auto |
|
|
166
|
+
| CostAware | all stages | model routing by complexity |
|
|
167
|
+
|
|
168
|
+
## Decision Engine
|
|
169
|
+
|
|
170
|
+
### Signal Collectors
|
|
171
|
+
|
|
172
|
+
18 built-in collectors plus Skipper Hand cross-pollination:
|
|
173
|
+
|
|
174
|
+
```rust
|
|
175
|
+
pub trait SignalCollector: Send + Sync {
|
|
176
|
+
fn name(&self) -> &str;
|
|
177
|
+
fn collect(&self, ctx: &RepoContext) -> Result<Vec<Candidate>>;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
pub struct Candidate {
|
|
181
|
+
pub id: String,
|
|
182
|
+
pub signal: SignalType,
|
|
183
|
+
pub category: Category,
|
|
184
|
+
pub title: String,
|
|
185
|
+
pub description: String,
|
|
186
|
+
pub evidence: serde_json::Value,
|
|
187
|
+
pub risk_score: u8,
|
|
188
|
+
pub confidence: f64,
|
|
189
|
+
pub dedup_key: String,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
pub enum SignalType {
|
|
193
|
+
Security, Dependency, Coverage, DeadCode, Performance,
|
|
194
|
+
Architecture, Dora, Documentation, Failure,
|
|
195
|
+
SkipperHand, // Signals from Collector, Researcher, Predictor
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Skipper Hand Cross-Pollination
|
|
200
|
+
|
|
201
|
+
```rust
|
|
202
|
+
pub struct HandSignalCollector {
|
|
203
|
+
kernel: Arc<KernelHandle>,
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
impl SignalCollector for HandSignalCollector {
|
|
207
|
+
fn collect(&self, ctx: &RepoContext) -> Result<Vec<Candidate>> {
|
|
208
|
+
let mut candidates = vec![];
|
|
209
|
+
|
|
210
|
+
// Collector Hand → OSINT on dependencies, CVE databases
|
|
211
|
+
if let Some(collector) = self.kernel.get_hand("collector") {
|
|
212
|
+
let intel = collector.query("security vulnerabilities for {}", ctx.dependencies)?;
|
|
213
|
+
candidates.extend(parse_collector_findings(intel));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Researcher Hand → Cross-referenced analysis
|
|
217
|
+
if let Some(researcher) = self.kernel.get_hand("researcher") {
|
|
218
|
+
let report = researcher.query("architecture anti-patterns in {}", ctx.repo_url)?;
|
|
219
|
+
candidates.extend(parse_researcher_findings(report));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Predictor Hand → Forecasting failure probability
|
|
223
|
+
if let Some(predictor) = self.kernel.get_hand("predictor") {
|
|
224
|
+
let forecast = predictor.query("probability of regression in {}", ctx.hot_files)?;
|
|
225
|
+
candidates.extend(parse_predictor_findings(forecast));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
Ok(candidates)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Scoring & Autonomy Tiers
|
|
234
|
+
|
|
235
|
+
```rust
|
|
236
|
+
pub struct ScoringWeights {
|
|
237
|
+
pub impact: f64, // 0.30
|
|
238
|
+
pub urgency: f64, // 0.25
|
|
239
|
+
pub effort: f64, // 0.20
|
|
240
|
+
pub confidence: f64, // 0.15
|
|
241
|
+
pub risk: f64, // 0.10
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
pub enum AutonomyTier {
|
|
245
|
+
Auto, // Create issue + spawn pipeline immediately
|
|
246
|
+
Propose, // Create issue, wait for approval
|
|
247
|
+
Draft, // Write to drafts only
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
pub struct DecisionLimits {
|
|
251
|
+
pub max_issues_per_day: u32, // 15
|
|
252
|
+
pub max_cost_per_day_usd: f64, // 25.0
|
|
253
|
+
pub cooldown_seconds: u64, // 300
|
|
254
|
+
pub halt_after_failures: u32, // 3
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Outcome Learning
|
|
259
|
+
|
|
260
|
+
EMA-based weight adjustment stored in Skipper's SQLite:
|
|
261
|
+
|
|
262
|
+
```rust
|
|
263
|
+
pub struct Outcome {
|
|
264
|
+
pub candidate_id: String,
|
|
265
|
+
pub predicted_score: f64,
|
|
266
|
+
pub actual_success: bool,
|
|
267
|
+
pub duration_minutes: u32,
|
|
268
|
+
pub cost_usd: f64,
|
|
269
|
+
pub signal_source: SignalType,
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
After 10+ outcomes, weights auto-adjust per signal source.
|
|
274
|
+
|
|
275
|
+
## Memory System
|
|
276
|
+
|
|
277
|
+
### Architecture
|
|
278
|
+
|
|
279
|
+
Reuses Skipper's `MemoryStore` (SQLite + sqlite-vec) instead of JSONL:
|
|
280
|
+
|
|
281
|
+
```rust
|
|
282
|
+
pub struct ShipwrightMemory {
|
|
283
|
+
store: Arc<skipper_memory::MemoryStore>,
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
pub struct FailurePattern {
|
|
287
|
+
pub repo: String,
|
|
288
|
+
pub stage: Stage,
|
|
289
|
+
pub error_class: String,
|
|
290
|
+
pub error_signature: String,
|
|
291
|
+
pub root_cause: String,
|
|
292
|
+
pub fix_applied: String,
|
|
293
|
+
pub fix_commit: Option<String>,
|
|
294
|
+
pub success: bool,
|
|
295
|
+
pub embedding: Vec<f32>,
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
pub struct ArchitectureRule {
|
|
299
|
+
pub repo: String,
|
|
300
|
+
pub layers: Vec<String>,
|
|
301
|
+
pub dependency_rules: Vec<DependencyRule>,
|
|
302
|
+
pub hotspots: HashMap<String, u32>,
|
|
303
|
+
pub conventions: Vec<String>,
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Semantic Search
|
|
308
|
+
|
|
309
|
+
Vector similarity search replaces keyword/TF-IDF matching:
|
|
310
|
+
|
|
311
|
+
```rust
|
|
312
|
+
impl ShipwrightMemory {
|
|
313
|
+
pub fn search_similar_failures(
|
|
314
|
+
&self, error_text: &str, repo: &str, limit: usize,
|
|
315
|
+
) -> Result<Vec<FailurePattern>> {
|
|
316
|
+
let query_embedding = self.store.embed(error_text)?;
|
|
317
|
+
self.store.vector_search("failure_patterns", &query_embedding, limit, Some(&[("repo", repo)]))
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
pub fn compose_context(&self, error: &str, repo: &str) -> String {
|
|
321
|
+
let patterns = self.search_similar_failures(error, repo, 3).unwrap_or_default();
|
|
322
|
+
patterns.iter().map(|p| {
|
|
323
|
+
format!("Previously fixed similar error:\n Cause: {}\n Fix: {}", p.root_cause, p.fix_applied)
|
|
324
|
+
}).collect::<Vec<_>>().join("\n\n")
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Cross-Hand Memory Sharing
|
|
330
|
+
|
|
331
|
+
All Hands access the same MemoryStore:
|
|
332
|
+
|
|
333
|
+
- Collector finds CVE → stores with embedding → Shipwright finds it during pipeline
|
|
334
|
+
- Predictor queries Shipwright outcomes for calibration
|
|
335
|
+
- Researcher stores architecture analysis → Shipwright enforces it
|
|
336
|
+
|
|
337
|
+
### Migration
|
|
338
|
+
|
|
339
|
+
```rust
|
|
340
|
+
pub fn migrate_jsonl_memory(jsonl_path: &Path, store: &MemoryStore) -> Result<u32> {
|
|
341
|
+
// Read JSONL → parse → embed → insert into SQLite
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Fleet & Daemon
|
|
346
|
+
|
|
347
|
+
### Fleet Manager
|
|
348
|
+
|
|
349
|
+
```rust
|
|
350
|
+
pub struct FleetManager {
|
|
351
|
+
kernel: Arc<KernelHandle>,
|
|
352
|
+
repos: Vec<RepoConfig>,
|
|
353
|
+
worker_pool: WorkerPool,
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
pub struct WorkerPool {
|
|
357
|
+
pub total_workers: u32,
|
|
358
|
+
pub min_per_repo: u32,
|
|
359
|
+
pub rebalance_interval: Duration,
|
|
360
|
+
pub scaling: ScalingStrategy,
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
pub enum ScalingStrategy {
|
|
364
|
+
Static { workers: u32 },
|
|
365
|
+
Auto { max_workers: u32, min_workers: u32, worker_mem_gb: u32, cost_per_job_usd: f64 },
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Daemon as Kernel-Scheduled Job
|
|
370
|
+
|
|
371
|
+
```rust
|
|
372
|
+
impl FleetManager {
|
|
373
|
+
pub async fn poll_cycle(&self) -> Result<()> {
|
|
374
|
+
for repo in &self.repos {
|
|
375
|
+
let issues = self.github.list_issues(&repo, &repo.watch_labels).await?;
|
|
376
|
+
let new_issues = self.filter_unclaimed(issues)?;
|
|
377
|
+
let scored = self.triage_and_score(new_issues).await?;
|
|
378
|
+
for issue in scored {
|
|
379
|
+
if self.worker_pool.has_capacity(&repo) {
|
|
380
|
+
let agent_id = self.kernel.spawn_agent(
|
|
381
|
+
AgentConfig::from_pipeline(issue, repo)
|
|
382
|
+
).await?;
|
|
383
|
+
self.worker_pool.claim(repo, agent_id)?;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
Ok(())
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### What the Kernel Replaces
|
|
393
|
+
|
|
394
|
+
| Shipwright Bash | Skipper Kernel |
|
|
395
|
+
| ------------------------------- | ------------------------------- |
|
|
396
|
+
| PID management + flock | Agent registry (atomic) |
|
|
397
|
+
| tmux pane isolation | WASM sandbox |
|
|
398
|
+
| File-based heartbeats | Kernel heartbeat monitor |
|
|
399
|
+
| `while true; sleep 60` | Cron scheduler |
|
|
400
|
+
| `claim_issue()` race conditions | Kernel agent spawn (serialized) |
|
|
401
|
+
|
|
402
|
+
### Channel Notifications
|
|
403
|
+
|
|
404
|
+
Pipeline events push to configured channels automatically:
|
|
405
|
+
|
|
406
|
+
```rust
|
|
407
|
+
impl Pipeline {
|
|
408
|
+
async fn notify(&self, event: PipelineEvent) {
|
|
409
|
+
self.kernel.send_channel_message(&self.notify_channels, &event.format()).await;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
40 adapters available: Slack, Discord, Telegram, email, Teams, etc.
|
|
415
|
+
|
|
416
|
+
## Configuration
|
|
417
|
+
|
|
418
|
+
Single `[shipwright]` section in `skipper.toml`:
|
|
419
|
+
|
|
420
|
+
```toml
|
|
421
|
+
[shipwright]
|
|
422
|
+
enabled = true
|
|
423
|
+
default_template = "standard"
|
|
424
|
+
|
|
425
|
+
[shipwright.fleet]
|
|
426
|
+
poll_interval_seconds = 60
|
|
427
|
+
auto_scale = true
|
|
428
|
+
max_workers = 8
|
|
429
|
+
|
|
430
|
+
[shipwright.decision]
|
|
431
|
+
enabled = true
|
|
432
|
+
max_issues_per_day = 15
|
|
433
|
+
max_cost_per_day_usd = 25.0
|
|
434
|
+
outcome_learning = true
|
|
435
|
+
|
|
436
|
+
[shipwright.intelligence]
|
|
437
|
+
prediction_enabled = true
|
|
438
|
+
adversarial_enabled = false
|
|
439
|
+
|
|
440
|
+
[shipwright.github]
|
|
441
|
+
watch_labels = ["shipwright", "ready-to-build"]
|
|
442
|
+
auto_merge = false
|
|
443
|
+
|
|
444
|
+
[[shipwright.repos]]
|
|
445
|
+
path = "/home/user/projects/my-app"
|
|
446
|
+
owner = "myorg"
|
|
447
|
+
repo = "my-app"
|
|
448
|
+
template = "autonomous"
|
|
449
|
+
max_parallel = 2
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
Hot-reload via filesystem watcher — changes apply without restart.
|
|
453
|
+
|
|
454
|
+
## CLI
|
|
455
|
+
|
|
456
|
+
```
|
|
457
|
+
skipper shipwright pipeline start --issue 42
|
|
458
|
+
skipper shipwright pipeline resume
|
|
459
|
+
skipper shipwright pipeline status
|
|
460
|
+
|
|
461
|
+
skipper shipwright decide run [--dry-run]
|
|
462
|
+
skipper shipwright decide candidates
|
|
463
|
+
skipper shipwright decide halt / resume
|
|
464
|
+
|
|
465
|
+
skipper shipwright fleet start / status
|
|
466
|
+
skipper shipwright fleet discover --org myorg
|
|
467
|
+
|
|
468
|
+
skipper shipwright memory show / search / import
|
|
469
|
+
skipper shipwright dora
|
|
470
|
+
skipper shipwright cost show
|
|
471
|
+
skipper shipwright doctor
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
## Dashboard Pages
|
|
475
|
+
|
|
476
|
+
6 pages added to Skipper's SPA dashboard:
|
|
477
|
+
|
|
478
|
+
| Page | Route | Content |
|
|
479
|
+
| ------------ | -------------------------- | -------------------------------------- |
|
|
480
|
+
| Pipelines | `/shipwright/pipelines` | Active/completed, stage progress, cost |
|
|
481
|
+
| Fleet | `/shipwright/fleet` | Multi-repo status, worker allocation |
|
|
482
|
+
| Decisions | `/shipwright/decisions` | Candidates, scores, tiers, outcomes |
|
|
483
|
+
| DORA | `/shipwright/dora` | Lead time, deploy frequency, CFR, MTTR |
|
|
484
|
+
| Memory | `/shipwright/memory` | Failure patterns, search, architecture |
|
|
485
|
+
| Intelligence | `/shipwright/intelligence` | Risk predictions, hotspots, anomalies |
|
|
486
|
+
|
|
487
|
+
## API Endpoints
|
|
488
|
+
|
|
489
|
+
```
|
|
490
|
+
GET /api/shipwright/pipelines
|
|
491
|
+
POST /api/shipwright/pipelines
|
|
492
|
+
GET /api/shipwright/pipelines/{id}
|
|
493
|
+
GET /api/shipwright/pipelines/{id}/ws
|
|
494
|
+
POST /api/shipwright/decide/run
|
|
495
|
+
GET /api/shipwright/decide/candidates
|
|
496
|
+
GET /api/shipwright/fleet/status
|
|
497
|
+
GET /api/shipwright/dora/{repo}
|
|
498
|
+
GET /api/shipwright/memory/search?q=...
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
## Build Sequence
|
|
502
|
+
|
|
503
|
+
| Phase | Module | Depends On | Deliverable |
|
|
504
|
+
| ----- | --------------- | ---------------------------------- | ----------------------------------------------- |
|
|
505
|
+
| 1 | `config.rs` | — | TOML config parsing |
|
|
506
|
+
| 2 | `github/` | config | GitHub API client |
|
|
507
|
+
| 3 | `memory/` | config | Vector memory, migration |
|
|
508
|
+
| 4 | `pipeline/` | config, github, memory | 12-stage engine, templates, self-healing |
|
|
509
|
+
| 5 | `decision/` | config, github, memory, pipeline | Signals, scoring, tiers, Hand cross-pollination |
|
|
510
|
+
| 6 | `intelligence/` | config, github, memory | DORA, prediction, self-optimization |
|
|
511
|
+
| 7 | `fleet/` | config, github, pipeline, decision | Daemon, multi-repo, auto-scaling, patrol |
|
|
512
|
+
| 8 | `hand.rs` | all modules | Hand definition, HAND.toml, SKILL.md |
|
|
513
|
+
| 9 | CLI + API | all modules | Subcommands, REST/WS endpoints |
|
|
514
|
+
| 10 | Dashboard | API | 6 SPA pages |
|
|
515
|
+
|
|
516
|
+
## Testing Strategy
|
|
517
|
+
|
|
518
|
+
- Unit tests per module with mock GitHub API and mock kernel
|
|
519
|
+
- Integration tests for full pipeline lifecycle
|
|
520
|
+
- Match Skipper standards: zero Clippy warnings, doc comments on all public types
|
|
521
|
+
- Test Hand cross-pollination (Collector → Decision → Pipeline)
|
|
522
|
+
|
|
523
|
+
## Migration Path
|
|
524
|
+
|
|
525
|
+
1. Fork & build: `cargo build --release`
|
|
526
|
+
2. Import memory: `skipper shipwright memory import --jsonl ~/.shipwright/memory/`
|
|
527
|
+
3. Configure repos in `skipper.toml`
|
|
528
|
+
4. Activate Hand: `skipper hand activate shipwright`
|
|
529
|
+
5. Start: `skipper start`
|
|
530
|
+
|
|
531
|
+
Existing bash Shipwright continues to work independently.
|