@cultos/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/dist/github.js ADDED
@@ -0,0 +1,113 @@
1
+ import { execFileSync, spawnSync } from "node:child_process";
2
+ import { z } from "zod";
3
+ const issueSchema = z.object({
4
+ number: z.number(),
5
+ title: z.string(),
6
+ body: z.string().nullable(),
7
+ url: z.url()
8
+ });
9
+ const repositorySchema = z.object({
10
+ nameWithOwner: z.string(),
11
+ url: z.url(),
12
+ defaultBranchRef: z.object({
13
+ name: z.string()
14
+ })
15
+ });
16
+ const pullRequestSchema = z.object({
17
+ number: z.number(),
18
+ url: z.url(),
19
+ state: z.string(),
20
+ headRefOid: z.string(),
21
+ baseRefName: z.string()
22
+ });
23
+ const checkSchema = z.object({
24
+ name: z.string(),
25
+ state: z.string(),
26
+ bucket: z.string(),
27
+ link: z.string().optional()
28
+ });
29
+ function runGitHub(args) {
30
+ try {
31
+ const output = execFileSync("gh", args, {
32
+ encoding: "utf8",
33
+ stdio: ["ignore", "pipe", "pipe"]
34
+ });
35
+ return JSON.parse(output);
36
+ }
37
+ catch (error) {
38
+ if (error instanceof Error && "stderr" in error) {
39
+ const stderr = String(error.stderr).trim();
40
+ throw new Error(stderr || "GitHub CLI command failed");
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ function runGitHubWithExitCodes(args, exitCodes) {
46
+ const result = spawnSync("gh", args, {
47
+ encoding: "utf8",
48
+ maxBuffer: 10 * 1024 * 1024
49
+ });
50
+ const exitCode = result.status ?? 1;
51
+ if (!exitCodes.includes(exitCode)) {
52
+ throw new Error(result.stderr.trim() || result.stdout.trim() || "GitHub CLI command failed");
53
+ }
54
+ return JSON.parse(result.stdout);
55
+ }
56
+ export function getIssue(reference, repository) {
57
+ const args = ["issue", "view", reference, "--json", "number,title,body,url"];
58
+ if (repository) {
59
+ args.push("--repo", repository);
60
+ }
61
+ const issue = issueSchema.parse(runGitHub(args));
62
+ if (!issue.url.includes("/issues/")) {
63
+ throw new Error(`${reference} is a pull request, not a GitHub issue`);
64
+ }
65
+ return {
66
+ ...issue,
67
+ body: issue.body ?? ""
68
+ };
69
+ }
70
+ export function getRepository(reference) {
71
+ const args = ["repo", "view"];
72
+ if (reference) {
73
+ args.push(reference);
74
+ }
75
+ args.push("--json", "nameWithOwner,url,defaultBranchRef");
76
+ const repository = repositorySchema.parse(runGitHub(args));
77
+ return {
78
+ nameWithOwner: repository.nameWithOwner,
79
+ url: repository.url,
80
+ defaultBranch: repository.defaultBranchRef.name
81
+ };
82
+ }
83
+ export function commandExists(command) {
84
+ const result = spawnSync(command, ["--version"], { stdio: "ignore" });
85
+ return result.status === 0;
86
+ }
87
+ export function githubIsAuthenticated() {
88
+ const result = spawnSync("gh", ["auth", "status"], { stdio: "ignore" });
89
+ return result.status === 0;
90
+ }
91
+ export function getPullRequest(reference) {
92
+ const pullRequest = pullRequestSchema.parse(runGitHub(["pr", "view", reference, "--json", "number,url,state,headRefOid,baseRefName"]));
93
+ return {
94
+ number: pullRequest.number,
95
+ url: pullRequest.url,
96
+ state: pullRequest.state,
97
+ headSha: pullRequest.headRefOid,
98
+ baseRef: pullRequest.baseRefName
99
+ };
100
+ }
101
+ export function getPullRequestChecks(reference) {
102
+ const checks = z.array(checkSchema).parse(runGitHubWithExitCodes(["pr", "checks", reference, "--json", "name,state,bucket,link"], [0, 1, 8]));
103
+ return checks;
104
+ }
105
+ export function commentOnIssue(issueNumber, body) {
106
+ const result = spawnSync("gh", ["issue", "comment", String(issueNumber), "--body", body], {
107
+ encoding: "utf8"
108
+ });
109
+ if (result.status !== 0) {
110
+ throw new Error(result.stderr.trim() || "Unable to post the GitHub receipt");
111
+ }
112
+ }
113
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { IssueWorkContract, PullRequestDelivery } from "./contract.js";
2
+ export interface CultJob {
3
+ issueNumber: number;
4
+ repository: string;
5
+ contract: IssueWorkContract;
6
+ provider: string;
7
+ offering?: string;
8
+ jobId: string;
9
+ chainId: number;
10
+ protocol?: string;
11
+ status: string;
12
+ budget?: string;
13
+ delivery?: PullRequestDelivery;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ export declare function saveJob(job: CultJob): void;
18
+ export declare function getJob(issueNumber: number): CultJob;
19
+ export declare function updateJob(issueNumber: number, update: Partial<CultJob>): CultJob;
20
+ export declare function listJobs(): CultJob[];
package/dist/state.js ADDED
@@ -0,0 +1,61 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ function repositoryRoot() {
5
+ try {
6
+ return execFileSync("git", ["rev-parse", "--show-toplevel"], {
7
+ encoding: "utf8",
8
+ stdio: ["ignore", "pipe", "ignore"]
9
+ }).trim();
10
+ }
11
+ catch {
12
+ return process.cwd();
13
+ }
14
+ }
15
+ const statePath = join(repositoryRoot(), ".cultos", "jobs.json");
16
+ function emptyState() {
17
+ return { version: 1, jobs: {} };
18
+ }
19
+ function readState() {
20
+ try {
21
+ return JSON.parse(readFileSync(statePath, "utf8"));
22
+ }
23
+ catch (error) {
24
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
25
+ return emptyState();
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ function writeState(state) {
31
+ mkdirSync(dirname(statePath), { recursive: true });
32
+ const temporaryPath = `${statePath}.tmp`;
33
+ writeFileSync(temporaryPath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
34
+ renameSync(temporaryPath, statePath);
35
+ }
36
+ export function saveJob(job) {
37
+ const state = readState();
38
+ state.jobs[String(job.issueNumber)] = job;
39
+ writeState(state);
40
+ }
41
+ export function getJob(issueNumber) {
42
+ const job = readState().jobs[String(issueNumber)];
43
+ if (!job) {
44
+ throw new Error(`No CultOS job is linked to issue #${issueNumber}`);
45
+ }
46
+ return job;
47
+ }
48
+ export function updateJob(issueNumber, update) {
49
+ const job = getJob(issueNumber);
50
+ const next = {
51
+ ...job,
52
+ ...update,
53
+ updatedAt: new Date().toISOString()
54
+ };
55
+ saveJob(next);
56
+ return next;
57
+ }
58
+ export function listJobs() {
59
+ return Object.values(readState().jobs).sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
60
+ }
61
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CultJob } from "./state.js";
2
+ import { type GitHubCheck, type GitHubPullRequest } from "./github.js";
3
+ export interface VerificationResult {
4
+ pullRequest: number;
5
+ url: string;
6
+ headSha: string;
7
+ checks: GitHubCheck[];
8
+ passed: boolean;
9
+ failures: string[];
10
+ }
11
+ export declare function evaluateDelivery(job: CultJob, pullRequest: GitHubPullRequest, checks: GitHubCheck[]): VerificationResult;
12
+ export declare function verifyJob(job: CultJob): VerificationResult;
package/dist/verify.js ADDED
@@ -0,0 +1,41 @@
1
+ import { getPullRequest, getPullRequestChecks } from "./github.js";
2
+ export function evaluateDelivery(job, pullRequest, checks) {
3
+ if (!job.delivery) {
4
+ throw new Error("The provider has not submitted a pull-request delivery");
5
+ }
6
+ const failures = [];
7
+ const repositoryPrefix = `${job.contract.repository}/pull/`;
8
+ if (!pullRequest.url.startsWith(repositoryPrefix)) {
9
+ failures.push("Pull request belongs to a different repository");
10
+ }
11
+ if (pullRequest.baseRef !== job.contract.baseRef) {
12
+ failures.push(`Pull request targets ${pullRequest.baseRef}, expected ${job.contract.baseRef}`);
13
+ }
14
+ if (pullRequest.headSha !== job.delivery.headSha) {
15
+ failures.push("Pull request changed after delivery");
16
+ }
17
+ if (pullRequest.state !== "OPEN") {
18
+ failures.push(`Pull request is ${pullRequest.state.toLowerCase()}`);
19
+ }
20
+ const failedChecks = checks.filter((check) => !["pass", "skipping"].includes(check.bucket));
21
+ for (const check of failedChecks) {
22
+ failures.push(`${check.name}: ${check.bucket}`);
23
+ }
24
+ return {
25
+ pullRequest: pullRequest.number,
26
+ url: pullRequest.url,
27
+ headSha: pullRequest.headSha,
28
+ checks,
29
+ passed: failures.length === 0,
30
+ failures
31
+ };
32
+ }
33
+ export function verifyJob(job) {
34
+ if (!job.delivery) {
35
+ throw new Error("The provider has not submitted a pull-request delivery");
36
+ }
37
+ const pullRequest = getPullRequest(job.delivery.url);
38
+ const checks = getPullRequestChecks(job.delivery.url);
39
+ return evaluateDelivery(job, pullRequest, checks);
40
+ }
41
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AAWrB,MAAM,UAAU,gBAAgB,CAC9B,GAAY,EACZ,WAA8B,EAC9B,MAAqB;IAErB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,gBAAgB,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,QAAQ,CAAC;IAE5D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,wBAAwB,WAAW,CAAC,OAAO,cAAc,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,WAAW,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM;QACN,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC7B,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@cultos/cli",
3
+ "version": "0.1.0",
4
+ "description": "GitHub-native work for the agent economy.",
5
+ "type": "module",
6
+ "bin": {
7
+ "cult": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.build.json",
14
+ "dev": "tsx src/cli.ts",
15
+ "prepack": "npm run build",
16
+ "test": "vitest run",
17
+ "typecheck": "tsc --noEmit"
18
+ },
19
+ "keywords": [
20
+ "virtuals",
21
+ "acp",
22
+ "github",
23
+ "agents",
24
+ "cli"
25
+ ],
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/thesmithdao/cultos.git"
30
+ },
31
+ "homepage": "https://github.com/thesmithdao/cultos#readme",
32
+ "bugs": {
33
+ "url": "https://github.com/thesmithdao/cultos/issues"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "engines": {
39
+ "node": ">=20"
40
+ },
41
+ "dependencies": {
42
+ "commander": "^14.0.0",
43
+ "ink": "^6.3.1",
44
+ "picocolors": "^1.1.1",
45
+ "react": "^19.1.1",
46
+ "zod": "^4.1.5"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^24.3.0",
50
+ "@types/react": "^19.1.11",
51
+ "tsx": "^4.20.5",
52
+ "typescript": "^5.9.2",
53
+ "vitest": "^3.2.4"
54
+ }
55
+ }