@amistio/cli 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/README.md +12 -0
- package/dist/api-client.d.ts +175 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +116 -0
- package/dist/api-client.js.map +1 -0
- package/dist/bootstrap.d.ts +11 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +66 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/control-plane.d.ts +11 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +91 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/credential-store.d.ts +9 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +32 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +698 -0
- package/dist/index.js.map +1 -0
- package/dist/local-tool-runner.d.ts +93 -0
- package/dist/local-tool-runner.d.ts.map +1 -0
- package/dist/local-tool-runner.js +472 -0
- package/dist/local-tool-runner.js.map +1 -0
- package/dist/orchestrator.d.ts +7 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +61 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/session-policy.d.ts +20 -0
- package/dist/session-policy.d.ts.map +1 -0
- package/dist/session-policy.js +125 -0
- package/dist/session-policy.js.map +1 -0
- package/dist/sync.d.ts +33 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +279 -0
- package/dist/sync.js.map +1 -0
- package/dist/tool-session-store.d.ts +8 -0
- package/dist/tool-session-store.d.ts.map +1 -0
- package/dist/tool-session-store.js +38 -0
- package/dist/tool-session-store.js.map +1 -0
- package/dist/work-runner.d.ts +4 -0
- package/dist/work-runner.d.ts.map +1 -0
- package/dist/work-runner.js +100 -0
- package/dist/work-runner.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# @amistio/cli
|
|
2
|
+
|
|
3
|
+
The Amistio CLI runner pairs a local repository with an Amistio project, syncs project-brain files, and runs approved work on the user's machine.
|
|
4
|
+
|
|
5
|
+
Install the current beta runner:
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install -g @amistio/cli@beta
|
|
9
|
+
amistio --help
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The package install only installs the `amistio` command. Repository cloning, project pairing, credential storage, and runner execution happen only when the user explicitly runs commands such as `amistio bootstrap`, `amistio pair`, or `amistio run --watch`.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { type BrainDocumentItem, type GeneratedBrainArtifact, type GeneratedDraftItem, type RepositoryLinkItem, type ExecutionMode, type RunnerHeartbeatItem, type SessionDecision, type SessionPolicy, type SessionResumabilityScope, type ToolSessionItem, type WorkItem, type WorkStatus } from "@amistio/shared";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export interface ApiClientOptions {
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
accountId: string;
|
|
6
|
+
token?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface WorkStatusTelemetry {
|
|
9
|
+
executionMode?: ExecutionMode;
|
|
10
|
+
message?: string;
|
|
11
|
+
tool?: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
durationMs?: number;
|
|
14
|
+
costUsd?: number;
|
|
15
|
+
tokensIn?: number;
|
|
16
|
+
tokensOut?: number;
|
|
17
|
+
sessionPolicy?: SessionPolicy;
|
|
18
|
+
sessionGroupKey?: string;
|
|
19
|
+
toolSessionId?: string;
|
|
20
|
+
sessionDecision?: SessionDecision;
|
|
21
|
+
sessionDecisionReason?: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
export type BrainGenerationResultMutation = {
|
|
25
|
+
status: "completed";
|
|
26
|
+
runnerId: string;
|
|
27
|
+
idempotencyKey: string;
|
|
28
|
+
artifacts: GeneratedBrainArtifact[];
|
|
29
|
+
tool?: string;
|
|
30
|
+
durationMs?: number;
|
|
31
|
+
sessionPolicy?: SessionPolicy;
|
|
32
|
+
sessionGroupKey?: string;
|
|
33
|
+
toolSessionId?: string;
|
|
34
|
+
sessionDecision?: SessionDecision;
|
|
35
|
+
sessionDecisionReason?: string;
|
|
36
|
+
message?: string;
|
|
37
|
+
} | {
|
|
38
|
+
status: "failed";
|
|
39
|
+
runnerId: string;
|
|
40
|
+
idempotencyKey: string;
|
|
41
|
+
tool?: string;
|
|
42
|
+
durationMs?: number;
|
|
43
|
+
sessionPolicy?: SessionPolicy;
|
|
44
|
+
sessionGroupKey?: string;
|
|
45
|
+
toolSessionId?: string;
|
|
46
|
+
sessionDecision?: SessionDecision;
|
|
47
|
+
sessionDecisionReason?: string;
|
|
48
|
+
message?: string;
|
|
49
|
+
error?: string;
|
|
50
|
+
};
|
|
51
|
+
export interface ToolSessionMutation {
|
|
52
|
+
toolSessionId?: string;
|
|
53
|
+
repositoryLinkId?: string;
|
|
54
|
+
tool?: string;
|
|
55
|
+
provider?: string;
|
|
56
|
+
model?: string;
|
|
57
|
+
resumabilityScope?: SessionResumabilityScope;
|
|
58
|
+
title?: string;
|
|
59
|
+
summary?: string;
|
|
60
|
+
tags?: string[];
|
|
61
|
+
relatedDocumentIds?: string[];
|
|
62
|
+
status?: ToolSessionItem["status"];
|
|
63
|
+
createdByUserId?: string;
|
|
64
|
+
runnerId?: string;
|
|
65
|
+
lastWorkItemId?: string;
|
|
66
|
+
messageCount?: number;
|
|
67
|
+
estimatedInputTokens?: number;
|
|
68
|
+
estimatedOutputTokens?: number;
|
|
69
|
+
costUsd?: number;
|
|
70
|
+
sessionGroupKey?: string;
|
|
71
|
+
reusePolicy?: SessionPolicy;
|
|
72
|
+
closedReason?: string;
|
|
73
|
+
}
|
|
74
|
+
export type RunnerHeartbeatStatus = "online" | "offline" | "running" | "blocked";
|
|
75
|
+
export declare class ApiClient {
|
|
76
|
+
private readonly options;
|
|
77
|
+
constructor(options: ApiClientOptions);
|
|
78
|
+
createPairingSession(projectId: string): Promise<{
|
|
79
|
+
pairingCode: string;
|
|
80
|
+
expiresAt: string;
|
|
81
|
+
}>;
|
|
82
|
+
consumePairingSession(input: {
|
|
83
|
+
projectId: string;
|
|
84
|
+
pairingCode: string;
|
|
85
|
+
repositoryLinkId: string;
|
|
86
|
+
repoName: string;
|
|
87
|
+
repoFingerprint: string;
|
|
88
|
+
defaultBranch: string;
|
|
89
|
+
}): Promise<{
|
|
90
|
+
repositoryLink: RepositoryLinkItem;
|
|
91
|
+
token: string;
|
|
92
|
+
}>;
|
|
93
|
+
claimWork(projectId: string, runnerId: string, repositoryLinkId: string, leaseSeconds?: number): Promise<{
|
|
94
|
+
workItem: WorkItem | undefined;
|
|
95
|
+
}>;
|
|
96
|
+
listWorkItems(projectId: string): Promise<{
|
|
97
|
+
workItems: WorkItem[];
|
|
98
|
+
}>;
|
|
99
|
+
listBrainDocuments(projectId: string): Promise<{
|
|
100
|
+
documents: BrainDocumentItem[];
|
|
101
|
+
}>;
|
|
102
|
+
pushBrainDocuments(projectId: string, documents: BrainDocumentItem[]): Promise<{
|
|
103
|
+
documents: BrainDocumentItem[];
|
|
104
|
+
}>;
|
|
105
|
+
sendRunnerHeartbeat(projectId: string, runnerId: string, repositoryLinkId: string, status: RunnerHeartbeatStatus, version?: string): Promise<{
|
|
106
|
+
runner: RunnerHeartbeatItem;
|
|
107
|
+
}>;
|
|
108
|
+
listToolSessions(projectId: string): Promise<{
|
|
109
|
+
toolSessions: ToolSessionItem[];
|
|
110
|
+
}>;
|
|
111
|
+
createToolSession(projectId: string, session: Required<Pick<ToolSessionMutation, "tool" | "title">> & ToolSessionMutation): Promise<{
|
|
112
|
+
toolSession: ToolSessionItem;
|
|
113
|
+
}>;
|
|
114
|
+
updateToolSession(projectId: string, toolSessionId: string, session: ToolSessionMutation): Promise<{
|
|
115
|
+
toolSession: ToolSessionItem;
|
|
116
|
+
}>;
|
|
117
|
+
updateWorkStatus(projectId: string, workItemId: string, status: WorkStatus, idempotencyKey: string, runnerId?: string, telemetry?: WorkStatusTelemetry): Promise<{
|
|
118
|
+
workItem: WorkItem;
|
|
119
|
+
}>;
|
|
120
|
+
submitBrainGenerationResult(projectId: string, workItemId: string, result: BrainGenerationResultMutation): Promise<{
|
|
121
|
+
draft: GeneratedDraftItem;
|
|
122
|
+
documents: BrainDocumentItem[];
|
|
123
|
+
workItem: WorkItem;
|
|
124
|
+
}>;
|
|
125
|
+
private request;
|
|
126
|
+
}
|
|
127
|
+
export declare const toolSessionMutationSchema: z.ZodObject<{
|
|
128
|
+
toolSessionId: z.ZodOptional<z.ZodString>;
|
|
129
|
+
repositoryLinkId: z.ZodOptional<z.ZodString>;
|
|
130
|
+
tool: z.ZodOptional<z.ZodString>;
|
|
131
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
132
|
+
model: z.ZodOptional<z.ZodString>;
|
|
133
|
+
resumabilityScope: z.ZodOptional<z.ZodEnum<{
|
|
134
|
+
account: "account";
|
|
135
|
+
none: "none";
|
|
136
|
+
localMachine: "localMachine";
|
|
137
|
+
repository: "repository";
|
|
138
|
+
providerCloud: "providerCloud";
|
|
139
|
+
}>>;
|
|
140
|
+
title: z.ZodOptional<z.ZodString>;
|
|
141
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
142
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
143
|
+
relatedDocumentIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
144
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
145
|
+
archived: "archived";
|
|
146
|
+
blocked: "blocked";
|
|
147
|
+
open: "open";
|
|
148
|
+
active: "active";
|
|
149
|
+
closed: "closed";
|
|
150
|
+
unavailable: "unavailable";
|
|
151
|
+
}>>;
|
|
152
|
+
createdByUserId: z.ZodOptional<z.ZodString>;
|
|
153
|
+
runnerId: z.ZodOptional<z.ZodString>;
|
|
154
|
+
lastWorkItemId: z.ZodOptional<z.ZodString>;
|
|
155
|
+
messageCount: z.ZodOptional<z.ZodNumber>;
|
|
156
|
+
estimatedInputTokens: z.ZodOptional<z.ZodNumber>;
|
|
157
|
+
estimatedOutputTokens: z.ZodOptional<z.ZodNumber>;
|
|
158
|
+
costUsd: z.ZodOptional<z.ZodNumber>;
|
|
159
|
+
sessionGroupKey: z.ZodOptional<z.ZodString>;
|
|
160
|
+
reusePolicy: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
|
|
161
|
+
auto: "auto";
|
|
162
|
+
new: "new";
|
|
163
|
+
none: "none";
|
|
164
|
+
}>, z.ZodString]>>;
|
|
165
|
+
sessionDecision: z.ZodOptional<z.ZodEnum<{
|
|
166
|
+
created: "created";
|
|
167
|
+
continued: "continued";
|
|
168
|
+
forcedNew: "forcedNew";
|
|
169
|
+
forcedContinue: "forcedContinue";
|
|
170
|
+
notSupported: "notSupported";
|
|
171
|
+
skipped: "skipped";
|
|
172
|
+
}>>;
|
|
173
|
+
closedReason: z.ZodOptional<z.ZodString>;
|
|
174
|
+
}, z.core.$strip>;
|
|
175
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { brainDocumentItemSchema, generatedDraftItemSchema, repositoryLinkItemSchema, runnerHeartbeatItemSchema, sessionDecisionSchema, sessionPolicySchema, sessionResumabilityScopeSchema, toolSessionItemSchema, toolSessionStatusSchema, workItemSchema } from "@amistio/shared";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export class ApiClient {
|
|
4
|
+
options;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
}
|
|
8
|
+
async createPairingSession(projectId) {
|
|
9
|
+
return this.request("pairing-sessions", z.object({ pairingCode: z.string(), expiresAt: z.string() }), {
|
|
10
|
+
method: "POST",
|
|
11
|
+
body: JSON.stringify({ projectId })
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async consumePairingSession(input) {
|
|
15
|
+
return this.request("pairing-sessions", z.object({ repositoryLink: repositoryLinkItemSchema, token: z.string().min(1) }), {
|
|
16
|
+
method: "PATCH",
|
|
17
|
+
body: JSON.stringify(input)
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async claimWork(projectId, runnerId, repositoryLinkId, leaseSeconds = 300) {
|
|
21
|
+
return this.request(`/projects/${projectId}/work-items/claim`, z.object({ workItem: workItemSchema.optional() }).transform(({ workItem }) => ({ workItem })), {
|
|
22
|
+
method: "POST",
|
|
23
|
+
body: JSON.stringify({ runnerId, repositoryLinkId, leaseSeconds })
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async listWorkItems(projectId) {
|
|
27
|
+
return this.request(`/projects/${projectId}/work-items`, z.object({ workItems: z.array(workItemSchema) }), { method: "GET" });
|
|
28
|
+
}
|
|
29
|
+
async listBrainDocuments(projectId) {
|
|
30
|
+
return this.request(`/projects/${projectId}/brain-documents`, z.object({ documents: z.array(brainDocumentItemSchema) }), { method: "GET" });
|
|
31
|
+
}
|
|
32
|
+
async pushBrainDocuments(projectId, documents) {
|
|
33
|
+
return this.request(`/projects/${projectId}/brain-documents`, z.object({ documents: z.array(brainDocumentItemSchema) }), {
|
|
34
|
+
method: "POST",
|
|
35
|
+
body: JSON.stringify({ documents })
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async sendRunnerHeartbeat(projectId, runnerId, repositoryLinkId, status, version) {
|
|
39
|
+
return this.request(`/projects/${projectId}/runners`, z.object({ runner: runnerHeartbeatItemSchema }), {
|
|
40
|
+
method: "POST",
|
|
41
|
+
body: JSON.stringify({ runnerId, repositoryLinkId, status, ...(version ? { version } : {}), lastSeenAt: new Date().toISOString() })
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async listToolSessions(projectId) {
|
|
45
|
+
return this.request(`/projects/${projectId}/tool-sessions`, z.object({ toolSessions: z.array(toolSessionItemSchema) }), { method: "GET" });
|
|
46
|
+
}
|
|
47
|
+
async createToolSession(projectId, session) {
|
|
48
|
+
return this.request(`/projects/${projectId}/tool-sessions`, z.object({ toolSession: toolSessionItemSchema }), {
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: JSON.stringify(session)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async updateToolSession(projectId, toolSessionId, session) {
|
|
54
|
+
return this.request(`/projects/${projectId}/tool-sessions/${toolSessionId}`, z.object({ toolSession: toolSessionItemSchema }), {
|
|
55
|
+
method: "PATCH",
|
|
56
|
+
body: JSON.stringify(session)
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async updateWorkStatus(projectId, workItemId, status, idempotencyKey, runnerId, telemetry = {}) {
|
|
60
|
+
return this.request(`/projects/${projectId}/work-items/${workItemId}/status`, z.object({ workItem: workItemSchema }), {
|
|
61
|
+
method: "PATCH",
|
|
62
|
+
body: JSON.stringify({ status, idempotencyKey, ...(runnerId ? { runnerId } : {}), ...telemetry })
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async submitBrainGenerationResult(projectId, workItemId, result) {
|
|
66
|
+
return this.request(`/projects/${projectId}/work-items/${workItemId}/generation-result`, z.object({ draft: generatedDraftItemSchema, documents: z.array(brainDocumentItemSchema), workItem: workItemSchema }), {
|
|
67
|
+
method: "POST",
|
|
68
|
+
body: JSON.stringify(result)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async request(urlPath, schema, init) {
|
|
72
|
+
const response = await fetch(resolveApiUrl(this.options.apiUrl, urlPath), {
|
|
73
|
+
...init,
|
|
74
|
+
headers: {
|
|
75
|
+
"content-type": "application/json",
|
|
76
|
+
"x-amistio-account-id": this.options.accountId,
|
|
77
|
+
...(this.options.token ? { authorization: `Bearer ${this.options.token}` } : {})
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
const detail = await response.text().catch(() => "");
|
|
82
|
+
throw new Error(`Amistio API request failed: ${response.status} ${response.statusText}${detail ? ` - ${detail}` : ""}`);
|
|
83
|
+
}
|
|
84
|
+
return schema.parse(await response.json());
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export const toolSessionMutationSchema = z.object({
|
|
88
|
+
toolSessionId: z.string().min(1).optional(),
|
|
89
|
+
repositoryLinkId: z.string().min(1).optional(),
|
|
90
|
+
tool: z.string().min(1).optional(),
|
|
91
|
+
provider: z.string().min(1).optional(),
|
|
92
|
+
model: z.string().min(1).optional(),
|
|
93
|
+
resumabilityScope: sessionResumabilityScopeSchema.optional(),
|
|
94
|
+
title: z.string().min(1).optional(),
|
|
95
|
+
summary: z.string().optional(),
|
|
96
|
+
tags: z.array(z.string()).optional(),
|
|
97
|
+
relatedDocumentIds: z.array(z.string()).optional(),
|
|
98
|
+
status: toolSessionStatusSchema.optional(),
|
|
99
|
+
createdByUserId: z.string().min(1).optional(),
|
|
100
|
+
runnerId: z.string().min(1).optional(),
|
|
101
|
+
lastWorkItemId: z.string().min(1).optional(),
|
|
102
|
+
messageCount: z.number().int().nonnegative().optional(),
|
|
103
|
+
estimatedInputTokens: z.number().int().nonnegative().optional(),
|
|
104
|
+
estimatedOutputTokens: z.number().int().nonnegative().optional(),
|
|
105
|
+
costUsd: z.number().nonnegative().optional(),
|
|
106
|
+
sessionGroupKey: z.string().min(1).optional(),
|
|
107
|
+
reusePolicy: sessionPolicySchema.optional(),
|
|
108
|
+
sessionDecision: sessionDecisionSchema.optional(),
|
|
109
|
+
closedReason: z.string().optional()
|
|
110
|
+
});
|
|
111
|
+
function resolveApiUrl(apiUrl, urlPath) {
|
|
112
|
+
const base = apiUrl.endsWith("/") ? apiUrl.slice(0, -1) : apiUrl;
|
|
113
|
+
const path = urlPath.startsWith("/") ? urlPath : `/${urlPath}`;
|
|
114
|
+
return new URL(`${base}${path}`);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface BootstrapCheckoutResult {
|
|
2
|
+
status: "cloned" | "validated";
|
|
3
|
+
targetDir: string;
|
|
4
|
+
originUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function buildGitCloneArgs(repoUrl: string, targetDir: string): string[];
|
|
7
|
+
export declare function cloneOrValidateRepository({ repoUrl, targetDir }: {
|
|
8
|
+
repoUrl: string;
|
|
9
|
+
targetDir: string;
|
|
10
|
+
}): Promise<BootstrapCheckoutResult>;
|
|
11
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,uBAAuB;IACpC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAED,wBAAsB,yBAAyB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAgChJ"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdir, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { repositoryCloneUrlsMatch } from "@amistio/shared";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
export function buildGitCloneArgs(repoUrl, targetDir) {
|
|
8
|
+
return ["clone", repoUrl, targetDir];
|
|
9
|
+
}
|
|
10
|
+
export async function cloneOrValidateRepository({ repoUrl, targetDir }) {
|
|
11
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
12
|
+
const targetStat = await stat(resolvedTarget).catch((error) => {
|
|
13
|
+
if (isNotFoundError(error))
|
|
14
|
+
return undefined;
|
|
15
|
+
throw error;
|
|
16
|
+
});
|
|
17
|
+
if (!targetStat) {
|
|
18
|
+
await mkdir(path.dirname(resolvedTarget), { recursive: true });
|
|
19
|
+
await runGit(buildGitCloneArgs(repoUrl, resolvedTarget), "clone");
|
|
20
|
+
return { status: "cloned", targetDir: resolvedTarget };
|
|
21
|
+
}
|
|
22
|
+
if (!targetStat.isDirectory()) {
|
|
23
|
+
throw new Error("Bootstrap target exists and is not a directory.");
|
|
24
|
+
}
|
|
25
|
+
if (await isGitCheckout(resolvedTarget)) {
|
|
26
|
+
const originUrl = await runGit(["-C", resolvedTarget, "remote", "get-url", "origin"], "remote");
|
|
27
|
+
if (!repositoryCloneUrlsMatch(repoUrl, originUrl)) {
|
|
28
|
+
throw new Error("Bootstrap target is a Git checkout for a different repository.");
|
|
29
|
+
}
|
|
30
|
+
return { status: "validated", targetDir: resolvedTarget, originUrl };
|
|
31
|
+
}
|
|
32
|
+
const entries = await readdir(resolvedTarget);
|
|
33
|
+
if (entries.length > 0) {
|
|
34
|
+
throw new Error("Bootstrap target exists, is not empty, and is not the linked repository checkout.");
|
|
35
|
+
}
|
|
36
|
+
await runGit(buildGitCloneArgs(repoUrl, resolvedTarget), "clone");
|
|
37
|
+
return { status: "cloned", targetDir: resolvedTarget };
|
|
38
|
+
}
|
|
39
|
+
async function isGitCheckout(targetDir) {
|
|
40
|
+
try {
|
|
41
|
+
const result = await runGit(["-C", targetDir, "rev-parse", "--is-inside-work-tree"], "rev-parse");
|
|
42
|
+
return result.trim() === "true";
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function runGit(args, operation) {
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await execFileAsync("git", args, { maxBuffer: 1024 * 1024 });
|
|
51
|
+
return stdout.trim();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
if (operation === "clone") {
|
|
55
|
+
throw new Error("git clone failed. Confirm local Git credentials can access the repository.");
|
|
56
|
+
}
|
|
57
|
+
if (operation === "remote") {
|
|
58
|
+
throw new Error("Could not read the target checkout origin remote.");
|
|
59
|
+
}
|
|
60
|
+
throw new Error("Could not inspect the target Git checkout.");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function isNotFoundError(error) {
|
|
64
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type RepoLinkMetadata } from "@amistio/shared";
|
|
2
|
+
export declare const controlPlaneFolders: readonly ["architecture", "context", "decisions", "features", "memory", "plans", string, "workflows"];
|
|
3
|
+
export declare function initControlPlane(rootDir: string): Promise<string[]>;
|
|
4
|
+
export declare function inspectControlPlane(rootDir: string): Promise<{
|
|
5
|
+
present: string[];
|
|
6
|
+
missing: string[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare function writeProjectLink(rootDir: string, metadata: RepoLinkMetadata): Promise<string>;
|
|
9
|
+
export declare function readProjectLink(rootDir: string): Promise<RepoLinkMetadata | undefined>;
|
|
10
|
+
export declare function parseFrontmatter(content: string): Record<string, string>;
|
|
11
|
+
//# sourceMappingURL=control-plane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../src/control-plane.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqD,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE3G,eAAO,MAAM,mBAAmB,uGAStB,CAAC;AAEX,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBzE;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAa5G;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnG;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAS5F;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createProjectLinkMarkdown, repoLinkMetadataSchema } from "@amistio/shared";
|
|
4
|
+
export const controlPlaneFolders = [
|
|
5
|
+
"architecture",
|
|
6
|
+
"context",
|
|
7
|
+
"decisions",
|
|
8
|
+
"features",
|
|
9
|
+
"memory",
|
|
10
|
+
"plans",
|
|
11
|
+
path.join("prompts", "shared"),
|
|
12
|
+
"workflows"
|
|
13
|
+
];
|
|
14
|
+
export async function initControlPlane(rootDir) {
|
|
15
|
+
const created = [];
|
|
16
|
+
for (const folder of controlPlaneFolders) {
|
|
17
|
+
const fullPath = path.join(rootDir, folder);
|
|
18
|
+
if (!(await exists(fullPath))) {
|
|
19
|
+
await mkdir(fullPath, { recursive: true });
|
|
20
|
+
created.push(folder);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
await writeIfMissing(path.join(rootDir, "AGENTS.md"), "# Agents\n\nRoot control-plane folders are the project brain. Keep architecture, context, decisions, features, memory, plans, prompts, and workflows in sync with product intent.\n");
|
|
24
|
+
await writeIfMissing(path.join(rootDir, "context", "product.md"), "# Product Context\n\nDescribe the product direction here.\n");
|
|
25
|
+
await writeIfMissing(path.join(rootDir, "architecture", "overview.md"), "# Architecture Overview\n\nDescribe the system shape here.\n");
|
|
26
|
+
return created;
|
|
27
|
+
}
|
|
28
|
+
export async function inspectControlPlane(rootDir) {
|
|
29
|
+
const present = [];
|
|
30
|
+
const missing = [];
|
|
31
|
+
for (const folder of controlPlaneFolders) {
|
|
32
|
+
if (await exists(path.join(rootDir, folder))) {
|
|
33
|
+
present.push(folder);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
missing.push(folder);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { present, missing };
|
|
40
|
+
}
|
|
41
|
+
export async function writeProjectLink(rootDir, metadata) {
|
|
42
|
+
const contextDir = path.join(rootDir, "context");
|
|
43
|
+
await mkdir(contextDir, { recursive: true });
|
|
44
|
+
const filePath = path.join(contextDir, "amistio-project.md");
|
|
45
|
+
await writeFile(filePath, createProjectLinkMarkdown(metadata), "utf8");
|
|
46
|
+
return filePath;
|
|
47
|
+
}
|
|
48
|
+
export async function readProjectLink(rootDir) {
|
|
49
|
+
const filePath = path.join(rootDir, "context", "amistio-project.md");
|
|
50
|
+
if (!(await exists(filePath))) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const content = await readFile(filePath, "utf8");
|
|
54
|
+
const frontmatter = parseFrontmatter(content);
|
|
55
|
+
return repoLinkMetadataSchema.parse(frontmatter);
|
|
56
|
+
}
|
|
57
|
+
export function parseFrontmatter(content) {
|
|
58
|
+
if (!content.startsWith("---\n")) {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
const end = content.indexOf("\n---", 4);
|
|
62
|
+
if (end === -1) {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
const lines = content.slice(4, end).split("\n");
|
|
66
|
+
return Object.fromEntries(lines
|
|
67
|
+
.map((line) => {
|
|
68
|
+
const separator = line.indexOf(":");
|
|
69
|
+
if (separator === -1) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
return [line.slice(0, separator).trim(), line.slice(separator + 1).trim()];
|
|
73
|
+
})
|
|
74
|
+
.filter((entry) => Boolean(entry)));
|
|
75
|
+
}
|
|
76
|
+
async function writeIfMissing(filePath, content) {
|
|
77
|
+
if (await exists(filePath)) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
await writeFile(filePath, content, "utf8");
|
|
81
|
+
}
|
|
82
|
+
async function exists(filePath) {
|
|
83
|
+
try {
|
|
84
|
+
await stat(filePath);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=control-plane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.js","sourceRoot":"","sources":["../src/control-plane.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class LocalCredentialStore {
|
|
2
|
+
private readonly filePath;
|
|
3
|
+
constructor(filePath?: string);
|
|
4
|
+
set(key: string, value: string): Promise<void>;
|
|
5
|
+
get(key: string): Promise<string | undefined>;
|
|
6
|
+
private read;
|
|
7
|
+
}
|
|
8
|
+
export declare function credentialKey(accountId: string, projectId: string, repositoryLinkId: string): string;
|
|
9
|
+
//# sourceMappingURL=credential-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAQA,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,SAAoE;IAEnG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAKrC,IAAI;CAOnB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAEpG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export class LocalCredentialStore {
|
|
5
|
+
filePath;
|
|
6
|
+
constructor(filePath = path.join(os.homedir(), ".config", "amistio", "credentials.json")) {
|
|
7
|
+
this.filePath = filePath;
|
|
8
|
+
}
|
|
9
|
+
async set(key, value) {
|
|
10
|
+
const data = await this.read();
|
|
11
|
+
data.credentials[key] = value;
|
|
12
|
+
await mkdir(path.dirname(this.filePath), { recursive: true });
|
|
13
|
+
await writeFile(this.filePath, JSON.stringify(data, null, 2), { encoding: "utf8", mode: 0o600 });
|
|
14
|
+
await chmod(this.filePath, 0o600);
|
|
15
|
+
}
|
|
16
|
+
async get(key) {
|
|
17
|
+
const data = await this.read();
|
|
18
|
+
return data.credentials[key];
|
|
19
|
+
}
|
|
20
|
+
async read() {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(await readFile(this.filePath, "utf8"));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { credentials: {} };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function credentialKey(accountId, projectId, repositoryLinkId) {
|
|
30
|
+
return `${accountId}:${projectId}:${repositoryLinkId}`;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=credential-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAAC;QAA5E,aAAQ,GAAR,QAAQ,CAAoE;IAAG,CAAC;IAE7G,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC9B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACjG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAyB,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,gBAAwB;IAC1F,OAAO,GAAG,SAAS,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;AACzD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|