speckit-assistant 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.
Files changed (180) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-build-manifest.json +71 -0
  3. package/.next/app-path-routes-manifest.json +10 -0
  4. package/.next/build-manifest.json +33 -0
  5. package/.next/cache/.previewinfo +1 -0
  6. package/.next/cache/.rscinfo +1 -0
  7. package/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/.next/cache/webpack/client-production/1.pack +0 -0
  9. package/.next/cache/webpack/client-production/10.pack +0 -0
  10. package/.next/cache/webpack/client-production/11.pack +0 -0
  11. package/.next/cache/webpack/client-production/12.pack +0 -0
  12. package/.next/cache/webpack/client-production/13.pack +0 -0
  13. package/.next/cache/webpack/client-production/14.pack +0 -0
  14. package/.next/cache/webpack/client-production/15.pack +0 -0
  15. package/.next/cache/webpack/client-production/16.pack +0 -0
  16. package/.next/cache/webpack/client-production/17.pack +0 -0
  17. package/.next/cache/webpack/client-production/18.pack +0 -0
  18. package/.next/cache/webpack/client-production/19.pack +0 -0
  19. package/.next/cache/webpack/client-production/2.pack +0 -0
  20. package/.next/cache/webpack/client-production/20.pack +0 -0
  21. package/.next/cache/webpack/client-production/21.pack +0 -0
  22. package/.next/cache/webpack/client-production/22.pack +0 -0
  23. package/.next/cache/webpack/client-production/3.pack +0 -0
  24. package/.next/cache/webpack/client-production/4.pack +0 -0
  25. package/.next/cache/webpack/client-production/5.pack +0 -0
  26. package/.next/cache/webpack/client-production/6.pack +0 -0
  27. package/.next/cache/webpack/client-production/7.pack +0 -0
  28. package/.next/cache/webpack/client-production/8.pack +0 -0
  29. package/.next/cache/webpack/client-production/9.pack +0 -0
  30. package/.next/cache/webpack/client-production/index.pack +0 -0
  31. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  32. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  33. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  34. package/.next/cache/webpack/server-production/0.pack +0 -0
  35. package/.next/cache/webpack/server-production/1.pack +0 -0
  36. package/.next/cache/webpack/server-production/10.pack +0 -0
  37. package/.next/cache/webpack/server-production/11.pack +0 -0
  38. package/.next/cache/webpack/server-production/12.pack +0 -0
  39. package/.next/cache/webpack/server-production/13.pack +0 -0
  40. package/.next/cache/webpack/server-production/14.pack +0 -0
  41. package/.next/cache/webpack/server-production/15.pack +0 -0
  42. package/.next/cache/webpack/server-production/16.pack +0 -0
  43. package/.next/cache/webpack/server-production/17.pack +0 -0
  44. package/.next/cache/webpack/server-production/18.pack +0 -0
  45. package/.next/cache/webpack/server-production/19.pack +0 -0
  46. package/.next/cache/webpack/server-production/2.pack +0 -0
  47. package/.next/cache/webpack/server-production/20.pack +0 -0
  48. package/.next/cache/webpack/server-production/3.pack +0 -0
  49. package/.next/cache/webpack/server-production/4.pack +0 -0
  50. package/.next/cache/webpack/server-production/5.pack +0 -0
  51. package/.next/cache/webpack/server-production/6.pack +0 -0
  52. package/.next/cache/webpack/server-production/7.pack +0 -0
  53. package/.next/cache/webpack/server-production/8.pack +0 -0
  54. package/.next/cache/webpack/server-production/9.pack +0 -0
  55. package/.next/cache/webpack/server-production/index.pack +0 -0
  56. package/.next/cache/webpack/server-production/index.pack.old +0 -0
  57. package/.next/diagnostics/build-diagnostics.json +6 -0
  58. package/.next/diagnostics/framework.json +1 -0
  59. package/.next/export-marker.json +6 -0
  60. package/.next/images-manifest.json +58 -0
  61. package/.next/next-minimal-server.js.nft.json +1 -0
  62. package/.next/next-server.js.nft.json +1 -0
  63. package/.next/package.json +1 -0
  64. package/.next/prerender-manifest.json +61 -0
  65. package/.next/react-loadable-manifest.json +1 -0
  66. package/.next/required-server-files.json +320 -0
  67. package/.next/routes-manifest.json +53 -0
  68. package/.next/server/app/_not-found/page.js +2 -0
  69. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  70. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  71. package/.next/server/app/_not-found.html +1 -0
  72. package/.next/server/app/_not-found.meta +8 -0
  73. package/.next/server/app/_not-found.rsc +15 -0
  74. package/.next/server/app/api/feature/route.js +1 -0
  75. package/.next/server/app/api/feature/route.js.nft.json +1 -0
  76. package/.next/server/app/api/feature/route_client-reference-manifest.js +1 -0
  77. package/.next/server/app/api/file/route.js +1 -0
  78. package/.next/server/app/api/file/route.js.nft.json +1 -0
  79. package/.next/server/app/api/file/route_client-reference-manifest.js +1 -0
  80. package/.next/server/app/api/phase/route.js +4 -0
  81. package/.next/server/app/api/phase/route.js.nft.json +1 -0
  82. package/.next/server/app/api/phase/route_client-reference-manifest.js +1 -0
  83. package/.next/server/app/api/state/route.js +1 -0
  84. package/.next/server/app/api/state/route.js.nft.json +1 -0
  85. package/.next/server/app/api/state/route_client-reference-manifest.js +1 -0
  86. package/.next/server/app/api/state/watch/route.js +4 -0
  87. package/.next/server/app/api/state/watch/route.js.nft.json +1 -0
  88. package/.next/server/app/api/state/watch/route_client-reference-manifest.js +1 -0
  89. package/.next/server/app/api/task/route.js +1 -0
  90. package/.next/server/app/api/task/route.js.nft.json +1 -0
  91. package/.next/server/app/api/task/route_client-reference-manifest.js +1 -0
  92. package/.next/server/app/index.html +1 -0
  93. package/.next/server/app/index.meta +7 -0
  94. package/.next/server/app/index.rsc +20 -0
  95. package/.next/server/app/page.js +14 -0
  96. package/.next/server/app/page.js.nft.json +1 -0
  97. package/.next/server/app/page_client-reference-manifest.js +1 -0
  98. package/.next/server/app-paths-manifest.json +10 -0
  99. package/.next/server/chunks/355.js +22 -0
  100. package/.next/server/chunks/6.js +9 -0
  101. package/.next/server/chunks/607.js +6 -0
  102. package/.next/server/chunks/643.js +1 -0
  103. package/.next/server/chunks/897.js +9 -0
  104. package/.next/server/functions-config-manifest.json +4 -0
  105. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  106. package/.next/server/middleware-build-manifest.js +1 -0
  107. package/.next/server/middleware-manifest.json +6 -0
  108. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  109. package/.next/server/next-font-manifest.js +1 -0
  110. package/.next/server/next-font-manifest.json +1 -0
  111. package/.next/server/pages/404.html +1 -0
  112. package/.next/server/pages/500.html +1 -0
  113. package/.next/server/pages/_app.js +1 -0
  114. package/.next/server/pages/_app.js.nft.json +1 -0
  115. package/.next/server/pages/_document.js +1 -0
  116. package/.next/server/pages/_document.js.nft.json +1 -0
  117. package/.next/server/pages/_error.js +19 -0
  118. package/.next/server/pages/_error.js.nft.json +1 -0
  119. package/.next/server/pages-manifest.json +6 -0
  120. package/.next/server/server-reference-manifest.js +1 -0
  121. package/.next/server/server-reference-manifest.json +1 -0
  122. package/.next/server/webpack-runtime.js +1 -0
  123. package/.next/static/chunks/590-a6568595ecd2a994.js +1 -0
  124. package/.next/static/chunks/8381d2c4-9707dccab70b742b.js +1 -0
  125. package/.next/static/chunks/920-f9bfc1b0d0402c3e.js +1 -0
  126. package/.next/static/chunks/acfafb44-8249079a6627ac92.js +1 -0
  127. package/.next/static/chunks/app/_not-found/page-be798b363e27e8c5.js +1 -0
  128. package/.next/static/chunks/app/api/feature/route-bb3c1a82e892ab58.js +1 -0
  129. package/.next/static/chunks/app/api/file/route-bb3c1a82e892ab58.js +1 -0
  130. package/.next/static/chunks/app/api/phase/route-bb3c1a82e892ab58.js +1 -0
  131. package/.next/static/chunks/app/api/state/route-bb3c1a82e892ab58.js +1 -0
  132. package/.next/static/chunks/app/api/state/watch/route-bb3c1a82e892ab58.js +1 -0
  133. package/.next/static/chunks/app/api/task/route-bb3c1a82e892ab58.js +1 -0
  134. package/.next/static/chunks/app/layout-3226c76a5f7f74bc.js +1 -0
  135. package/.next/static/chunks/app/page-8a5248f7704cde29.js +1 -0
  136. package/.next/static/chunks/framework-20dd4f6054cc5446.js +1 -0
  137. package/.next/static/chunks/main-91029f76ac1b7110.js +1 -0
  138. package/.next/static/chunks/main-app-b9ad56d6b1dfa941.js +1 -0
  139. package/.next/static/chunks/pages/_app-aa33dc41c3472021.js +1 -0
  140. package/.next/static/chunks/pages/_error-78b0b3b591df0e73.js +1 -0
  141. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  142. package/.next/static/chunks/webpack-c460f8e58a9e9eff.js +1 -0
  143. package/.next/static/css/008a05b0ad6b854a.css +31 -0
  144. package/.next/static/css/6fd2e11db3a59771.css +3 -0
  145. package/.next/static/fWuQ3yoHovA7Cre6u89W7/_buildManifest.js +1 -0
  146. package/.next/static/fWuQ3yoHovA7Cre6u89W7/_ssgManifest.js +1 -0
  147. package/.next/trace +3 -0
  148. package/.next/types/app/api/feature/route.ts +347 -0
  149. package/.next/types/app/api/file/route.ts +347 -0
  150. package/.next/types/app/api/phase/route.ts +347 -0
  151. package/.next/types/app/api/state/route.ts +347 -0
  152. package/.next/types/app/api/state/watch/route.ts +347 -0
  153. package/.next/types/app/api/task/route.ts +347 -0
  154. package/.next/types/app/layout.ts +84 -0
  155. package/.next/types/app/page.ts +84 -0
  156. package/.next/types/cache-life.d.ts +141 -0
  157. package/.next/types/package.json +1 -0
  158. package/.next/types/routes.d.ts +78 -0
  159. package/.next/types/validator.ts +124 -0
  160. package/LICENSE +21 -0
  161. package/README.md +284 -0
  162. package/bin/adapters/di.js +9 -0
  163. package/bin/adapters/primary/api/utils.js +57 -0
  164. package/bin/adapters/secondary/agent/ProcessAgentRunner.js +161 -0
  165. package/bin/adapters/secondary/fs/FSWorkspaceRepository.js +283 -0
  166. package/bin/app/api/feature/route.js +35 -0
  167. package/bin/app/api/file/route.js +36 -0
  168. package/bin/app/api/phase/route.js +55 -0
  169. package/bin/app/api/state/route.js +28 -0
  170. package/bin/app/api/state/watch/route.js +92 -0
  171. package/bin/app/api/task/route.js +20 -0
  172. package/bin/bin/cli.js +317 -0
  173. package/bin/cli.js +85 -0
  174. package/bin/domain/models/types.js +2 -0
  175. package/bin/domain/ports/in/WorkflowUseCases.js +2 -0
  176. package/bin/domain/ports/out/AgentRunnerPort.js +2 -0
  177. package/bin/domain/ports/out/WorkspaceRepositoryPort.js +2 -0
  178. package/bin/domain/services/WorkflowService.js +174 -0
  179. package/next.config.ts +13 -0
  180. package/package.json +53 -0
