@selvakumaresra/specship 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +6 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/agents/specship-explorer.md +29 -0
- package/commands/cg-drifted.md +23 -0
- package/commands/cg-explore.md +13 -0
- package/commands/cg-fix.md +21 -0
- package/commands/cg-impact.md +13 -0
- package/commands/cg-implement.md +23 -0
- package/commands/cg-relink.md +21 -0
- package/commands/cg-spec.md +19 -0
- package/commands/cg-sync.md +8 -0
- package/commands/cg-trace.md +13 -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 +2018 -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 +101 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +276 -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 +427 -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 +410 -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 +57 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +253 -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 +409 -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 +88 -0
- package/dist/installer/targets/claude.d.ts.map +1 -0
- package/dist/installer/targets/claude.js +582 -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 +406 -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 +480 -0
- package/dist/server/routes/graph.js +149 -0
- package/dist/server/routes/memory.js +272 -0
- package/dist/server/routes/projects.js +197 -0
- package/dist/server/routes/spec.js +105 -0
- package/dist/server/routes/status.js +35 -0
- package/dist/server/routes/workflow.js +184 -0
- package/dist/server/server.js +202 -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-2YZXEHZ2.js +1 -0
- package/dist/web/chunk-3GIC555L.js +18 -0
- package/dist/web/chunk-3IIIGRMT.js +1 -0
- package/dist/web/chunk-47QYKLE5.js +1 -0
- package/dist/web/chunk-4LHBWWP7.js +1 -0
- package/dist/web/chunk-4OAZLD5W.js +1 -0
- package/dist/web/chunk-5OQKAJAE.js +1 -0
- package/dist/web/chunk-7B525GKQ.js +1 -0
- package/dist/web/chunk-BPDXCOOZ.js +1 -0
- package/dist/web/chunk-DT37HTZB.js +1 -0
- package/dist/web/chunk-EIMUHJND.js +1 -0
- package/dist/web/chunk-FTESTUEO.js +1 -0
- package/dist/web/chunk-GLJZV6MU.js +1 -0
- package/dist/web/chunk-I7LS67U5.js +1 -0
- package/dist/web/chunk-L4TVIPSR.js +1 -0
- package/dist/web/chunk-MASCULC2.js +1 -0
- package/dist/web/chunk-MW7ICSRM.js +1 -0
- package/dist/web/chunk-OI5VP2A3.js +1 -0
- package/dist/web/chunk-RA6EBF6I.js +1 -0
- package/dist/web/chunk-RP3WU5Y6.js +1 -0
- package/dist/web/chunk-RQDRMTXN.js +1 -0
- package/dist/web/chunk-TQMT6UDU.js +1 -0
- package/dist/web/chunk-U7IYOV7T.js +1 -0
- package/dist/web/chunk-UE227MWF.js +1 -0
- package/dist/web/chunk-WV573J4K.js +1 -0
- package/dist/web/chunk-WVCKOJZL.js +4 -0
- package/dist/web/chunk-XZKLVPHE.js +1 -0
- package/dist/web/chunk-ZABKKHJ3.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-RI5CO5Z4.js +1 -0
- package/dist/web/styles-CYN7IKT4.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/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-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 +623 -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 +27 -0
- package/package.json +67 -0
- package/scripts/add-lang/bench.sh +60 -0
- package/scripts/add-lang/check-grammar.mjs +75 -0
- package/scripts/add-lang/dump-ast.mjs +103 -0
- package/scripts/add-lang/verify-extraction.mjs +70 -0
- package/scripts/agent-eval/arms-F.sh +21 -0
- package/scripts/agent-eval/arms-matrix.sh +37 -0
- package/scripts/agent-eval/audit.sh +68 -0
- package/scripts/agent-eval/bench-readme.sh +28 -0
- package/scripts/agent-eval/bench-why-repo.sh +22 -0
- package/scripts/agent-eval/block-read-hook.sh +19 -0
- package/scripts/agent-eval/hook-settings.json +15 -0
- package/scripts/agent-eval/itrun.sh +120 -0
- package/scripts/agent-eval/parse-arms.mjs +116 -0
- package/scripts/agent-eval/parse-bench-readme.mjs +84 -0
- package/scripts/agent-eval/parse-run.mjs +45 -0
- package/scripts/agent-eval/parse-session.mjs +93 -0
- package/scripts/agent-eval/probe-context.mjs +21 -0
- package/scripts/agent-eval/probe-explore.mjs +40 -0
- package/scripts/agent-eval/probe-node.mjs +20 -0
- package/scripts/agent-eval/probe-sweep.mjs +119 -0
- package/scripts/agent-eval/probe-trace.mjs +20 -0
- package/scripts/agent-eval/run-agent.sh +34 -0
- package/scripts/agent-eval/run-all.sh +67 -0
- package/scripts/agent-eval/run-arms.sh +56 -0
- package/scripts/agent-eval/seq-matrix.mjs +137 -0
- package/scripts/build-bundle.sh +118 -0
- package/scripts/build-server-bundle.mjs +80 -0
- package/scripts/build-web-bundle.mjs +66 -0
- package/scripts/extract-release-notes.mjs +130 -0
- package/scripts/local-install.sh +41 -0
- package/scripts/npm-sdk.js +75 -0
- package/scripts/npm-shim.js +246 -0
- package/scripts/offline-install.ps1 +148 -0
- package/scripts/offline-install.sh +136 -0
- package/scripts/pack-npm.sh +119 -0
- package/scripts/prepare-release.mjs +270 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "specship",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local code intelligence for Claude Code — semantic search, flow tracing, and impact analysis backed by a SQLite knowledge graph. Auto-syncs after every Edit/Write.",
|
|
5
|
+
"author": { "name": "selvakumarEsra" }
|
|
6
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Colby Mchenry
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# SpecShip
|
|
4
|
+
|
|
5
|
+
### Supercharge Claude Code with Semantic Code Intelligence
|
|
6
|
+
|
|
7
|
+
**~16% cheaper · ~58% fewer tool calls · 100% local**
|
|
8
|
+
|
|
9
|
+
[](https://opensource.org/licenses/MIT)
|
|
10
|
+
[](https://nodejs.org/)
|
|
11
|
+
|
|
12
|
+
[](#supported-platforms)
|
|
13
|
+
[](#supported-platforms)
|
|
14
|
+
[](#supported-platforms)
|
|
15
|
+
|
|
16
|
+
[](#get-started)
|
|
17
|
+
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
## Get Started
|
|
21
|
+
|
|
22
|
+
### 1. Install the CLI
|
|
23
|
+
|
|
24
|
+
Requires Node.js 22.5+ (Node 24.x recommended — its bundled SQLite has FTS5, which SpecShip needs):
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm i -g @selvakumaresra/specship@0.1.0
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Offline / air-gapped client workstation? Clone or copy this repo onto the machine and run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
./scripts/offline-install.sh # macOS / Linux
|
|
34
|
+
.\scripts\offline-install.ps1 # Windows
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The offline installer probes for FTS5 up front, runs `npm install` against whatever registry npm is already pointed at (your private mirror is fine), builds, `npm link`s, and wires Claude Code — no GitHub access required.
|
|
38
|
+
|
|
39
|
+
### 2. Wire up Claude Code
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
specship install
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
<sub>Writes the SpecShip MCP server into `~/.claude.json` (global) or `./.mcp.json` (project), plus the auto-allow permissions list into Claude's `settings.json`. Use `--yes` for non-interactive defaults (global location, auto-allow on).</sub>
|
|
46
|
+
|
|
47
|
+
### 3. Initialize each project
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd your-project
|
|
51
|
+
specship init -i
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
<sub>`specship init` creates the local `.specship/` index directory; adding `-i` (`--index`) also builds the initial graph in the same step. Without `-i`, run `specship index` afterwards.</sub>
|
|
55
|
+
|
|
56
|
+
### Uninstall
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
specship uninstall
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
<sub>Strips SpecShip's MCP server config and permissions from Claude Code. Your project indexes (`.specship/`) are left untouched; remove those per-project with `specship uninit`.</sub>
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Specs as First-Class Citizens
|
|
67
|
+
|
|
68
|
+
Write requirements in Markdown under `specs/` with embedded IDs, and SpecShip indexes them alongside the code. Each spec becomes a queryable node with a content-hashed body, parent/child structure, and links to the code that implements it.
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
<!-- specs/auth.md -->
|
|
72
|
+
---
|
|
73
|
+
id: AUTH-DOC
|
|
74
|
+
title: Authentication
|
|
75
|
+
---
|
|
76
|
+
<!-- id: REQ-AUTH-001 -->
|
|
77
|
+
# Login must rate-limit failed attempts
|
|
78
|
+
|
|
79
|
+
The login endpoint rejects more than 5 failed attempts per IP per minute.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
After `specship init -i`, the agent can:
|
|
83
|
+
|
|
84
|
+
- `mcp__specship__specship_spec("REQ-AUTH-001")` — fetch spec + linked code + state
|
|
85
|
+
- `mcp__specship__specship_link_assert(...)` — declare a link after implementing
|
|
86
|
+
- `mcp__specship__specship_drifted` — review queue when spec or code moves
|
|
87
|
+
|
|
88
|
+
The link layer carries state — `implemented`, `verified`, `drifted`, `broken`, `orphaned` — keyed on logical identity (file + qualified name) so links survive ordinary refactors. Drop `// @implements REQ-AUTH-001` in your code as a backstop when the agent forgets to assert.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
specship drifted # review queue
|
|
92
|
+
specship drifted --fail-on=broken,drifted # CI gate
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Spec-driven workflows
|
|
96
|
+
|
|
97
|
+
A YAML workflow engine (`specship workflow run <name>`) drives the agent through deterministic spec → implement → verify → link loops in an isolated git worktree, with approval gates so a non-coding spec author reviews the plan and final diff. Four bundled workflows ship by default:
|
|
98
|
+
|
|
99
|
+
- `spec-implement` — plan → approve → implement → test → link → final review
|
|
100
|
+
- `spec-fix` — diagnose a drifted link → fix code → re-verify
|
|
101
|
+
- `spec-verify` — run tests, promote `implemented` links to `verified`
|
|
102
|
+
- `spec-relink` — re-attach an orphan after a refactor
|
|
103
|
+
|
|
104
|
+
Customize by dropping your own `<project>/.specship/workflows/<name>.yaml` (project tier overrides bundled defaults). The matching slash commands `/cg-spec`, `/cg-implement`, `/cg-drifted`, `/cg-fix`, `/cg-relink` are installed into Claude Code by `specship install`.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Why SpecShip?
|
|
109
|
+
|
|
110
|
+
When Claude Code explores a codebase, it spawns **Explore agents** that scan files with grep, glob, and Read — consuming tokens on every tool call.
|
|
111
|
+
|
|
112
|
+
**SpecShip gives those agents a pre-indexed knowledge graph** — symbol relationships, call graphs, and code structure. Agents query the graph instantly instead of scanning files.
|
|
113
|
+
|
|
114
|
+
## Key Features
|
|
115
|
+
|
|
116
|
+
| | |
|
|
117
|
+
|---|---|
|
|
118
|
+
| **Smart Context Building** | One tool call returns entry points, related symbols, and code snippets — no expensive exploration agents |
|
|
119
|
+
| **Full-Text Search** | Find code by name instantly across your entire codebase, powered by FTS5 |
|
|
120
|
+
| **Impact Analysis** | Trace callers, callees, and the full impact radius of any symbol before making changes |
|
|
121
|
+
| **Always Fresh** | File watcher uses native OS events (FSEvents/inotify/ReadDirectoryChangesW) with debounced auto-sync — the graph stays current as you code, zero config |
|
|
122
|
+
| **20+ Languages** | TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Objective-C, Swift, Kotlin, Dart, Lua, Luau, Svelte, Liquid, Pascal/Delphi |
|
|
123
|
+
| **Framework-aware Routes** | Recognizes web-framework routing files and links URL patterns to their handlers across 14 frameworks |
|
|
124
|
+
| **Desktop UI** | Live dashboard for cost, drift, tool-call heatmap, cache analytics, plus a project picker that auto-discovers every project you've used Claude Code in |
|
|
125
|
+
| **100% Local** | No data leaves your machine. No API keys. No external services. SQLite database only |
|
|
126
|
+
|
|
127
|
+
<details>
|
|
128
|
+
<summary><strong>How auto-syncing works — and why you don't need to run <code>specship sync</code> manually</strong></summary>
|
|
129
|
+
|
|
130
|
+
When Claude Code launches `specship serve --mcp`, three layers keep the index in step with your code — and make sure the agent never gets a silent wrong answer in the brief window between an edit and the next sync:
|
|
131
|
+
|
|
132
|
+
1. **File watcher with debounced auto-sync.** A native FSEvents / inotify / ReadDirectoryChangesW watcher captures every source-file create / modify / delete and triggers a re-index after a debounce window (default `2000ms`, tunable via `SPECSHIP_WATCH_DEBOUNCE_MS`, clamped to `[100ms, 60s]`). Bursts of edits collapse into a single sync.
|
|
133
|
+
|
|
134
|
+
2. **Per-file staleness banner.** During the brief debounce window, MCP tool responses that would reference a still-pending file prepend a `⚠️` banner naming it and telling the agent to `Read` it directly. Pending files NOT referenced by the response surface as a small footer instead. Either way, the agent gets an explicit signal — validated with Claude Code, where the agent literally says "Reading the file directly for the live content" before opening it.
|
|
135
|
+
|
|
136
|
+
3. **Connect-time catch-up.** When the MCP server (re)connects, specship runs a fast `(size, mtime)` + content-hash reconciliation against the working tree before answering the first query — so edits made while no MCP server was running (a `git pull` from the terminal, edits from another editor, a previous agent session that exited) get absorbed on the next session's first tool call.
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
agent writes src/Widget.ts
|
|
140
|
+
→ watcher fires (<100ms)
|
|
141
|
+
→ debounce (default 2s)
|
|
142
|
+
→ sync; Widget.ts is in the index
|
|
143
|
+
→ next agent query sees it
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Verify any time** with `specship_status` (via MCP) or `specship status` (CLI). If anything is pending, you'll see a `### Pending sync:` section naming the files and their edit age.
|
|
147
|
+
|
|
148
|
+
The handful of cases where manual `specship sync` makes sense: the watcher is disabled (sandboxed environments, or `SPECSHIP_NO_DAEMON=1`), or you're scripting against the index outside an agent session and want a pre-flight sync at the start of your script.
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
</details>
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Dashboard
|
|
156
|
+
|
|
157
|
+
`specship serve --ui` boots a single-process Fastify + Angular SPA on `http://127.0.0.1:4242/`. One port serves both the API and the desktop UI. No Electron, no auth — loopback only.
|
|
158
|
+
|
|
159
|
+

|
|
160
|
+
|
|
161
|
+
The dashboard is designed to answer four questions in one glance — **what is the structural state of my codebase, what needs attention, what did my last session cost, and what should I do about it.** The zones, top-to-bottom:
|
|
162
|
+
|
|
163
|
+
#### Status strip · top of every page
|
|
164
|
+
|
|
165
|
+
Project path · backend (`better-sqlite3` / `node:sqlite`) · node count · edge count · drift count · last-index time. Always visible — drift > 0 turns amber, index time pulses red after 30 minutes of staleness.
|
|
166
|
+
|
|
167
|
+
#### Project picker · top bar
|
|
168
|
+
|
|
169
|
+
Auto-discovers every project under `~/.claude/projects/`, decodes the slug back to its absolute path, flags each one with `initialized` / `not init` / `missing`, and shows the most-recently-touched first. A live SSE stream pushes new entries the moment you open a project in Claude Code — no refresh. Pick one and every codegraph-scoped surface (status, graph, specs, drift, workflows, memory) switches to that project's data.
|
|
170
|
+
|
|
171
|
+
#### Stat tiles · 4 across
|
|
172
|
+
|
|
173
|
+
| Tile | Surfaces |
|
|
174
|
+
|---|---|
|
|
175
|
+
| **Last session cost** | Total $ for your most recent Claude Code session, sourced from the JSONL transcripts ingested in the background. Click → Sessions page with that session focused. |
|
|
176
|
+
| **Tool calls · range** | Count of tool calls in the selected time range (Today / This week / This month / All time, picker top-right). Click → Heatmap. |
|
|
177
|
+
| **Subagent spend** | What % of your token spend went to Task-tool subagents. Hot signal: above ~40 % usually means a workflow is over-delegating. Click → Heatmap → Subagents lane. |
|
|
178
|
+
| **Drift queue** | Spec-link rows in `drifted`, `broken`, or `orphaned` state. Click → Drift queue. The sidebar item also carries this badge so it's visible from any page. |
|
|
179
|
+
|
|
180
|
+
#### Recent neighborhood · interactive mini-graph
|
|
181
|
+
|
|
182
|
+
A small live `<app-graph-canvas>` panel — pan/zoom, click any node to deep-link into `/graph?focus=<id>`. By default it shows a 15–25 node slice around the file you most recently edited. When the API returns no rows (fresh dev, no project indexed), it falls back to a seed neighborhood with all four node kinds (purple `code` / blue `spec` / green `test` / teal `route`) and a drifted spec, so the visual language is always on screen.
|
|
183
|
+
|
|
184
|
+
#### Tips panel
|
|
185
|
+
|
|
186
|
+
Rule-based pattern-matcher over your transcripts. Each tip has a severity bar (`error` / `warn` / `info`), a one-line title, a concrete `Fix` (often a copyable command), and an estimated saving. Examples that show up in real usage:
|
|
187
|
+
|
|
188
|
+
> _You read `auth.ts` 17 times last session. Same answer via `specship_explore` in 1 call._
|
|
189
|
+
>
|
|
190
|
+
> _Bash(grep) returned 82k tokens. `specship_search` covers this in 600._
|
|
191
|
+
>
|
|
192
|
+
> _Cache miss rate on your evening sessions is 91%. Could be your system prompt drifts each turn._
|
|
193
|
+
|
|
194
|
+
`Apply` jumps to the related surface; `Dismiss` snoozes the tip (snooze persistence lands in the next release).
|
|
195
|
+
|
|
196
|
+
#### Tool-call heatmap strip
|
|
197
|
+
|
|
198
|
+
One cell per touched file, sized roughly by path length so longer paths get more room. Color intensity tracks tool-call volume in the selected range. Hover for the path + counts; click to drill into the file's tool breakdown with a sessions list and a "heavy tool" callout (e.g. _"`Read` returned 396 k tokens here — a structural query would cover it in a fraction"_).
|
|
199
|
+
|
|
200
|
+
#### Recent prompts · by cost
|
|
201
|
+
|
|
202
|
+
Last 8–12 user prompts across your sessions, with a per-prompt cost bar and token rollup. Expensive prompts pop red; cache-hit % shows next to each. Click a row to jump into the Sessions deep-dive scrolled to that prompt — token-split micro-bars, every tool call with its result-token weight, and tagged "heavy tool" rows.
|
|
203
|
+
|
|
204
|
+
#### Cache analytics card
|
|
205
|
+
|
|
206
|
+
One big number — your **cache read rate** — plus a 2×2 breakdown: creation tokens (with 1h / 5m split), read tokens (charged at ~10 %), estimated dollars saved this week, week-over-week delta. The single biggest controllable knob for keeping Claude Code cheap, surfaced where you can see it without going hunting.
|
|
207
|
+
|
|
208
|
+
> **Project & time scope.** Every numeric on this page respects the project picker's active selection and the range selector top-right. Switching projects re-fetches without a page reload.
|
|
209
|
+
|
|
210
|
+
#### Beyond the dashboard
|
|
211
|
+
|
|
212
|
+
Same shell, same shortcuts, more depth:
|
|
213
|
+
|
|
214
|
+
| Surface | What |
|
|
215
|
+
|---|---|
|
|
216
|
+
| **Graph** | Full xyflow code explorer — pan/zoom, fuzzy search, kind filters, click-to-recenter, side panel with callers / callees / linked specs / "Reveal in editor". Hierarchical / Force / Spec-anchored layouts. |
|
|
217
|
+
| **Specs** | Doc tree + Markdown spec detail; per-spec linked-code list with state pills and one-click `Implement` / `Verify` / `Edit spec` / `Show in graph` actions. |
|
|
218
|
+
| **Drift queue** | Filterable list of links needing attention. Bulk re-verify, bulk re-attach via the relink workflow. |
|
|
219
|
+
| **Workflows + Runs** | Run any bundled or project-tier workflow, watch its DAG advance live via SSE, approve / reject pause gates, inspect per-step artifacts (plan.md, diff.md, test_results.md). |
|
|
220
|
+
| **Chat** | A codegraph-aware companion chat with slash commands, collapsible tool calls, and per-turn cost footers. |
|
|
221
|
+
| **Sessions / Heatmap / Costs / Compare / Tips** | The Claude Code analytics suite — sessions deep-dive with per-prompt expand, file/tool/subagent heatmap drilldowns, per-day cost line + by-model donut, cross-project comparison. |
|
|
222
|
+
| **Memory** | The full `CLAUDE.md` hierarchy (managed / user / project / subdir) plus `@import` resolution plus `~/.claude/memory/*.md` agent-written notes. Sources view + Effective (merged-precedence) view. |
|
|
223
|
+
| **Design system** | The visual reference for the entire app — every token, palette swatch, semantic state, button/pill family, and the 4 px node-color legibility test that the graph relies on. |
|
|
224
|
+
|
|
225
|
+
A live boot splash animates the Wake logomark assembling on first launch each session — then fades into the dashboard. Subsequent reloads within the same session skip straight to the dashboard.
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Framework-aware Routes
|
|
230
|
+
|
|
231
|
+
SpecShip detects web-framework routing files and emits `route` nodes linked by `references` edges to their handler classes or functions. Querying callers of a view/controller now surfaces the URL pattern that binds it.
|
|
232
|
+
|
|
233
|
+
| Framework | Shapes recognized |
|
|
234
|
+
|---|---|
|
|
235
|
+
| **Django** | `path()`, `re_path()`, `url()`, `include()` in `urls.py` (CBV `.as_view()`, dotted paths) |
|
|
236
|
+
| **Flask** | `@app.route('/path', methods=[...])`, blueprint routes |
|
|
237
|
+
| **FastAPI** | `@app.get(...)`, `@router.post(...)`, all standard methods |
|
|
238
|
+
| **Express** | `app.get(...)`, `router.post(...)` with middleware chains |
|
|
239
|
+
| **NestJS** | `@Controller` + `@Get/@Post/...`, GraphQL `@Resolver` + `@Query/@Mutation`, `@MessagePattern`/`@EventPattern`, `@SubscribeMessage` |
|
|
240
|
+
| **Laravel** | `Route::get()`, `Route::resource()`, `Controller@action`, tuple syntax |
|
|
241
|
+
| **Drupal** | `*.routing.yml` routes (`_controller`, `_form`, entity handlers); `hook_*` implementations in `.module`/`.theme`/`.install`/`.inc` |
|
|
242
|
+
| **Rails** | `get '/x', to: 'users#index'`, hash-rocket `=>` syntax |
|
|
243
|
+
| **Spring** | `@GetMapping`, `@PostMapping`, `@RequestMapping` on methods |
|
|
244
|
+
| **Gin / chi / gorilla / mux** | `r.GET(...)`, `router.HandleFunc(...)` |
|
|
245
|
+
| **Axum / actix / Rocket** | `.route("/x", get(handler))` |
|
|
246
|
+
| **ASP.NET** | `[HttpGet("/x")]` attributes on action methods |
|
|
247
|
+
| **Vapor** | `app.get("x", use: handler)` |
|
|
248
|
+
| **React Router** / **SvelteKit** | Route component nodes |
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Quick Start
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
npm i -g @selvakumaresra/specship@0.1.0
|
|
256
|
+
specship install --yes # writes ~/.claude.json + ~/.claude/settings.json
|
|
257
|
+
cd your-project && specship init -i
|
|
258
|
+
# restart Claude Code
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
The installer:
|
|
262
|
+
- Writes Claude Code's MCP server config (`~/.claude.json` for global, `./.mcp.json` for project-local)
|
|
263
|
+
- Writes the auto-allow permissions list into `~/.claude/settings.json`
|
|
264
|
+
- For local installs, also runs `specship init` against the current directory
|
|
265
|
+
|
|
266
|
+
**Non-interactive (scripting / CI):**
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
specship install --yes # global, auto-allow on
|
|
270
|
+
specship install --location=local --yes # project-local
|
|
271
|
+
specship install --print-config # print snippet, no file writes
|
|
272
|
+
specship install --no-permissions # skip auto-allow list
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
| Flag | Values | Default |
|
|
276
|
+
|---|---|---|
|
|
277
|
+
| `--location` | `global`, `local` | prompt |
|
|
278
|
+
| `--yes` | (boolean) | prompt every step |
|
|
279
|
+
| `--no-permissions` | (boolean) skip Claude auto-allow list | permissions on |
|
|
280
|
+
| `--print-config` | dump Claude MCP snippet and exit | — |
|
|
281
|
+
|
|
282
|
+
<details>
|
|
283
|
+
<summary><strong>Manual Setup (Alternative)</strong></summary>
|
|
284
|
+
|
|
285
|
+
**Install globally:**
|
|
286
|
+
```bash
|
|
287
|
+
npm install -g @selvakumaresra/specship@0.1.0
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Add to `~/.claude.json`:**
|
|
291
|
+
```json
|
|
292
|
+
{
|
|
293
|
+
"mcpServers": {
|
|
294
|
+
"specship": {
|
|
295
|
+
"type": "stdio",
|
|
296
|
+
"command": "specship",
|
|
297
|
+
"args": ["serve", "--mcp"]
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Add to `~/.claude/settings.json` (optional, for auto-allow):**
|
|
304
|
+
```json
|
|
305
|
+
{
|
|
306
|
+
"permissions": {
|
|
307
|
+
"allow": [
|
|
308
|
+
"mcp__specship__specship_search",
|
|
309
|
+
"mcp__specship__specship_explore",
|
|
310
|
+
"mcp__specship__specship_callers",
|
|
311
|
+
"mcp__specship__specship_callees",
|
|
312
|
+
"mcp__specship__specship_impact",
|
|
313
|
+
"mcp__specship__specship_node",
|
|
314
|
+
"mcp__specship__specship_status",
|
|
315
|
+
"mcp__specship__specship_files"
|
|
316
|
+
]
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
</details>
|
|
322
|
+
|
|
323
|
+
<details>
|
|
324
|
+
<summary><strong>Agent Tool Guidance</strong></summary>
|
|
325
|
+
|
|
326
|
+
SpecShip's MCP server delivers its usage guidance to Claude Code **automatically**, in the MCP `initialize` response — there's no instructions file to manage and nothing is added to your `CLAUDE.md`. In short, it tells the agent to:
|
|
327
|
+
|
|
328
|
+
- **Answer structural questions directly with SpecShip** — it *is* the pre-built index, so a grep/read loop just repeats work it already did. Treat the returned source as already read.
|
|
329
|
+
- **Pick the tool by intent:** `specship_explore` for almost anything — "how does X work", a flow/"how does X reach Y", or surveying an area (one call returns the relevant symbols' source grouped by file); `specship_search` to just locate a symbol; `specship_callers`/`specship_callees` to walk call flow; `specship_impact` before editing; `specship_node` for one specific symbol's full source (it returns every overload for an ambiguous name).
|
|
330
|
+
- **Trust the results — don't re-verify with grep**, and check the staleness banner after edits.
|
|
331
|
+
- If `.specship/` doesn't exist yet, offer to run `specship init -i`.
|
|
332
|
+
|
|
333
|
+
The exact text is `src/mcp/server-instructions.ts` — the single source of truth.
|
|
334
|
+
|
|
335
|
+
</details>
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## How It Works
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
┌───────────────────────────────────────────────────────────────────┐
|
|
343
|
+
│ Claude Code │
|
|
344
|
+
│ │
|
|
345
|
+
│ "How does a request reach the database?" │
|
|
346
|
+
│ calls SpecShip tools directly — no Explore sub-agent │
|
|
347
|
+
│ │ │
|
|
348
|
+
└─────────────────────────────────┬─────────────────────────────────┘
|
|
349
|
+
│
|
|
350
|
+
▼
|
|
351
|
+
┌───────────────────────────────────────────────────────────────────┐
|
|
352
|
+
│ SpecShip MCP Server │
|
|
353
|
+
│ │
|
|
354
|
+
│ explore · search · callers · callees · impact · node │
|
|
355
|
+
│ │ │
|
|
356
|
+
│ ▼ │
|
|
357
|
+
│ SQLite knowledge graph │
|
|
358
|
+
│ symbols · edges · files · FTS5 full-text search │
|
|
359
|
+
└───────────────────────────────────────────────────────────────────┘
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
1. **Extraction** — [tree-sitter](https://tree-sitter.github.io/) parses source code into ASTs. Language-specific queries extract nodes (functions, classes, methods) and edges (calls, imports, extends, implements).
|
|
363
|
+
|
|
364
|
+
2. **Storage** — Everything goes into a local SQLite database (`.specship/specship.db`) with FTS5 full-text search.
|
|
365
|
+
|
|
366
|
+
3. **Resolution** — After extraction, references are resolved: function calls → definitions, imports → source files, class inheritance, and framework-specific patterns.
|
|
367
|
+
|
|
368
|
+
4. **Auto-Sync** — The MCP server watches your project using native OS file events. Changes are debounced (2-second quiet window), filtered to source files only, and incrementally synced. The graph stays fresh as you code — no configuration needed.
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## CLI Reference
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
specship # Run interactive installer
|
|
376
|
+
specship install # Run installer (explicit)
|
|
377
|
+
specship uninstall # Remove SpecShip from your agents (inverse of install)
|
|
378
|
+
specship init [path] # Initialize in a project (--index to also index)
|
|
379
|
+
specship uninit [path] # Remove SpecShip from a project (--force to skip prompt)
|
|
380
|
+
specship index [path] # Full index (--force to re-index, --quiet for less output)
|
|
381
|
+
specship sync [path] # Incremental update
|
|
382
|
+
specship status [path] # Show statistics
|
|
383
|
+
specship query <search> # Search symbols (--kind, --limit, --json)
|
|
384
|
+
specship files [path] # Show file structure (--format, --filter, --max-depth, --json)
|
|
385
|
+
specship callers <symbol> # Find what calls a function/method (--limit, --json)
|
|
386
|
+
specship callees <symbol> # Find what a function/method calls (--limit, --json)
|
|
387
|
+
specship impact <symbol> # Analyze what code is affected by changing a symbol (--depth, --json)
|
|
388
|
+
specship affected [files...] # Find test files affected by changes (see below)
|
|
389
|
+
specship serve --mcp # Start MCP server
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### `specship affected`
|
|
393
|
+
|
|
394
|
+
Traces import dependencies transitively to find which test files are affected by changed source files.
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
specship affected src/utils.ts src/api.ts # Pass files as arguments
|
|
398
|
+
git diff --name-only | specship affected --stdin # Pipe from git diff
|
|
399
|
+
specship affected src/auth.ts --filter "e2e/*" # Custom test file pattern
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
| Option | Description | Default |
|
|
403
|
+
|--------|-------------|---------|
|
|
404
|
+
| `--stdin` | Read file list from stdin | `false` |
|
|
405
|
+
| `-d, --depth <n>` | Max dependency traversal depth | `5` |
|
|
406
|
+
| `-f, --filter <glob>` | Custom glob to identify test files | auto-detect |
|
|
407
|
+
| `-j, --json` | Output as JSON | `false` |
|
|
408
|
+
| `-q, --quiet` | Output file paths only | `false` |
|
|
409
|
+
|
|
410
|
+
**CI/hook example:**
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
#!/usr/bin/env bash
|
|
414
|
+
AFFECTED=$(git diff --name-only HEAD | specship affected --stdin --quiet)
|
|
415
|
+
if [ -n "$AFFECTED" ]; then
|
|
416
|
+
npx vitest run $AFFECTED
|
|
417
|
+
fi
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## MCP Tools
|
|
423
|
+
|
|
424
|
+
When running as an MCP server, SpecShip exposes these tools to Claude Code:
|
|
425
|
+
|
|
426
|
+
| Tool | Purpose |
|
|
427
|
+
|------|---------|
|
|
428
|
+
| `specship_explore` | **Primary.** Answer almost any question in one call — "how does X work", a flow ("how does X reach Y"), or surveying an area — returning the relevant symbols' verbatim source grouped by file, plus a relationship map and blast radius. Surfaces dynamic-dispatch hops (callbacks, React re-render, interface→impl) grep can't follow. |
|
|
429
|
+
| `specship_search` | Find symbols by name across the codebase |
|
|
430
|
+
| `specship_callers` | Find what calls a function |
|
|
431
|
+
| `specship_callees` | Find what a function calls |
|
|
432
|
+
| `specship_impact` | Analyze what code is affected by changing a symbol |
|
|
433
|
+
| `specship_node` | Get one specific symbol's details + full source (returns every overload for an ambiguous name) |
|
|
434
|
+
| `specship_files` | Get indexed file structure (faster than filesystem scanning) |
|
|
435
|
+
| `specship_status` | Check index health and statistics |
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Library Usage
|
|
440
|
+
|
|
441
|
+
SpecShip can be embedded directly. The npm package re-exports its programmatic
|
|
442
|
+
API, so both `import` and `require` resolve the `SpecShip` class in your own
|
|
443
|
+
process — handy for embedding it in an app (e.g. an Electron main process).
|
|
444
|
+
|
|
445
|
+
```typescript
|
|
446
|
+
import SpecShip from '@selvakumaresra/specship';
|
|
447
|
+
// CommonJS works too:
|
|
448
|
+
// const { SpecShip } = require('@selvakumaresra/specship');
|
|
449
|
+
|
|
450
|
+
const cg = await SpecShip.init('/path/to/project');
|
|
451
|
+
// Or: const cg = await SpecShip.open('/path/to/project');
|
|
452
|
+
|
|
453
|
+
await cg.indexAll({
|
|
454
|
+
onProgress: (p) => console.log(`${p.phase}: ${p.current}/${p.total}`)
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
const results = cg.searchNodes('UserService');
|
|
458
|
+
const callers = cg.getCallers(results[0].node.id);
|
|
459
|
+
const context = await cg.buildContext('fix login bug', { maxNodes: 20, includeCode: true, format: 'markdown' });
|
|
460
|
+
const impact = cg.getImpactRadius(results[0].node.id, 2);
|
|
461
|
+
|
|
462
|
+
cg.watch(); // auto-sync on file changes
|
|
463
|
+
cg.unwatch(); // stop watching
|
|
464
|
+
cg.close();
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Lower-level building blocks are exported from the same entry point for callers
|
|
468
|
+
that drive the graph directly: `DatabaseConnection`, `QueryBuilder`,
|
|
469
|
+
`getDatabasePath`, `initGrammars` / `loadGrammarsForLanguages`, and `FileLock`.
|
|
470
|
+
|
|
471
|
+
**Embedding requirements**
|
|
472
|
+
|
|
473
|
+
- Install from npm (`npm i @selvakumaresra/specship@0.1.0`) so the matching
|
|
474
|
+
per-platform package — which carries the compiled library and its
|
|
475
|
+
dependencies — is fetched alongside the shim.
|
|
476
|
+
- The API runs on **your** runtime, so it needs **Node 22.5+** for the built-in
|
|
477
|
+
`node:sqlite` (Electron qualifies when its bundled Node is 22.5+). The CLI and
|
|
478
|
+
MCP server are unaffected — they run on the self-contained bundled runtime.
|
|
479
|
+
- TypeScript types ship with the package. As with any Node-targeting library,
|
|
480
|
+
keep `@types/node` available and `skipLibCheck: true` (the common default).
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## Configuration
|
|
485
|
+
|
|
486
|
+
There isn't any — SpecShip is zero-config, with **no config file** to write or
|
|
487
|
+
keep in sync. Language support is automatic from the file extension; there's
|
|
488
|
+
nothing to wire up per language.
|
|
489
|
+
|
|
490
|
+
What it skips out of the box:
|
|
491
|
+
|
|
492
|
+
- **Dependency, build, and cache directories** — `node_modules`, `vendor`,
|
|
493
|
+
`dist`, `build`, `target`, `.venv`, `Pods`, `.next`, and the like across every
|
|
494
|
+
[supported stack](#supported-languages) — so the graph is your code, not
|
|
495
|
+
third-party noise. This holds even with no `.gitignore`.
|
|
496
|
+
- **Anything in your `.gitignore`** — honored in git repos via git, and in
|
|
497
|
+
non-git projects by reading `.gitignore` directly (root and nested).
|
|
498
|
+
- **Files larger than 1 MB** — generated bundles, minified JS, vendored blobs.
|
|
499
|
+
|
|
500
|
+
To keep something else out, add it to `.gitignore`. To pull a default-excluded
|
|
501
|
+
directory back **in** (say you really do want a vendored dependency indexed),
|
|
502
|
+
add a negation — `!vendor/`. The defaults apply uniformly, so committing a
|
|
503
|
+
dependency or build directory doesn't force it into the graph; the `.gitignore`
|
|
504
|
+
negation is the explicit opt-in.
|
|
505
|
+
|
|
506
|
+
## Supported Platforms
|
|
507
|
+
|
|
508
|
+
Every release ships a self-contained build (bundled Node runtime — nothing to
|
|
509
|
+
compile) for all three desktop OSes, on both Intel/AMD (x64) and ARM (arm64):
|
|
510
|
+
|
|
511
|
+
| Platform | Architectures | Install |
|
|
512
|
+
|----------|---------------|---------|
|
|
513
|
+
| Windows | x64, arm64 | PowerShell installer or npm |
|
|
514
|
+
| macOS | x64, arm64 | shell installer or npm |
|
|
515
|
+
| Linux | x64, arm64 | shell installer or npm |
|
|
516
|
+
|
|
517
|
+
See [Get Started](#get-started) for the one-line install commands.
|
|
518
|
+
|
|
519
|
+
## Supported Languages
|
|
520
|
+
|
|
521
|
+
| Language | Extension | Status |
|
|
522
|
+
|----------|-----------|--------|
|
|
523
|
+
| TypeScript | `.ts`, `.tsx` | Full support |
|
|
524
|
+
| JavaScript | `.js`, `.jsx`, `.mjs` | Full support |
|
|
525
|
+
| Python | `.py` | Full support |
|
|
526
|
+
| Go | `.go` | Full support |
|
|
527
|
+
| Rust | `.rs` | Full support |
|
|
528
|
+
| Java | `.java` | Full support |
|
|
529
|
+
| C# | `.cs` | Full support |
|
|
530
|
+
| PHP | `.php` | Full support |
|
|
531
|
+
| Ruby | `.rb` | Full support |
|
|
532
|
+
| C | `.c`, `.h` | Full support |
|
|
533
|
+
| C++ | `.cpp`, `.hpp`, `.cc` | Full support |
|
|
534
|
+
| Objective-C | `.m`, `.mm`, `.h` | Partial support (classes, protocols, methods, `@property`, `#import`, message sends; `.mm` ObjC++ may parse incompletely) |
|
|
535
|
+
| Swift | `.swift` | Full support |
|
|
536
|
+
| Kotlin | `.kt`, `.kts` | Full support |
|
|
537
|
+
| Scala | `.scala`, `.sc` | Full support (classes, traits, methods, type aliases, Scala 3 enums) |
|
|
538
|
+
| Dart | `.dart` | Full support |
|
|
539
|
+
| Svelte | `.svelte` | Full support (script extraction, Svelte 5 runes, SvelteKit routes) |
|
|
540
|
+
| Vue | `.vue` | Full support (script + script-setup extraction, Nuxt page/API/middleware routes) |
|
|
541
|
+
| Liquid | `.liquid` | Full support |
|
|
542
|
+
| Pascal / Delphi | `.pas`, `.dpr`, `.dpk`, `.lpr` | Full support (classes, records, interfaces, enums, DFM/FMX form files) |
|
|
543
|
+
| Lua | `.lua` | Full support (functions, methods with receivers, local variables, `require` imports, call edges) |
|
|
544
|
+
| Luau | `.luau` | Full support (everything in Lua, plus `type`/`export type` aliases, typed signatures, and Roblox instance-path `require`) |
|
|
545
|
+
|
|
546
|
+
## Troubleshooting
|
|
547
|
+
|
|
548
|
+
**"SpecShip not initialized"** — Run `specship init` in your project directory first.
|
|
549
|
+
|
|
550
|
+
**Indexing is slow** — Check that `node_modules` and other large directories are excluded. Use `--quiet` to reduce output overhead.
|
|
551
|
+
|
|
552
|
+
**MCP hits `database is locked`** — current builds shouldn't: SpecShip bundles its own Node runtime and uses Node's built-in `node:sqlite` in WAL mode, where concurrent reads never block on a writer. If you still see it:
|
|
553
|
+
|
|
554
|
+
- **You're on an old (pre-0.9) install.** Reinstall: `npm i -g @selvakumaresra/specship@0.1.0`.
|
|
555
|
+
- **`specship status` shows `Journal:` other than `wal`** — WAL couldn't be enabled on this filesystem (common on network shares and WSL2 `/mnt`), so reads can block on writes. Move the project (with its `.specship/` folder) onto a local disk.
|
|
556
|
+
|
|
557
|
+
**MCP server not connecting** — Ensure the project is initialized/indexed, verify the path in your MCP config, and check that `specship serve --mcp` works from the command line.
|
|
558
|
+
|
|
559
|
+
**Missing symbols** — The MCP server auto-syncs on save (wait a couple seconds). Run `specship sync` manually if needed. Check that the file's language is supported and isn't inside a `.gitignore`d or default-excluded directory (e.g. `node_modules`, `dist`).
|
|
560
|
+
|
|
561
|
+
## License
|
|
562
|
+
|
|
563
|
+
MIT
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
<div align="center">
|
|
568
|
+
|
|
569
|
+
**Made for Claude Code**
|
|
570
|
+
|
|
571
|
+
[Report Bug](https://github.com/selvakumarEsra/specship/issues) · [Request Feature](https://github.com/selvakumarEsra/specship/issues)
|
|
572
|
+
|
|
573
|
+
</div>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specship-explorer
|
|
3
|
+
description: Use to answer structural / flow / impact questions about the codebase ("how does X reach Y", "who calls Z", "what breaks if I change W", "explore the area around N"). This agent has NO access to Read, Grep, Glob, or Edit — it can only query SpecShip's MCP tools. Dispatch to it when the question is a code-intelligence question, not a content question.
|
|
4
|
+
tools: mcp__specship__specship_explore, mcp__specship__specship_search, mcp__specship__specship_node, mcp__specship__specship_callers, mcp__specship__specship_callees, mcp__specship__specship_impact, mcp__specship__specship_files, mcp__specship__specship_status
|
|
5
|
+
model: inherit
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are **specship-explorer**. You answer questions about a codebase using only SpecShip's MCP tools — you have no Read, Grep, Glob, or shell access. The graph is a pre-built index of every symbol, file, and edge in the project; trust it.
|
|
9
|
+
|
|
10
|
+
# How to think
|
|
11
|
+
|
|
12
|
+
Pick the tool by intent:
|
|
13
|
+
|
|
14
|
+
- **`specship_explore`** — almost everything. "How does X work?" "How does X reach Y?" (a flow). "What's in this area?" Pass a precise bag of symbol names (include `Class.method` qualified forms when known). Explore returns the relevant symbols' source grouped by file, plus a Flow section when the names span a connected path. Treat returned source as already Read.
|
|
15
|
+
- **`specship_search`** — locate a symbol when you don't know the exact name. Returns matches; pick one and feed it to explore or node.
|
|
16
|
+
- **`specship_node`** — full source of one specific symbol, including ALL its overloads in a single response. Use this when explore truncates.
|
|
17
|
+
- **`specship_callers`** — direct callers of a symbol (one hop). For "who calls X."
|
|
18
|
+
- **`specship_callees`** — what a symbol calls (one hop). For "what does X do."
|
|
19
|
+
- **`specship_impact`** — transitive blast radius. Use before editing a symbol to scope what could break.
|
|
20
|
+
- **`specship_files`** — list project files. Use sparingly; usually explore is better.
|
|
21
|
+
- **`specship_status`** — index freshness, backend, node/edge counts. Use when you suspect stale data.
|
|
22
|
+
|
|
23
|
+
# Rules
|
|
24
|
+
|
|
25
|
+
1. **Never apologize for not having Read/Grep.** Your job is exactly to answer without them. If the user's question requires reading a file's literal bytes (e.g., "what's the syntax on line 42"), say so plainly and recommend they hand the question to the main agent.
|
|
26
|
+
2. **One symbol bag per explore call.** If the question spans two flows, make two calls — don't smear them.
|
|
27
|
+
3. **If a flow doesn't connect statically, that IS the answer.** SpecShip's heuristic synthesizers cover most dynamic dispatch; if even they don't bridge it, the connection is purely runtime and your answer should say so. Don't fall back to guessing.
|
|
28
|
+
4. **Lead with the answer, not the methodology.** Give the user the actual call path / impact list / symbol body first. The "I ran these tools" narrative is noise.
|
|
29
|
+
5. **Cite by `file:line`.** Every claim about a symbol's location should include `path/to/file.ts:42` so the user can jump to it.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: List spec→code links in concerning states (drifted, broken, orphaned). The non-coder review queue.
|
|
3
|
+
argument-hint: [--state drifted,broken,orphaned] [--limit N]
|
|
4
|
+
allowed-tools: mcp__specship__specship_drifted, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# SpecShip Drift Queue
|
|
8
|
+
|
|
9
|
+
Call `mcp__specship__specship_drifted` to list spec links that need attention.
|
|
10
|
+
|
|
11
|
+
For a quick CLI view instead, run:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
specship drifted $ARGUMENTS
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Add `--fail-on=broken,drifted,orphaned` to make it exit non-zero — useful as a pre-commit or CI gate.
|
|
18
|
+
|
|
19
|
+
For each link returned:
|
|
20
|
+
- **drifted (drift_axis=spec)**: spec body changed; the code may be stale. Run `/cg-fix <SPEC_ID>` to investigate.
|
|
21
|
+
- **drifted (drift_axis=code)**: code's signature changed since the link was set. Re-verify with `mcp__specship__specship_link_verify` if behavior is still correct.
|
|
22
|
+
- **broken**: verification failed. Open the spec, find the failing test, fix the code.
|
|
23
|
+
- **orphaned**: target symbol no longer exists. Use `/cg-relink <SPEC_ID>` to re-attach.
|