feat(P05): ship infrastructure — Gitea API client, release notes, npm publishConfig, ciagent projects cmd, --project flag
---ci--- phase: 5 milestone: v1.0 plan: 05 task: SHIP-01-04 MULTI-01 MULTI-02 status: execute ---/ci---
This commit is contained in:
+13
-1
@@ -19,7 +19,7 @@
|
|||||||
"dev": "ts-node src/cli.ts",
|
"dev": "ts-node src/cli.ts",
|
||||||
"typecheck": "tsc --noEmit",
|
"typecheck": "tsc --noEmit",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"prepublishOnly": "npm run build",
|
"prepublishOnly": "npm run build && npm test",
|
||||||
"install-opencode": "node scripts/postinstall.js"
|
"install-opencode": "node scripts/postinstall.js"
|
||||||
},
|
},
|
||||||
"keywords": ["ciagent", "autonomous", "ai", "software-engineering", "agent", "multi-project"],
|
"keywords": ["ciagent", "autonomous", "ai", "software-engineering", "agent", "multi-project"],
|
||||||
@@ -27,6 +27,18 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0"
|
"node": ">=18.0.0"
|
||||||
},
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://registry.npmjs.org/",
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.cloudinit.dev/continuous-intelligence/ciagent.git"
|
||||||
|
},
|
||||||
|
"homepage": "https://git.cloudinit.dev/continuous-intelligence/ciagent",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://git.cloudinit.dev/continuous-intelligence/ciagent/issues"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "^12.1.0",
|
"commander": "^12.1.0",
|
||||||
"zod": "^3.23.0"
|
"zod": "^3.23.0"
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ import { PipelineState, createInitialPipelineState } from "../types/pipeline.js"
|
|||||||
import { resolveBackend } from "../backends/index.js";
|
import { resolveBackend } from "../backends/index.js";
|
||||||
import { BackendUnavailableError } from "../backends/types.js";
|
import { BackendUnavailableError } from "../backends/types.js";
|
||||||
import { getAgent } from "../agents/index.js";
|
import { getAgent } from "../agents/index.js";
|
||||||
|
import { CIAgentFiles } from "../core/ciagent-files.js";
|
||||||
|
import { GiteaClient, generateReleaseNotes } from "../core/gitea.js";
|
||||||
import * as fs from "node:fs";
|
import * as fs from "node:fs";
|
||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
import { execSync } from "node:child_process";
|
import { execSync } from "node:child_process";
|
||||||
@@ -642,6 +644,83 @@ export function createRollbackCommand(): Command {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function createProjectsCommand(): Command {
|
||||||
|
const cmd = new Command("projects");
|
||||||
|
cmd.description("Manage CIAgent projects in multi-project mode");
|
||||||
|
|
||||||
|
cmd.command("list")
|
||||||
|
.description("List all registered projects")
|
||||||
|
.action(() => {
|
||||||
|
const projectPath = process.cwd();
|
||||||
|
|
||||||
|
if (!isCIAgentInitialized(projectPath)) {
|
||||||
|
console.error("CIAgent project not initialized. Run 'ciagent init' first.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = loadConfig(projectPath);
|
||||||
|
const ciFiles = new CIAgentFiles(projectPath);
|
||||||
|
const projects = ciFiles.listProjects();
|
||||||
|
const activeProject = config.active_project || ciFiles.getActiveProject();
|
||||||
|
|
||||||
|
if (projects.length === 0) {
|
||||||
|
console.log("No projects registered.");
|
||||||
|
console.log("Use 'ciagent projects add <slug> <name>' to add a project.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("─── CIAgent Projects ───\n");
|
||||||
|
for (const project of projects) {
|
||||||
|
const isActive = project.slug === activeProject;
|
||||||
|
const marker = isActive ? " *" : "";
|
||||||
|
console.log(` ${project.slug} — ${project.name}${marker}`);
|
||||||
|
}
|
||||||
|
console.log("\n * = active project");
|
||||||
|
});
|
||||||
|
|
||||||
|
cmd.command("add <slug> <name>")
|
||||||
|
.description("Add a new project")
|
||||||
|
.action((slug: string, name: string) => {
|
||||||
|
const projectPath = process.cwd();
|
||||||
|
|
||||||
|
if (!isCIAgentInitialized(projectPath)) {
|
||||||
|
console.error("CIAgent project not initialized. Run 'ciagent init' first.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ciFiles = new CIAgentFiles(projectPath);
|
||||||
|
ciFiles.addProject(slug, name);
|
||||||
|
console.log(`✓ Project added: ${slug} (${name})`);
|
||||||
|
});
|
||||||
|
|
||||||
|
cmd.command("set <slug>")
|
||||||
|
.description("Set the active project")
|
||||||
|
.action((slug: string) => {
|
||||||
|
const projectPath = process.cwd();
|
||||||
|
|
||||||
|
if (!isCIAgentInitialized(projectPath)) {
|
||||||
|
console.error("CIAgent project not initialized. Run 'ciagent init' first.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ciFiles = new CIAgentFiles(projectPath);
|
||||||
|
const projects = ciFiles.listProjects();
|
||||||
|
|
||||||
|
if (!projects.some((p) => p.slug === slug)) {
|
||||||
|
console.error(`Project "${slug}" not found. Registered projects: ${projects.map((p) => p.slug).join(", ")}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ciFiles.setActiveProject(slug);
|
||||||
|
const config = loadConfig(projectPath);
|
||||||
|
config.active_project = slug;
|
||||||
|
saveConfig(projectPath, config);
|
||||||
|
console.log(`✓ Active project set to: ${slug}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
export function createShipCommand(): Command {
|
export function createShipCommand(): Command {
|
||||||
return new Command("ship")
|
return new Command("ship")
|
||||||
.description("Auto-complete phase: verify, security, commit, tag")
|
.description("Auto-complete phase: verify, security, commit, tag")
|
||||||
@@ -713,6 +792,35 @@ export function createShipCommand(): Command {
|
|||||||
});
|
});
|
||||||
console.log(` ✓ Tagged: ${version.tag}`);
|
console.log(` ✓ Tagged: ${version.tag}`);
|
||||||
|
|
||||||
|
if (config.gitea && config.gitea.owner && config.gitea.repo) {
|
||||||
|
const apiToken = process.env[config.gitea.api_token_env];
|
||||||
|
if (apiToken) {
|
||||||
|
try {
|
||||||
|
const previousTag = getPreviousTag(projectPath, version.tag);
|
||||||
|
const releaseNotes = generateReleaseNotes(projectPath, previousTag, version.tag);
|
||||||
|
|
||||||
|
const giteaClient = new GiteaClient({
|
||||||
|
baseUrl: config.gitea.base_url,
|
||||||
|
token: apiToken,
|
||||||
|
owner: config.gitea.owner,
|
||||||
|
repo: config.gitea.repo,
|
||||||
|
});
|
||||||
|
|
||||||
|
const release = await giteaClient.createRelease({
|
||||||
|
tag_name: version.tag,
|
||||||
|
name: version.tag,
|
||||||
|
body: releaseNotes,
|
||||||
|
draft: false,
|
||||||
|
prerelease: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(` ✓ Release created: ${release.html_url}`);
|
||||||
|
} catch (giteaErr) {
|
||||||
|
console.warn(` ⚠ Gitea release failed: ${giteaErr instanceof Error ? giteaErr.message : String(giteaErr)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (config.git.auto_push) {
|
if (config.git.auto_push) {
|
||||||
execSync(`git push origin ${version.tag}`, { cwd: projectPath, stdio: "pipe" });
|
execSync(`git push origin ${version.tag}`, { cwd: projectPath, stdio: "pipe" });
|
||||||
console.log(` ✓ Pushed tag: ${version.tag}`);
|
console.log(` ✓ Pushed tag: ${version.tag}`);
|
||||||
@@ -819,4 +927,20 @@ function resolveMergeTarget(projectPath: string, milestoneType: string): string
|
|||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
return "main";
|
return "main";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPreviousTag(projectPath: string, currentTag: string): string | null {
|
||||||
|
try {
|
||||||
|
const tags = execSync("git tag -l --sort=-v:refname", { cwd: projectPath, encoding: "utf-8" })
|
||||||
|
.split("\n")
|
||||||
|
.map((t) => t.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
const currentIdx = tags.indexOf(currentTag);
|
||||||
|
if (currentIdx >= 0 && currentIdx + 1 < tags.length) {
|
||||||
|
return tags[currentIdx + 1];
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
+13
-1
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
import { Command } from "commander";
|
import { Command } from "commander";
|
||||||
import { VERSION } from "../version.js";
|
import { VERSION } from "../version.js";
|
||||||
|
import { CIAgentFiles } from "../core/ciagent-files.js";
|
||||||
|
import { isCIAgentInitialized } from "../core/config.js";
|
||||||
import {
|
import {
|
||||||
createInitCommand,
|
createInitCommand,
|
||||||
createRunCommand,
|
createRunCommand,
|
||||||
@@ -14,6 +16,7 @@ import {
|
|||||||
createClarifyCommand,
|
createClarifyCommand,
|
||||||
createRollbackCommand,
|
createRollbackCommand,
|
||||||
createShipCommand,
|
createShipCommand,
|
||||||
|
createProjectsCommand,
|
||||||
} from "./commands.js";
|
} from "./commands.js";
|
||||||
|
|
||||||
const program = new Command();
|
const program = new Command();
|
||||||
@@ -22,6 +25,14 @@ program
|
|||||||
.name("ciagent")
|
.name("ciagent")
|
||||||
.description("CIAgent — Continuous Intelligence: autonomous AI-driven software engineering harness")
|
.description("CIAgent — Continuous Intelligence: autonomous AI-driven software engineering harness")
|
||||||
.version(VERSION)
|
.version(VERSION)
|
||||||
|
.option("--project <slug>", "Specify which project to operate on")
|
||||||
|
.hook("preAction", () => {
|
||||||
|
const opts = program.opts();
|
||||||
|
if (opts.project && isCIAgentInitialized(process.cwd())) {
|
||||||
|
const ciFiles = new CIAgentFiles(process.cwd());
|
||||||
|
ciFiles.setProjectSlug(opts.project);
|
||||||
|
}
|
||||||
|
})
|
||||||
.addCommand(createInitCommand())
|
.addCommand(createInitCommand())
|
||||||
.addCommand(createRunCommand())
|
.addCommand(createRunCommand())
|
||||||
.addCommand(createQuickCommand())
|
.addCommand(createQuickCommand())
|
||||||
@@ -32,6 +43,7 @@ program
|
|||||||
.addCommand(createAuditCommand())
|
.addCommand(createAuditCommand())
|
||||||
.addCommand(createClarifyCommand())
|
.addCommand(createClarifyCommand())
|
||||||
.addCommand(createRollbackCommand())
|
.addCommand(createRollbackCommand())
|
||||||
.addCommand(createShipCommand());
|
.addCommand(createShipCommand())
|
||||||
|
.addCommand(createProjectsCommand());
|
||||||
|
|
||||||
program.parse();
|
program.parse();
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
import { execSync } from "node:child_process";
|
||||||
|
|
||||||
|
export interface GiteaReleaseConfig {
|
||||||
|
baseUrl: string;
|
||||||
|
token: string;
|
||||||
|
owner: string;
|
||||||
|
repo: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GiteaRelease {
|
||||||
|
id: number;
|
||||||
|
tag_name: string;
|
||||||
|
name: string;
|
||||||
|
body: string;
|
||||||
|
url: string;
|
||||||
|
html_url: string;
|
||||||
|
draft: boolean;
|
||||||
|
prerelease: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GiteaClient {
|
||||||
|
private config: GiteaReleaseConfig;
|
||||||
|
|
||||||
|
constructor(config: GiteaReleaseConfig) {
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
async createRelease(params: {
|
||||||
|
tag_name: string;
|
||||||
|
name: string;
|
||||||
|
body: string;
|
||||||
|
draft?: boolean;
|
||||||
|
prerelease?: boolean;
|
||||||
|
}): Promise<GiteaRelease> {
|
||||||
|
const url = `${this.config.baseUrl}/api/v1/repos/${this.config.owner}/${this.config.repo}/releases`;
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Authorization": `token ${this.config.token}`,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
tag_name: params.tag_name,
|
||||||
|
name: params.name,
|
||||||
|
body: params.body,
|
||||||
|
draft: params.draft ?? false,
|
||||||
|
prerelease: params.prerelease ?? false,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const text = await response.text();
|
||||||
|
throw new Error(`Gitea API error: ${response.status} ${text}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.json() as Promise<GiteaRelease>;
|
||||||
|
}
|
||||||
|
|
||||||
|
async listReleases(): Promise<GiteaRelease[]> {
|
||||||
|
const url = `${this.config.baseUrl}/api/v1/repos/${this.config.owner}/${this.config.repo}/releases`;
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Authorization": `token ${this.config.token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Gitea API error: ${response.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.json() as Promise<GiteaRelease[]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getReleaseByTag(tag: string): Promise<GiteaRelease | null> {
|
||||||
|
const url = `${this.config.baseUrl}/api/v1/repos/${this.config.owner}/${this.config.repo}/releases/tags/${tag}`;
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Authorization": `token ${this.config.token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.status === 404) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Gitea API error: ${response.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.json() as Promise<GiteaRelease>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateReleaseNotes(projectPath: string, fromTag: string | null, toTag: string): string {
|
||||||
|
let gitLogCmd: string;
|
||||||
|
if (fromTag) {
|
||||||
|
gitLogCmd = `git log ${fromTag}..${toTag} --oneline`;
|
||||||
|
} else {
|
||||||
|
gitLogCmd = `git log ${toTag} --oneline`;
|
||||||
|
}
|
||||||
|
|
||||||
|
let logOutput: string;
|
||||||
|
try {
|
||||||
|
logOutput = execSync(gitLogCmd, { cwd: projectPath, encoding: "utf-8" }).trim();
|
||||||
|
} catch {
|
||||||
|
return `## What's Changed\n\nNo commits found between ${fromTag || "beginning"} and ${toTag}.\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!logOutput) {
|
||||||
|
return `## What's Changed\n\nNo commits found between ${fromTag || "beginning"} and ${toTag}.\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lines = logOutput.split("\n").filter(Boolean);
|
||||||
|
|
||||||
|
const featCommits: string[] = [];
|
||||||
|
const fixCommits: string[] = [];
|
||||||
|
const testCommits: string[] = [];
|
||||||
|
const otherCommits: string[] = [];
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
const subject = line.replace(/^[a-f0-9]+\s+/, "");
|
||||||
|
if (/^feat/i.test(subject)) {
|
||||||
|
featCommits.push(subject);
|
||||||
|
} else if (/^fix/i.test(subject)) {
|
||||||
|
fixCommits.push(subject);
|
||||||
|
} else if (/^test/i.test(subject)) {
|
||||||
|
testCommits.push(subject);
|
||||||
|
} else {
|
||||||
|
otherCommits.push(subject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const sections: string[] = [];
|
||||||
|
|
||||||
|
if (featCommits.length > 0) {
|
||||||
|
sections.push("### New Features\n");
|
||||||
|
for (const c of featCommits) {
|
||||||
|
sections.push(`- ${c}`);
|
||||||
|
}
|
||||||
|
sections.push("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fixCommits.length > 0) {
|
||||||
|
sections.push("### Bug Fixes\n");
|
||||||
|
for (const c of fixCommits) {
|
||||||
|
sections.push(`- ${c}`);
|
||||||
|
}
|
||||||
|
sections.push("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (testCommits.length > 0) {
|
||||||
|
sections.push("### Tests\n");
|
||||||
|
for (const c of testCommits) {
|
||||||
|
sections.push(`- ${c}`);
|
||||||
|
}
|
||||||
|
sections.push("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherCommits.length > 0) {
|
||||||
|
sections.push("### Other Changes\n");
|
||||||
|
for (const c of otherCommits) {
|
||||||
|
sections.push(`- ${c}`);
|
||||||
|
}
|
||||||
|
sections.push("");
|
||||||
|
}
|
||||||
|
|
||||||
|
return `## What's Changed\n\n${sections.join("\n")}`;
|
||||||
|
}
|
||||||
@@ -8,5 +8,7 @@ export { GitContext } from "./git-context.js";
|
|||||||
export { GitBranch } from "./git-branch.js";
|
export { GitBranch } from "./git-branch.js";
|
||||||
export { CommitBuilder } from "./commit-builder.js";
|
export { CommitBuilder } from "./commit-builder.js";
|
||||||
export { extractCIAgentBlock, parseCIAgentBlock, parseCommitMessage } from "./commit-parser.js";
|
export { extractCIAgentBlock, parseCIAgentBlock, parseCommitMessage } from "./commit-parser.js";
|
||||||
|
export { GiteaClient, generateReleaseNotes } from "./gitea.js";
|
||||||
|
export type { GiteaReleaseConfig, GiteaRelease } from "./gitea.js";
|
||||||
export type { CIAgentConfig } from "../types/config.js";
|
export type { CIAgentConfig } from "../types/config.js";
|
||||||
export { DEFAULT_CIAGENT_CONFIG } from "../types/config.js";
|
export { DEFAULT_CIAGENT_CONFIG } from "../types/config.js";
|
||||||
+3
-1
@@ -8,6 +8,7 @@ export { GitContext } from "./core/git-context.js";
|
|||||||
export { GitBranch } from "./core/git-branch.js";
|
export { GitBranch } from "./core/git-branch.js";
|
||||||
export { CommitBuilder } from "./core/commit-builder.js";
|
export { CommitBuilder } from "./core/commit-builder.js";
|
||||||
export { extractCIAgentBlock, parseCIAgentBlock, parseCommitMessage } from "./core/commit-parser.js";
|
export { extractCIAgentBlock, parseCIAgentBlock, parseCommitMessage } from "./core/commit-parser.js";
|
||||||
|
export { GiteaClient, generateReleaseNotes } from "./core/gitea.js";
|
||||||
export { VerificationPipeline } from "./verification/index.js";
|
export { VerificationPipeline } from "./verification/index.js";
|
||||||
export { StructuralVerification } from "./verification/structural.js";
|
export { StructuralVerification } from "./verification/structural.js";
|
||||||
export { BehavioralVerification } from "./verification/behavioral.js";
|
export { BehavioralVerification } from "./verification/behavioral.js";
|
||||||
@@ -30,7 +31,7 @@ export { OllamaLocalBackend } from "./backends/ollama-local.js";
|
|||||||
export { OllamaCloudBackend } from "./backends/ollama-cloud.js";
|
export { OllamaCloudBackend } from "./backends/ollama-cloud.js";
|
||||||
export { ToolRegistry } from "./backends/tool-registry.js";
|
export { ToolRegistry } from "./backends/tool-registry.js";
|
||||||
|
|
||||||
export type { CIAgentConfig, AutonomyLevel, ModelProfile } from "./types/config.js";
|
export type { CIAgentConfig, AutonomyLevel, ModelProfile, GiteaConfig } from "./types/config.js";
|
||||||
export type { Decision, DecisionCategory } from "./types/decisions.js";
|
export type { Decision, DecisionCategory } from "./types/decisions.js";
|
||||||
export type { Escalation, EscalationType } from "./types/escalation.js";
|
export type { Escalation, EscalationType } from "./types/escalation.js";
|
||||||
export type { PipelineState, PhaseResult, OrchestratorResult } from "./types/pipeline.js";
|
export type { PipelineState, PhaseResult, OrchestratorResult } from "./types/pipeline.js";
|
||||||
@@ -44,5 +45,6 @@ export type { CIAgentMetadata, ParsedCIAgentCommit, CommitType, CommitScope, Com
|
|||||||
export type { ProjectState, BranchInfo } from "./core/git-context.js";
|
export type { ProjectState, BranchInfo } from "./core/git-context.js";
|
||||||
export type { PhaseBranchInfo, MilestoneBranchInfo, BranchCreateResult, BranchMergeResult } from "./core/git-branch.js";
|
export type { PhaseBranchInfo, MilestoneBranchInfo, BranchCreateResult, BranchMergeResult } from "./core/git-branch.js";
|
||||||
export type { ProjectMd, RoadmapMd, RequirementsMd, ArchitectureMd } from "./core/ciagent-files.js";
|
export type { ProjectMd, RoadmapMd, RequirementsMd, ArchitectureMd } from "./core/ciagent-files.js";
|
||||||
|
export type { GiteaReleaseConfig, GiteaRelease } from "./core/gitea.js";
|
||||||
export type { IntelligenceBackend, BackendRequest, BackendResult, BackendConfigSection, BackendUnavailableError, Artifact, TokenUsage } from "./backends/types.js";
|
export type { IntelligenceBackend, BackendRequest, BackendResult, BackendConfigSection, BackendUnavailableError, Artifact, TokenUsage } from "./backends/types.js";
|
||||||
export type { ToolDefinition, ToolCall, ToolResult } from "./backends/tool-registry.js";
|
export type { ToolDefinition, ToolCall, ToolResult } from "./backends/tool-registry.js";
|
||||||
@@ -66,6 +66,13 @@ export interface GitConfig {
|
|||||||
auto_push: boolean;
|
auto_push: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface GiteaConfig {
|
||||||
|
base_url: string;
|
||||||
|
api_token_env: string;
|
||||||
|
owner: string;
|
||||||
|
repo: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ProjectEntry {
|
export interface ProjectEntry {
|
||||||
slug: string;
|
slug: string;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -82,6 +89,7 @@ export interface CIAgentConfig {
|
|||||||
security: SecurityConfig;
|
security: SecurityConfig;
|
||||||
git: GitConfig;
|
git: GitConfig;
|
||||||
backend: BackendConfigSection;
|
backend: BackendConfigSection;
|
||||||
|
gitea?: GiteaConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DEFAULT_CIAGENT_CONFIG: CIAgentConfig = {
|
export const DEFAULT_CIAGENT_CONFIG: CIAgentConfig = {
|
||||||
@@ -136,4 +144,10 @@ export const DEFAULT_CIAGENT_CONFIG: CIAgentConfig = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
gitea: {
|
||||||
|
base_url: "https://git.cloudinit.dev",
|
||||||
|
api_token_env: "GITEA_TOKEN",
|
||||||
|
owner: "",
|
||||||
|
repo: "",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user