showdar-skills 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +322 -0
- package/bin/showdar.js +118 -0
- package/bundles/bugfix.yaml +4 -0
- package/bundles/design.yaml +4 -0
- package/bundles/feature.yaml +4 -0
- package/bundles/release.yaml +4 -0
- package/bundles/upgrade.yaml +4 -0
- package/commands/opencode/showdar/build.md +6 -0
- package/commands/opencode/showdar/debug.md +6 -0
- package/commands/opencode/showdar/design.md +6 -0
- package/commands/opencode/showdar/git.md +6 -0
- package/commands/opencode/showdar/ops.md +7 -0
- package/commands/opencode/showdar/plan.md +6 -0
- package/commands/opencode/showdar/quality.md +7 -0
- package/commands/opencode/showdar/recover.md +6 -0
- package/commands/opencode/showdar/requirements.md +7 -0
- package/commands/opencode/showdar/review.md +6 -0
- package/commands/opencode/showdar/security.md +7 -0
- package/commands/opencode/showdar/ship.md +6 -0
- package/commands/opencode/showdar/skill.md +6 -0
- package/commands/opencode/showdar/test.md +6 -0
- package/commands/opencode/showdar/understand.md +6 -0
- package/commands/opencode/showdar/upgrade.md +6 -0
- package/engine/csv.mjs +45 -0
- package/engine/detect-stack.mjs +48 -0
- package/engine/rank.mjs +40 -0
- package/engine/search.mjs +20 -0
- package/package.json +28 -0
- package/profiles/backend.json +1 -0
- package/profiles/developer.json +1 -0
- package/profiles/full.json +1 -0
- package/profiles/minimal.json +1 -0
- package/profiles/product.json +1 -0
- package/profiles/qa.json +1 -0
- package/router/conflicts.yaml +50 -0
- package/router/skill-map.yaml +54 -0
- package/router/triggers.yaml +30 -0
- package/skills/showdar-build/SKILL.md +154 -0
- package/skills/showdar-build/data/change-smells.csv +24 -0
- package/skills/showdar-build/data/index.json +14 -0
- package/skills/showdar-build/examples/change-surface.md +18 -0
- package/skills/showdar-build/references/architecture-boundaries.md +3 -0
- package/skills/showdar-build/references/error-handling.md +3 -0
- package/skills/showdar-build/references/feature-flags.md +3 -0
- package/skills/showdar-build/references/minimal-change.md +3 -0
- package/skills/showdar-build/scripts/change-surface.mjs +5 -0
- package/skills/showdar-build/stacks/dart.md +3 -0
- package/skills/showdar-build/stacks/flutter.md +3 -0
- package/skills/showdar-build/stacks/kotlin.md +3 -0
- package/skills/showdar-build/stacks/nextjs.md +3 -0
- package/skills/showdar-build/stacks/node-fastify.md +3 -0
- package/skills/showdar-build/stacks/node-nestjs.md +3 -0
- package/skills/showdar-build/stacks/react-native.md +3 -0
- package/skills/showdar-build/stacks/react.md +3 -0
- package/skills/showdar-build/stacks/rust-tauri.md +3 -0
- package/skills/showdar-build/stacks/swift.md +3 -0
- package/skills/showdar-build/stacks/typescript.md +3 -0
- package/skills/showdar-debug/SKILL.md +179 -0
- package/skills/showdar-debug/data/failure-patterns.csv +34 -0
- package/skills/showdar-debug/data/index.json +14 -0
- package/skills/showdar-debug/examples/evidence-log.md +19 -0
- package/skills/showdar-debug/references/async-races.md +3 -0
- package/skills/showdar-debug/references/build-failures.md +3 -0
- package/skills/showdar-debug/references/hypothesis-driven-debugging.md +3 -0
- package/skills/showdar-debug/references/memory.md +3 -0
- package/skills/showdar-debug/references/networking.md +3 -0
- package/skills/showdar-debug/references/performance.md +3 -0
- package/skills/showdar-debug/scripts/collect-context.mjs +8 -0
- package/skills/showdar-debug/scripts/lib/detect-stack.mjs +48 -0
- package/skills/showdar-debug/stacks/android.md +21 -0
- package/skills/showdar-debug/stacks/docker.md +21 -0
- package/skills/showdar-debug/stacks/flutter.md +21 -0
- package/skills/showdar-debug/stacks/ios.md +21 -0
- package/skills/showdar-debug/stacks/nextjs.md +21 -0
- package/skills/showdar-debug/stacks/node.md +21 -0
- package/skills/showdar-debug/stacks/react-native.md +21 -0
- package/skills/showdar-debug/stacks/react.md +21 -0
- package/skills/showdar-debug/stacks/tauri.md +21 -0
- package/skills/showdar-design/SKILL.md +179 -0
- package/skills/showdar-design/data/accessibility.csv +16 -0
- package/skills/showdar-design/data/colors.csv +13 -0
- package/skills/showdar-design/data/components.csv +20 -0
- package/skills/showdar-design/data/index.json +25 -0
- package/skills/showdar-design/data/motion.csv +13 -0
- package/skills/showdar-design/data/products.csv +19 -0
- package/skills/showdar-design/data/stacks/compose.csv +9 -0
- package/skills/showdar-design/data/stacks/flutter.csv +9 -0
- package/skills/showdar-design/data/stacks/html-tailwind.csv +9 -0
- package/skills/showdar-design/data/stacks/nextjs.csv +9 -0
- package/skills/showdar-design/data/stacks/nuxt.csv +9 -0
- package/skills/showdar-design/data/stacks/react-native.csv +9 -0
- package/skills/showdar-design/data/stacks/react.csv +9 -0
- package/skills/showdar-design/data/stacks/svelte.csv +9 -0
- package/skills/showdar-design/data/stacks/swiftui.csv +9 -0
- package/skills/showdar-design/data/stacks/tauri.csv +9 -0
- package/skills/showdar-design/data/stacks/vue.csv +9 -0
- package/skills/showdar-design/data/styles.csv +13 -0
- package/skills/showdar-design/data/typography.csv +13 -0
- package/skills/showdar-design/data/ui-patterns.csv +19 -0
- package/skills/showdar-design/examples/design-brief.md +19 -0
- package/skills/showdar-design/references/accessibility.md +5 -0
- package/skills/showdar-design/references/anti-ai-ui.md +5 -0
- package/skills/showdar-design/references/architecture.md +12 -0
- package/skills/showdar-design/references/interaction.md +5 -0
- package/skills/showdar-design/references/layout.md +5 -0
- package/skills/showdar-design/references/release-readiness.md +12 -0
- package/skills/showdar-design/references/responsive.md +5 -0
- package/skills/showdar-design/references/security.md +12 -0
- package/skills/showdar-design/references/visual-hierarchy.md +7 -0
- package/skills/showdar-design/scripts/lib/csv.mjs +40 -0
- package/skills/showdar-design/scripts/lib/rank.mjs +35 -0
- package/skills/showdar-design/scripts/lib/search.mjs +20 -0
- package/skills/showdar-design/scripts/search.mjs +38 -0
- package/skills/showdar-design/stacks/flutter.md +13 -0
- package/skills/showdar-design/stacks/html-tailwind.md +12 -0
- package/skills/showdar-design/stacks/jetpack-compose.md +13 -0
- package/skills/showdar-design/stacks/nextjs.md +12 -0
- package/skills/showdar-design/stacks/nuxt.md +11 -0
- package/skills/showdar-design/stacks/react-native.md +13 -0
- package/skills/showdar-design/stacks/react.md +12 -0
- package/skills/showdar-design/stacks/svelte.md +11 -0
- package/skills/showdar-design/stacks/swiftui.md +12 -0
- package/skills/showdar-design/stacks/tauri.md +12 -0
- package/skills/showdar-design/stacks/vue.md +12 -0
- package/skills/showdar-git/SKILL.md +291 -0
- package/skills/showdar-git/data/git-workflows.csv +7 -0
- package/skills/showdar-git/data/index.json +14 -0
- package/skills/showdar-git/examples/commit-task-only.md +15 -0
- package/skills/showdar-git/examples/conflict-stop.md +7 -0
- package/skills/showdar-git/examples/explicit-push.md +7 -0
- package/skills/showdar-git/examples/feature-merge-no-push.md +13 -0
- package/skills/showdar-git/references/operation-safety.md +34 -0
- package/skills/showdar-git/scripts/inspect-git-state.mjs +53 -0
- package/skills/showdar-ops/SKILL.md +160 -0
- package/skills/showdar-ops/data/index.json +14 -0
- package/skills/showdar-ops/data/ops-patterns.csv +12 -0
- package/skills/showdar-ops/examples/explicit-deployment.md +5 -0
- package/skills/showdar-ops/examples/fix-existing-ci.md +5 -0
- package/skills/showdar-ops/examples/inspect-ci-readonly.md +7 -0
- package/skills/showdar-ops/examples/rollback-plan.md +5 -0
- package/skills/showdar-ops/examples/staging-plan.md +5 -0
- package/skills/showdar-ops/references/ci-cd.md +5 -0
- package/skills/showdar-ops/references/containers.md +5 -0
- package/skills/showdar-ops/references/deployment.md +5 -0
- package/skills/showdar-ops/references/desktop-release.md +3 -0
- package/skills/showdar-ops/references/environments.md +5 -0
- package/skills/showdar-ops/references/mobile-release.md +3 -0
- package/skills/showdar-ops/references/observability.md +5 -0
- package/skills/showdar-ops/references/rollback.md +5 -0
- package/skills/showdar-ops/scripts/inspect-ops-state.mjs +54 -0
- package/skills/showdar-plan/SKILL.md +159 -0
- package/skills/showdar-plan/data/index.json +14 -0
- package/skills/showdar-plan/data/planning-checklists.csv +25 -0
- package/skills/showdar-plan/examples/feature-plan.md +19 -0
- package/skills/showdar-plan/references/architecture.md +5 -0
- package/skills/showdar-plan/references/requirements.md +5 -0
- package/skills/showdar-plan/references/risk-analysis.md +5 -0
- package/skills/showdar-plan/references/scope.md +5 -0
- package/skills/showdar-plan/references/task-decomposition.md +5 -0
- package/skills/showdar-plan/scripts/collect-planning-context.mjs +9 -0
- package/skills/showdar-plan/scripts/lib/detect-stack.mjs +48 -0
- package/skills/showdar-plan/stacks/backend.md +3 -0
- package/skills/showdar-plan/stacks/mobile.md +3 -0
- package/skills/showdar-plan/stacks/web.md +3 -0
- package/skills/showdar-quality/SKILL.md +166 -0
- package/skills/showdar-quality/data/index.json +14 -0
- package/skills/showdar-quality/data/quality-patterns.csv +11 -0
- package/skills/showdar-quality/references/qa-guide.md +20 -0
- package/skills/showdar-recover/SKILL.md +164 -0
- package/skills/showdar-recover/data/index.json +14 -0
- package/skills/showdar-recover/data/recovery-signals.csv +23 -0
- package/skills/showdar-recover/examples/recovery-report.md +18 -0
- package/skills/showdar-recover/references/failed-runs.md +3 -0
- package/skills/showdar-recover/references/interrupted-session.md +3 -0
- package/skills/showdar-recover/references/merge-conflicts.md +3 -0
- package/skills/showdar-recover/references/partial-implementation.md +3 -0
- package/skills/showdar-recover/scripts/inspect-state.mjs +5 -0
- package/skills/showdar-requirements/SKILL.md +172 -0
- package/skills/showdar-requirements/data/index.json +14 -0
- package/skills/showdar-requirements/data/requirements-patterns.csv +11 -0
- package/skills/showdar-requirements/references/analysis-guide.md +30 -0
- package/skills/showdar-review/SKILL.md +155 -0
- package/skills/showdar-review/data/index.json +14 -0
- package/skills/showdar-review/data/review-patterns.csv +27 -0
- package/skills/showdar-review/examples/finding.md +16 -0
- package/skills/showdar-review/references/architecture.md +3 -0
- package/skills/showdar-review/references/correctness.md +3 -0
- package/skills/showdar-review/references/maintainability.md +3 -0
- package/skills/showdar-review/references/performance.md +3 -0
- package/skills/showdar-review/references/security.md +3 -0
- package/skills/showdar-review/references/testing.md +3 -0
- package/skills/showdar-review/scripts/collect-diff.mjs +5 -0
- package/skills/showdar-review/stacks/android.md +3 -0
- package/skills/showdar-review/stacks/flutter.md +3 -0
- package/skills/showdar-review/stacks/ios.md +3 -0
- package/skills/showdar-review/stacks/nextjs.md +3 -0
- package/skills/showdar-review/stacks/node-backend.md +3 -0
- package/skills/showdar-review/stacks/react-native.md +3 -0
- package/skills/showdar-review/stacks/react.md +3 -0
- package/skills/showdar-review/stacks/swift-kotlin.md +3 -0
- package/skills/showdar-review/stacks/typescript.md +3 -0
- package/skills/showdar-security/SKILL.md +169 -0
- package/skills/showdar-security/data/index.json +14 -0
- package/skills/showdar-security/data/security-patterns.csv +13 -0
- package/skills/showdar-security/examples/api-authorization-review.md +9 -0
- package/skills/showdar-security/examples/mobile-deeplink-review.md +7 -0
- package/skills/showdar-security/examples/secret-exposure-review.md +5 -0
- package/skills/showdar-security/examples/threat-model-open-assumptions.md +11 -0
- package/skills/showdar-security/references/authz-secrets.md +7 -0
- package/skills/showdar-security/references/mobile-security.md +7 -0
- package/skills/showdar-security/references/supply-chain.md +5 -0
- package/skills/showdar-security/references/threat-modeling.md +12 -0
- package/skills/showdar-security/scripts/inspect-security-surface.mjs +47 -0
- package/skills/showdar-ship/SKILL.md +234 -0
- package/skills/showdar-ship/data/index.json +14 -0
- package/skills/showdar-ship/data/release-checks.csv +28 -0
- package/skills/showdar-ship/examples/release-report.md +25 -0
- package/skills/showdar-ship/references/migrations.md +12 -0
- package/skills/showdar-ship/references/post-deploy.md +12 -0
- package/skills/showdar-ship/references/release-readiness.md +13 -0
- package/skills/showdar-ship/references/rollback.md +12 -0
- package/skills/showdar-ship/references/secrets.md +3 -0
- package/skills/showdar-ship/scripts/detect-targets.mjs +5 -0
- package/skills/showdar-ship/scripts/lib/detect-stack.mjs +48 -0
- package/skills/showdar-ship/scripts/release-check.mjs +6 -0
- package/skills/showdar-ship/stacks/android.md +33 -0
- package/skills/showdar-ship/stacks/docker.md +30 -0
- package/skills/showdar-ship/stacks/electron.md +7 -0
- package/skills/showdar-ship/stacks/ios.md +34 -0
- package/skills/showdar-ship/stacks/nextjs.md +30 -0
- package/skills/showdar-ship/stacks/node-backend.md +37 -0
- package/skills/showdar-ship/stacks/orchestration.md +12 -0
- package/skills/showdar-ship/stacks/tauri.md +35 -0
- package/skills/showdar-ship/stacks/web.md +35 -0
- package/skills/showdar-test/SKILL.md +164 -0
- package/skills/showdar-test/data/index.json +14 -0
- package/skills/showdar-test/data/test-strategy.csv +22 -0
- package/skills/showdar-test/examples/regression.md +14 -0
- package/skills/showdar-test/references/e2e.md +3 -0
- package/skills/showdar-test/references/integration.md +3 -0
- package/skills/showdar-test/references/regression.md +3 -0
- package/skills/showdar-test/references/test-smells.md +3 -0
- package/skills/showdar-test/references/unit.md +3 -0
- package/skills/showdar-test/scripts/detect-test-tools.mjs +6 -0
- package/skills/showdar-test/stacks/android-testing.md +13 -0
- package/skills/showdar-test/stacks/detox.md +13 -0
- package/skills/showdar-test/stacks/flutter-test.md +13 -0
- package/skills/showdar-test/stacks/integration-test.md +13 -0
- package/skills/showdar-test/stacks/jest.md +13 -0
- package/skills/showdar-test/stacks/playwright.md +13 -0
- package/skills/showdar-test/stacks/react-native-testing.md +17 -0
- package/skills/showdar-test/stacks/react-testing-library.md +13 -0
- package/skills/showdar-test/stacks/vitest.md +13 -0
- package/skills/showdar-test/stacks/xctest.md +13 -0
- package/skills/showdar-understand/SKILL.md +159 -0
- package/skills/showdar-understand/data/architecture-signals.csv +28 -0
- package/skills/showdar-understand/data/index.json +14 -0
- package/skills/showdar-understand/examples/repository-audit.md +17 -0
- package/skills/showdar-understand/references/architecture-signals.md +25 -0
- package/skills/showdar-understand/references/dependency-analysis.md +9 -0
- package/skills/showdar-understand/references/repository-analysis.md +24 -0
- package/skills/showdar-understand/scripts/inspect-repo.mjs +16 -0
- package/skills/showdar-understand/scripts/lib/detect-stack.mjs +48 -0
- package/skills/showdar-understand/stacks/android.md +3 -0
- package/skills/showdar-understand/stacks/backend.md +5 -0
- package/skills/showdar-understand/stacks/electron.md +3 -0
- package/skills/showdar-understand/stacks/fastify.md +3 -0
- package/skills/showdar-understand/stacks/flutter.md +3 -0
- package/skills/showdar-understand/stacks/ios.md +3 -0
- package/skills/showdar-understand/stacks/mobile.md +5 -0
- package/skills/showdar-understand/stacks/nestjs.md +3 -0
- package/skills/showdar-understand/stacks/nextjs.md +3 -0
- package/skills/showdar-understand/stacks/node.md +3 -0
- package/skills/showdar-understand/stacks/react-native.md +3 -0
- package/skills/showdar-understand/stacks/react.md +3 -0
- package/skills/showdar-understand/stacks/tauri.md +3 -0
- package/skills/showdar-upgrade/SKILL.md +162 -0
- package/skills/showdar-upgrade/data/compatibility-checklist.csv +24 -0
- package/skills/showdar-upgrade/data/index.json +14 -0
- package/skills/showdar-upgrade/examples/upgrade-report.md +18 -0
- package/skills/showdar-upgrade/references/breaking-changes.md +3 -0
- package/skills/showdar-upgrade/references/compatibility.md +3 -0
- package/skills/showdar-upgrade/references/dependency-resolution.md +3 -0
- package/skills/showdar-upgrade/references/migration-strategy.md +3 -0
- package/skills/showdar-upgrade/references/rollback.md +3 -0
- package/skills/showdar-upgrade/scripts/inspect-dependencies.mjs +6 -0
- package/skills/showdar-upgrade/scripts/lib/detect-stack.mjs +48 -0
- package/skills/showdar-upgrade/stacks/android.md +15 -0
- package/skills/showdar-upgrade/stacks/cocoapods-spm.md +17 -0
- package/skills/showdar-upgrade/stacks/expo.md +17 -0
- package/skills/showdar-upgrade/stacks/flutter.md +17 -0
- package/skills/showdar-upgrade/stacks/gradle.md +13 -0
- package/skills/showdar-upgrade/stacks/ios.md +15 -0
- package/skills/showdar-upgrade/stacks/nextjs.md +17 -0
- package/skills/showdar-upgrade/stacks/node.md +17 -0
- package/skills/showdar-upgrade/stacks/react-native.md +17 -0
- package/skills/showdar-upgrade/stacks/react.md +17 -0
- package/skills/showdar-upgrade/stacks/tauri-rust.md +15 -0
- package/src/adapters.js +44 -0
- package/src/catalog.js +57 -0
- package/src/project.js +287 -0
- package/src/runtime.js +9 -0
- package/src/validate.js +310 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
|
|
5
|
+
const root = path.resolve(process.argv[2] ?? process.cwd());
|
|
6
|
+
|
|
7
|
+
function add(groups, group, relative) {
|
|
8
|
+
groups[group].push(relative || '.');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function classify(relative, groups) {
|
|
12
|
+
const name = path.basename(relative).toLowerCase();
|
|
13
|
+
const normalized = relative.toLowerCase().replaceAll(path.sep, '/');
|
|
14
|
+
if (/^\.env(?:\.|$)/.test(name)) add(groups, 'envFiles', relative);
|
|
15
|
+
if (/^(package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|composer\.lock|go\.sum|cargo\.lock)$/.test(name)) add(groups, 'dependencyManifests', relative);
|
|
16
|
+
if (/(auth|security|permission|token|session|crypto|oauth|login|biometric|deep[-_ ]?link|webview|key|cert|credential)/.test(name)) add(groups, 'securitySensitiveFiles', relative);
|
|
17
|
+
if (/\.(ya?ml|json|toml|xml|plist|conf|config)$/.test(name)) add(groups, 'configurationFiles', relative);
|
|
18
|
+
if (/(^|\/)(android|ios|mobile)(\/|$)/.test(normalized)) add(groups, 'platformSecurityFiles', relative);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function walk(directory, relative = '', depth = 0, groups = {
|
|
22
|
+
envFiles: [], dependencyManifests: [], securitySensitiveFiles: [], configurationFiles: [], platformSecurityFiles: [],
|
|
23
|
+
}) {
|
|
24
|
+
if (depth > 4) return groups;
|
|
25
|
+
let entries = [];
|
|
26
|
+
try { entries = await readdir(directory, { withFileTypes: true }); } catch { return groups; }
|
|
27
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
if (entry.name === 'node_modules' || entry.name === '.git') continue;
|
|
30
|
+
const childRelative = relative ? path.join(relative, entry.name) : entry.name;
|
|
31
|
+
const child = path.join(directory, entry.name);
|
|
32
|
+
if (entry.isDirectory()) await walk(child, childRelative, depth + 1, groups);
|
|
33
|
+
else classify(childRelative, groups);
|
|
34
|
+
}
|
|
35
|
+
return groups;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const info = await stat(root);
|
|
40
|
+
if (!info.isDirectory()) throw new Error('target must be a directory');
|
|
41
|
+
const groups = await walk(root);
|
|
42
|
+
for (const values of Object.values(groups)) values.sort();
|
|
43
|
+
console.log(JSON.stringify({ root, ...groups }, null, 2));
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error(`inspect-security-surface: ${error.message}`);
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: showdar-ship
|
|
3
|
+
description: Use when checking whether a change, artifact, or release is ready for handoff or external release.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Showdar Ship
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
`showdar-ship` is a delivery-verification skill. Its normal job is to decide
|
|
11
|
+
whether the requested change is safe to hand off, merge, package, publish, or
|
|
12
|
+
release, using fresh local evidence and repository-defined checks.
|
|
13
|
+
|
|
14
|
+
It may inspect existing release, deployment, and CI configuration as evidence.
|
|
15
|
+
It does not create or modify that infrastructure in its normal verification
|
|
16
|
+
mode. A readiness report is not an instruction to deploy.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- Verifying a completed change before handoff or merge.
|
|
21
|
+
- Assessing release readiness for a web, backend, mobile, Docker, or desktop artifact.
|
|
22
|
+
- Checking package/export/type/build metadata before a requested handoff.
|
|
23
|
+
- Reviewing existing release or CI configuration for canonical commands and gaps.
|
|
24
|
+
- Verifying an explicitly requested deployment, store submission, or release execution.
|
|
25
|
+
|
|
26
|
+
## When not to use
|
|
27
|
+
|
|
28
|
+
- Routine implementation, debugging, code review, or test-strategy work.
|
|
29
|
+
- Creating CI/CD, deployment, release, secrets, or environment infrastructure.
|
|
30
|
+
- Treating “ship”, “release checklist”, or “is this ready?” as permission to deploy or publish.
|
|
31
|
+
- Requiring a deployed endpoint when local artifact and repository checks answer the request.
|
|
32
|
+
|
|
33
|
+
## Inputs and assumptions
|
|
34
|
+
|
|
35
|
+
- The requested outcome and whether it explicitly names release/deployment execution.
|
|
36
|
+
- Current Git/worktree state and the exact change or artifact under review.
|
|
37
|
+
- Repository-owned test, typecheck, lint, build, package, and smoke commands.
|
|
38
|
+
- Existing release/CI configuration may be inspected read-only to discover commands.
|
|
39
|
+
- Secret, signing, store, deployment, and production access remains external; never request values.
|
|
40
|
+
- `scripts/detect-targets.mjs` and `scripts/release-check.mjs` provide read-only preflight signals.
|
|
41
|
+
|
|
42
|
+
## Non-negotiable rules
|
|
43
|
+
|
|
44
|
+
- Default mode is delivery verification, not deployment execution.
|
|
45
|
+
- No readiness claim without fresh checks appropriate to the requested change.
|
|
46
|
+
- Ordinary Ship verification does not require CI/CD, a hosted provider, or a deployed endpoint.
|
|
47
|
+
- Existing CI is read-only by default: inspect it for commands or inconsistencies, but do not modify it.
|
|
48
|
+
- A deployed endpoint is not required for ordinary ship verification. Report external checks as unavailable when they are outside the request.
|
|
49
|
+
- Never print, commit, embed, or copy secret values into artifacts, logs, or reports.
|
|
50
|
+
- Publishing, deploying, tagging, pushing, store submission, production mutation, and destructive migration require explicit user intent and any separate approval required by repository policy.
|
|
51
|
+
- Keep release-specific metadata, symbols, mappings, migration compatibility, and rollback evidence when they are relevant to the requested artifact.
|
|
52
|
+
|
|
53
|
+
## Hard scope boundary
|
|
54
|
+
|
|
55
|
+
Unless the current user/task explicitly requests deployment or release execution,
|
|
56
|
+
`showdar-ship` MUST NOT:
|
|
57
|
+
|
|
58
|
+
- create or modify `.github/workflows/**`;
|
|
59
|
+
- create GitHub Actions, CI/CD pipelines, or release automation;
|
|
60
|
+
- configure deployment providers, coverage/SaaS CI services, branch protection, or environment/secrets infrastructure;
|
|
61
|
+
- add Docker solely for CI or deployment;
|
|
62
|
+
- deploy anything, publish packages/apps, or change production infrastructure.
|
|
63
|
+
|
|
64
|
+
`.github/workflows/**` is outside normal Ship mutation scope even when an
|
|
65
|
+
existing workflow is failing. An explicit CI/CD task must be routed and scoped
|
|
66
|
+
as that task before any CI change is proposed.
|
|
67
|
+
|
|
68
|
+
## Explicit intent gate
|
|
69
|
+
|
|
70
|
+
Words such as “ship”, “release-ready”, “prepare a checklist”, “handoff”, or
|
|
71
|
+
“verify” select verification mode. Execution mode is activated only when the
|
|
72
|
+
request explicitly names an action, target, and release/deployment context,
|
|
73
|
+
such as “deploy this service to staging”, “publish this package”, “submit this
|
|
74
|
+
build to TestFlight”, or “create the GitHub Actions workflow”.
|
|
75
|
+
|
|
76
|
+
Only when explicit deployment or release-execution intent exists may the skill
|
|
77
|
+
prepare execution-specific commands or load `references/post-deploy.md`,
|
|
78
|
+
`references/rollback.md`, or rollout guidance. Even then, describe the command
|
|
79
|
+
and its risk before running it, and stop for any required approval.
|
|
80
|
+
|
|
81
|
+
## Existing CI is read-only
|
|
82
|
+
|
|
83
|
+
If `.github/workflows/**`, `.gitlab-ci.yml`, `Jenkinsfile`, or another CI file
|
|
84
|
+
already exists:
|
|
85
|
+
|
|
86
|
+
Inspect existing CI configuration without modifying it.
|
|
87
|
+
|
|
88
|
+
- read it to discover canonical test/build/package commands and target assumptions;
|
|
89
|
+
- compare it with local scripts and report drift, missing coverage, or failures;
|
|
90
|
+
- do not edit, add, delete, enable, or “repair” the CI file in ordinary Ship mode;
|
|
91
|
+
- do not infer that CI must exist, must pass, or must be recreated for local readiness.
|
|
92
|
+
|
|
93
|
+
## Workflow
|
|
94
|
+
|
|
95
|
+
### Phase 1 — classify request and scope
|
|
96
|
+
|
|
97
|
+
- Read the exact request and classify it as verification or explicit execution.
|
|
98
|
+
- Record the target artifact/platform only when relevant.
|
|
99
|
+
- If intent is ambiguous, stay in verification mode and report the missing decision.
|
|
100
|
+
|
|
101
|
+
### Phase 2 — inspect repository state
|
|
102
|
+
|
|
103
|
+
- Run `git status`, inspect the requested diff, and confirm the active branch.
|
|
104
|
+
- Identify repository-owned scripts from `package.json`, Makefiles, task runners, and existing CI configuration without changing them.
|
|
105
|
+
- Use read-only target detection when platform selection is unclear.
|
|
106
|
+
|
|
107
|
+
### Phase 3 — run local readiness checks
|
|
108
|
+
|
|
109
|
+
Run the smallest relevant set of existing commands:
|
|
110
|
+
|
|
111
|
+
- focused tests and the repository test command;
|
|
112
|
+
- typecheck, analyzer, and lint when configured;
|
|
113
|
+
- production/release build or package/export validation when the artifact is in scope;
|
|
114
|
+
- install, smoke, API, or native checks that can run locally;
|
|
115
|
+
- version, build number, changelog, package exports, and generated-file checks when relevant.
|
|
116
|
+
|
|
117
|
+
Do not add a workflow, hosted service, deployed endpoint, or production secret
|
|
118
|
+
just to obtain one of these checks.
|
|
119
|
+
|
|
120
|
+
### Phase 4 — inspect platform guidance
|
|
121
|
+
|
|
122
|
+
- Web/static web -> `stacks/web.md`.
|
|
123
|
+
- Next.js -> `stacks/nextjs.md` plus applicable web checks.
|
|
124
|
+
- Node backend -> `stacks/node-backend.md`.
|
|
125
|
+
- Docker -> `stacks/docker.md`.
|
|
126
|
+
- iOS -> `stacks/ios.md`.
|
|
127
|
+
- Android -> `stacks/android.md`.
|
|
128
|
+
- Tauri/desktop -> `stacks/tauri.md`.
|
|
129
|
+
- Container orchestration -> `stacks/orchestration.md` only when the request explicitly concerns that execution surface.
|
|
130
|
+
|
|
131
|
+
Keep platform checks focused on evidence that can be gathered locally. Store,
|
|
132
|
+
provider, deployed-service, and production-observability checks are external
|
|
133
|
+
unless the request explicitly asks for their verification.
|
|
134
|
+
|
|
135
|
+
### Phase 5 — optional explicit execution branch
|
|
136
|
+
|
|
137
|
+
When the explicit intent gate is satisfied, identify the exact command, target,
|
|
138
|
+
credentials boundary, irreversible effects, rollout/rollback constraints, and
|
|
139
|
+
post-execution evidence before acting. Load the execution references only for
|
|
140
|
+
that branch. Do not convert a checklist request into execution permission.
|
|
141
|
+
|
|
142
|
+
### Phase 6 — readiness report
|
|
143
|
+
|
|
144
|
+
Report passed, failed, blocked, and unverified checks. Distinguish local proof
|
|
145
|
+
from external proof. State whether execution was requested and whether any
|
|
146
|
+
execution occurred. Do not call a change ready merely because a workflow is
|
|
147
|
+
green or an upload command succeeded.
|
|
148
|
+
|
|
149
|
+
## Decision points
|
|
150
|
+
|
|
151
|
+
- Ordinary code/package change? Verify local scope, tests, static checks, build, and exports; no endpoint or CI change is needed.
|
|
152
|
+
- Existing CI found? Inspect commands and report drift; keep it unchanged.
|
|
153
|
+
- Static web? Inspect generated files, routes, asset paths, and cache intent; do not publish an artifact by default.
|
|
154
|
+
- Backend or Docker? Verify local startup, health/readiness behavior, config names, migrations, and graceful shutdown where reproducible.
|
|
155
|
+
- Mobile/native artifact? Verify identifiers, signing metadata, permissions, symbols, and installable output when available; store submission is separate.
|
|
156
|
+
- Stateful change? Assess backward compatibility and rollback safety; do not run production data mutation without explicit approval.
|
|
157
|
+
- Explicit deployment/release execution? Add target-specific external checks only after the intent gate is satisfied.
|
|
158
|
+
|
|
159
|
+
## Stack detection
|
|
160
|
+
|
|
161
|
+
- Detect targets before choosing local checks, but do not turn detected CI or deployment files into a mutation request.
|
|
162
|
+
- Web and backend checks remain separate when a repository contains both.
|
|
163
|
+
- React Native and Flutter release artifacts may need native iOS/Android checks even when shared code changed only once.
|
|
164
|
+
- Tauri/Electron signing and updater surfaces are distinct from frontend build verification.
|
|
165
|
+
- Docker is an artifact/runtime layer; orchestration execution is a separate, explicit scope.
|
|
166
|
+
- Existing CI detection is evidence collection only.
|
|
167
|
+
|
|
168
|
+
## Failure modes
|
|
169
|
+
|
|
170
|
+
- “CI green” treated as proof that the requested local artifact or diff is ready.
|
|
171
|
+
- A checklist request interpreted as deploy, publish, tag, or workflow creation permission.
|
|
172
|
+
- A local readiness task blocked because no deployed endpoint exists.
|
|
173
|
+
- Existing workflow edited to make a local test pass.
|
|
174
|
+
- Upload or package command treated as proof of user-visible health.
|
|
175
|
+
- Secrets printed while proving configuration presence.
|
|
176
|
+
- Migration, signing, symbol, mapping, or package metadata omitted from the evidence.
|
|
177
|
+
- Production behavior guessed from a development server or preview configuration.
|
|
178
|
+
|
|
179
|
+
## Stop conditions
|
|
180
|
+
|
|
181
|
+
- Stop before creating or modifying CI/CD, deployment, release, provider, secret, environment, branch-protection, or production infrastructure unless explicitly requested.
|
|
182
|
+
- Stop before deploy, publish, tag, push, store submission, destructive migration, credential operation, or production mutation without explicit intent and required approval.
|
|
183
|
+
- Stop when the request is ordinary verification but the next proposed action would change external state.
|
|
184
|
+
- Stop when required local evidence is unavailable; report it as blocked or unverified instead of inventing a hosted check.
|
|
185
|
+
- Stop when repository instructions conflict with this playbook; user and repository instructions win.
|
|
186
|
+
|
|
187
|
+
## Escalation conditions
|
|
188
|
+
|
|
189
|
+
- Ask for the target and explicit action when execution intent is unclear.
|
|
190
|
+
- Escalate signing, store, provider, production, irreversible data, and credential decisions without requesting secret values.
|
|
191
|
+
- Escalate CI changes as a separate task; do not smuggle them into Ship readiness work.
|
|
192
|
+
- Escalate missing rollback or observability evidence when the user explicitly requests deployment/release execution.
|
|
193
|
+
|
|
194
|
+
## Verification
|
|
195
|
+
|
|
196
|
+
- Run fresh relevant local test, typecheck/analyzer, lint, build, package, export, install, and smoke commands.
|
|
197
|
+
- Inspect `git status` and the requested diff for scope and generated artifacts.
|
|
198
|
+
- Confirm package exports, public types, version/build metadata, and changelog only when relevant.
|
|
199
|
+
- Read existing CI/release configuration without modifying it.
|
|
200
|
+
- Record external endpoint, store, provider, deployment, and observability checks as unverified unless explicitly requested and actually observed.
|
|
201
|
+
- For explicit execution, record the exact target, artifact/version, command status, and post-execution evidence separately.
|
|
202
|
+
|
|
203
|
+
## Output contract
|
|
204
|
+
|
|
205
|
+
- **Intent and scope** — verification or explicitly requested execution.
|
|
206
|
+
- **Target/artifact** — only the platform and version relevant to the request.
|
|
207
|
+
- **Local evidence** — commands and exact results.
|
|
208
|
+
- **Existing CI/release inspection** — read-only findings, if any.
|
|
209
|
+
- **Readiness** — ready, not ready, blocked, or unverified with reasons.
|
|
210
|
+
- **External checks** — clearly separated from local proof; not required for ordinary Ship verification.
|
|
211
|
+
- **Execution status** — not requested / not performed / performed with explicit authorization.
|
|
212
|
+
- **Next decision** — the smallest user decision needed, if any.
|
|
213
|
+
|
|
214
|
+
## Anti-patterns
|
|
215
|
+
|
|
216
|
+
- Creating `.github/workflows/**` because a normal change needs verification.
|
|
217
|
+
- Adding CI/CD, a hosted coverage service, Docker, deployment config, or secrets infrastructure to complete a checklist.
|
|
218
|
+
- Auto-deploying because the user said “ship”.
|
|
219
|
+
- Requiring a production URL for local readiness.
|
|
220
|
+
- Editing existing CI when the task is only implementation, testing, review, or release-readiness assessment.
|
|
221
|
+
- Printing environment, signing, store, or deployment secrets.
|
|
222
|
+
- Claiming “deployed”, “published”, or “healthy” without observing the corresponding external state.
|
|
223
|
+
|
|
224
|
+
## Example
|
|
225
|
+
|
|
226
|
+
User request: “Ship the current fix and tell me if it is ready.”
|
|
227
|
+
|
|
228
|
+
- Stay in verification mode: inspect the diff, run repository tests/typecheck/lint/build, inspect package or release metadata when relevant, and report readiness.
|
|
229
|
+
- Read an existing workflow only to find the canonical command if useful; do not create or modify CI.
|
|
230
|
+
- Do not require a deployed endpoint and do not deploy or publish.
|
|
231
|
+
|
|
232
|
+
User request: “Deploy this backend to staging and verify the deployed health endpoint.”
|
|
233
|
+
|
|
234
|
+
- Use the explicit execution branch, name the target and artifact, present the command/risk boundary, obtain required approval, then use `references/post-deploy.md` for the requested external verification.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"skill": "showdar-ship",
|
|
4
|
+
"datasets": [
|
|
5
|
+
{
|
|
6
|
+
"file": "data/release-checks.csv",
|
|
7
|
+
"idField": "id",
|
|
8
|
+
"requiredColumns": ["id", "target", "category", "check", "critical", "evidence", "owner", "rollback_or_followup", "tags", "reference", "stack"],
|
|
9
|
+
"searchableFields": ["target", "category", "check", "evidence", "owner", "rollback_or_followup", "tags"],
|
|
10
|
+
"filterFields": ["target", "category", "critical", "stack"],
|
|
11
|
+
"reference": "references/release-readiness.md"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id,target,category,check,critical,evidence,owner,rollback_or_followup,tags,reference,stack
|
|
2
|
+
web-build,web,build,release candidate build completes locally,yes,build exit code and artifact manifest,change owner,record prior artifact for explicit rollback assessment,web build,references/release-readiness.md,*
|
|
3
|
+
web-env,web,environment,required environment names are present without exposing values,yes,redacted config metadata and startup check,release owner,restore prior environment mapping,web environment,references/secrets.md,*
|
|
4
|
+
web-routes,web,smoke,critical routes and assets load in a local production-like preview,yes,authenticated and unauthenticated local smoke result,product owner,record external route failure for explicit execution review,web smoke,references/release-readiness.md,nextjs
|
|
5
|
+
web-cache,web,delivery,headers and cache freshness match release intent,no,response headers and local cache/revalidation evidence,change owner,record external cache action as unverified,web cache,references/release-readiness.md,*
|
|
6
|
+
backend-artifact,backend,build,backend artifact starts with a release-like runtime locally,yes,start log and artifact digest,change owner,record prior digest for explicit rollback assessment,backend artifact,references/release-readiness.md,node
|
|
7
|
+
backend-config,backend,environment,config and secret references resolve by name,yes,startup/readiness result without values,backend owner,restore prior config mapping,backend config,references/secrets.md,node
|
|
8
|
+
backend-migration,backend,data,migration is compatible with old and new app,yes,schema diff and compatibility analysis,change owner,document compatibility limits for explicit execution,backend migration,references/migrations.md,node
|
|
9
|
+
backend-health,backend,health,health and readiness checks pass in a local release-like runtime,yes,versioned response from local instance,change owner,report external health as unverified unless explicitly requested,backend health,references/release-readiness.md,node
|
|
10
|
+
backend-shutdown,backend,reliability,graceful shutdown drains work,yes,termination test and no dropped in-flight work,backend owner,restore prior process config,graceful shutdown,references/release-readiness.md,node
|
|
11
|
+
backend-observability,backend,observability,local logs metrics traces and alert assumptions identify the candidate,yes,local release marker and alert configuration check,change owner,inspect external dashboard only for explicit execution,observability,references/release-readiness.md,node
|
|
12
|
+
docker-build,docker,build,image builds reproducibly,yes,digest and build command output,release owner,retain prior image digest,docker image,references/release-readiness.md,docker
|
|
13
|
+
docker-runtime,docker,smoke,container starts expected entrypoint as non-root where practical,yes,local container smoke and health result,change owner,record prior image for explicit rollback assessment,docker runtime,references/release-readiness.md,docker
|
|
14
|
+
docker-secrets,docker,security,secrets are injected at runtime not baked into layers,yes,config inspection and secret scan without values,platform owner,rebuild from prior safe image,docker secrets,references/secrets.md,docker
|
|
15
|
+
orchestration-rollout,docker,rollout,explicit orchestration task has readiness gates and replica assumptions,yes,configuration inspection and recorded target evidence,change owner,leave cluster action for explicit execution,orchestration,references/release-readiness.md,kubernetes
|
|
16
|
+
orchestration-rollback,docker,rollback,explicit orchestration task has a recoverable previous image and config,yes,dry-run or recorded rollback plan,change owner,execute only after explicit approval,orchestration rollback,references/rollback.md,kubernetes
|
|
17
|
+
ios-version,ios,version,bundle ID and marketing/build version are deliberate,yes,archive metadata,release owner,restore prior version metadata,ios version,references/release-readiness.md,ios
|
|
18
|
+
ios-signing,ios,signing,scheme signing entitlements and provisioning validate,yes,archive validation result,release owner,use prior signed artifact,ios signing,references/secrets.md,ios
|
|
19
|
+
ios-privacy,ios,compliance,privacy manifest and usage descriptions match APIs,yes,archive/store validation,release owner,withdraw build and keep prior release,ios privacy,references/release-readiness.md,ios
|
|
20
|
+
ios-symbols,ios,diagnostics,dSYM and archive are retained with release identity,yes,artifact checksum and local symbol identity,change owner,retain prior symbols for explicit release recovery,ios symbols,references/release-readiness.md,ios
|
|
21
|
+
ios-smoke,ios,smoke,install launch login push/deep-link critical flow on a local device or simulator,yes,local device smoke result,QA owner,record TestFlight/store verification as unverified,ios smoke,references/release-readiness.md,ios
|
|
22
|
+
android-version,android,version,application ID versionCode and versionName are correct,yes,AAB metadata,release owner,restore prior version config,android version,references/release-readiness.md,android
|
|
23
|
+
android-signing,android,signing,release signing and permissions validate,yes,bundle build and signing result,release owner,use prior signed bundle,android signing,references/secrets.md,android
|
|
24
|
+
android-symbols,android,diagnostics,R8 mapping and native symbols are retained,yes,mapping artifact linked to candidate version,change owner,retain prior mapping for explicit release recovery,android symbols,references/release-readiness.md,android
|
|
25
|
+
android-smoke,android,smoke,install launch update and critical journey pass on a local device,yes,local device result,QA owner,record Play track verification as unverified,android smoke,references/release-readiness.md,android
|
|
26
|
+
tauri-artifact,desktop,build,Rust/frontend bundle and updater metadata are correct,yes,platform artifact and checksum,release owner,retain previous bundle,tauri artifact,references/release-readiness.md,tauri
|
|
27
|
+
tauri-signing,desktop,signing,desktop signing/notarization and update path validate,yes,platform verification result,release owner,serve previous signed release,tauri signing,references/secrets.md,tauri
|
|
28
|
+
tauri-smoke,desktop,smoke,clean-machine install launch and update smoke pass,yes,clean local environment result,QA owner,record updater-channel action for explicit execution,desktop smoke,references/release-readiness.md,tauri
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Example delivery-readiness report
|
|
2
|
+
|
|
3
|
+
Intent: verify whether the iOS candidate is ready for handoff; no store
|
|
4
|
+
submission or deployment was requested.
|
|
5
|
+
|
|
6
|
+
Target: iOS candidate `2.4.0 (318)`.
|
|
7
|
+
|
|
8
|
+
Local evidence: focused tests, typecheck, archive, signing, entitlements,
|
|
9
|
+
version/build-number, privacy strings, push/deep-link configuration, dSYM
|
|
10
|
+
identity, and clean-device smoke passed.
|
|
11
|
+
|
|
12
|
+
Existing CI: inspected the workflow to confirm its canonical test command;
|
|
13
|
+
unchanged because CI modification was outside scope.
|
|
14
|
+
|
|
15
|
+
External/unverified: App Store/TestFlight processing, production push delivery,
|
|
16
|
+
provider monitoring, and rollout state. These are not required for this local
|
|
17
|
+
readiness decision and must not be reported as passed.
|
|
18
|
+
|
|
19
|
+
Readiness: ready for the requested handoff, subject to the release owner's
|
|
20
|
+
separate decision about any later submission or deployment.
|
|
21
|
+
|
|
22
|
+
If the user explicitly requests TestFlight submission or deployment
|
|
23
|
+
verification, record the target, artifact, authorized command, processing
|
|
24
|
+
result, install/launch smoke, observation owner, and recovery trigger
|
|
25
|
+
separately. Use `references/post-deploy.md` only for that explicit scope.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Migration readiness
|
|
2
|
+
|
|
3
|
+
Classify migrations as additive/backward-compatible, lock-heavy, backfill,
|
|
4
|
+
destructive, or irreversible. For a readiness assessment, inspect the schema
|
|
5
|
+
diff, compatibility window, lock/timeout behavior, retry/idempotency, ordering,
|
|
6
|
+
rollback compatibility, and abort trigger without mutating production data.
|
|
7
|
+
|
|
8
|
+
If the task explicitly requests deployment execution, the expand/migrate/contract
|
|
9
|
+
sequence may be evaluated: add a compatible shape, run compatible readers and
|
|
10
|
+
writers, backfill with observable progress, then contract after old consumers
|
|
11
|
+
are gone. Production data mutation still requires explicit approval and
|
|
12
|
+
backup/recovery evidence.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Explicit deployment verification
|
|
2
|
+
|
|
3
|
+
Only load this reference when the task explicitly requests deployment or
|
|
4
|
+
release-execution verification. It is not part of ordinary delivery readiness
|
|
5
|
+
and does not authorize a deploy.
|
|
6
|
+
|
|
7
|
+
For that explicit scope, verify the deployed version or artifact digest,
|
|
8
|
+
health/readiness, critical user/API flows, logs/error rate, dependency
|
|
9
|
+
reachability, queue/migration state, and platform-specific distribution status.
|
|
10
|
+
Define a risk-appropriate observation window and abort threshold. Separate
|
|
11
|
+
successful upload/deploy from successful behavior, and record which external
|
|
12
|
+
signals remain manual or unavailable.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Delivery readiness
|
|
2
|
+
|
|
3
|
+
Delivery readiness is a verification decision, not an execution command. Gather
|
|
4
|
+
fresh evidence for relevant tests, typecheck/analyzer, lint, build, package or
|
|
5
|
+
export output, artifact metadata, and target-specific prerequisites. Confirm
|
|
6
|
+
version, environment names, feature flags, migrations, secret references
|
|
7
|
+
without values, and observability assumptions when they are in scope.
|
|
8
|
+
|
|
9
|
+
Inspect existing CI or release configuration read-only when it helps discover
|
|
10
|
+
canonical commands. A deployed endpoint, provider result, store result, or
|
|
11
|
+
green CI run is not required for ordinary local readiness. Separate local proof
|
|
12
|
+
from external proof and report external checks as unverified unless the task
|
|
13
|
+
explicitly requests release/deployment verification.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Rollback readiness
|
|
2
|
+
|
|
3
|
+
Use this reference to assess rollback safety; do not execute a rollback during
|
|
4
|
+
ordinary delivery verification. Record the previous artifact/version/digest,
|
|
5
|
+
schema compatibility, feature-flag state, config changes, secret references,
|
|
6
|
+
data irreversibility, traffic assumptions, and trigger conditions. Check that
|
|
7
|
+
old code can read current data and that a recovery path does not repeat a
|
|
8
|
+
migration.
|
|
9
|
+
|
|
10
|
+
Only an explicitly requested deployment/release-execution task may exercise the
|
|
11
|
+
rollback mechanics. Otherwise list the command or external check as unverified
|
|
12
|
+
and leave production state unchanged.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Secrets
|
|
2
|
+
|
|
3
|
+
Never print, copy into source, or include secrets in generated artifacts, logs, screenshots, or issue text. Verify presence by variable/key name, provider metadata, or a safe startup check only. Distinguish public build configuration from server, signing, updater, and store secrets. Use platform secret stores, least privilege, rotation, and redaction. Treat a secret exposed once as compromised and escalate rotation without requesting the value.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { detectStacks } from './lib/detect-stack.mjs'; import path from 'node:path';
|
|
3
|
+
const root=path.resolve(process.argv[2]??process.cwd()); const stacks=await detectStacks(root); const targets=[];
|
|
4
|
+
if(stacks.some(s=>['nextjs','react','vue','svelte'].includes(s)))targets.push('web'); if(stacks.some(s=>['node','fastify','nestjs'].includes(s)))targets.push('backend'); if(stacks.includes('ios'))targets.push('ios'); if(stacks.includes('android'))targets.push('android'); if(stacks.includes('tauri'))targets.push('desktop');
|
|
5
|
+
console.log(JSON.stringify({root,stacks,targets:[...new Set(targets)]},null,2));
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { access, readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
async function exists(target) { try { await access(target); return true; } catch { return false; } }
|
|
5
|
+
|
|
6
|
+
export async function detectStacks(projectRoot) {
|
|
7
|
+
const found = new Set();
|
|
8
|
+
try {
|
|
9
|
+
const names = await readdir(projectRoot);
|
|
10
|
+
if (names.some((name) => ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb'].includes(name))) found.add('package-manager');
|
|
11
|
+
if (names.some((name) => ['pnpm-workspace.yaml', 'lerna.json', 'turbo.json', 'nx.json'].includes(name))) found.add('workspace');
|
|
12
|
+
if (names.some((name) => name.endsWith('.xcodeproj') || name.endsWith('.xcworkspace'))) found.add('ios');
|
|
13
|
+
} catch { /* inaccessible repository is reported by the caller */ }
|
|
14
|
+
const packageFile = path.join(projectRoot, 'package.json');
|
|
15
|
+
if (await exists(packageFile)) {
|
|
16
|
+
try {
|
|
17
|
+
const pkg = JSON.parse(await readFile(packageFile, 'utf8'));
|
|
18
|
+
const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}), ...(pkg.peerDependencies ?? {}) };
|
|
19
|
+
if (pkg.packageManager) found.add('package-manager');
|
|
20
|
+
if (pkg.workspaces) found.add('workspace');
|
|
21
|
+
if (deps.next) found.add('nextjs');
|
|
22
|
+
if (deps.react) found.add('react');
|
|
23
|
+
if (deps['react-native']) found.add('react-native');
|
|
24
|
+
if (deps.vue) found.add('vue');
|
|
25
|
+
if (deps.svelte) found.add('svelte');
|
|
26
|
+
if (deps.tailwindcss) found.add('html-tailwind');
|
|
27
|
+
if (deps.fastify || deps['@fastify/core']) found.add('fastify');
|
|
28
|
+
if (deps['@nestjs/core']) found.add('nestjs');
|
|
29
|
+
if (deps['@tauri-apps/api']) found.add('tauri');
|
|
30
|
+
if (deps.electron) found.add('electron');
|
|
31
|
+
if (deps.expo || deps['expo-router']) found.add('expo');
|
|
32
|
+
found.add('node');
|
|
33
|
+
} catch { /* malformed package is reported by higher-level skills */ }
|
|
34
|
+
}
|
|
35
|
+
if (await exists(path.join(projectRoot, 'pubspec.yaml'))) {
|
|
36
|
+
const pubspec = await readFile(path.join(projectRoot, 'pubspec.yaml'), 'utf8');
|
|
37
|
+
if (/\bflutter\s*:/m.test(pubspec)) found.add('flutter');
|
|
38
|
+
found.add('dart');
|
|
39
|
+
}
|
|
40
|
+
if (await exists(path.join(projectRoot, 'ios'))) found.add('ios');
|
|
41
|
+
if (await exists(path.join(projectRoot, 'android'))) found.add('android');
|
|
42
|
+
if (await exists(path.join(projectRoot, 'Package.swift'))) { found.add('swift'); found.add('spm'); }
|
|
43
|
+
if (await exists(path.join(projectRoot, 'Cargo.toml'))) found.add('rust');
|
|
44
|
+
if (await exists(path.join(projectRoot, 'go.mod'))) found.add('go');
|
|
45
|
+
if (await exists(path.join(projectRoot, 'pyproject.toml')) || await exists(path.join(projectRoot, 'requirements.txt'))) found.add('python');
|
|
46
|
+
if (await exists(path.join(projectRoot, '.github', 'workflows')) || await exists(path.join(projectRoot, '.gitlab-ci.yml')) || await exists(path.join(projectRoot, 'Jenkinsfile'))) found.add('ci');
|
|
47
|
+
return [...found].sort();
|
|
48
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { access, readFile } from 'node:fs/promises'; import path from 'node:path';
|
|
3
|
+
const root=path.resolve(process.argv[2]??process.cwd()); const exists=async p=>{try{await access(p);return true}catch{return false}}; const checks=[];
|
|
4
|
+
if(await exists(path.join(root,'package.json'))){const p=JSON.parse(await readFile(path.join(root,'package.json'),'utf8'));checks.push({check:'package version',status:p.version?'present':'missing',value:p.version??null});checks.push({check:'build script',status:p.scripts?.build?'present':'missing'});checks.push({check:'test script',status:p.scripts?.test?'present':'missing'})}
|
|
5
|
+
checks.push({check:'git repository',status:await exists(path.join(root,'.git'))?'present':'not-detected'}); checks.push({check:'ios project',status:await exists(path.join(root,'ios'))?'present':'not-applicable'}); checks.push({check:'android project',status:await exists(path.join(root,'android'))?'present':'not-applicable'});
|
|
6
|
+
console.log(JSON.stringify({root,checks,note:'Read-only preflight. It does not prove release readiness; run project verification commands and platform checks.'},null,2));
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Android delivery verification
|
|
2
|
+
|
|
3
|
+
Verify the signed release artifact locally by default. Play Console upload,
|
|
4
|
+
track changes, and staged rollout require explicit release-execution intent.
|
|
5
|
+
|
|
6
|
+
## Identity, SDK, and signing
|
|
7
|
+
|
|
8
|
+
Record `applicationId`, `versionCode`, `versionName`, min/target/compile SDK, release variant, JDK/AGP/Gradle/Kotlin versions, and the exact signing configuration. Verify the keystore/alias reference and Play app identity without printing secrets. Check manifest merger output, exported components, permissions, app links, notification/push configuration, network security, and target-SDK behavior changes for the supported API range.
|
|
9
|
+
|
|
10
|
+
## Artifact and symbols
|
|
11
|
+
|
|
12
|
+
Prefer the signed AAB for Play distribution and inspect generated APKs/splits for ABI, resource, and permission behavior. Run R8/ProGuard in the release path and retain the exact mapping file, native symbols, build ID, and artifact digest; a release crash without matching mapping cannot be diagnosed reliably. Validate version code monotonicity and any signing-key/Play App Signing constraint before upload.
|
|
13
|
+
|
|
14
|
+
## Distribution readiness (explicit execution only)
|
|
15
|
+
|
|
16
|
+
Smoke clean install, upgrade install, process death/restore, permissions,
|
|
17
|
+
deep links/push, offline/reconnect, and release-only code paths locally. Play
|
|
18
|
+
Console upload, internal/closed tracks, staged rollout, and external crash/ANR
|
|
19
|
+
observation are execution-only checks. Android rollback is limited by
|
|
20
|
+
monotonic version codes, installed clients, data/schema changes, and track
|
|
21
|
+
state; record forward-fix or halt options without changing Play state by
|
|
22
|
+
default.
|
|
23
|
+
|
|
24
|
+
## Wrong turns and caveats
|
|
25
|
+
|
|
26
|
+
Do not test only a debug APK, disable R8 to make a release pass, or assume emulator behavior covers ABI/OEM/API differences. Target/min SDK implications and Play policy requirements change over time; verify current requirements and the target device matrix.
|
|
27
|
+
|
|
28
|
+
## Verification
|
|
29
|
+
|
|
30
|
+
Run tests and the release bundle task, inspect manifest/resources and signing,
|
|
31
|
+
install generated artifacts with `adb`, and preserve mapping/native symbols for
|
|
32
|
+
the candidate build. Upload/validate the AAB in a track only when explicitly
|
|
33
|
+
requested.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Docker delivery verification
|
|
2
|
+
|
|
3
|
+
Build and inspect Docker locally by default. Do not add Docker, deployment
|
|
4
|
+
configuration, or registry/host changes to an ordinary readiness task.
|
|
5
|
+
|
|
6
|
+
## Build an immutable artifact
|
|
7
|
+
|
|
8
|
+
Pin the base image by an approved tag/digest and record the resulting image digest. Use a multi-stage build so compilers, package-manager caches, tests, and source-only files do not enter the runtime image. Keep the build context minimal, run as a non-root UID/GID where compatible, define an explicit exec-form entrypoint, and make the target architecture (`linux/amd64`, `linux/arm64`, or both) deliberate.
|
|
9
|
+
|
|
10
|
+
## Runtime contract
|
|
11
|
+
|
|
12
|
+
Inject secrets at runtime and verify only variable names/references, never values. Check ports, DNS/service names, writable paths, persistent volumes, time zone/CA requirements, resource limits, and PID 1 signal handling. A health check should test the service's readiness contract without depending on a permanently unavailable external system; startup ordering is not readiness. Preserve data volumes and migration order separately from image rollout.
|
|
13
|
+
|
|
14
|
+
## Artifact and local runtime verification
|
|
15
|
+
|
|
16
|
+
Scan/build the intended image, inspect labels and entrypoint, then run it by
|
|
17
|
+
digest in an isolated local network with non-secret configuration. Verify health
|
|
18
|
+
transitions, critical smoke flow, graceful stop/restart, dependency outage,
|
|
19
|
+
volume ownership, and architecture-specific startup. Keep prior digest/config
|
|
20
|
+
as readiness evidence; read `references/rollback.md` for safety assessment and
|
|
21
|
+
`references/post-deploy.md` only for explicit external verification.
|
|
22
|
+
|
|
23
|
+
## Wrong turns and edge cases
|
|
24
|
+
|
|
25
|
+
For an explicitly requested deployment, do not use a mutable `latest` tag, bake
|
|
26
|
+
`.env` or credentials into a layer, use `localhost` for another service, or run
|
|
27
|
+
as root to bypass a permissions defect. In ordinary verification, still watch
|
|
28
|
+
for native addon/libc mismatch, line endings, shell-form signal loss,
|
|
29
|
+
bind-mount masking, and a container that is “healthy” while its worker/queue
|
|
30
|
+
path is dead.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Electron delivery verification
|
|
2
|
+
|
|
3
|
+
Verify renderer production assets, main/preload packaging, context isolation,
|
|
4
|
+
application ID/version, platform signing, update metadata, and clean-machine
|
|
5
|
+
install/update behavior locally. Retain symbols and previous signed artifacts.
|
|
6
|
+
Treat successful packaging or upload as incomplete until launch and critical IPC
|
|
7
|
+
flows pass; upload and updater publication require explicit execution intent.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# iOS delivery verification
|
|
2
|
+
|
|
3
|
+
Verify the archive and installable artifact locally by default. TestFlight,
|
|
4
|
+
App Store, signing-service, and rollout actions are separate explicit scopes.
|
|
5
|
+
|
|
6
|
+
## Identity and signing
|
|
7
|
+
|
|
8
|
+
Record the bundle identifier, marketing version, build number, release scheme/configuration, deployment target, and archive export method. Confirm the identifier matches App Store Connect and the intended provisioning profile; certificates, distribution profiles, entitlements, capabilities, and keychain access groups must belong to the same app identity. Validate push, associated domains, background modes, Sign in with Apple, and other capabilities against the archive rather than the project editor alone.
|
|
9
|
+
|
|
10
|
+
## Privacy and artifact evidence
|
|
11
|
+
|
|
12
|
+
Check privacy manifests, permission usage descriptions, SDK-required declarations, URL schemes, and tracking disclosures for every native dependency. Archive with release settings, retain the matching dSYM/BCSymbolMaps and exported IPA metadata, and verify bitcode/symbol expectations for the current toolchain. Do not treat a successful archive as proof that launch, permissions, deep links, push, or background behavior works on a device.
|
|
13
|
+
|
|
14
|
+
## Distribution readiness (explicit execution only)
|
|
15
|
+
|
|
16
|
+
Run archive validation and install the exact build on a clean simulator/device
|
|
17
|
+
when available. Smoke first launch, upgrade from the previous version, login,
|
|
18
|
+
critical native capabilities, push/deep links, offline/reconnect,
|
|
19
|
+
background/foreground, and crash reporting. TestFlight groups, App Store
|
|
20
|
+
rollout, and external observation are execution-only checks; use them only when
|
|
21
|
+
explicitly requested. iOS rollback is constrained after users migrate local
|
|
22
|
+
data or distribution advances, so record recovery assumptions without
|
|
23
|
+
submitting or changing store state.
|
|
24
|
+
|
|
25
|
+
## Wrong turns and caveats
|
|
26
|
+
|
|
27
|
+
Do not reuse a development profile, increment only the marketing version, or copy entitlements from another target. Signing, privacy, Xcode, SDK, and App Store rules are version-sensitive; verify current target requirements and provider status. Report store processing, phased rollout, and crash-observability checks that cannot be verified locally.
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
|
|
31
|
+
Run repository tests plus `xcodebuild archive`/export and validation for the
|
|
32
|
+
affected scheme, inspect signing/entitlements, verify dSYM UUIDs, and install
|
|
33
|
+
the exported artifact. Record TestFlight/store status only for an explicit
|
|
34
|
+
external-verification request, without exposing credentials.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Next.js delivery verification
|
|
2
|
+
|
|
3
|
+
Default to local build and runtime verification. Do not deploy or change
|
|
4
|
+
provider configuration unless the task explicitly requests deployment.
|
|
5
|
+
|
|
6
|
+
## Choose the runtime
|
|
7
|
+
|
|
8
|
+
Record Next.js version, router, Node version, output mode, hosting target, and whether each route is static, Node/serverless, or edge. Static export removes server runtime features; Node and edge deployments differ in available APIs, startup, streaming, caching, and environment access. Confirm provider support for the exact output mode before treating `next build` as deployable.
|
|
9
|
+
|
|
10
|
+
## Build-time and runtime configuration
|
|
11
|
+
|
|
12
|
+
Classify public `NEXT_PUBLIC_*` values and server-only variables. Public values are commonly embedded during build, so changing them after deployment may require rebuilding; server variables must exist in the runtime environment. Inspect route output, middleware/runtime assignments, image/font assets, base path, redirects/headers, and source-map/secret exposure. For App Router, verify server/client boundaries, server actions, and cache/revalidation behavior in the production build.
|
|
13
|
+
|
|
14
|
+
## Artifact and local smoke
|
|
15
|
+
|
|
16
|
+
Run the repository's tests, typecheck/lint, and `next build`; start the
|
|
17
|
+
production artifact with `next start` when possible. Smoke direct load and
|
|
18
|
+
client navigation for critical routes, auth/session, API/route handlers, image
|
|
19
|
+
assets, error/404 paths, and local cache behavior. Check deployed health,
|
|
20
|
+
logs, CDN behavior, or deployed commit/version only through the explicit
|
|
21
|
+
deployment-verification gate in `references/post-deploy.md`.
|
|
22
|
+
|
|
23
|
+
## Wrong turns and caveats
|
|
24
|
+
|
|
25
|
+
Do not use a development server as release evidence, assume preview environment
|
|
26
|
+
variables match another environment, or add `dynamic`/`no-store` merely to
|
|
27
|
+
force a passing build. React/Next cache APIs, bundlers, edge support, and
|
|
28
|
+
provider output rules are version-sensitive; verify migration/release notes
|
|
29
|
+
when relevant and record prior-artifact rollback assumptions without changing
|
|
30
|
+
provider state.
|