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.
- package/.next/BUILD_ID +1 -0
- package/.next/app-build-manifest.json +71 -0
- package/.next/app-path-routes-manifest.json +10 -0
- package/.next/build-manifest.json +33 -0
- package/.next/cache/.previewinfo +1 -0
- package/.next/cache/.rscinfo +1 -0
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/10.pack +0 -0
- package/.next/cache/webpack/client-production/11.pack +0 -0
- package/.next/cache/webpack/client-production/12.pack +0 -0
- package/.next/cache/webpack/client-production/13.pack +0 -0
- package/.next/cache/webpack/client-production/14.pack +0 -0
- package/.next/cache/webpack/client-production/15.pack +0 -0
- package/.next/cache/webpack/client-production/16.pack +0 -0
- package/.next/cache/webpack/client-production/17.pack +0 -0
- package/.next/cache/webpack/client-production/18.pack +0 -0
- package/.next/cache/webpack/client-production/19.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/20.pack +0 -0
- package/.next/cache/webpack/client-production/21.pack +0 -0
- package/.next/cache/webpack/client-production/22.pack +0 -0
- package/.next/cache/webpack/client-production/3.pack +0 -0
- package/.next/cache/webpack/client-production/4.pack +0 -0
- package/.next/cache/webpack/client-production/5.pack +0 -0
- package/.next/cache/webpack/client-production/6.pack +0 -0
- package/.next/cache/webpack/client-production/7.pack +0 -0
- package/.next/cache/webpack/client-production/8.pack +0 -0
- package/.next/cache/webpack/client-production/9.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/1.pack +0 -0
- package/.next/cache/webpack/server-production/10.pack +0 -0
- package/.next/cache/webpack/server-production/11.pack +0 -0
- package/.next/cache/webpack/server-production/12.pack +0 -0
- package/.next/cache/webpack/server-production/13.pack +0 -0
- package/.next/cache/webpack/server-production/14.pack +0 -0
- package/.next/cache/webpack/server-production/15.pack +0 -0
- package/.next/cache/webpack/server-production/16.pack +0 -0
- package/.next/cache/webpack/server-production/17.pack +0 -0
- package/.next/cache/webpack/server-production/18.pack +0 -0
- package/.next/cache/webpack/server-production/19.pack +0 -0
- package/.next/cache/webpack/server-production/2.pack +0 -0
- package/.next/cache/webpack/server-production/20.pack +0 -0
- package/.next/cache/webpack/server-production/3.pack +0 -0
- package/.next/cache/webpack/server-production/4.pack +0 -0
- package/.next/cache/webpack/server-production/5.pack +0 -0
- package/.next/cache/webpack/server-production/6.pack +0 -0
- package/.next/cache/webpack/server-production/7.pack +0 -0
- package/.next/cache/webpack/server-production/8.pack +0 -0
- package/.next/cache/webpack/server-production/9.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +58 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +61 -0
- package/.next/react-loadable-manifest.json +1 -0
- package/.next/required-server-files.json +320 -0
- package/.next/routes-manifest.json +53 -0
- package/.next/server/app/_not-found/page.js +2 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +8 -0
- package/.next/server/app/_not-found.rsc +15 -0
- package/.next/server/app/api/feature/route.js +1 -0
- package/.next/server/app/api/feature/route.js.nft.json +1 -0
- package/.next/server/app/api/feature/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/file/route.js +1 -0
- package/.next/server/app/api/file/route.js.nft.json +1 -0
- package/.next/server/app/api/file/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/phase/route.js +4 -0
- package/.next/server/app/api/phase/route.js.nft.json +1 -0
- package/.next/server/app/api/phase/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/state/route.js +1 -0
- package/.next/server/app/api/state/route.js.nft.json +1 -0
- package/.next/server/app/api/state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/state/watch/route.js +4 -0
- package/.next/server/app/api/state/watch/route.js.nft.json +1 -0
- package/.next/server/app/api/state/watch/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/task/route.js +1 -0
- package/.next/server/app/api/task/route.js.nft.json +1 -0
- package/.next/server/app/api/task/route_client-reference-manifest.js +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +7 -0
- package/.next/server/app/index.rsc +20 -0
- package/.next/server/app/page.js +14 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +10 -0
- package/.next/server/chunks/355.js +22 -0
- package/.next/server/chunks/6.js +9 -0
- package/.next/server/chunks/607.js +6 -0
- package/.next/server/chunks/643.js +1 -0
- package/.next/server/chunks/897.js +9 -0
- package/.next/server/functions-config-manifest.json +4 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages/_app.js +1 -0
- package/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/server/pages/_document.js +1 -0
- package/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/server/pages/_error.js +19 -0
- package/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/server/pages-manifest.json +6 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/chunks/590-a6568595ecd2a994.js +1 -0
- package/.next/static/chunks/8381d2c4-9707dccab70b742b.js +1 -0
- package/.next/static/chunks/920-f9bfc1b0d0402c3e.js +1 -0
- package/.next/static/chunks/acfafb44-8249079a6627ac92.js +1 -0
- package/.next/static/chunks/app/_not-found/page-be798b363e27e8c5.js +1 -0
- package/.next/static/chunks/app/api/feature/route-bb3c1a82e892ab58.js +1 -0
- package/.next/static/chunks/app/api/file/route-bb3c1a82e892ab58.js +1 -0
- package/.next/static/chunks/app/api/phase/route-bb3c1a82e892ab58.js +1 -0
- package/.next/static/chunks/app/api/state/route-bb3c1a82e892ab58.js +1 -0
- package/.next/static/chunks/app/api/state/watch/route-bb3c1a82e892ab58.js +1 -0
- package/.next/static/chunks/app/api/task/route-bb3c1a82e892ab58.js +1 -0
- package/.next/static/chunks/app/layout-3226c76a5f7f74bc.js +1 -0
- package/.next/static/chunks/app/page-8a5248f7704cde29.js +1 -0
- package/.next/static/chunks/framework-20dd4f6054cc5446.js +1 -0
- package/.next/static/chunks/main-91029f76ac1b7110.js +1 -0
- package/.next/static/chunks/main-app-b9ad56d6b1dfa941.js +1 -0
- package/.next/static/chunks/pages/_app-aa33dc41c3472021.js +1 -0
- package/.next/static/chunks/pages/_error-78b0b3b591df0e73.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-c460f8e58a9e9eff.js +1 -0
- package/.next/static/css/008a05b0ad6b854a.css +31 -0
- package/.next/static/css/6fd2e11db3a59771.css +3 -0
- package/.next/static/fWuQ3yoHovA7Cre6u89W7/_buildManifest.js +1 -0
- package/.next/static/fWuQ3yoHovA7Cre6u89W7/_ssgManifest.js +1 -0
- package/.next/trace +3 -0
- package/.next/types/app/api/feature/route.ts +347 -0
- package/.next/types/app/api/file/route.ts +347 -0
- package/.next/types/app/api/phase/route.ts +347 -0
- package/.next/types/app/api/state/route.ts +347 -0
- package/.next/types/app/api/state/watch/route.ts +347 -0
- package/.next/types/app/api/task/route.ts +347 -0
- package/.next/types/app/layout.ts +84 -0
- package/.next/types/app/page.ts +84 -0
- package/.next/types/cache-life.d.ts +141 -0
- package/.next/types/package.json +1 -0
- package/.next/types/routes.d.ts +78 -0
- package/.next/types/validator.ts +124 -0
- package/LICENSE +21 -0
- package/README.md +284 -0
- package/bin/adapters/di.js +9 -0
- package/bin/adapters/primary/api/utils.js +57 -0
- package/bin/adapters/secondary/agent/ProcessAgentRunner.js +161 -0
- package/bin/adapters/secondary/fs/FSWorkspaceRepository.js +283 -0
- package/bin/app/api/feature/route.js +35 -0
- package/bin/app/api/file/route.js +36 -0
- package/bin/app/api/phase/route.js +55 -0
- package/bin/app/api/state/route.js +28 -0
- package/bin/app/api/state/watch/route.js +92 -0
- package/bin/app/api/task/route.js +20 -0
- package/bin/bin/cli.js +317 -0
- package/bin/cli.js +85 -0
- package/bin/domain/models/types.js +2 -0
- package/bin/domain/ports/in/WorkflowUseCases.js +2 -0
- package/bin/domain/ports/out/AgentRunnerPort.js +2 -0
- package/bin/domain/ports/out/WorkspaceRepositoryPort.js +2 -0
- package/bin/domain/services/WorkflowService.js +174 -0
- package/next.config.ts +13 -0
- 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
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://github.com/dmux/speckit-assistant)
|
|
9
|
+
[](https://nodejs.org)
|
|
10
|
+
[](https://nextjs.org)
|
|
11
|
+
[](#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
|
+

|
|
74
|
+
|
|
75
|
+
### ReactFlow DAG Map View (Feature dependency tracking)
|
|
76
|
+

|
|
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
|
+
}
|