Refine company package export format

This commit is contained in:
Dotta
2026-03-14 09:46:16 -05:00
parent 56a34a8f8a
commit 1d8f514d10
13 changed files with 1684 additions and 304 deletions

View File

@@ -115,9 +115,11 @@ export type {
JoinRequest,
InstanceUserRoleGrant,
CompanyPortabilityInclude,
CompanyPortabilitySecretRequirement,
CompanyPortabilityEnvInput,
CompanyPortabilityCompanyManifestEntry,
CompanyPortabilityAgentManifestEntry,
CompanyPortabilityProjectManifestEntry,
CompanyPortabilityIssueManifestEntry,
CompanyPortabilityManifest,
CompanyPortabilityExportResult,
CompanyPortabilitySource,
@@ -126,6 +128,8 @@ export type {
CompanyPortabilityCollisionStrategy,
CompanyPortabilityPreviewRequest,
CompanyPortabilityPreviewAgentPlan,
CompanyPortabilityPreviewProjectPlan,
CompanyPortabilityPreviewIssuePlan,
CompanyPortabilityPreviewResult,
CompanyPortabilityImportRequest,
CompanyPortabilityImportResult,
@@ -235,7 +239,7 @@ export {
type UpdateMemberPermissions,
type UpdateUserCompanyAccess,
portabilityIncludeSchema,
portabilitySecretRequirementSchema,
portabilityEnvInputSchema,
portabilityCompanyManifestEntrySchema,
portabilityAgentManifestEntrySchema,
portabilityManifestSchema,

View File

@@ -1,13 +1,18 @@
export interface CompanyPortabilityInclude {
company: boolean;
agents: boolean;
projects: boolean;
issues: boolean;
}
export interface CompanyPortabilitySecretRequirement {
export interface CompanyPortabilityEnvInput {
key: string;
description: string | null;
agentSlug: string | null;
providerHint: string | null;
kind: "secret" | "plain";
requirement: "required" | "optional";
defaultValue: string | null;
portability: "portable" | "system_dependent";
}
export interface CompanyPortabilityCompanyManifestEntry {
@@ -18,6 +23,38 @@ export interface CompanyPortabilityCompanyManifestEntry {
requireBoardApprovalForNewAgents: boolean;
}
export interface CompanyPortabilityProjectManifestEntry {
slug: string;
name: string;
path: string;
description: string | null;
ownerAgentSlug: string | null;
leadAgentSlug: string | null;
targetDate: string | null;
color: string | null;
status: string | null;
executionWorkspacePolicy: Record<string, unknown> | null;
metadata: Record<string, unknown> | null;
}
export interface CompanyPortabilityIssueManifestEntry {
slug: string;
identifier: string | null;
title: string;
path: string;
projectSlug: string | null;
assigneeAgentSlug: string | null;
description: string | null;
recurrence: Record<string, unknown> | null;
status: string | null;
priority: string | null;
labelIds: string[];
billingCode: string | null;
executionWorkspaceSettings: Record<string, unknown> | null;
assigneeAdapterOverrides: Record<string, unknown> | null;
metadata: Record<string, unknown> | null;
}
export interface CompanyPortabilityAgentManifestEntry {
slug: string;
name: string;
@@ -45,7 +82,9 @@ export interface CompanyPortabilityManifest {
includes: CompanyPortabilityInclude;
company: CompanyPortabilityCompanyManifestEntry | null;
agents: CompanyPortabilityAgentManifestEntry[];
requiredSecrets: CompanyPortabilitySecretRequirement[];
projects: CompanyPortabilityProjectManifestEntry[];
issues: CompanyPortabilityIssueManifestEntry[];
envInputs: CompanyPortabilityEnvInput[];
}
export interface CompanyPortabilityExportResult {
@@ -53,6 +92,7 @@ export interface CompanyPortabilityExportResult {
manifest: CompanyPortabilityManifest;
files: Record<string, string>;
warnings: string[];
paperclipExtensionPath: string;
}
export type CompanyPortabilitySource =
@@ -100,6 +140,21 @@ export interface CompanyPortabilityPreviewAgentPlan {
reason: string | null;
}
export interface CompanyPortabilityPreviewProjectPlan {
slug: string;
action: "create" | "update" | "skip";
plannedName: string;
existingProjectId: string | null;
reason: string | null;
}
export interface CompanyPortabilityPreviewIssuePlan {
slug: string;
action: "create" | "skip";
plannedTitle: string;
reason: string | null;
}
export interface CompanyPortabilityPreviewResult {
include: CompanyPortabilityInclude;
targetCompanyId: string | null;
@@ -109,8 +164,10 @@ export interface CompanyPortabilityPreviewResult {
plan: {
companyAction: "none" | "create" | "update";
agentPlans: CompanyPortabilityPreviewAgentPlan[];
projectPlans: CompanyPortabilityPreviewProjectPlan[];
issuePlans: CompanyPortabilityPreviewIssuePlan[];
};
requiredSecrets: CompanyPortabilitySecretRequirement[];
envInputs: CompanyPortabilityEnvInput[];
warnings: string[];
errors: string[];
}
@@ -130,10 +187,13 @@ export interface CompanyPortabilityImportResult {
name: string;
reason: string | null;
}[];
requiredSecrets: CompanyPortabilitySecretRequirement[];
envInputs: CompanyPortabilityEnvInput[];
warnings: string[];
}
export interface CompanyPortabilityExportRequest {
include?: Partial<CompanyPortabilityInclude>;
projects?: string[];
issues?: string[];
projectIssues?: string[];
}

View File

@@ -70,9 +70,11 @@ export type {
} from "./access.js";
export type {
CompanyPortabilityInclude,
CompanyPortabilitySecretRequirement,
CompanyPortabilityEnvInput,
CompanyPortabilityCompanyManifestEntry,
CompanyPortabilityAgentManifestEntry,
CompanyPortabilityProjectManifestEntry,
CompanyPortabilityIssueManifestEntry,
CompanyPortabilityManifest,
CompanyPortabilityExportResult,
CompanyPortabilitySource,
@@ -81,6 +83,8 @@ export type {
CompanyPortabilityCollisionStrategy,
CompanyPortabilityPreviewRequest,
CompanyPortabilityPreviewAgentPlan,
CompanyPortabilityPreviewProjectPlan,
CompanyPortabilityPreviewIssuePlan,
CompanyPortabilityPreviewResult,
CompanyPortabilityImportRequest,
CompanyPortabilityImportResult,

View File

@@ -4,14 +4,19 @@ export const portabilityIncludeSchema = z
.object({
company: z.boolean().optional(),
agents: z.boolean().optional(),
projects: z.boolean().optional(),
issues: z.boolean().optional(),
})
.partial();
export const portabilitySecretRequirementSchema = z.object({
export const portabilityEnvInputSchema = z.object({
key: z.string().min(1),
description: z.string().nullable(),
agentSlug: z.string().min(1).nullable(),
providerHint: z.string().nullable(),
kind: z.enum(["secret", "plain"]),
requirement: z.enum(["required", "optional"]),
defaultValue: z.string().nullable(),
portability: z.enum(["portable", "system_dependent"]),
});
export const portabilityCompanyManifestEntrySchema = z.object({
@@ -39,6 +44,38 @@ export const portabilityAgentManifestEntrySchema = z.object({
metadata: z.record(z.unknown()).nullable(),
});
export const portabilityProjectManifestEntrySchema = z.object({
slug: z.string().min(1),
name: z.string().min(1),
path: z.string().min(1),
description: z.string().nullable(),
ownerAgentSlug: z.string().min(1).nullable(),
leadAgentSlug: z.string().min(1).nullable(),
targetDate: z.string().nullable(),
color: z.string().nullable(),
status: z.string().nullable(),
executionWorkspacePolicy: z.record(z.unknown()).nullable(),
metadata: z.record(z.unknown()).nullable(),
});
export const portabilityIssueManifestEntrySchema = z.object({
slug: z.string().min(1),
identifier: z.string().min(1).nullable(),
title: z.string().min(1),
path: z.string().min(1),
projectSlug: z.string().min(1).nullable(),
assigneeAgentSlug: z.string().min(1).nullable(),
description: z.string().nullable(),
recurrence: z.record(z.unknown()).nullable(),
status: z.string().nullable(),
priority: z.string().nullable(),
labelIds: z.array(z.string().min(1)).default([]),
billingCode: z.string().nullable(),
executionWorkspaceSettings: z.record(z.unknown()).nullable(),
assigneeAdapterOverrides: z.record(z.unknown()).nullable(),
metadata: z.record(z.unknown()).nullable(),
});
export const portabilityManifestSchema = z.object({
schemaVersion: z.number().int().positive(),
generatedAt: z.string().datetime(),
@@ -51,10 +88,14 @@ export const portabilityManifestSchema = z.object({
includes: z.object({
company: z.boolean(),
agents: z.boolean(),
projects: z.boolean(),
issues: z.boolean(),
}),
company: portabilityCompanyManifestEntrySchema.nullable(),
agents: z.array(portabilityAgentManifestEntrySchema),
requiredSecrets: z.array(portabilitySecretRequirementSchema).default([]),
projects: z.array(portabilityProjectManifestEntrySchema).default([]),
issues: z.array(portabilityIssueManifestEntrySchema).default([]),
envInputs: z.array(portabilityEnvInputSchema).default([]),
});
export const portabilitySourceSchema = z.discriminatedUnion("type", [
@@ -93,6 +134,9 @@ export const portabilityCollisionStrategySchema = z.enum(["rename", "skip", "rep
export const companyPortabilityExportSchema = z.object({
include: portabilityIncludeSchema.optional(),
projects: z.array(z.string().min(1)).optional(),
issues: z.array(z.string().min(1)).optional(),
projectIssues: z.array(z.string().min(1)).optional(),
});
export type CompanyPortabilityExport = z.infer<typeof companyPortabilityExportSchema>;

View File

@@ -14,7 +14,7 @@ export {
} from "./adapter-skills.js";
export {
portabilityIncludeSchema,
portabilitySecretRequirementSchema,
portabilityEnvInputSchema,
portabilityCompanyManifestEntrySchema,
portabilityAgentManifestEntrySchema,
portabilityManifestSchema,