@@ -0,0 +1,78 @@
1
+ // This file is generated automatically by Next.js
2
+ // Do not edit this file manually
3
+
4
+ type AppRoutes = "/"
5
+ type AppRouteHandlerRoutes = "/api/feature" | "/api/file" | "/api/phase" | "/api/state" | "/api/state/watch" | "/api/task"
6
+ type PageRoutes = never
7
+ type LayoutRoutes = "/"
8
+ type RedirectRoutes = never
9
+ type RewriteRoutes = never
10
+ type Routes = AppRoutes | PageRoutes | LayoutRoutes | RedirectRoutes | RewriteRoutes | AppRouteHandlerRoutes
11
+
12
+
13
+ interface ParamMap {
14
+ "/": {}
15
+ "/api/feature": {}
16
+ "/api/file": {}
17
+ "/api/phase": {}
18
+ "/api/state": {}
19
+ "/api/state/watch": {}
20
+ "/api/task": {}
21
+ }
22
+
23
+
24
+ export type ParamsOf<Route extends Routes> = ParamMap[Route]
25
+
26
+ interface LayoutSlotMap {
27
+ "/": never
28
+ }
29
+
30
+
31
+ export type { AppRoutes, PageRoutes, LayoutRoutes, RedirectRoutes, RewriteRoutes, ParamMap, AppRouteHandlerRoutes }
32
+
33
+ declare global {
34
+ /**
35
+ * Props for Next.js App Router page components
36
+ * @example
37
+ * ```tsx
38
+ * export default function Page(props: PageProps<'/blog/[slug]'>) {
39
+ * const { slug } = await props.params
40
+ * return <div>Blog post: {slug}</div>
41
+ * }
42
+ * ```
43
+ */
44
+ interface PageProps<AppRoute extends AppRoutes> {
45
+ params: Promise<ParamMap[AppRoute]>
46
+ searchParams: Promise<Record<string, string | string[] | undefined>>
47
+ }
48
+
49
+ /**
50
+ * Props for Next.js App Router layout components
51
+ * @example
52
+ * ```tsx
53
+ * export default function Layout(props: LayoutProps<'/dashboard'>) {
54
+ * return <div>{props.children}</div>
55
+ * }
56
+ * ```
57
+ */
58
+ type LayoutProps<LayoutRoute extends LayoutRoutes> = {
59
+ params: Promise<ParamMap[LayoutRoute]>
60
+ children: React.ReactNode
61
+ } & {
62
+ [K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
63
+ }
64
+
65
+ /**
66
+ * Context for Next.js App Router route handlers
67
+ * @example
68
+ * ```tsx
69
+ * export async function GET(request: NextRequest, context: RouteContext<'/api/users/[id]'>) {
70
+ * const { id } = await context.params
71
+ * return Response.json({ id })
72
+ * }
73
+ * ```
74
+ */
75
+ interface RouteContext<AppRouteHandlerRoute extends AppRouteHandlerRoutes> {
76
+ params: Promise<ParamMap[AppRouteHandlerRoute]>
77
+ }
78
+ }
@@ -0,0 +1,124 @@
1
+ // This file is generated automatically by Next.js
2
+ // Do not edit this file manually
3
+ // This file validates that all pages and layouts export the correct types
4
+
5
+ import type { AppRoutes, LayoutRoutes, ParamMap, AppRouteHandlerRoutes } from "./routes.js"
6
+ import type { ResolvingMetadata, ResolvingViewport } from "next/types.js"
7
+ import type { NextRequest } from 'next/server.js'
8
+
9
+ type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
10
+ default: React.ComponentType<{ params: Promise<ParamMap[Route]> } & any> | ((props: { params: Promise<ParamMap[Route]> } & any) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
11
+ generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
12
+ generateMetadata?: (
13
+ props: { params: Promise<ParamMap[Route]> } & any,
14
+ parent: ResolvingMetadata
15
+ ) => Promise<any> | any
16
+ generateViewport?: (
17
+ props: { params: Promise<ParamMap[Route]> } & any,
18
+ parent: ResolvingViewport
19
+ ) => Promise<any> | any
20
+ metadata?: any
21
+ viewport?: any
22
+ }
23
+
24
+ type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
25
+ default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
26
+ generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
27
+ generateMetadata?: (
28
+ props: { params: Promise<ParamMap[Route]> } & any,
29
+ parent: ResolvingMetadata
30
+ ) => Promise<any> | any
31
+ generateViewport?: (
32
+ props: { params: Promise<ParamMap[Route]> } & any,
33
+ parent: ResolvingViewport
34
+ ) => Promise<any> | any
35
+ metadata?: any
36
+ viewport?: any
37
+ }
38
+
39
+ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRoutes> = {
40
+ GET?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
41
+ POST?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
42
+ PUT?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
43
+ PATCH?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
44
+ DELETE?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
45
+ HEAD?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
46
+ OPTIONS?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
47
+ }
48
+
49
+
50
+ // Validate ../../src/app/page.tsx
51
+ {
52
+ type __IsExpected<Specific extends AppPageConfig<"/">> = Specific
53
+ const handler = {} as typeof import("../../src/app/page.js")
54
+ type __Check = __IsExpected<typeof handler>
55
+ // @ts-ignore
56
+ type __Unused = __Check
57
+ }
58
+
59
+ // Validate ../../src/app/api/feature/route.ts
60
+ {
61
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/feature">> = Specific
62
+ const handler = {} as typeof import("../../src/app/api/feature/route.js")
63
+ type __Check = __IsExpected<typeof handler>
64
+ // @ts-ignore
65
+ type __Unused = __Check
66
+ }
67
+
68
+ // Validate ../../src/app/api/file/route.ts
69
+ {
70
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/file">> = Specific
71
+ const handler = {} as typeof import("../../src/app/api/file/route.js")
72
+ type __Check = __IsExpected<typeof handler>
73
+ // @ts-ignore
74
+ type __Unused = __Check
75
+ }
76
+
77
+ // Validate ../../src/app/api/phase/route.ts
78
+ {
79
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/phase">> = Specific
80
+ const handler = {} as typeof import("../../src/app/api/phase/route.js")
81
+ type __Check = __IsExpected<typeof handler>
82
+ // @ts-ignore
83
+ type __Unused = __Check
84
+ }
85
+
86
+ // Validate ../../src/app/api/state/route.ts
87
+ {
88
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/state">> = Specific
89
+ const handler = {} as typeof import("../../src/app/api/state/route.js")
90
+ type __Check = __IsExpected<typeof handler>
91
+ // @ts-ignore
92
+ type __Unused = __Check
93
+ }
94
+
95
+ // Validate ../../src/app/api/state/watch/route.ts
96
+ {
97
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/state/watch">> = Specific
98
+ const handler = {} as typeof import("../../src/app/api/state/watch/route.js")
99
+ type __Check = __IsExpected<typeof handler>
100
+ // @ts-ignore
101
+ type __Unused = __Check
102
+ }
103
+
104
+ // Validate ../../src/app/api/task/route.ts
105
+ {
106
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/task">> = Specific
107
+ const handler = {} as typeof import("../../src/app/api/task/route.js")
108
+ type __Check = __IsExpected<typeof handler>
109
+ // @ts-ignore
110
+ type __Unused = __Check
111
+ }
112
+
113
+
114
+
115
+
116
+
117
+ // Validate ../../src/app/layout.tsx
118
+ {
119
+ type __IsExpected<Specific extends LayoutConfig<"/">> = Specific
120
+ const handler = {} as typeof import("../../src/app/layout.js")
121
+ type __Check = __IsExpected<typeof handler>
122
+ // @ts-ignore
123
+ type __Unused = __Check
124
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 speckit-assistant contributors
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,284 @@
1
+ # ๐ŸŒฑ SpecKit Assistant
2
+
3
+ > **Visual Orchestrator for Spec-Driven Development (SDD)** โ€” Decoupled Hexagonal Architecture, Next.js 15, ReactFlow, and Multi-Agent Orchestration.
4
+
5
+ ---
6
+
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
+ [![Coverage Status](https://img.shields.io/badge/Coverage-99.44%25-brightgreen.svg)](https://github.com/dmux/speckit-assistant)
9
+ [![Node Version](https://img.shields.io/badge/Node-%3E%3D%2018.0.0-blue.svg)](https://nodejs.org)
10
+ [![Framework](https://img.shields.io/badge/Framework-Next.js%2015-black.svg)](https://nextjs.org)
11
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](#contributing)
12
+
13
+ ---
14
+
15
+ ### ๐ŸŒ Project Overview
16
+
17
+ **SpecKit Assistant** is a visual orchestrator for **Spec-Driven Development (SDD)**. It connects your local specification, planning, and task checklists with AI agents (Claude, Gemini, Copilot) through a modern, Vercel-style dashboard. By utilizing **Hexagonal Architecture**, it fully decouples the core domain rules from UI and external runners, ensuring that your local file system remains the single source of truth at all times.
18
+
19
+ ---
20
+
21
+ ## ๐Ÿ“– Table of Contents
22
+
23
+ 1. [Core Concept & SDD Flow](#-core-concept--sdd-flow)
24
+ 2. [Key Features](#-key-features)
25
+ 3. [User Interface Screenshots](#-user-interface-screenshots)
26
+ 4. [Architecture (Hexagonal / Ports & Adapters)](#-architecture-hexagonal--ports--adapters)
27
+ 5. [Installation & Setup](#-installation--setup)
28
+ 6. [How to Publish to npmjs](#-how-to-publish-to-npmjs)
29
+ 7. [CLI Usage](#-cli-usage)
30
+ 8. [Workspace Anatomy](#-workspace-anatomy)
31
+ 9. [Testing & Quality Assurance](#-testing--quality-assurance)
32
+ 10. [License](#-license)
33
+
34
+ ---
35
+
36
+ ## ๐ŸŽฏ Core Concept & SDD Flow
37
+
38
+ **Spec-Driven Development (SDD)** is a software engineering methodology that uses structured markdown documents to guide AI agents and human developers sequentially through software lifecycle stages:
39
+
40
+ ```mermaid
41
+ graph TD
42
+ A[1. Constitution] --> B[2. Specification]
43
+ B --> C[3. Planning]
44
+ C --> D[4. Tasks]
45
+ D --> E[5. Implementation]
46
+ ```
47
+
48
+ 1. **Constitution**: Establish project-wide principles, tech stack, and constraints.
49
+ 2. **Specification**: Document user requirements and features in detail.
50
+ 3. **Planning**: Outline technical implementation decisions and file modifications.
51
+ 4. **Tasks**: Break down plans into an actionable checklist of developer-ready tasks.
52
+ 5. **Implementation**: Execute tasks and generate clean code.
53
+
54
+ SpecKit Assistant acts as the **Visual Dashboard** and **Command-Line Interface** to run, approve, and track these phases, syncing seamlessly with your local file system.
55
+
56
+ ---
57
+
58
+ ## โœจ Key Features
59
+
60
+ * ๐ŸŽจ **Premium UI/UX**: High-fidelity dark and light themes styled with a sleek, minimalist Vercel aesthetic.
61
+ * ๐Ÿ—บ๏ธ **Interactive ReactFlow DAG Map**: Visualizes the dependencies and status of every feature's development lifecycle.
62
+ * ๐Ÿ“‹ **Drag-and-Drop Kanban Board**: Progress features forward (auto-approving intermediate steps and launching agents) or roll them back (marking downstream files as stale) by simple drag-and-drop.
63
+ * ๐Ÿค– **Agnostic Agent Dispatcher**: Spawn executions via terminal subshells for Anthropic's **Claude CLI**, Google's **Gemini CLI**, **GitHub Copilot CLI**, or custom CLI wrappers.
64
+ * ๐Ÿ“ **WYSIWYG Markdown Editor**: Edit specifications or plans with a formatting toolbar (Bold, Italic, Headings, Code Blocks, Tables, Checklists), with support for alternating-row Vercel-style tables.
65
+ * ๐Ÿ”„ **Conflict & Change Guard**: A live watcher (`chokidar` + SSE) detects external changes on disk and alerts you in case of editing conflicts.
66
+ * ๐Ÿ’พ **Persistent State**: Automatically remembers your active workspace inside `~/.speckit-assistant-config.json`.
67
+
68
+ ---
69
+
70
+ ## ๐Ÿ–ฅ๏ธ User Interface Screenshots
71
+
72
+ ### Kanban Board View (Interactive state progression)
73
+ ![Kanban Board View](docs/screenshot1.png)
74
+
75
+ ### ReactFlow DAG Map View (Feature dependency tracking)
76
+ ![ReactFlow DAG Map View](docs/screenshot2.png)
77
+
78
+ ---
79
+
80
+ ## ๐Ÿ›๏ธ Architecture (Hexagonal / Ports & Adapters)
81
+
82
+ To prevent coupling our core workflows to UI libraries, Next.js, or file system APIs, SpecKit Assistant is built using **Hexagonal Architecture**.
83
+
84
+ ```text
85
+ src/
86
+ โ”œโ”€โ”€ domain/ # Core business rules
87
+ โ”‚ โ”œโ”€โ”€ models/ # Types (Feature, Phase, Task)
88
+ โ”‚ โ””โ”€โ”€ ports/ # Ports (Interfaces)
89
+ โ”‚ โ”œโ”€โ”€ in/ # Inbound use cases (GetWorkflowState, RunPhase)
90
+ โ”‚ โ””โ”€โ”€ out/ # Outbound SPIs (WorkspaceRepository, AgentRunner)
91
+ โ”œโ”€โ”€ adapters/ # Infrastructure implementations
92
+ โ”‚ โ”œโ”€โ”€ primary/ # Next.js API controllers, React/ReactFlow UI
93
+ โ”‚ โ””โ”€โ”€ secondary/ # File system sync, Process spawners
94
+ ```
95
+
96
+ For a detailed analysis of our architectural decisions, read our **Architecture Decision Records (ADRs)**:
97
+
98
+ * [ADR 001: Hexagonal Architecture (Ports and Adapters)](docs/adr-001-hexagonal-architecture.md)
99
+ * [ADR 002: State Synchronization and Agent Dispatch](docs/adr-002-state-sync-and-agent-dispatch.md)
100
+
101
+ ---
102
+
103
+ ## โš™๏ธ Installation & Setup
104
+
105
+ ### Prerequisites
106
+
107
+ * **Node.js**: `v18.0.0` or higher
108
+ * **Package Manager**: `pnpm` (preferred), `npm` or `yarn`
109
+
110
+ ### ๐Ÿš€ Running Instantly via `npx`
111
+
112
+ You don't need to install or clone anything locally to run the assistant. Simply run it inside your target workspace using `npx`:
113
+
114
+ ```bash
115
+ npx speckit-assistant
116
+ ```
117
+ *(This will download the latest release, start the server on port `18080`, and open the Web UI in your browser.)*
118
+
119
+ ### ๐Ÿ› ๏ธ Local Development Quick Start
120
+
121
+ If you wish to modify the code or contribute to the project:
122
+
123
+ ```bash
124
+ # Clone the repository
125
+ git clone https://github.com/dmux/speckit-assistant.git
126
+ cd speckit-assistant
127
+
128
+ # Install dependencies using pnpm
129
+ pnpm install
130
+
131
+ # Compile the CLI and Next.js assets
132
+ pnpm run build
133
+
134
+ # Start the Web UI on the default port (18080)
135
+ pnpm start
136
+ ```
137
+
138
+ ---
139
+
140
+ ## ๐Ÿ“ฆ How to Publish to npmjs
141
+
142
+ To publish `speckit-assistant` under your own account/organization on npm so it can be run via `npx`:
143
+
144
+ ### 1. Authenticate with npm
145
+ Log in to your npm registry account (sign up at [npmjs.com](https://www.npmjs.com) if you haven't already):
146
+ ```bash
147
+ npm login
148
+ ```
149
+
150
+ ### 2. Verify and Configure the Package Name
151
+ Open [package.json](file:///Users/guru/work/dmux/speckit-assistant/package.json) and verify:
152
+ - `"name"`: Change this if the package name `speckit-assistant` is already taken, or if you want to publish under a scoped organization (e.g. `"@my-org/speckit-assistant"`).
153
+ - `"version"`: Bump the version number (e.g. `"0.1.1"`, `"1.0.0"`) every time you publish new changes.
154
+
155
+ ### 3. Build & Publish
156
+ Run the publish command. The configured `prepublishOnly` script will automatically compile the Next.js assets and TypeScript files before bundling and uploading the package:
157
+
158
+ ```bash
159
+ # For public packages
160
+ npm publish
161
+
162
+ # If using a scoped package (e.g. @my-org/speckit-assistant)
163
+ npm publish --access public
164
+ ```
165
+
166
+ ---
167
+
168
+ ## ๐Ÿ’ป CLI Usage
169
+
170
+ SpecKit Assistant comes with a powerful CLI. When installed globally, you can invoke it using `speckit-assistant` (or via local path `./bin/bin/cli.js`).
171
+
172
+ ### CLI Commands
173
+
174
+ * **Start the Web Server**:
175
+
176
+ ```bash
177
+ speckit-assistant
178
+ ```
179
+
180
+ Starts the Next.js server on port `18080` (avoids conflicts on Unix/Windows/macOS) and auto-opens `http://localhost:18080` in your default browser.
181
+
182
+ * **Check Workflow Status**:
183
+
184
+ ```bash
185
+ speckit-assistant status [-w <workspace-path>]
186
+ ```
187
+
188
+ Displays a terminal-based overview of your Constitution and feature phase statuses.
189
+
190
+ * **Approve a Phase**:
191
+
192
+ ```bash
193
+ speckit-assistant approve <phase> [feature-name]
194
+ ```
195
+
196
+ Marks a phase (e.g. `specification`, `planning`, `tasks`) as approved.
197
+
198
+ * **Discard/Reset a Phase**:
199
+
200
+ ```bash
201
+ speckit-assistant discard <phase> [feature-name]
202
+ ```
203
+
204
+ Resets the phase and marks all downstream phases as stale (e.g. discarding `specification` marks `planning`, `tasks`, and `implementation` as stale).
205
+
206
+ * **Create a New Feature**:
207
+
208
+ ```bash
209
+ speckit-assistant create <feature-name>
210
+ ```
211
+
212
+ Generates a new directory under `specs/<feature-name>` with template markdown files.
213
+
214
+ * **Run an Agent Phase**:
215
+
216
+ ```bash
217
+ speckit-assistant run <phase> [feature-name] --agent <claude|gemini|copilot> --prompt "refinement details"
218
+ ```
219
+
220
+ ### Command Options
221
+
222
+ * `-w, --workspace <path>`: Specify the target workspace directory. Defaults to the current directory, but persists the last-used workspace in `~/.speckit-assistant-config.json`.
223
+ * `-p, --port <number>`: Override the default port `18080` for the Web UI.
224
+ * `--agent <type>`: AI agent execution binary (default: `claude`).
225
+ * `--prompt <text>`: Feed specific refinements or custom instructions to the AI agent.
226
+
227
+ ---
228
+
229
+ ## ๐Ÿ“‚ Workspace Anatomy
230
+
231
+ SpecKit Assistant manages markdown files inside your target project workspace. Your workspace directory structure should follow this pattern:
232
+
233
+ ```text
234
+ my-project/
235
+ โ”œโ”€โ”€ .specify/
236
+ โ”‚ โ”œโ”€โ”€ memory/
237
+ โ”‚ โ”‚ โ””โ”€โ”€ constitution.md # Project-wide context & rules
238
+ โ”‚ โ””โ”€โ”€ .runtime/
239
+ โ”‚ โ””โ”€โ”€ workflow-state.json # Internal workflow cache (automatically managed)
240
+ โ””โ”€โ”€ specs/
241
+ โ”œโ”€โ”€ 001-user-authentication/
242
+ โ”‚ โ”œโ”€โ”€ spec.md # Feature requirements
243
+ โ”‚ โ”œโ”€โ”€ plan.md # Implementation strategy
244
+ โ”‚ โ””โ”€โ”€ tasks.md # Actionable checklists
245
+ โ””โ”€โ”€ 002-database-migration/
246
+ โ”œโ”€โ”€ spec.md
247
+ โ”œโ”€โ”€ plan.md
248
+ โ””โ”€โ”€ tasks.md
249
+ ```
250
+
251
+ ---
252
+
253
+ ## ๐Ÿงช Testing & Quality Assurance
254
+
255
+ SpecKit Assistant maintains a high bar for reliability and code health:
256
+
257
+ * **Vitest** for fast, concurrent unit and integration testing.
258
+ * **100% Mocked File Systems** in unit tests to prevent disk pollution.
259
+ * **Isolated temporary workspaces** for E2E tests, avoiding workspace write conflicts.
260
+
261
+ We boast **99.44% statement coverage** across our domain rules, API routers, process dispatchers, and repository adapters:
262
+
263
+ ```bash
264
+ # Run unit and integration tests
265
+ pnpm run test
266
+ ```
267
+
268
+ ### Coverage Report Details
269
+
270
+ ```text
271
+ โœ“ src/domain/services/WorkflowService.test.ts (9 tests)
272
+ โœ“ src/adapters/secondary/fs/FSWorkspaceRepository.test.ts (2 tests)
273
+ โœ“ src/app/api/api.test.ts (9 tests)
274
+
275
+ Test Files 3 passed (3)
276
+ Tests 20 passed (20)
277
+ Duration 511ms
278
+ ```
279
+
280
+ ---
281
+
282
+ ## ๐Ÿ“„ License
283
+
284
+ This project is licensed under the MIT License. See [LICENSE](LICENSE) for details.
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workflowService = void 0;
4
+ const FSWorkspaceRepository_1 = require("./secondary/fs/FSWorkspaceRepository");
5
+ const ProcessAgentRunner_1 = require("./secondary/agent/ProcessAgentRunner");
6
+ const WorkflowService_1 = require("../domain/services/WorkflowService");
7
+ const workspaceRepo = new FSWorkspaceRepository_1.FSWorkspaceRepository();
8
+ const agentRunner = new ProcessAgentRunner_1.ProcessAgentRunner();
9
+ exports.workflowService = new WorkflowService_1.WorkflowService(workspaceRepo, agentRunner);
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getWorkspacePath = getWorkspacePath;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ function getWorkspacePath() {
41
+ if (process.env.WORKSPACE_PATH) {
42
+ return process.env.WORKSPACE_PATH;
43
+ }
44
+ try {
45
+ const configPath = path.join(os.homedir(), '.speckit-assistant-config.json');
46
+ if (fs.existsSync(configPath)) {
47
+ const data = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
48
+ if (data.lastWorkspacePath) {
49
+ return data.lastWorkspacePath;
50
+ }
51
+ }
52
+ }
53
+ catch {
54
+ // ignore
55
+ }
56
+ return process.cwd();
57
+ }