@selvakumaresra/specship 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/commands/ss-design-implement.md +79 -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 +2019 -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/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 +87 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +415 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/instructions-template.d.ts +18 -0
- package/dist/installer/instructions-template.d.ts.map +1 -0
- package/dist/installer/instructions-template.js +21 -0
- package/dist/installer/instructions-template.js.map +1 -0
- package/dist/installer/targets/claude.d.ts +98 -0
- package/dist/installer/targets/claude.d.ts.map +1 -0
- package/dist/installer/targets/claude.js +639 -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 +62 -0
- package/dist/installer/targets/shared.d.ts.map +1 -0
- package/dist/installer/targets/shared.js +207 -0
- package/dist/installer/targets/shared.js.map +1 -0
- package/dist/installer/targets/types.d.ts +76 -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/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 +3066 -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-2DHIGIOI.js +1 -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-2OKMB4KX.js +2 -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-3SEJX2BK.js +1 -0
- package/dist/web/chunk-42XVAQ6I.js +1 -0
- package/dist/web/chunk-4IMMPEYM.js +1 -0
- package/dist/web/chunk-4N5DWG46.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-AZJVTPLU.js +1 -0
- package/dist/web/chunk-BCZM5AXU.js +1 -0
- package/dist/web/chunk-BLBRMCN2.js +1 -0
- package/dist/web/chunk-BMIAXD2V.js +2 -0
- package/dist/web/chunk-BPECIDVO.js +1 -0
- package/dist/web/chunk-BUXWEHIY.js +1 -0
- package/dist/web/chunk-BYZFQSM6.js +1 -0
- package/dist/web/chunk-DA6SNNAF.js +1 -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-FIJW2UNJ.js +1 -0
- package/dist/web/chunk-FMV5PXRC.js +5 -0
- package/dist/web/chunk-G7VZT5KB.js +3 -0
- package/dist/web/chunk-GRZYXPSO.js +7 -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-JFYVCXK3.js +1 -0
- package/dist/web/chunk-JN6W7HCN.js +17 -0
- package/dist/web/chunk-JT7P3DEK.js +6 -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-LV4G6QFG.js +2 -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-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-RAAMPHPJ.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-TWXZK6XM.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-WDU3WICG.js +1 -0
- package/dist/web/chunk-WFXJIXZE.js +4 -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-YAWCRPHV.js +1 -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-WVI3YTDU.js +1 -0
- package/dist/web/media/codicon-LN6W7LCM.ttf +0 -0
- package/dist/web/styles-KSOPUVDA.css +1 -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 +247 -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/package.json +1 -1
- package/scripts/offline-install.sh +19 -6
- /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,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Condition evaluator + `$nodeId.output` substitution.
|
|
4
|
+
*
|
|
5
|
+
* Modeled on Archon's evaluator (packages/workflows/src/dag-executor.ts:331-372).
|
|
6
|
+
*
|
|
7
|
+
* Two responsibilities:
|
|
8
|
+
* 1. Substitute `$nodeId.output[.field]` references in a template string
|
|
9
|
+
* with the corresponding upstream node output.
|
|
10
|
+
* 2. Evaluate `when:` expressions to gate a node's execution.
|
|
11
|
+
*
|
|
12
|
+
* Design choices:
|
|
13
|
+
* - Unresolvable field references THROW `OutputRefError` (no silent drop).
|
|
14
|
+
* - Unparseable `when:` expressions FAIL CLOSED (skip the node) so an
|
|
15
|
+
* authoring mistake doesn't run a step the author didn't intend.
|
|
16
|
+
* - Large outputs (>10KB) are spilled to a file and the substitution
|
|
17
|
+
* emits a `$(cat <file>)` shell command for bash nodes (so they don't
|
|
18
|
+
* blow up the shell argv); for prompt nodes the raw text is inlined.
|
|
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.OutputRefError = void 0;
|
|
55
|
+
exports.substituteRefs = substituteRefs;
|
|
56
|
+
exports.evaluateCondition = evaluateCondition;
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
class OutputRefError extends Error {
|
|
60
|
+
ref;
|
|
61
|
+
constructor(ref, message) {
|
|
62
|
+
super(`OutputRef "${ref}": ${message}`);
|
|
63
|
+
this.ref = ref;
|
|
64
|
+
this.name = 'OutputRefError';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.OutputRefError = OutputRefError;
|
|
68
|
+
/** Pattern matching `$nodeId` or `$nodeId.output` or `$nodeId.output.field` or `$VAR`. */
|
|
69
|
+
const REF_PATTERN = /\$([A-Z_][A-Z0-9_]*|[a-zA-Z_][a-zA-Z0-9_-]*)(?:\.([a-zA-Z_][a-zA-Z0-9_]*))?(?:\.([a-zA-Z_][a-zA-Z0-9_]*))?/g;
|
|
70
|
+
const DEFAULT_SPILL_THRESHOLD = 10 * 1024;
|
|
71
|
+
/**
|
|
72
|
+
* Substitute references in a template. Returns the substituted string.
|
|
73
|
+
* Throws OutputRefError for unresolvable named-field references.
|
|
74
|
+
*
|
|
75
|
+
* `forBash`: when true and a substituted value exceeds the spill threshold,
|
|
76
|
+
* writes the value to a temp file and substitutes `$(cat <file>)` instead
|
|
77
|
+
* of the raw text — preventing shell argv overflow.
|
|
78
|
+
*/
|
|
79
|
+
function substituteRefs(template, ctx, opts = {}) {
|
|
80
|
+
const spillDir = ctx.spillDir ?? require('os').tmpdir();
|
|
81
|
+
const threshold = ctx.spillThreshold ?? DEFAULT_SPILL_THRESHOLD;
|
|
82
|
+
return template.replace(REF_PATTERN, (match, name, second, third) => {
|
|
83
|
+
// Static variables ($CONTEXT, $ARTIFACTS_DIR, $INPUT.NAME): UPPER_SNAKE name.
|
|
84
|
+
if (/^[A-Z_][A-Z0-9_]*$/.test(name)) {
|
|
85
|
+
// `$INPUT.SPEC_ID` style: name='INPUT', second='SPEC_ID'
|
|
86
|
+
if (name === 'INPUT' && second) {
|
|
87
|
+
const v = ctx.inputs?.[second];
|
|
88
|
+
if (v === undefined) {
|
|
89
|
+
throw new OutputRefError(match, `input "${second}" not provided to this workflow`);
|
|
90
|
+
}
|
|
91
|
+
return v;
|
|
92
|
+
}
|
|
93
|
+
// `$ARTIFACTS_DIR`, `$CONTEXT`, etc.
|
|
94
|
+
const v = ctx.variables?.[name];
|
|
95
|
+
if (v !== undefined)
|
|
96
|
+
return v;
|
|
97
|
+
// Fall through to node-id lookup (an UPPER_SNAKE word might be a node ID).
|
|
98
|
+
}
|
|
99
|
+
// Node-output reference. Second segment must be `output` for v1.
|
|
100
|
+
if (second !== 'output') {
|
|
101
|
+
// Bare `$nodeId` with no `.output` is treated as plain text (no substitution).
|
|
102
|
+
// This lets prompt authors include literal `$variableName` references
|
|
103
|
+
// without escaping when they're not addressing a node.
|
|
104
|
+
if (second === undefined)
|
|
105
|
+
return match;
|
|
106
|
+
throw new OutputRefError(match, `expected ".output" after node ID; got ".${second}"`);
|
|
107
|
+
}
|
|
108
|
+
const out = ctx.outputs.get(name);
|
|
109
|
+
if (!out) {
|
|
110
|
+
throw new OutputRefError(match, `node "${name}" has not produced output yet (not run, skipped, or failed)`);
|
|
111
|
+
}
|
|
112
|
+
let value;
|
|
113
|
+
if (third) {
|
|
114
|
+
// Field access: prefer structured, fall back to JSON-parsed text.
|
|
115
|
+
if (out.structured !== undefined && third in out.structured) {
|
|
116
|
+
value = out.structured[third];
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
try {
|
|
120
|
+
const parsed = JSON.parse(out.text);
|
|
121
|
+
if (parsed && typeof parsed === 'object' && third in parsed) {
|
|
122
|
+
value = parsed[third];
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw new OutputRefError(match, `field "${third}" not found in node "${name}" output`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (err instanceof OutputRefError)
|
|
130
|
+
throw err;
|
|
131
|
+
throw new OutputRefError(match, `node "${name}" output is not JSON-parseable; can't access field "${third}"`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
value = out.text;
|
|
137
|
+
}
|
|
138
|
+
const asString = typeof value === 'string' ? value : JSON.stringify(value);
|
|
139
|
+
// Spill very large values to a file for bash nodes (argv overflow).
|
|
140
|
+
if (opts.forBash && asString.length > threshold) {
|
|
141
|
+
const filename = `cg-spill-${opts.nodeId ?? 'node'}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.txt`;
|
|
142
|
+
const spillPath = path.join(spillDir, filename);
|
|
143
|
+
try {
|
|
144
|
+
fs.writeFileSync(spillPath, asString);
|
|
145
|
+
return `"$(cat ${shellEscape(spillPath)})"`;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Fall through to inline if we can't spill — better than failing.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (opts.forBash) {
|
|
152
|
+
// Single-quote-wrap for shell safety. Embedded single quotes get escaped.
|
|
153
|
+
return shellSingleQuote(asString);
|
|
154
|
+
}
|
|
155
|
+
return asString;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Evaluate a `when:` condition expression. Fail-closed: on parse error,
|
|
160
|
+
* returns false (the node skips).
|
|
161
|
+
*
|
|
162
|
+
* Grammar (subset, no parens):
|
|
163
|
+
* expr := and (`||` and)*
|
|
164
|
+
* and := cmp (`&&` cmp)*
|
|
165
|
+
* cmp := value op value
|
|
166
|
+
* op := `==` | `!=` | `<` | `>` | `<=` | `>=`
|
|
167
|
+
* value := $ref | 'string' | "string" | bare_word | number
|
|
168
|
+
*/
|
|
169
|
+
function evaluateCondition(expression, ctx) {
|
|
170
|
+
// First substitute $refs to their values (using a "raw" form — no quoting,
|
|
171
|
+
// no spilling). We do this before tokenizing so the parser sees literal
|
|
172
|
+
// values, not symbolic refs.
|
|
173
|
+
let substituted;
|
|
174
|
+
try {
|
|
175
|
+
substituted = substituteRefs(expression, ctx, { forBash: false });
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (err instanceof OutputRefError) {
|
|
179
|
+
// Unresolvable ref in a `when:` expression — fail closed.
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
throw err;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
return evalOr(substituted);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// Mini expression evaluator (no recursion through full grammar — linear scan).
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
function evalOr(expr) {
|
|
195
|
+
return splitTopLevel(expr, '||').some((sub) => evalAnd(sub.trim()));
|
|
196
|
+
}
|
|
197
|
+
function evalAnd(expr) {
|
|
198
|
+
return splitTopLevel(expr, '&&').every((sub) => evalCmp(sub.trim()));
|
|
199
|
+
}
|
|
200
|
+
function splitTopLevel(expr, sep) {
|
|
201
|
+
const out = [];
|
|
202
|
+
let depth = 0;
|
|
203
|
+
let last = 0;
|
|
204
|
+
let inSingle = false;
|
|
205
|
+
let inDouble = false;
|
|
206
|
+
for (let i = 0; i <= expr.length - sep.length; i++) {
|
|
207
|
+
const ch = expr[i];
|
|
208
|
+
if (ch === "'" && !inDouble)
|
|
209
|
+
inSingle = !inSingle;
|
|
210
|
+
else if (ch === '"' && !inSingle)
|
|
211
|
+
inDouble = !inDouble;
|
|
212
|
+
if (inSingle || inDouble)
|
|
213
|
+
continue;
|
|
214
|
+
if (ch === '(')
|
|
215
|
+
depth++;
|
|
216
|
+
else if (ch === ')')
|
|
217
|
+
depth--;
|
|
218
|
+
if (depth === 0 && expr.startsWith(sep, i)) {
|
|
219
|
+
out.push(expr.slice(last, i));
|
|
220
|
+
last = i + sep.length;
|
|
221
|
+
i += sep.length - 1;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
out.push(expr.slice(last));
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
const OP_PATTERN = /(==|!=|<=|>=|<|>)/;
|
|
228
|
+
function evalCmp(expr) {
|
|
229
|
+
const trimmed = expr.trim();
|
|
230
|
+
if (trimmed === 'true')
|
|
231
|
+
return true;
|
|
232
|
+
if (trimmed === 'false')
|
|
233
|
+
return false;
|
|
234
|
+
const match = trimmed.match(OP_PATTERN);
|
|
235
|
+
if (!match) {
|
|
236
|
+
// No operator — treat as truthy test: non-empty string is true.
|
|
237
|
+
return parseValue(trimmed).trim().length > 0;
|
|
238
|
+
}
|
|
239
|
+
const op = match[1];
|
|
240
|
+
const idx = match.index;
|
|
241
|
+
const left = parseValue(trimmed.slice(0, idx).trim());
|
|
242
|
+
const right = parseValue(trimmed.slice(idx + op.length).trim());
|
|
243
|
+
if (op === '==')
|
|
244
|
+
return left === right;
|
|
245
|
+
if (op === '!=')
|
|
246
|
+
return left !== right;
|
|
247
|
+
// Numeric comparisons require both sides to be parseable as numbers.
|
|
248
|
+
const ln = Number(left);
|
|
249
|
+
const rn = Number(right);
|
|
250
|
+
if (!Number.isFinite(ln) || !Number.isFinite(rn))
|
|
251
|
+
return false;
|
|
252
|
+
switch (op) {
|
|
253
|
+
case '<': return ln < rn;
|
|
254
|
+
case '>': return ln > rn;
|
|
255
|
+
case '<=': return ln <= rn;
|
|
256
|
+
case '>=': return ln >= rn;
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
function parseValue(s) {
|
|
261
|
+
if (s.length >= 2) {
|
|
262
|
+
const first = s[0];
|
|
263
|
+
const last = s[s.length - 1];
|
|
264
|
+
if ((first === "'" && last === "'") || (first === '"' && last === '"')) {
|
|
265
|
+
return s.slice(1, -1);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return s;
|
|
269
|
+
}
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Shell escaping helpers
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
function shellSingleQuote(s) {
|
|
274
|
+
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
275
|
+
}
|
|
276
|
+
function shellEscape(s) {
|
|
277
|
+
// Escape spaces and shell metachars for the `cat` argument.
|
|
278
|
+
if (/^[A-Za-z0-9_./@:+-]+$/.test(s))
|
|
279
|
+
return s;
|
|
280
|
+
return shellSingleQuote(s);
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=condition-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/workflows/condition-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
name: claude-design-implement
|
|
2
|
+
description: Import a Claude Design file (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
|
+
inputs:
|
|
14
|
+
- name: CONNECTOR_URL
|
|
15
|
+
description: The full Claude Design URL (https://claude.ai/design/p/<id>/?file=<name>.html)
|
|
16
|
+
required: true
|
|
17
|
+
- name: FILE_LABEL
|
|
18
|
+
description: Human label for the imported file (e.g. "Data Flow")
|
|
19
|
+
required: true
|
|
20
|
+
- name: SLUG
|
|
21
|
+
description: Kebab-case directory name under specs/ (e.g. "data-flow")
|
|
22
|
+
required: true
|
|
23
|
+
- name: OWNER
|
|
24
|
+
description: Spec owner — used in frontmatter when set
|
|
25
|
+
required: false
|
|
26
|
+
- name: PRIORITY
|
|
27
|
+
description: high / medium / low — used in frontmatter when set
|
|
28
|
+
required: false
|
|
29
|
+
|
|
30
|
+
systemPromptAppend: |
|
|
31
|
+
You are implementing a Claude Design import for SpecShip.
|
|
32
|
+
|
|
33
|
+
The fidelity principle: never paraphrase or summarise design content
|
|
34
|
+
when capturing it. The snapshot HTML and tokens.css are the
|
|
35
|
+
zero-loss reference layer; the spec captures contract only (behaviour,
|
|
36
|
+
accessibility, responsive, interaction states, data shape).
|
|
37
|
+
|
|
38
|
+
Use whichever Claude Design tooling is available (an MCP connector,
|
|
39
|
+
the figma-implement-design skill, or a direct fetch) to pull the
|
|
40
|
+
source file. Save it byte-for-byte to specs/$INPUT.SLUG/snapshot.html.
|
|
41
|
+
Never edit the snapshot during this workflow.
|
|
42
|
+
|
|
43
|
+
nodes:
|
|
44
|
+
- id: snapshot
|
|
45
|
+
kind: prompt
|
|
46
|
+
output_type: snapshot_summary
|
|
47
|
+
allowed_tools:
|
|
48
|
+
- Read
|
|
49
|
+
- Write
|
|
50
|
+
- Bash
|
|
51
|
+
- mcp__specship__specship_explore
|
|
52
|
+
- mcp__specship__specship_search
|
|
53
|
+
prompt: |
|
|
54
|
+
Source URL: $INPUT.CONNECTOR_URL
|
|
55
|
+
File label: $INPUT.FILE_LABEL
|
|
56
|
+
Slug: $INPUT.SLUG
|
|
57
|
+
|
|
58
|
+
Goal: snapshot the Claude Design source into specs/$INPUT.SLUG/
|
|
59
|
+
so the rest of the workflow has a zero-loss reference layer.
|
|
60
|
+
|
|
61
|
+
1. Create the directory `specs/$INPUT.SLUG/` if it doesn't exist.
|
|
62
|
+
|
|
63
|
+
2. Fetch the design content from $INPUT.CONNECTOR_URL. Try in
|
|
64
|
+
this order:
|
|
65
|
+
a. Any Claude Design MCP connector tool available in this
|
|
66
|
+
session (look for `mcp__*design*` or similar).
|
|
67
|
+
b. The `figma-implement-design` or `figma-use` skill if
|
|
68
|
+
loaded — Claude Design and Figma share a similar handoff
|
|
69
|
+
shape.
|
|
70
|
+
c. A direct `curl` of the URL, as a last resort.
|
|
71
|
+
|
|
72
|
+
Save the FULL rendered HTML byte-for-byte to
|
|
73
|
+
`specs/$INPUT.SLUG/snapshot.html`. Do NOT filter, summarise, or
|
|
74
|
+
re-format. If the design has linked CSS / asset files, save
|
|
75
|
+
them alongside.
|
|
76
|
+
|
|
77
|
+
3. Write `specs/$INPUT.SLUG/source.md` with the import audit
|
|
78
|
+
record:
|
|
79
|
+
|
|
80
|
+
```markdown
|
|
81
|
+
# $INPUT.FILE_LABEL — Claude Design import
|
|
82
|
+
|
|
83
|
+
**Imported:** <today's date in YYYY-MM-DD>
|
|
84
|
+
**Connector URL:** $INPUT.CONNECTOR_URL
|
|
85
|
+
**Project ID:** <extracted from the URL — the segment after /p/>
|
|
86
|
+
**File:** $INPUT.FILE_LABEL
|
|
87
|
+
|
|
88
|
+
**Snapshot:** snapshot.html (byte-for-byte capture)
|
|
89
|
+
**Tokens:** tokens.css (extracted CSS custom properties)
|
|
90
|
+
|
|
91
|
+
**Original prompt:**
|
|
92
|
+
> Import this Claude Design project using the Claude Design connector:
|
|
93
|
+
> $INPUT.CONNECTOR_URL
|
|
94
|
+
> Implement: $INPUT.FILE_LABEL
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
4. Extract CSS custom properties + literal token-like values
|
|
98
|
+
(colors, spacing, font sizes, radii, transitions) from the
|
|
99
|
+
snapshot to `specs/$INPUT.SLUG/tokens.css`. Use
|
|
100
|
+
`specship_explore` first to find the project's existing token
|
|
101
|
+
system — if a value in the snapshot matches an existing
|
|
102
|
+
project token, map it by name instead of duplicating.
|
|
103
|
+
|
|
104
|
+
Output: a ≤250-word summary covering:
|
|
105
|
+
- Snapshot structure (top-level layout, key components).
|
|
106
|
+
- Token mapping (which match existing project tokens, which are
|
|
107
|
+
new and added to tokens.css).
|
|
108
|
+
- Any visible interaction or state cues in the CSS (`:hover`,
|
|
109
|
+
`:focus`, `:disabled`, `[aria-*]` selectors) the spec
|
|
110
|
+
author should be aware of.
|
|
111
|
+
|
|
112
|
+
- id: draft_spec
|
|
113
|
+
kind: prompt
|
|
114
|
+
depends_on: [snapshot]
|
|
115
|
+
output_type: spec_markdown
|
|
116
|
+
allowed_tools:
|
|
117
|
+
- Read
|
|
118
|
+
- mcp__specship__specship_explore
|
|
119
|
+
- mcp__specship__specship_search
|
|
120
|
+
- mcp__specship__specship_node
|
|
121
|
+
- mcp__specship__specship_spec
|
|
122
|
+
prompt: |
|
|
123
|
+
Use the spec-author skill (~/.claude/skills/spec-author/SKILL.md
|
|
124
|
+
and its references/) to draft a SpecShip-compatible spec for the
|
|
125
|
+
Claude Design import. Inputs available on disk:
|
|
126
|
+
|
|
127
|
+
- specs/$INPUT.SLUG/snapshot.html (visual + structural source)
|
|
128
|
+
- specs/$INPUT.SLUG/tokens.css (design tokens)
|
|
129
|
+
- specs/$INPUT.SLUG/source.md (audit record)
|
|
130
|
+
|
|
131
|
+
Spec scope: $INPUT.FILE_LABEL component(s).
|
|
132
|
+
Optional inputs: owner=$INPUT.OWNER priority=$INPUT.PRIORITY
|
|
133
|
+
|
|
134
|
+
Cover, as separate REQs:
|
|
135
|
+
- Behavioural contract (what the component renders, given what data).
|
|
136
|
+
- Each visible state (default, hover, focused, pressed, disabled,
|
|
137
|
+
loading, error, empty) — derive from the CSS, gap-fill the rest.
|
|
138
|
+
- Accessibility (keyboard nav, ARIA roles, focus order, contrast,
|
|
139
|
+
screen-reader behaviour).
|
|
140
|
+
- Responsive behaviour (breakpoints by name, not pixels).
|
|
141
|
+
- Data shape + failure-mode contracts.
|
|
142
|
+
- Performance contract (initial render budget, interaction
|
|
143
|
+
latency, if applicable).
|
|
144
|
+
|
|
145
|
+
DO NOT put exact hex colors, pixel values, font names, or animation
|
|
146
|
+
durations in the spec. Reference design tokens by name
|
|
147
|
+
(`MUST use the --error color token`). The values themselves live
|
|
148
|
+
in tokens.css.
|
|
149
|
+
|
|
150
|
+
Embed the import-source record in the spec's frontmatter so the
|
|
151
|
+
spec carries its provenance:
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
---
|
|
155
|
+
id: <SLUG-DOC>
|
|
156
|
+
title: <FILE_LABEL>
|
|
157
|
+
owner: <OWNER or "[needs review]">
|
|
158
|
+
priority: <PRIORITY or "[needs review]">
|
|
159
|
+
source: specs/<SLUG>/source.md
|
|
160
|
+
snapshot: specs/<SLUG>/snapshot.html
|
|
161
|
+
tokens: specs/<SLUG>/tokens.css
|
|
162
|
+
---
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Output: the full Markdown body of the proposed spec
|
|
166
|
+
(with frontmatter, embedded `<!-- id: -->` markers, RFC 2119
|
|
167
|
+
keywords, acceptance bullets with .A1/.A2 IDs). DO NOT write
|
|
168
|
+
it to disk yet — the next node is a review gate.
|
|
169
|
+
|
|
170
|
+
- id: gap_review
|
|
171
|
+
kind: approval
|
|
172
|
+
depends_on: [draft_spec]
|
|
173
|
+
message: |
|
|
174
|
+
Spec draft ready for $INPUT.FILE_LABEL.
|
|
175
|
+
|
|
176
|
+
Walk the [needs review] markers and gap-fill questions, then
|
|
177
|
+
approve to write the file. Reject with feedback to revise.
|
|
178
|
+
|
|
179
|
+
─────── DRAFT ───────
|
|
180
|
+
$draft_spec.output
|
|
181
|
+
capture_response: true
|
|
182
|
+
on_reject:
|
|
183
|
+
prompt: |
|
|
184
|
+
The draft was rejected with this feedback. Revise the spec
|
|
185
|
+
per the feedback; keep ALL existing REQ IDs stable so any
|
|
186
|
+
downstream tracking survives the rewrite.
|
|
187
|
+
|
|
188
|
+
Feedback:
|
|
189
|
+
$gap_review.output
|
|
190
|
+
|
|
191
|
+
Current draft:
|
|
192
|
+
$draft_spec.output
|
|
193
|
+
|
|
194
|
+
Output the revised draft.
|
|
195
|
+
max_attempts: 3
|
|
196
|
+
|
|
197
|
+
- id: write_spec
|
|
198
|
+
kind: prompt
|
|
199
|
+
depends_on: [gap_review]
|
|
200
|
+
output_type: file_path
|
|
201
|
+
allowed_tools:
|
|
202
|
+
- Write
|
|
203
|
+
- Read
|
|
204
|
+
- Bash
|
|
205
|
+
prompt: |
|
|
206
|
+
Write the approved spec to `specs/$INPUT.SLUG.md` using the
|
|
207
|
+
Write tool.
|
|
208
|
+
|
|
209
|
+
If `specs/$INPUT.SLUG.md` already exists (re-importing an
|
|
210
|
+
iteration), APPEND the new requirements to it instead of
|
|
211
|
+
overwriting; preserve all existing REQ IDs. Tell the user
|
|
212
|
+
explicitly what you did.
|
|
213
|
+
|
|
214
|
+
Approved draft:
|
|
215
|
+
$gap_review.output
|
|
216
|
+
|
|
217
|
+
Then run:
|
|
218
|
+
specship sync
|
|
219
|
+
|
|
220
|
+
Output: the relative path of the file written + the first REQ
|
|
221
|
+
ID (e.g. "REQ-DATA-FLOW-001") so the next step can hand it to
|
|
222
|
+
/ss-implement.
|
|
223
|
+
|
|
224
|
+
- id: handoff
|
|
225
|
+
kind: prompt
|
|
226
|
+
depends_on: [write_spec]
|
|
227
|
+
output_type: handoff_message
|
|
228
|
+
allowed_tools:
|
|
229
|
+
- Read
|
|
230
|
+
prompt: |
|
|
231
|
+
The spec is now indexed. Output a short hand-off message for the
|
|
232
|
+
user with EXACTLY these elements:
|
|
233
|
+
|
|
234
|
+
1. The path of the spec file: `specs/$INPUT.SLUG.md`.
|
|
235
|
+
2. The full list of REQ IDs the spec defines, one per line.
|
|
236
|
+
3. The reference files the implementation phase should read:
|
|
237
|
+
- specs/$INPUT.SLUG/snapshot.html
|
|
238
|
+
- specs/$INPUT.SLUG/tokens.css
|
|
239
|
+
- specs/$INPUT.SLUG/source.md
|
|
240
|
+
4. The exact next command:
|
|
241
|
+
/ss-implement <first REQ ID>
|
|
242
|
+
5. A one-line reminder that the implementation step should
|
|
243
|
+
load the snapshot for visual fidelity — the spec covers
|
|
244
|
+
contract only.
|
|
245
|
+
|
|
246
|
+
Keep the message ≤200 words. The user is about to switch from
|
|
247
|
+
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"}
|