@selvakumaresra/specship 0.1.3 → 0.4.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/README.md +2 -2
- package/commands/ss-design-implement.md +84 -0
- package/commands/ss-design-loop.md +125 -0
- package/commands/{cg-drifted.md → ss-drifted.md} +2 -2
- package/commands/{cg-fix.md → ss-fix.md} +1 -1
- package/commands/{cg-implement.md → ss-implement.md} +1 -1
- package/commands/ss-spec-author.md +43 -0
- package/commands/ss-spec-review.md +48 -0
- package/dist/bin/node-version-check.d.ts +37 -0
- package/dist/bin/node-version-check.d.ts.map +1 -0
- package/dist/bin/node-version-check.js +79 -0
- package/dist/bin/node-version-check.js.map +1 -0
- package/dist/bin/specship.d.ts +25 -0
- package/dist/bin/specship.d.ts.map +1 -0
- package/dist/bin/specship.js +2085 -0
- package/dist/bin/specship.js.map +1 -0
- package/dist/bin/uninstall.d.ts +13 -0
- package/dist/bin/uninstall.d.ts.map +1 -0
- package/dist/bin/uninstall.js +35 -0
- package/dist/bin/uninstall.js.map +1 -0
- package/dist/context/formatter.d.ts +30 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +263 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +119 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +1289 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/markers.d.ts +19 -0
- package/dist/context/markers.d.ts.map +1 -0
- package/dist/context/markers.js +22 -0
- package/dist/context/markers.js.map +1 -0
- package/dist/db/index.d.ts +103 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +279 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +44 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +462 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +357 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +1504 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.sql +419 -0
- package/dist/db/spec-queries.d.ts +101 -0
- package/dist/db/spec-queries.d.ts.map +1 -0
- package/dist/db/spec-queries.js +675 -0
- package/dist/db/spec-queries.js.map +1 -0
- package/dist/db/sqlite-adapter.d.ts +65 -0
- package/dist/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/db/sqlite-adapter.js +214 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/designer/artifact-store.js +54 -0
- package/dist/designer/browser.js +141 -0
- package/dist/designer/cdp-ensure.js +60 -0
- package/dist/designer/cdp-env.js +18 -0
- package/dist/designer/cdp-trace.js +599 -0
- package/dist/designer/cross-platform.js +74 -0
- package/dist/designer/designer-controller.js +1413 -0
- package/dist/designer/file-panel.js +39 -0
- package/dist/designer/interstitials.js +97 -0
- package/dist/designer/oopif-reader.js +176 -0
- package/dist/designer/package-meta.js +18 -0
- package/dist/designer/preview-host.js +50 -0
- package/dist/designer/repo-root.js +31 -0
- package/dist/designer/run-state.js +353 -0
- package/dist/designer/session-store.js +59 -0
- package/dist/designer/ui-anchors.js +651 -0
- package/dist/directory.d.ts +67 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +267 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +136 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +219 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction/dfm-extractor.d.ts +31 -0
- package/dist/extraction/dfm-extractor.d.ts.map +1 -0
- package/dist/extraction/dfm-extractor.js +151 -0
- package/dist/extraction/dfm-extractor.js.map +1 -0
- package/dist/extraction/generated-detection.d.ts +30 -0
- package/dist/extraction/generated-detection.d.ts.map +1 -0
- package/dist/extraction/generated-detection.js +80 -0
- package/dist/extraction/generated-detection.js.map +1 -0
- package/dist/extraction/grammars.d.ts +100 -0
- package/dist/extraction/grammars.d.ts.map +1 -0
- package/dist/extraction/grammars.js +426 -0
- package/dist/extraction/grammars.js.map +1 -0
- package/dist/extraction/index.d.ts +138 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +1394 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/languages/c-cpp.d.ts +4 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
- package/dist/extraction/languages/c-cpp.js +171 -0
- package/dist/extraction/languages/c-cpp.js.map +1 -0
- package/dist/extraction/languages/csharp.d.ts +3 -0
- package/dist/extraction/languages/csharp.d.ts.map +1 -0
- package/dist/extraction/languages/csharp.js +73 -0
- package/dist/extraction/languages/csharp.js.map +1 -0
- package/dist/extraction/languages/dart.d.ts +3 -0
- package/dist/extraction/languages/dart.d.ts.map +1 -0
- package/dist/extraction/languages/dart.js +192 -0
- package/dist/extraction/languages/dart.js.map +1 -0
- package/dist/extraction/languages/go.d.ts +3 -0
- package/dist/extraction/languages/go.d.ts.map +1 -0
- package/dist/extraction/languages/go.js +74 -0
- package/dist/extraction/languages/go.js.map +1 -0
- package/dist/extraction/languages/index.d.ts +10 -0
- package/dist/extraction/languages/index.d.ts.map +1 -0
- package/dist/extraction/languages/index.js +51 -0
- package/dist/extraction/languages/index.js.map +1 -0
- package/dist/extraction/languages/java.d.ts +3 -0
- package/dist/extraction/languages/java.d.ts.map +1 -0
- package/dist/extraction/languages/java.js +70 -0
- package/dist/extraction/languages/java.js.map +1 -0
- package/dist/extraction/languages/javascript.d.ts +3 -0
- package/dist/extraction/languages/javascript.d.ts.map +1 -0
- package/dist/extraction/languages/javascript.js +90 -0
- package/dist/extraction/languages/javascript.js.map +1 -0
- package/dist/extraction/languages/kotlin.d.ts +3 -0
- package/dist/extraction/languages/kotlin.d.ts.map +1 -0
- package/dist/extraction/languages/kotlin.js +259 -0
- package/dist/extraction/languages/kotlin.js.map +1 -0
- package/dist/extraction/languages/lua.d.ts +3 -0
- package/dist/extraction/languages/lua.d.ts.map +1 -0
- package/dist/extraction/languages/lua.js +150 -0
- package/dist/extraction/languages/lua.js.map +1 -0
- package/dist/extraction/languages/luau.d.ts +3 -0
- package/dist/extraction/languages/luau.d.ts.map +1 -0
- package/dist/extraction/languages/luau.js +37 -0
- package/dist/extraction/languages/luau.js.map +1 -0
- package/dist/extraction/languages/objc.d.ts +3 -0
- package/dist/extraction/languages/objc.d.ts.map +1 -0
- package/dist/extraction/languages/objc.js +133 -0
- package/dist/extraction/languages/objc.js.map +1 -0
- package/dist/extraction/languages/pascal.d.ts +3 -0
- package/dist/extraction/languages/pascal.d.ts.map +1 -0
- package/dist/extraction/languages/pascal.js +66 -0
- package/dist/extraction/languages/pascal.js.map +1 -0
- package/dist/extraction/languages/php.d.ts +3 -0
- package/dist/extraction/languages/php.d.ts.map +1 -0
- package/dist/extraction/languages/php.js +107 -0
- package/dist/extraction/languages/php.js.map +1 -0
- package/dist/extraction/languages/python.d.ts +3 -0
- package/dist/extraction/languages/python.d.ts.map +1 -0
- package/dist/extraction/languages/python.js +56 -0
- package/dist/extraction/languages/python.js.map +1 -0
- package/dist/extraction/languages/ruby.d.ts +3 -0
- package/dist/extraction/languages/ruby.d.ts.map +1 -0
- package/dist/extraction/languages/ruby.js +114 -0
- package/dist/extraction/languages/ruby.js.map +1 -0
- package/dist/extraction/languages/rust.d.ts +3 -0
- package/dist/extraction/languages/rust.d.ts.map +1 -0
- package/dist/extraction/languages/rust.js +109 -0
- package/dist/extraction/languages/rust.js.map +1 -0
- package/dist/extraction/languages/scala.d.ts +3 -0
- package/dist/extraction/languages/scala.d.ts.map +1 -0
- package/dist/extraction/languages/scala.js +139 -0
- package/dist/extraction/languages/scala.js.map +1 -0
- package/dist/extraction/languages/swift.d.ts +3 -0
- package/dist/extraction/languages/swift.d.ts.map +1 -0
- package/dist/extraction/languages/swift.js +91 -0
- package/dist/extraction/languages/swift.js.map +1 -0
- package/dist/extraction/languages/typescript.d.ts +3 -0
- package/dist/extraction/languages/typescript.d.ts.map +1 -0
- package/dist/extraction/languages/typescript.js +129 -0
- package/dist/extraction/languages/typescript.js.map +1 -0
- package/dist/extraction/liquid-extractor.d.ts +52 -0
- package/dist/extraction/liquid-extractor.d.ts.map +1 -0
- package/dist/extraction/liquid-extractor.js +313 -0
- package/dist/extraction/liquid-extractor.js.map +1 -0
- package/dist/extraction/mybatis-extractor.d.ts +48 -0
- package/dist/extraction/mybatis-extractor.d.ts.map +1 -0
- package/dist/extraction/mybatis-extractor.js +198 -0
- package/dist/extraction/mybatis-extractor.js.map +1 -0
- package/dist/extraction/parse-worker.d.ts +8 -0
- package/dist/extraction/parse-worker.d.ts.map +1 -0
- package/dist/extraction/parse-worker.js +94 -0
- package/dist/extraction/parse-worker.js.map +1 -0
- package/dist/extraction/specs/markdown-spec-extractor.d.ts +59 -0
- package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -0
- package/dist/extraction/specs/markdown-spec-extractor.js +327 -0
- package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -0
- package/dist/extraction/specs/types.d.ts +39 -0
- package/dist/extraction/specs/types.d.ts.map +1 -0
- package/dist/extraction/specs/types.js +8 -0
- package/dist/extraction/specs/types.js.map +1 -0
- package/dist/extraction/svelte-extractor.d.ts +56 -0
- package/dist/extraction/svelte-extractor.d.ts.map +1 -0
- package/dist/extraction/svelte-extractor.js +272 -0
- package/dist/extraction/svelte-extractor.js.map +1 -0
- package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
- package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
- package/dist/extraction/tree-sitter-helpers.js +103 -0
- package/dist/extraction/tree-sitter-helpers.js.map +1 -0
- package/dist/extraction/tree-sitter-types.d.ts +193 -0
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
- package/dist/extraction/tree-sitter-types.js +10 -0
- package/dist/extraction/tree-sitter-types.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts +317 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -0
- package/dist/extraction/tree-sitter.js +3092 -0
- package/dist/extraction/tree-sitter.js.map +1 -0
- package/dist/extraction/vue-extractor.d.ts +51 -0
- package/dist/extraction/vue-extractor.d.ts.map +1 -0
- package/dist/extraction/vue-extractor.js +251 -0
- package/dist/extraction/vue-extractor.js.map +1 -0
- package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
- package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
- package/dist/extraction/wasm-runtime-flags.js +106 -0
- package/dist/extraction/wasm-runtime-flags.js.map +1 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/queries.d.ts +106 -0
- package/dist/graph/queries.d.ts.map +1 -0
- package/dist/graph/queries.js +366 -0
- package/dist/graph/queries.js.map +1 -0
- package/dist/graph/traversal.d.ts +127 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +531 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/index.d.ts +551 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1165 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/config-writer.d.ts +28 -0
- package/dist/installer/config-writer.d.ts.map +1 -0
- package/dist/installer/config-writer.js +91 -0
- package/dist/installer/config-writer.js.map +1 -0
- package/dist/installer/index.d.ts +92 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +416 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/instructions-template.d.ts +35 -0
- package/dist/installer/instructions-template.d.ts.map +1 -0
- package/dist/installer/instructions-template.js +51 -0
- package/dist/installer/instructions-template.js.map +1 -0
- package/dist/installer/targets/claude.d.ts +117 -0
- package/dist/installer/targets/claude.d.ts.map +1 -0
- package/dist/installer/targets/claude.js +736 -0
- package/dist/installer/targets/claude.js.map +1 -0
- package/dist/installer/targets/registry.d.ts +19 -0
- package/dist/installer/targets/registry.d.ts.map +1 -0
- package/dist/installer/targets/registry.js +31 -0
- package/dist/installer/targets/registry.js.map +1 -0
- package/dist/installer/targets/shared.d.ts +76 -0
- package/dist/installer/targets/shared.d.ts.map +1 -0
- package/dist/installer/targets/shared.js +256 -0
- package/dist/installer/targets/shared.js.map +1 -0
- package/dist/installer/targets/types.d.ts +84 -0
- package/dist/installer/targets/types.d.ts.map +1 -0
- package/dist/installer/targets/types.js +12 -0
- package/dist/installer/targets/types.js.map +1 -0
- package/dist/isolation/worktree.d.ts +65 -0
- package/dist/isolation/worktree.d.ts.map +1 -0
- package/dist/isolation/worktree.js +231 -0
- package/dist/isolation/worktree.js.map +1 -0
- package/dist/mcp/daemon-paths.d.ts +46 -0
- package/dist/mcp/daemon-paths.d.ts.map +1 -0
- package/dist/mcp/daemon-paths.js +125 -0
- package/dist/mcp/daemon-paths.js.map +1 -0
- package/dist/mcp/daemon.d.ts +161 -0
- package/dist/mcp/daemon.d.ts.map +1 -0
- package/dist/mcp/daemon.js +403 -0
- package/dist/mcp/daemon.js.map +1 -0
- package/dist/mcp/designer-tools.d.ts +33 -0
- package/dist/mcp/designer-tools.d.ts.map +1 -0
- package/dist/mcp/designer-tools.js +313 -0
- package/dist/mcp/designer-tools.js.map +1 -0
- package/dist/mcp/engine.d.ts +105 -0
- package/dist/mcp/engine.d.ts.map +1 -0
- package/dist/mcp/engine.js +270 -0
- package/dist/mcp/engine.js.map +1 -0
- package/dist/mcp/index.d.ts +112 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +477 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/proxy.d.ts +81 -0
- package/dist/mcp/proxy.d.ts.map +1 -0
- package/dist/mcp/proxy.js +510 -0
- package/dist/mcp/proxy.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +18 -0
- package/dist/mcp/server-instructions.d.ts.map +1 -0
- package/dist/mcp/server-instructions.js +77 -0
- package/dist/mcp/server-instructions.js.map +1 -0
- package/dist/mcp/session.d.ts +77 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +294 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/spec-tools.d.ts +39 -0
- package/dist/mcp/spec-tools.d.ts.map +1 -0
- package/dist/mcp/spec-tools.js +326 -0
- package/dist/mcp/spec-tools.js.map +1 -0
- package/dist/mcp/tools.d.ts +404 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +3087 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +188 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +343 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/mcp/version.d.ts +19 -0
- package/dist/mcp/version.d.ts.map +1 -0
- package/dist/mcp/version.js +71 -0
- package/dist/mcp/version.js.map +1 -0
- package/dist/resolution/callback-synthesizer.d.ts +10 -0
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
- package/dist/resolution/callback-synthesizer.js +1300 -0
- package/dist/resolution/callback-synthesizer.js.map +1 -0
- package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
- package/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
- package/dist/resolution/frameworks/cargo-workspace.js +225 -0
- package/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
- package/dist/resolution/frameworks/csharp.js +241 -0
- package/dist/resolution/frameworks/csharp.js.map +1 -0
- package/dist/resolution/frameworks/drupal.d.ts +51 -0
- package/dist/resolution/frameworks/drupal.d.ts.map +1 -0
- package/dist/resolution/frameworks/drupal.js +367 -0
- package/dist/resolution/frameworks/drupal.js.map +1 -0
- package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
- package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
- package/dist/resolution/frameworks/expo-modules.js +143 -0
- package/dist/resolution/frameworks/expo-modules.js.map +1 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/express.d.ts.map +1 -0
- package/dist/resolution/frameworks/express.js +308 -0
- package/dist/resolution/frameworks/express.js.map +1 -0
- package/dist/resolution/frameworks/fabric.d.ts +3 -0
- package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
- package/dist/resolution/frameworks/fabric.js +354 -0
- package/dist/resolution/frameworks/fabric.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -0
- package/dist/resolution/frameworks/go.js +161 -0
- package/dist/resolution/frameworks/go.js.map +1 -0
- package/dist/resolution/frameworks/index.d.ts +48 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -0
- package/dist/resolution/frameworks/index.js +161 -0
- package/dist/resolution/frameworks/index.js.map +1 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/java.d.ts.map +1 -0
- package/dist/resolution/frameworks/java.js +504 -0
- package/dist/resolution/frameworks/java.js.map +1 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
- package/dist/resolution/frameworks/laravel.js +257 -0
- package/dist/resolution/frameworks/laravel.js.map +1 -0
- package/dist/resolution/frameworks/nestjs.d.ts +26 -0
- package/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
- package/dist/resolution/frameworks/nestjs.js +698 -0
- package/dist/resolution/frameworks/nestjs.js.map +1 -0
- package/dist/resolution/frameworks/play.d.ts +19 -0
- package/dist/resolution/frameworks/play.d.ts.map +1 -0
- package/dist/resolution/frameworks/play.js +111 -0
- package/dist/resolution/frameworks/play.js.map +1 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/python.d.ts.map +1 -0
- package/dist/resolution/frameworks/python.js +396 -0
- package/dist/resolution/frameworks/python.js.map +1 -0
- package/dist/resolution/frameworks/react-native.d.ts +3 -0
- package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
- package/dist/resolution/frameworks/react-native.js +360 -0
- package/dist/resolution/frameworks/react-native.js.map +1 -0
- package/dist/resolution/frameworks/react.d.ts +8 -0
- package/dist/resolution/frameworks/react.d.ts.map +1 -0
- package/dist/resolution/frameworks/react.js +365 -0
- package/dist/resolution/frameworks/react.js.map +1 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
- package/dist/resolution/frameworks/ruby.js +302 -0
- package/dist/resolution/frameworks/ruby.js.map +1 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/rust.d.ts.map +1 -0
- package/dist/resolution/frameworks/rust.js +304 -0
- package/dist/resolution/frameworks/rust.js.map +1 -0
- package/dist/resolution/frameworks/svelte.d.ts +9 -0
- package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
- package/dist/resolution/frameworks/svelte.js +249 -0
- package/dist/resolution/frameworks/svelte.js.map +1 -0
- package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
- package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift-objc.js +252 -0
- package/dist/resolution/frameworks/swift-objc.js.map +1 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/swift.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift.js +400 -0
- package/dist/resolution/frameworks/swift.js.map +1 -0
- package/dist/resolution/frameworks/vue.d.ts +9 -0
- package/dist/resolution/frameworks/vue.d.ts.map +1 -0
- package/dist/resolution/frameworks/vue.js +306 -0
- package/dist/resolution/frameworks/vue.js.map +1 -0
- package/dist/resolution/go-module.d.ts +26 -0
- package/dist/resolution/go-module.d.ts.map +1 -0
- package/dist/resolution/go-module.js +78 -0
- package/dist/resolution/go-module.js.map +1 -0
- package/dist/resolution/import-resolver.d.ts +68 -0
- package/dist/resolution/import-resolver.d.ts.map +1 -0
- package/dist/resolution/import-resolver.js +1275 -0
- package/dist/resolution/import-resolver.js.map +1 -0
- package/dist/resolution/index.d.ts +117 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +895 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/lru-cache.d.ts +24 -0
- package/dist/resolution/lru-cache.d.ts.map +1 -0
- package/dist/resolution/lru-cache.js +62 -0
- package/dist/resolution/lru-cache.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +32 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -0
- package/dist/resolution/name-matcher.js +596 -0
- package/dist/resolution/name-matcher.js.map +1 -0
- package/dist/resolution/path-aliases.d.ts +68 -0
- package/dist/resolution/path-aliases.d.ts.map +1 -0
- package/dist/resolution/path-aliases.js +238 -0
- package/dist/resolution/path-aliases.js.map +1 -0
- package/dist/resolution/spec-link-resolver.d.ts +103 -0
- package/dist/resolution/spec-link-resolver.d.ts.map +1 -0
- package/dist/resolution/spec-link-resolver.js +259 -0
- package/dist/resolution/spec-link-resolver.js.map +1 -0
- package/dist/resolution/strip-comments.d.ts +27 -0
- package/dist/resolution/strip-comments.d.ts.map +1 -0
- package/dist/resolution/strip-comments.js +441 -0
- package/dist/resolution/strip-comments.js.map +1 -0
- package/dist/resolution/swift-objc-bridge.d.ts +134 -0
- package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
- package/dist/resolution/swift-objc-bridge.js +256 -0
- package/dist/resolution/swift-objc-bridge.js.map +1 -0
- package/dist/resolution/types.d.ts +216 -0
- package/dist/resolution/types.d.ts.map +1 -0
- package/dist/resolution/types.js +8 -0
- package/dist/resolution/types.js.map +1 -0
- package/dist/resolution/workspace-packages.d.ts +48 -0
- package/dist/resolution/workspace-packages.d.ts.map +1 -0
- package/dist/resolution/workspace-packages.js +208 -0
- package/dist/resolution/workspace-packages.js.map +1 -0
- package/dist/search/query-parser.d.ts +57 -0
- package/dist/search/query-parser.d.ts.map +1 -0
- package/dist/search/query-parser.js +177 -0
- package/dist/search/query-parser.js.map +1 -0
- package/dist/search/query-utils.d.ts +71 -0
- package/dist/search/query-utils.d.ts.map +1 -0
- package/dist/search/query-utils.js +380 -0
- package/dist/search/query-utils.js.map +1 -0
- package/dist/server/cli.js +152 -0
- package/dist/server/index.js +12 -0
- package/dist/server/ingest/index.js +18 -0
- package/dist/server/ingest/ingestor.js +506 -0
- package/dist/server/ingest/parser.js +104 -0
- package/dist/server/ingest/pricing.js +78 -0
- package/dist/server/ingest/types.js +9 -0
- package/dist/server/ingest/watcher.js +77 -0
- package/dist/server/package.json +3 -0
- package/dist/server/project-registry.js +101 -0
- package/dist/server/routes/claude.js +868 -0
- package/dist/server/routes/graph.js +211 -0
- package/dist/server/routes/memory.js +272 -0
- package/dist/server/routes/projects.js +197 -0
- package/dist/server/routes/spec.js +265 -0
- package/dist/server/routes/status.js +112 -0
- package/dist/server/routes/workflow.js +212 -0
- package/dist/server/server.js +206 -0
- package/dist/server/static-handler.js +87 -0
- package/dist/sync/git-hooks.d.ts +45 -0
- package/dist/sync/git-hooks.d.ts.map +1 -0
- package/dist/sync/git-hooks.js +225 -0
- package/dist/sync/git-hooks.js.map +1 -0
- package/dist/sync/index.d.ts +19 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +35 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/watch-policy.d.ts +48 -0
- package/dist/sync/watch-policy.d.ts.map +1 -0
- package/dist/sync/watch-policy.js +124 -0
- package/dist/sync/watch-policy.js.map +1 -0
- package/dist/sync/watcher.d.ts +283 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +606 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/sync/worktree.d.ts +54 -0
- package/dist/sync/worktree.d.ts.map +1 -0
- package/dist/sync/worktree.js +137 -0
- package/dist/sync/worktree.js.map +1 -0
- package/dist/types.d.ts +623 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +108 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/glyphs.d.ts +42 -0
- package/dist/ui/glyphs.d.ts.map +1 -0
- package/dist/ui/glyphs.js +78 -0
- package/dist/ui/glyphs.js.map +1 -0
- package/dist/ui/shimmer-progress.d.ts +11 -0
- package/dist/ui/shimmer-progress.d.ts.map +1 -0
- package/dist/ui/shimmer-progress.js +90 -0
- package/dist/ui/shimmer-progress.js.map +1 -0
- package/dist/ui/shimmer-worker.d.ts +2 -0
- package/dist/ui/shimmer-worker.d.ts.map +1 -0
- package/dist/ui/shimmer-worker.js +118 -0
- package/dist/ui/shimmer-worker.js.map +1 -0
- package/dist/ui/types.d.ts +17 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +3 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/utils.d.ts +205 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +549 -0
- package/dist/utils.js.map +1 -0
- package/dist/web/chunk-2AJCHB7P.js +1 -0
- package/dist/web/chunk-2CPLUFCH.js +2 -0
- package/dist/web/chunk-2GBEK2GM.js +1 -0
- package/dist/web/chunk-2I7L37NS.js +1 -0
- package/dist/web/chunk-2NAWAJB5.js +1 -0
- package/dist/web/chunk-2OJBIPE4.js +1 -0
- package/dist/web/chunk-2YUJNZ2Y.js +6 -0
- package/dist/web/chunk-3E2WB6D5.js +1 -0
- package/dist/web/chunk-3EBFYSCH.js +2 -0
- package/dist/web/chunk-3QCQ4BXS.js +1 -0
- package/dist/web/chunk-42XVAQ6I.js +1 -0
- package/dist/web/chunk-45QHGCB4.js +17 -0
- package/dist/web/chunk-4IMMPEYM.js +1 -0
- package/dist/web/chunk-4TJQJPCZ.js +1 -0
- package/dist/web/chunk-4WZIHTPC.js +1 -0
- package/dist/web/chunk-4YVSYOSD.js +1 -0
- package/dist/web/chunk-5BQIOYKW.js +1 -0
- package/dist/web/chunk-5HGWHUJA.js +1 -0
- package/dist/web/chunk-5Y244R4G.js +1 -0
- package/dist/web/chunk-6RRDPT5Z.js +1 -0
- package/dist/web/chunk-6VKB2ZWM.js +1 -0
- package/dist/web/chunk-7DMFVTU4.js +1 -0
- package/dist/web/chunk-7RNS77UP.js +1 -0
- package/dist/web/chunk-7SMPKVEP.js +1 -0
- package/dist/web/chunk-A5R3MJMO.js +1 -0
- package/dist/web/chunk-ASZ77FMZ.js +1 -0
- package/dist/web/chunk-AZJVTPLU.js +1 -0
- package/dist/web/chunk-B3YPFY6A.js +1 -0
- package/dist/web/chunk-BLBRMCN2.js +1 -0
- package/dist/web/chunk-BMIAXD2V.js +2 -0
- package/dist/web/chunk-BUXWEHIY.js +1 -0
- package/dist/web/chunk-BYZFQSM6.js +1 -0
- package/dist/web/chunk-D5OCNEJA.js +2 -0
- package/dist/web/chunk-DLQPZWSI.css +1 -0
- package/dist/web/chunk-DTRN7FZR.js +1 -0
- package/dist/web/chunk-DYRFLPJA.js +1 -0
- package/dist/web/chunk-E3J3CXR5.js +1 -0
- package/dist/web/chunk-E44X4RH2.js +1 -0
- package/dist/web/chunk-E73OX2P7.js +1 -0
- package/dist/web/chunk-EAXRKDLV.js +1 -0
- package/dist/web/chunk-EBKKDHYI.js +1 -0
- package/dist/web/chunk-EE7V7Q5P.js +1 -0
- package/dist/web/chunk-EKY2FUHU.js +1 -0
- package/dist/web/chunk-EMGMOEVR.js +1 -0
- package/dist/web/chunk-EP6XOPXH.js +1 -0
- package/dist/web/chunk-ESGDLJOJ.js +1 -0
- package/dist/web/chunk-ETJG7NCY.js +1 -0
- package/dist/web/chunk-EUUEFEDI.js +1 -0
- package/dist/web/chunk-FGNZDHTL.js +11 -0
- package/dist/web/chunk-FHZHD2ZG.js +1 -0
- package/dist/web/chunk-FIJW2UNJ.js +1 -0
- package/dist/web/chunk-FMV5PXRC.js +5 -0
- package/dist/web/chunk-G7VZT5KB.js +3 -0
- package/dist/web/chunk-GR72OOCN.js +1 -0
- package/dist/web/chunk-GRZYXPSO.js +7 -0
- package/dist/web/chunk-GWPVKJIY.js +1 -0
- package/dist/web/chunk-GYGPS3AN.js +1 -0
- package/dist/web/chunk-H7AF7YS4.js +1 -0
- package/dist/web/chunk-HDZDQILN.js +1 -0
- package/dist/web/chunk-HMK6UO6N.js +1 -0
- package/dist/web/chunk-HZA6NEAB.js +1 -0
- package/dist/web/chunk-IHEE5NYJ.js +1 -0
- package/dist/web/chunk-ISNEBICW.js +1 -0
- package/dist/web/chunk-J2GZVLHH.js +1 -0
- package/dist/web/chunk-JTFXTIPE.js +903 -0
- package/dist/web/chunk-L37MTFSG.js +3 -0
- package/dist/web/chunk-LB6JPLX2.js +1 -0
- package/dist/web/chunk-LNSVDHCI.js +1 -0
- package/dist/web/chunk-LVGIY3SO.js +1 -0
- package/dist/web/chunk-LXLHIHEN.js +1 -0
- package/dist/web/chunk-MC4DFIHG.js +1 -0
- package/dist/web/chunk-MVOMVPYB.js +1 -0
- package/dist/web/chunk-N6SS4G6S.js +1 -0
- package/dist/web/chunk-NTBJG6SJ.js +1 -0
- package/dist/web/chunk-NUDB3Q2Y.js +3 -0
- package/dist/web/chunk-NZEZCT65.js +1 -0
- package/dist/web/chunk-OXEF5E3E.js +1 -0
- package/dist/web/chunk-PDN6QYGJ.js +4 -0
- package/dist/web/chunk-PGGJPDJG.js +1 -0
- package/dist/web/chunk-PUYSJNJR.js +1 -0
- package/dist/web/chunk-Q2RVFS45.js +1 -0
- package/dist/web/chunk-Q7L6LLAK.js +1 -0
- package/dist/web/chunk-QCMKJIWY.js +1 -0
- package/dist/web/chunk-QH6CF3M3.js +1 -0
- package/dist/web/chunk-QQ5LD7PI.js +1 -0
- package/dist/web/chunk-QR6L3KAC.js +1 -0
- package/dist/web/chunk-R2DLK4HO.js +1 -0
- package/dist/web/chunk-R5W2MDZN.js +1 -0
- package/dist/web/chunk-RD6TVPOT.js +1 -0
- package/dist/web/chunk-RKY4EJYJ.js +1 -0
- package/dist/web/chunk-RONYWVY7.js +1 -0
- package/dist/web/chunk-RXKXYF2C.js +1 -0
- package/dist/web/chunk-SBWU7JFC.js +1 -0
- package/dist/web/chunk-SEXBRGYK.js +1 -0
- package/dist/web/chunk-SHPTC4RL.js +1 -0
- package/dist/web/chunk-SUZYBYDW.js +1 -0
- package/dist/web/chunk-SWKJRNYY.js +1 -0
- package/dist/web/chunk-T66XVKGB.js +1 -0
- package/dist/web/chunk-T7AZ65JP.js +1 -0
- package/dist/web/chunk-TCZDVOHD.js +1 -0
- package/dist/web/chunk-TPTITA3V.js +1 -0
- package/dist/web/chunk-TR335633.js +1 -0
- package/dist/web/chunk-UBOZGQNK.js +1 -0
- package/dist/web/chunk-UR5KDXPX.js +1 -0
- package/dist/web/chunk-UR6O2GEH.js +1 -0
- package/dist/web/chunk-UTNMGWTP.js +1 -0
- package/dist/web/chunk-UYC52MBC.js +1 -0
- package/dist/web/chunk-VECWMHJP.js +1 -0
- package/dist/web/chunk-VUACT35R.js +3 -0
- package/dist/web/chunk-VZI7H4SZ.js +1 -0
- package/dist/web/chunk-WAI2JMZP.js +1 -0
- package/dist/web/chunk-WB6YHOD4.js +1 -0
- package/dist/web/chunk-WBT64AWV.js +1 -0
- package/dist/web/chunk-WCKHQIYN.js +1 -0
- package/dist/web/chunk-WDU3WICG.js +1 -0
- package/dist/web/chunk-WFXJIXZE.js +4 -0
- package/dist/web/chunk-WLIMNDS3.js +1 -0
- package/dist/web/chunk-WTGYRH3Z.js +298 -0
- package/dist/web/chunk-WXTCVDTP.js +1 -0
- package/dist/web/chunk-X2HTISHL.js +1 -0
- package/dist/web/chunk-XCDHWLVH.js +1 -0
- package/dist/web/chunk-Y3H6FFUZ.js +1 -0
- package/dist/web/chunk-Y4F5ULGJ.js +1 -0
- package/dist/web/chunk-YAMRN47K.js +2 -0
- package/dist/web/chunk-YEGKAAEE.js +1 -0
- package/dist/web/chunk-YM2KU57F.js +1 -0
- package/dist/web/chunk-YRERBP6T.js +1 -0
- package/dist/web/chunk-ZLV4VCDG.js +3 -0
- package/dist/web/chunk-ZTVI5KFF.js +1 -0
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon-small.svg +15 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +20 -0
- package/dist/web/index.html +145 -0
- package/dist/web/main-ESADRXN2.css +1 -0
- package/dist/web/main-R53HA54V.js +1 -0
- package/dist/web/media/codicon-LN6W7LCM.ttf +0 -0
- package/dist/web/styles-KSOPUVDA.css +1 -0
- package/dist/web/sw.js +69 -0
- package/dist/workflows/condition-evaluator.d.ts +75 -0
- package/dist/workflows/condition-evaluator.d.ts.map +1 -0
- package/dist/workflows/condition-evaluator.js +282 -0
- package/dist/workflows/condition-evaluator.js.map +1 -0
- package/dist/workflows/defaults/claude-design-implement.yaml +336 -0
- package/dist/workflows/defaults/index.d.ts +26 -0
- package/dist/workflows/defaults/index.d.ts.map +1 -0
- package/dist/workflows/defaults/index.js +94 -0
- package/dist/workflows/defaults/index.js.map +1 -0
- package/dist/workflows/defaults/spec-author.yaml +214 -0
- package/dist/workflows/defaults/spec-fix.yaml +110 -0
- package/dist/workflows/defaults/spec-implement.yaml +150 -0
- package/dist/workflows/defaults/spec-relink.yaml +81 -0
- package/dist/workflows/defaults/spec-verify.yaml +51 -0
- package/dist/workflows/discovery.d.ts +46 -0
- package/dist/workflows/discovery.d.ts.map +1 -0
- package/dist/workflows/discovery.js +193 -0
- package/dist/workflows/discovery.js.map +1 -0
- package/dist/workflows/executor.d.ts +83 -0
- package/dist/workflows/executor.d.ts.map +1 -0
- package/dist/workflows/executor.js +624 -0
- package/dist/workflows/executor.js.map +1 -0
- package/dist/workflows/runners/approval.d.ts +18 -0
- package/dist/workflows/runners/approval.d.ts.map +1 -0
- package/dist/workflows/runners/approval.js +34 -0
- package/dist/workflows/runners/approval.js.map +1 -0
- package/dist/workflows/runners/bash.d.ts +13 -0
- package/dist/workflows/runners/bash.d.ts.map +1 -0
- package/dist/workflows/runners/bash.js +143 -0
- package/dist/workflows/runners/bash.js.map +1 -0
- package/dist/workflows/runners/cancel.d.ts +10 -0
- package/dist/workflows/runners/cancel.d.ts.map +1 -0
- package/dist/workflows/runners/cancel.js +19 -0
- package/dist/workflows/runners/cancel.js.map +1 -0
- package/dist/workflows/runners/prompt.d.ts +28 -0
- package/dist/workflows/runners/prompt.d.ts.map +1 -0
- package/dist/workflows/runners/prompt.js +212 -0
- package/dist/workflows/runners/prompt.js.map +1 -0
- package/dist/workflows/runners/script.d.ts +17 -0
- package/dist/workflows/runners/script.d.ts.map +1 -0
- package/dist/workflows/runners/script.js +155 -0
- package/dist/workflows/runners/script.js.map +1 -0
- package/dist/workflows/runners/types.d.ts +51 -0
- package/dist/workflows/runners/types.d.ts.map +1 -0
- package/dist/workflows/runners/types.js +13 -0
- package/dist/workflows/runners/types.js.map +1 -0
- package/dist/workflows/schemas/workflow.d.ts +166 -0
- package/dist/workflows/schemas/workflow.d.ts.map +1 -0
- package/dist/workflows/schemas/workflow.js +437 -0
- package/dist/workflows/schemas/workflow.js.map +1 -0
- package/hooks/hooks.json +11 -0
- package/package.json +7 -3
- package/scripts/offline-install.sh +19 -6
- package/selectors.json +41 -0
- /package/commands/{cg-explore.md → ss-explore.md} +0 -0
- /package/commands/{cg-impact.md → ss-impact.md} +0 -0
- /package/commands/{cg-relink.md → ss-relink.md} +0 -0
- /package/commands/{cg-spec.md → ss-spec.md} +0 -0
- /package/commands/{cg-sync.md → ss-sync.md} +0 -0
- /package/commands/{cg-trace.md → ss-trace.md} +0 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
name: claude-design-implement
|
|
2
|
+
description: Import a Claude Design (live URL or a designer handoff bundle) — snapshot + tokens + source record — draft the spec, gate at review, write the spec — ready to hand off to /ss-implement.
|
|
3
|
+
tags: [spec, ui, claude-design, default]
|
|
4
|
+
requires: [specship, git]
|
|
5
|
+
|
|
6
|
+
# Worktree isolation: the spec draft and snapshot live in the user's
|
|
7
|
+
# working tree (not the worktree) so the artifacts survive the run,
|
|
8
|
+
# but the worktree gives the spec author a clean diff to review and
|
|
9
|
+
# means a rejected run leaves no half-written specs/<slug>.md.
|
|
10
|
+
worktree:
|
|
11
|
+
enabled: true
|
|
12
|
+
|
|
13
|
+
# Two entry shapes (provide exactly one source):
|
|
14
|
+
# - CONNECTOR_URL — a live claude.ai/design URL (the `/ss-design-implement`
|
|
15
|
+
# command). The snapshot node fetches it, preferring the `designer` MCP.
|
|
16
|
+
# - HANDOFF_DIR — a designer handoff bundle already on disk (the
|
|
17
|
+
# `/ss-design-loop` command, after the human-tasted loop + designer_handoff).
|
|
18
|
+
# The snapshot node reads files straight from the bundle — no fetch, no CDP.
|
|
19
|
+
# Optional inputs default to "" (see the CLI's declared-default handling), so a
|
|
20
|
+
# `$INPUT.X` reference to an omitted optional input resolves to "" rather than
|
|
21
|
+
# throwing — that is what lets a single snapshot node branch on whichever
|
|
22
|
+
# source was supplied.
|
|
23
|
+
inputs:
|
|
24
|
+
- name: CONNECTOR_URL
|
|
25
|
+
description: A live Claude Design URL (https://claude.ai/design/p/<id>/?file=<name>.html). Provide this OR HANDOFF_DIR.
|
|
26
|
+
required: false
|
|
27
|
+
default: ""
|
|
28
|
+
- name: HANDOFF_DIR
|
|
29
|
+
description: Path to a designer handoff bundle (artifacts/<key>/handoff-<ts>/) containing project/ + decision-record.md. Provide this OR CONNECTOR_URL.
|
|
30
|
+
required: false
|
|
31
|
+
default: ""
|
|
32
|
+
- name: CHOSEN_FILE
|
|
33
|
+
description: When importing from HANDOFF_DIR, the variant filename inside project/ to spec (e.g. "dashboard.html"). Omit if the bundle has a single obvious file.
|
|
34
|
+
required: false
|
|
35
|
+
default: ""
|
|
36
|
+
- name: FILE_LABEL
|
|
37
|
+
description: Human label for the imported file (e.g. "Data Flow")
|
|
38
|
+
required: true
|
|
39
|
+
- name: SLUG
|
|
40
|
+
description: Kebab-case directory name under specs/ (e.g. "data-flow")
|
|
41
|
+
required: true
|
|
42
|
+
- name: OWNER
|
|
43
|
+
description: Spec owner — used in frontmatter when set
|
|
44
|
+
required: false
|
|
45
|
+
default: ""
|
|
46
|
+
- name: PRIORITY
|
|
47
|
+
description: high / medium / low — used in frontmatter when set
|
|
48
|
+
required: false
|
|
49
|
+
default: ""
|
|
50
|
+
|
|
51
|
+
systemPromptAppend: |
|
|
52
|
+
You are implementing a Claude Design import for SpecShip.
|
|
53
|
+
|
|
54
|
+
The fidelity principle: never paraphrase or summarise design content
|
|
55
|
+
when capturing it. The snapshot HTML and tokens.css are the
|
|
56
|
+
zero-loss reference layer; the spec captures contract only (behaviour,
|
|
57
|
+
accessibility, responsive, interaction states, data shape).
|
|
58
|
+
|
|
59
|
+
There are two import shapes — exactly one source input is non-empty:
|
|
60
|
+
- HANDOFF_DIR set → read the design files straight off disk from the
|
|
61
|
+
designer handoff bundle. No network, no CDP, no MCP fetch.
|
|
62
|
+
- CONNECTOR_URL set → pull the live design. Prefer the `designer`
|
|
63
|
+
MCP (it reads the real rendered HTML over CDP); a plain fetch of a
|
|
64
|
+
claude.ai/design URL returns only a ~1 KB loader shell.
|
|
65
|
+
|
|
66
|
+
Either way: save the source byte-for-byte to specs/$INPUT.SLUG/snapshot.html.
|
|
67
|
+
Never edit the snapshot during this workflow.
|
|
68
|
+
|
|
69
|
+
nodes:
|
|
70
|
+
- id: snapshot
|
|
71
|
+
kind: prompt
|
|
72
|
+
output_type: snapshot_summary
|
|
73
|
+
allowed_tools:
|
|
74
|
+
- Read
|
|
75
|
+
- Write
|
|
76
|
+
- Bash
|
|
77
|
+
- mcp__specship__specship_explore
|
|
78
|
+
- mcp__specship__specship_search
|
|
79
|
+
- mcp__specship__designer_snapshot
|
|
80
|
+
- mcp__specship__designer_handoff
|
|
81
|
+
prompt: |
|
|
82
|
+
File label: $INPUT.FILE_LABEL
|
|
83
|
+
Slug: $INPUT.SLUG
|
|
84
|
+
Handoff dir: $INPUT.HANDOFF_DIR
|
|
85
|
+
Chosen file: $INPUT.CHOSEN_FILE
|
|
86
|
+
Source URL: $INPUT.CONNECTOR_URL
|
|
87
|
+
|
|
88
|
+
Goal: snapshot the Claude Design source into specs/$INPUT.SLUG/
|
|
89
|
+
so the rest of the workflow has a zero-loss reference layer.
|
|
90
|
+
|
|
91
|
+
Exactly one of "Handoff dir" or "Source URL" above is non-empty.
|
|
92
|
+
If BOTH are empty, stop and report the error — there is nothing to
|
|
93
|
+
import. Pick the branch by which one is set.
|
|
94
|
+
|
|
95
|
+
1. Create the directory `specs/$INPUT.SLUG/` if it doesn't exist.
|
|
96
|
+
|
|
97
|
+
── BRANCH A — Handoff dir is set (preferred; reads disk, no fetch) ──
|
|
98
|
+
|
|
99
|
+
A1. Locate the chosen design file inside the bundle:
|
|
100
|
+
- If "Chosen file" is set, use `$INPUT.HANDOFF_DIR/project/$INPUT.CHOSEN_FILE`.
|
|
101
|
+
- Else list `$INPUT.HANDOFF_DIR/project/`: if there is exactly one
|
|
102
|
+
top-level `.html`, use it; if several, STOP and report the
|
|
103
|
+
candidate filenames, asking the caller to re-run with CHOSEN_FILE.
|
|
104
|
+
A2. Copy that file BYTE-FOR-BYTE to `specs/$INPUT.SLUG/snapshot.html`
|
|
105
|
+
(use `cp`, do not re-render). Copy any CSS / JS / asset files it
|
|
106
|
+
references from `project/` alongside it.
|
|
107
|
+
A3. Write `specs/$INPUT.SLUG/source.md` as the import audit record,
|
|
108
|
+
then APPEND the bundle's decision record verbatim — it is the
|
|
109
|
+
richest provenance you have (every prompt + reply + the human's
|
|
110
|
+
final reaction):
|
|
111
|
+
|
|
112
|
+
```markdown
|
|
113
|
+
# $INPUT.FILE_LABEL — Claude Design import (handoff bundle)
|
|
114
|
+
|
|
115
|
+
**Imported:** <today's date in YYYY-MM-DD>
|
|
116
|
+
**Handoff bundle:** $INPUT.HANDOFF_DIR
|
|
117
|
+
**Chosen file:** <the file you copied>
|
|
118
|
+
|
|
119
|
+
**Snapshot:** snapshot.html (byte-for-byte capture)
|
|
120
|
+
**Tokens:** tokens.css (extracted CSS custom properties)
|
|
121
|
+
|
|
122
|
+
## Design decision record (verbatim)
|
|
123
|
+
|
|
124
|
+
<full contents of $INPUT.HANDOFF_DIR/decision-record.md, copied in
|
|
125
|
+
unchanged — if that file is missing, say so here>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
── BRANCH B — Source URL is set (live fetch) ──
|
|
129
|
+
|
|
130
|
+
B1. Fetch the design content from $INPUT.CONNECTOR_URL. Try in order:
|
|
131
|
+
a. The `designer` MCP — `mcp__specship__designer_snapshot`
|
|
132
|
+
(reads the real rendered HTML over CDP from inside the
|
|
133
|
+
cross-origin preview iframe). This is the only path that
|
|
134
|
+
reliably returns the real design for a claude.ai/design URL.
|
|
135
|
+
b. Any other Claude Design MCP connector tool in this session
|
|
136
|
+
(look for `mcp__*design*`), or the `figma-implement-design`
|
|
137
|
+
/ `figma-use` skill if loaded.
|
|
138
|
+
c. A direct `curl` of the URL, as a last resort (warning: for
|
|
139
|
+
claude.ai/design this usually returns only a loader shell).
|
|
140
|
+
Save the FULL rendered HTML byte-for-byte to
|
|
141
|
+
`specs/$INPUT.SLUG/snapshot.html`. Do NOT filter, summarise, or
|
|
142
|
+
re-format. Save any linked CSS / asset files alongside.
|
|
143
|
+
B2. Write `specs/$INPUT.SLUG/source.md` with the import audit record:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
# $INPUT.FILE_LABEL — Claude Design import
|
|
147
|
+
|
|
148
|
+
**Imported:** <today's date in YYYY-MM-DD>
|
|
149
|
+
**Connector URL:** $INPUT.CONNECTOR_URL
|
|
150
|
+
**Project ID:** <extracted from the URL — the segment after /p/>
|
|
151
|
+
**File:** $INPUT.FILE_LABEL
|
|
152
|
+
|
|
153
|
+
**Snapshot:** snapshot.html (byte-for-byte capture)
|
|
154
|
+
**Tokens:** tokens.css (extracted CSS custom properties)
|
|
155
|
+
|
|
156
|
+
**Original prompt:**
|
|
157
|
+
> Import this Claude Design project: $INPUT.CONNECTOR_URL
|
|
158
|
+
> Implement: $INPUT.FILE_LABEL
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
── BOTH BRANCHES ──
|
|
162
|
+
|
|
163
|
+
4. Extract CSS custom properties + literal token-like values
|
|
164
|
+
(colors, spacing, font sizes, radii, transitions) from the
|
|
165
|
+
snapshot to `specs/$INPUT.SLUG/tokens.css`. Use
|
|
166
|
+
`specship_explore` first to find the project's existing token
|
|
167
|
+
system — if a value in the snapshot matches an existing
|
|
168
|
+
project token, map it by name instead of duplicating.
|
|
169
|
+
|
|
170
|
+
Output: a ≤250-word summary covering:
|
|
171
|
+
- Which branch ran and the file captured.
|
|
172
|
+
- Snapshot structure (top-level layout, key components).
|
|
173
|
+
- Token mapping (which match existing project tokens, which are
|
|
174
|
+
new and added to tokens.css).
|
|
175
|
+
- Any visible interaction or state cues in the CSS (`:hover`,
|
|
176
|
+
`:focus`, `:disabled`, `[aria-*]` selectors) the spec
|
|
177
|
+
author should be aware of.
|
|
178
|
+
- For Branch A: note that source.md carries the verbatim decision
|
|
179
|
+
record — the draft step should mine it for stated behaviour.
|
|
180
|
+
|
|
181
|
+
- id: draft_spec
|
|
182
|
+
kind: prompt
|
|
183
|
+
depends_on: [snapshot]
|
|
184
|
+
output_type: spec_markdown
|
|
185
|
+
allowed_tools:
|
|
186
|
+
- Read
|
|
187
|
+
- mcp__specship__specship_explore
|
|
188
|
+
- mcp__specship__specship_search
|
|
189
|
+
- mcp__specship__specship_node
|
|
190
|
+
- mcp__specship__specship_spec
|
|
191
|
+
prompt: |
|
|
192
|
+
Use the spec-author skill (~/.claude/skills/spec-author/SKILL.md
|
|
193
|
+
and its references/) to draft a SpecShip-compatible spec for the
|
|
194
|
+
Claude Design import. Inputs available on disk:
|
|
195
|
+
|
|
196
|
+
- specs/$INPUT.SLUG/snapshot.html (visual + structural source)
|
|
197
|
+
- specs/$INPUT.SLUG/tokens.css (design tokens)
|
|
198
|
+
- specs/$INPUT.SLUG/source.md (audit record)
|
|
199
|
+
|
|
200
|
+
Spec scope: $INPUT.FILE_LABEL component(s).
|
|
201
|
+
Optional inputs: owner=$INPUT.OWNER priority=$INPUT.PRIORITY
|
|
202
|
+
(an empty value means "not provided" — use "[needs review]").
|
|
203
|
+
|
|
204
|
+
If `source.md` contains a "Design decision record (verbatim)"
|
|
205
|
+
section (a handoff-bundle import), READ IT FIRST and mine it for
|
|
206
|
+
contract: interaction states, failure modes, data shapes, and the
|
|
207
|
+
human's stated intent are often spelled out in that transcript.
|
|
208
|
+
Prefer what the record states over guessing; reserve [needs review]
|
|
209
|
+
for items genuinely absent from both the snapshot and the record.
|
|
210
|
+
|
|
211
|
+
Cover, as separate REQs:
|
|
212
|
+
- Behavioural contract (what the component renders, given what data).
|
|
213
|
+
- Each visible state (default, hover, focused, pressed, disabled,
|
|
214
|
+
loading, error, empty) — derive from the CSS, gap-fill the rest.
|
|
215
|
+
- Accessibility (keyboard nav, ARIA roles, focus order, contrast,
|
|
216
|
+
screen-reader behaviour).
|
|
217
|
+
- Responsive behaviour (breakpoints by name, not pixels).
|
|
218
|
+
- Data shape + failure-mode contracts.
|
|
219
|
+
- Performance contract (initial render budget, interaction
|
|
220
|
+
latency, if applicable).
|
|
221
|
+
|
|
222
|
+
DO NOT put exact hex colors, pixel values, font names, or animation
|
|
223
|
+
durations in the spec. Reference design tokens by name
|
|
224
|
+
(`MUST use the --error color token`). The values themselves live
|
|
225
|
+
in tokens.css.
|
|
226
|
+
|
|
227
|
+
Embed the import-source record in the spec's frontmatter so the
|
|
228
|
+
spec carries its provenance:
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
---
|
|
232
|
+
id: <SLUG-DOC>
|
|
233
|
+
title: <FILE_LABEL>
|
|
234
|
+
owner: <OWNER or "[needs review]">
|
|
235
|
+
priority: <PRIORITY or "[needs review]">
|
|
236
|
+
source: specs/<SLUG>/source.md
|
|
237
|
+
snapshot: specs/<SLUG>/snapshot.html
|
|
238
|
+
tokens: specs/<SLUG>/tokens.css
|
|
239
|
+
---
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Output: the full Markdown body of the proposed spec
|
|
243
|
+
(with frontmatter, embedded `<!-- id: -->` markers, RFC 2119
|
|
244
|
+
keywords, acceptance bullets with .A1/.A2 IDs). DO NOT write
|
|
245
|
+
it to disk yet — the next node is a review gate.
|
|
246
|
+
|
|
247
|
+
- id: gap_review
|
|
248
|
+
kind: approval
|
|
249
|
+
depends_on: [draft_spec]
|
|
250
|
+
message: |
|
|
251
|
+
Spec draft ready for $INPUT.FILE_LABEL.
|
|
252
|
+
|
|
253
|
+
Walk the [needs review] markers and gap-fill questions, then
|
|
254
|
+
approve to write the file. Reject with feedback to revise.
|
|
255
|
+
|
|
256
|
+
─────── DRAFT ───────
|
|
257
|
+
$draft_spec.output
|
|
258
|
+
capture_response: true
|
|
259
|
+
on_reject:
|
|
260
|
+
prompt: |
|
|
261
|
+
The draft was rejected with this feedback. Revise the spec
|
|
262
|
+
per the feedback; keep ALL existing REQ IDs stable so any
|
|
263
|
+
downstream tracking survives the rewrite.
|
|
264
|
+
|
|
265
|
+
Feedback:
|
|
266
|
+
$gap_review.output
|
|
267
|
+
|
|
268
|
+
Current draft:
|
|
269
|
+
$draft_spec.output
|
|
270
|
+
|
|
271
|
+
Output the revised draft.
|
|
272
|
+
max_attempts: 3
|
|
273
|
+
|
|
274
|
+
- id: write_spec
|
|
275
|
+
kind: prompt
|
|
276
|
+
depends_on: [gap_review]
|
|
277
|
+
output_type: file_path
|
|
278
|
+
allowed_tools:
|
|
279
|
+
- Write
|
|
280
|
+
- Read
|
|
281
|
+
- Bash
|
|
282
|
+
prompt: |
|
|
283
|
+
Write the approved spec to `specs/$INPUT.SLUG.md` using the Write
|
|
284
|
+
tool. The spec content is the DRAFT below; the reviewer's gate
|
|
285
|
+
response carries the gap-fill answers / edits to fold in.
|
|
286
|
+
|
|
287
|
+
APPROVED DRAFT (this is the spec to write):
|
|
288
|
+
$draft_spec.output
|
|
289
|
+
|
|
290
|
+
REVIEWER GATE RESPONSE (gap-fill answers / edits — apply these,
|
|
291
|
+
resolving any `[needs review]` markers the reviewer answered; if it
|
|
292
|
+
is just "approved" with no substantive content, write the draft as
|
|
293
|
+
is):
|
|
294
|
+
$gap_review.output
|
|
295
|
+
|
|
296
|
+
Rules:
|
|
297
|
+
- Write the full spec Markdown (frontmatter + REQ bodies +
|
|
298
|
+
acceptance bullets), NOT the reviewer's comment verbatim.
|
|
299
|
+
- Resolve `[needs review]` markers the reviewer answered; leave
|
|
300
|
+
any they didn't as `[needs review]`.
|
|
301
|
+
- Keep ALL existing REQ IDs stable.
|
|
302
|
+
- If `specs/$INPUT.SLUG.md` already exists (re-importing an
|
|
303
|
+
iteration), APPEND new requirements instead of overwriting and
|
|
304
|
+
preserve existing REQ IDs. Tell the user explicitly what you did.
|
|
305
|
+
|
|
306
|
+
Then run:
|
|
307
|
+
specship sync
|
|
308
|
+
|
|
309
|
+
Output: the relative path of the file written + the first REQ
|
|
310
|
+
ID (e.g. "REQ-DATA-FLOW-001") so the next step can hand it to
|
|
311
|
+
/ss-implement.
|
|
312
|
+
|
|
313
|
+
- id: handoff
|
|
314
|
+
kind: prompt
|
|
315
|
+
depends_on: [write_spec]
|
|
316
|
+
output_type: handoff_message
|
|
317
|
+
allowed_tools:
|
|
318
|
+
- Read
|
|
319
|
+
prompt: |
|
|
320
|
+
The spec is now indexed. Output a short hand-off message for the
|
|
321
|
+
user with EXACTLY these elements:
|
|
322
|
+
|
|
323
|
+
1. The path of the spec file: `specs/$INPUT.SLUG.md`.
|
|
324
|
+
2. The full list of REQ IDs the spec defines, one per line.
|
|
325
|
+
3. The reference files the implementation phase should read:
|
|
326
|
+
- specs/$INPUT.SLUG/snapshot.html
|
|
327
|
+
- specs/$INPUT.SLUG/tokens.css
|
|
328
|
+
- specs/$INPUT.SLUG/source.md
|
|
329
|
+
4. The exact next command:
|
|
330
|
+
/ss-implement <first REQ ID>
|
|
331
|
+
5. A one-line reminder that the implementation step should
|
|
332
|
+
load the snapshot for visual fidelity — the spec covers
|
|
333
|
+
contract only.
|
|
334
|
+
|
|
335
|
+
Keep the message ≤200 words. The user is about to switch from
|
|
336
|
+
this workflow to the implement workflow; this is the bridge.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled default workflows.
|
|
3
|
+
*
|
|
4
|
+
* Workflow YAMLs are stored as `.yaml` files in this directory and
|
|
5
|
+
* compile-time embedded by reading them at build time. We don't use a
|
|
6
|
+
* code-generator (matches the rest of the codebase that avoids generated
|
|
7
|
+
* files); instead, the build's `copy-assets` script copies the .yaml
|
|
8
|
+
* files into `dist/workflows/defaults/`, and this module reads them at
|
|
9
|
+
* import time from `__dirname`.
|
|
10
|
+
*
|
|
11
|
+
* Bundled workflows (v1):
|
|
12
|
+
* - spec-implement.yaml — implement an unimplemented spec
|
|
13
|
+
* - spec-fix.yaml — fix a drifted / broken link
|
|
14
|
+
* - spec-verify.yaml — run verification across `implemented` links
|
|
15
|
+
* - spec-relink.yaml — re-attach an orphaned link
|
|
16
|
+
*
|
|
17
|
+
* See workflow-discovery.ts for the three-tier precedence model.
|
|
18
|
+
*/
|
|
19
|
+
export interface BundledWorkflow {
|
|
20
|
+
/** Filename stem (no .yaml extension). */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Raw YAML source. */
|
|
23
|
+
yaml: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const bundledDefaults: BundledWorkflow[];
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflows/defaults/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AASD,eAAO,MAAM,eAAe,EAAE,eAAe,EAAmB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bundled default workflows.
|
|
4
|
+
*
|
|
5
|
+
* Workflow YAMLs are stored as `.yaml` files in this directory and
|
|
6
|
+
* compile-time embedded by reading them at build time. We don't use a
|
|
7
|
+
* code-generator (matches the rest of the codebase that avoids generated
|
|
8
|
+
* files); instead, the build's `copy-assets` script copies the .yaml
|
|
9
|
+
* files into `dist/workflows/defaults/`, and this module reads them at
|
|
10
|
+
* import time from `__dirname`.
|
|
11
|
+
*
|
|
12
|
+
* Bundled workflows (v1):
|
|
13
|
+
* - spec-implement.yaml — implement an unimplemented spec
|
|
14
|
+
* - spec-fix.yaml — fix a drifted / broken link
|
|
15
|
+
* - spec-verify.yaml — run verification across `implemented` links
|
|
16
|
+
* - spec-relink.yaml — re-attach an orphaned link
|
|
17
|
+
*
|
|
18
|
+
* See workflow-discovery.ts for the three-tier precedence model.
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.bundledDefaults = void 0;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
/**
|
|
58
|
+
* Lazy-loaded bundled defaults from `<dist|src>/workflows/defaults/*.yaml`.
|
|
59
|
+
* Populated on first read. Always re-reads from disk in tests where the
|
|
60
|
+
* file set may have been mutated; production callers call once at startup.
|
|
61
|
+
*/
|
|
62
|
+
let cached = null;
|
|
63
|
+
exports.bundledDefaults = loadDefaults();
|
|
64
|
+
function loadDefaults() {
|
|
65
|
+
if (cached)
|
|
66
|
+
return cached;
|
|
67
|
+
const out = [];
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = fs.readdirSync(__dirname, { withFileTypes: true });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
cached = [];
|
|
74
|
+
return cached;
|
|
75
|
+
}
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
if (!entry.isFile())
|
|
78
|
+
continue;
|
|
79
|
+
const lower = entry.name.toLowerCase();
|
|
80
|
+
if (!lower.endsWith('.yaml') && !lower.endsWith('.yml'))
|
|
81
|
+
continue;
|
|
82
|
+
try {
|
|
83
|
+
const yaml = fs.readFileSync(path.join(__dirname, entry.name), 'utf-8');
|
|
84
|
+
const stem = entry.name.replace(/\.(ya?ml)$/i, '');
|
|
85
|
+
out.push({ name: stem, yaml });
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Skip unreadable files; discovery will surface the gap on next load.
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
cached = out;
|
|
92
|
+
return cached;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workflows/defaults/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAS7B;;;;GAIG;AACH,IAAI,MAAM,GAA6B,IAAI,CAAC;AAE/B,QAAA,eAAe,GAAsB,YAAY,EAAE,CAAC;AAEjE,SAAS,YAAY;IACnB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAS;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAClE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACnD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,CAAC;IACb,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
name: spec-author
|
|
2
|
+
description: Author a new spec. Draft → gap-fill review → quality review → final approval → write file.
|
|
3
|
+
tags: [spec, default]
|
|
4
|
+
requires: [specship, git]
|
|
5
|
+
|
|
6
|
+
# Worktree isolation isn't strictly needed for spec authoring (no code
|
|
7
|
+
# changes) — but enabling it keeps the artifact directory under the same
|
|
8
|
+
# umbrella the other spec workflows use, and a future expansion that adds
|
|
9
|
+
# example-code touches stays safe.
|
|
10
|
+
worktree:
|
|
11
|
+
enabled: true
|
|
12
|
+
|
|
13
|
+
inputs:
|
|
14
|
+
- name: DESCRIPTION
|
|
15
|
+
description: One-line description of the feature you want to spec
|
|
16
|
+
required: true
|
|
17
|
+
- name: PARENT_DOC
|
|
18
|
+
description: Optional spec ID of an existing doc to attach the new requirements under
|
|
19
|
+
required: false
|
|
20
|
+
- name: OWNER
|
|
21
|
+
description: Owner team or person (e.g. "security", "payments-team")
|
|
22
|
+
required: false
|
|
23
|
+
- name: PRIORITY
|
|
24
|
+
description: high / medium / low
|
|
25
|
+
required: false
|
|
26
|
+
|
|
27
|
+
systemPromptAppend: |
|
|
28
|
+
You are authoring a SpecShip-compatible Markdown spec. Use the
|
|
29
|
+
spec-author skill loop and references throughout this workflow.
|
|
30
|
+
The output of every node should be markdown that is ready for the
|
|
31
|
+
next stage — do NOT write the file until the `write_file` node.
|
|
32
|
+
|
|
33
|
+
nodes:
|
|
34
|
+
- id: ground
|
|
35
|
+
kind: prompt
|
|
36
|
+
output_type: code_grounding
|
|
37
|
+
allowed_tools:
|
|
38
|
+
- mcp__specship__specship_explore
|
|
39
|
+
- mcp__specship__specship_search
|
|
40
|
+
- mcp__specship__specship_files
|
|
41
|
+
- Read
|
|
42
|
+
prompt: |
|
|
43
|
+
Feature: $INPUT.DESCRIPTION
|
|
44
|
+
|
|
45
|
+
Walk the codebase to find where this feature would live:
|
|
46
|
+
|
|
47
|
+
1. Use specship_explore on terms drawn from the description to
|
|
48
|
+
surface relevant existing symbols.
|
|
49
|
+
2. Note any existing conventions, similar features, or shared
|
|
50
|
+
primitives the new spec should align with.
|
|
51
|
+
3. List candidate file paths + qualified symbol names that the
|
|
52
|
+
new implementation might touch — these become the `implementations:`
|
|
53
|
+
block of the spec.
|
|
54
|
+
|
|
55
|
+
If this is greenfield (no relevant existing code), say so explicitly
|
|
56
|
+
and propose a target directory under src/ where the implementation
|
|
57
|
+
will live.
|
|
58
|
+
|
|
59
|
+
Output: a ≤300-word grounding report — paths, conventions, and
|
|
60
|
+
candidate symbols. Do NOT write the spec yet.
|
|
61
|
+
|
|
62
|
+
- id: draft
|
|
63
|
+
kind: prompt
|
|
64
|
+
depends_on: [ground]
|
|
65
|
+
output_type: spec_draft
|
|
66
|
+
allowed_tools:
|
|
67
|
+
- mcp__specship__specship_spec
|
|
68
|
+
- mcp__specship__specship_explore
|
|
69
|
+
- mcp__specship__specship_node
|
|
70
|
+
- Read
|
|
71
|
+
prompt: |
|
|
72
|
+
Feature: $INPUT.DESCRIPTION
|
|
73
|
+
Optional parent doc: $INPUT.PARENT_DOC
|
|
74
|
+
Optional owner: $INPUT.OWNER
|
|
75
|
+
Optional priority: $INPUT.PRIORITY
|
|
76
|
+
|
|
77
|
+
Code grounding:
|
|
78
|
+
$ground.output
|
|
79
|
+
|
|
80
|
+
Produce a complete first-draft Markdown spec following the spec-author
|
|
81
|
+
skill's `references/format.md`:
|
|
82
|
+
|
|
83
|
+
- YAML frontmatter with id/title/owner/priority (use the inputs if
|
|
84
|
+
provided; mark as `[needs review]` if not).
|
|
85
|
+
- Embedded `<!-- id: -->` markers above every heading.
|
|
86
|
+
- RFC 2119 keyword (MUST / SHOULD / MAY) in each requirement title.
|
|
87
|
+
- One concern per requirement.
|
|
88
|
+
- `## Acceptance` section with bulleted criteria, each carrying its
|
|
89
|
+
own `.A<N>` ID. Cover both happy path and failure path.
|
|
90
|
+
- Optional `implementations:` block, populated from the grounding
|
|
91
|
+
report (or empty for greenfield).
|
|
92
|
+
- Wherever the description doesn't tell you something, insert a
|
|
93
|
+
`[needs user confirmation]` marker — DO NOT invent.
|
|
94
|
+
|
|
95
|
+
Output: the full spec markdown, ready for the gap-fill review.
|
|
96
|
+
|
|
97
|
+
- id: gap_review
|
|
98
|
+
kind: approval
|
|
99
|
+
depends_on: [draft]
|
|
100
|
+
message: |
|
|
101
|
+
Draft is ready. The gap-fill questions below identify areas the
|
|
102
|
+
description didn't cover. Approve with answers (e.g. "owner: security,
|
|
103
|
+
TTL: 1h, on non-existent email: 200 OK"), or reject with feedback to
|
|
104
|
+
revise.
|
|
105
|
+
|
|
106
|
+
Draft:
|
|
107
|
+
$draft.output
|
|
108
|
+
|
|
109
|
+
Gap-fill questions for THIS draft — walk references/gap-questions.md
|
|
110
|
+
and surface only the unanswered ones (max 5):
|
|
111
|
+
[the agent fills these in based on the draft above]
|
|
112
|
+
capture_response: true
|
|
113
|
+
on_reject:
|
|
114
|
+
prompt: |
|
|
115
|
+
The draft was rejected with this feedback. Revise the draft to
|
|
116
|
+
address it. Keep all existing IDs stable so any pre-existing links
|
|
117
|
+
survive.
|
|
118
|
+
|
|
119
|
+
Feedback:
|
|
120
|
+
$gap_review.output
|
|
121
|
+
max_attempts: 3
|
|
122
|
+
|
|
123
|
+
- id: incorporate
|
|
124
|
+
kind: prompt
|
|
125
|
+
depends_on: [gap_review]
|
|
126
|
+
output_type: spec_draft
|
|
127
|
+
allowed_tools:
|
|
128
|
+
- Read
|
|
129
|
+
prompt: |
|
|
130
|
+
Apply the gap-fill answers to the draft. Replace `[needs user
|
|
131
|
+
confirmation]` markers with the user's answers where given; leave
|
|
132
|
+
others as `[needs review]` if they explicitly skipped.
|
|
133
|
+
|
|
134
|
+
Draft:
|
|
135
|
+
$draft.output
|
|
136
|
+
|
|
137
|
+
Answers:
|
|
138
|
+
$gap_review.output
|
|
139
|
+
|
|
140
|
+
Output: the updated spec markdown.
|
|
141
|
+
|
|
142
|
+
- id: quality_review
|
|
143
|
+
kind: prompt
|
|
144
|
+
depends_on: [incorporate]
|
|
145
|
+
output_type: review_findings
|
|
146
|
+
allowed_tools:
|
|
147
|
+
- mcp__specship__specship_explore
|
|
148
|
+
- mcp__specship__specship_node
|
|
149
|
+
- mcp__specship__specship_search
|
|
150
|
+
- Read
|
|
151
|
+
prompt: |
|
|
152
|
+
Run the spec-author skill's `references/review-checklist.md` against
|
|
153
|
+
this draft and produce a structured findings list.
|
|
154
|
+
|
|
155
|
+
Updated draft:
|
|
156
|
+
$incorporate.output
|
|
157
|
+
|
|
158
|
+
Group findings into STRUCTURAL (blocks the file write), QUALITY (block
|
|
159
|
+
on critical, warn on minor), HYGIENE (warn only). For each, give:
|
|
160
|
+
line number, what's wrong, suggested fix. Don't be polite — sharp
|
|
161
|
+
signal is more useful than soft language.
|
|
162
|
+
|
|
163
|
+
If any STRUCTURAL findings exist, propose a corrected version of the
|
|
164
|
+
affected sections inline.
|
|
165
|
+
|
|
166
|
+
- id: finalize
|
|
167
|
+
kind: approval
|
|
168
|
+
depends_on: [quality_review]
|
|
169
|
+
message: |
|
|
170
|
+
Quality review complete. Approve to write the spec file, or reject to
|
|
171
|
+
revise further.
|
|
172
|
+
|
|
173
|
+
Review:
|
|
174
|
+
$quality_review.output
|
|
175
|
+
|
|
176
|
+
Final draft:
|
|
177
|
+
$incorporate.output
|
|
178
|
+
capture_response: true
|
|
179
|
+
on_reject:
|
|
180
|
+
prompt: |
|
|
181
|
+
Final approval was rejected. Revise the draft per the feedback,
|
|
182
|
+
re-run the quality review pass, and produce a new draft.
|
|
183
|
+
|
|
184
|
+
Feedback:
|
|
185
|
+
$finalize.output
|
|
186
|
+
|
|
187
|
+
Current draft:
|
|
188
|
+
$incorporate.output
|
|
189
|
+
max_attempts: 2
|
|
190
|
+
|
|
191
|
+
- id: write_file
|
|
192
|
+
kind: prompt
|
|
193
|
+
depends_on: [finalize]
|
|
194
|
+
output_type: file_path
|
|
195
|
+
allowed_tools:
|
|
196
|
+
- Write
|
|
197
|
+
- Read
|
|
198
|
+
- Bash
|
|
199
|
+
prompt: |
|
|
200
|
+
Write the approved spec to disk.
|
|
201
|
+
|
|
202
|
+
Final draft:
|
|
203
|
+
$incorporate.output
|
|
204
|
+
|
|
205
|
+
Use the `Write` tool to create `specs/<slug>.md` at the project root,
|
|
206
|
+
where `<slug>` is derived from the feature name (kebab-case, no date
|
|
207
|
+
prefix). If a file with that name already exists, APPEND the new
|
|
208
|
+
requirements to it (preserving any pre-existing content) instead of
|
|
209
|
+
overwriting; the user will resolve the merge in review.
|
|
210
|
+
|
|
211
|
+
After writing:
|
|
212
|
+
- Run `specship sync` to index the new spec.
|
|
213
|
+
- Output the relative path of the file written + a one-line note
|
|
214
|
+
about what to do next (typically: `/ss-implement <REQ-ID>`).
|