@paperclipai/plugin-workspace-diff 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.
@@ -0,0 +1,122 @@
1
+ import { z } from "@paperclipai/plugin-sdk";
2
+ export const workspaceDiffViewSchema = z.enum(["working-tree", "head"]);
3
+ export const workspaceDiffFileStatusSchema = z.enum([
4
+ "added",
5
+ "modified",
6
+ "deleted",
7
+ "renamed",
8
+ "copied",
9
+ "type_changed",
10
+ "untracked",
11
+ "unknown",
12
+ ]);
13
+ export const workspaceDiffPatchKindSchema = z.enum(["staged", "unstaged", "head", "untracked"]);
14
+ export const workspaceDiffWarningCodeSchema = z.enum([
15
+ "base_ref_missing",
16
+ "base_ref_invalid",
17
+ "binary_file",
18
+ "file_count_truncated",
19
+ "file_oversized",
20
+ "git_command_failed",
21
+ "missing_cwd",
22
+ "non_git_workspace",
23
+ "patch_truncated",
24
+ "path_filter_invalid",
25
+ "symlink_target_outside_workspace",
26
+ "workspace_path_invalid",
27
+ ]);
28
+ const queryBooleanSchema = z
29
+ .union([z.boolean(), z.enum(["true", "false"])])
30
+ .transform((value) => value === true || value === "true");
31
+ function normalizePathQuery(value) {
32
+ if (value == null)
33
+ return [];
34
+ const values = Array.isArray(value) ? value : [value];
35
+ return values.flatMap((entry) => {
36
+ if (typeof entry !== "string")
37
+ return [];
38
+ return entry
39
+ .split(",")
40
+ .map((filePath) => filePath.trim())
41
+ .filter(Boolean);
42
+ });
43
+ }
44
+ export const workspaceDiffQuerySchema = z
45
+ .object({
46
+ view: workspaceDiffViewSchema.optional().default("working-tree"),
47
+ baseRef: z.string().trim().min(1).max(240).optional().nullable(),
48
+ includeUntracked: queryBooleanSchema.optional().default(true),
49
+ path: z.union([z.string(), z.array(z.string())]).optional(),
50
+ paths: z.union([z.string(), z.array(z.string())]).optional(),
51
+ })
52
+ .passthrough()
53
+ .transform((value) => ({
54
+ view: value.view,
55
+ baseRef: value.baseRef?.trim() || null,
56
+ includeUntracked: value.includeUntracked,
57
+ paths: normalizePathQuery(value.paths ?? value.path),
58
+ }));
59
+ export const workspaceDiffWarningSchema = z.object({
60
+ code: workspaceDiffWarningCodeSchema,
61
+ message: z.string(),
62
+ path: z.string().nullable(),
63
+ }).strict();
64
+ export const workspaceDiffCapsSchema = z.object({
65
+ maxFiles: z.number().int().positive(),
66
+ maxFileBytes: z.number().int().positive(),
67
+ maxPatchBytes: z.number().int().positive(),
68
+ maxTotalPatchBytes: z.number().int().positive(),
69
+ }).strict();
70
+ export const workspaceDiffFilePatchSchema = z.object({
71
+ kind: workspaceDiffPatchKindSchema,
72
+ patch: z.string().nullable(),
73
+ additions: z.number().int().nonnegative(),
74
+ deletions: z.number().int().nonnegative(),
75
+ binary: z.boolean(),
76
+ oversized: z.boolean(),
77
+ truncated: z.boolean(),
78
+ warnings: z.array(workspaceDiffWarningSchema),
79
+ }).strict();
80
+ export const workspaceDiffFileSchema = z.object({
81
+ path: z.string(),
82
+ oldPath: z.string().nullable(),
83
+ status: workspaceDiffFileStatusSchema,
84
+ staged: z.boolean(),
85
+ unstaged: z.boolean(),
86
+ untracked: z.boolean(),
87
+ binary: z.boolean(),
88
+ oversized: z.boolean(),
89
+ truncated: z.boolean(),
90
+ additions: z.number().int().nonnegative(),
91
+ deletions: z.number().int().nonnegative(),
92
+ sizeBytes: z.number().int().nonnegative().nullable(),
93
+ patches: z.array(workspaceDiffFilePatchSchema),
94
+ warnings: z.array(workspaceDiffWarningSchema),
95
+ }).strict();
96
+ export const workspaceDiffStatsSchema = z.object({
97
+ fileCount: z.number().int().nonnegative(),
98
+ stagedFileCount: z.number().int().nonnegative(),
99
+ unstagedFileCount: z.number().int().nonnegative(),
100
+ untrackedFileCount: z.number().int().nonnegative(),
101
+ binaryFileCount: z.number().int().nonnegative(),
102
+ oversizedFileCount: z.number().int().nonnegative(),
103
+ truncatedFileCount: z.number().int().nonnegative(),
104
+ additions: z.number().int().nonnegative(),
105
+ deletions: z.number().int().nonnegative(),
106
+ }).strict();
107
+ export const workspaceDiffResponseSchema = z.object({
108
+ workspaceId: z.string(),
109
+ companyId: z.string(),
110
+ view: workspaceDiffViewSchema,
111
+ baseRef: z.string().nullable(),
112
+ defaultBaseRef: z.string().nullable(),
113
+ headSha: z.string().nullable(),
114
+ includeUntracked: z.boolean(),
115
+ paths: z.array(z.string()),
116
+ files: z.array(workspaceDiffFileSchema),
117
+ stats: workspaceDiffStatsSchema,
118
+ warnings: z.array(workspaceDiffWarningSchema),
119
+ caps: workspaceDiffCapsSchema,
120
+ truncated: z.boolean(),
121
+ }).strict();
122
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { WorkspaceDiffFile, WorkspaceDiffFilePatch, WorkspaceDiffResponse, WorkspaceDiffWarning } from "./contracts.js";
2
+ export type DiffRenderMode = "unified" | "split";
3
+ export interface DiffPatchViewModel {
4
+ kind: WorkspaceDiffFilePatch["kind"];
5
+ patch: string | null;
6
+ lineCount: number;
7
+ additions: number;
8
+ deletions: number;
9
+ binary: boolean;
10
+ oversized: boolean;
11
+ truncated: boolean;
12
+ warnings: WorkspaceDiffWarning[];
13
+ }
14
+ export interface DiffFileViewModel {
15
+ path: string;
16
+ oldPath: string | null;
17
+ status: WorkspaceDiffFile["status"];
18
+ additions: number;
19
+ deletions: number;
20
+ binary: boolean;
21
+ oversized: boolean;
22
+ truncated: boolean;
23
+ warnings: WorkspaceDiffWarning[];
24
+ patchKinds: WorkspaceDiffFilePatch["kind"][];
25
+ patches: DiffPatchViewModel[];
26
+ patch: string | null;
27
+ lineCount: number;
28
+ longDiff: boolean;
29
+ }
30
+ export interface DiffSummaryViewModel {
31
+ changedLabel: string;
32
+ lineLabel: string;
33
+ warningCount: number;
34
+ truncated: boolean;
35
+ }
36
+ export declare const LONG_DIFF_LINE_THRESHOLD = 400;
37
+ export declare function statusLabel(status: WorkspaceDiffFile["status"]): string;
38
+ export declare function fileName(filePath: string): string;
39
+ export declare function buildFilePatches(file: WorkspaceDiffFile): DiffPatchViewModel[];
40
+ export declare function buildFilePatch(file: WorkspaceDiffFile): string | null;
41
+ export declare function isLongDiffFile(file: Pick<DiffFileViewModel, "lineCount">): boolean;
42
+ export declare function toFileViewModels(diff: WorkspaceDiffResponse | null | undefined): DiffFileViewModel[];
43
+ export declare function diffSummary(diff: WorkspaceDiffResponse | null | undefined): DiffSummaryViewModel;
44
+ export declare function nextExpandedFileSet(current: ReadonlySet<string>, filePath: string): Set<string>;
45
+ export declare function initialExpandedFileSet(files: readonly DiffFileViewModel[]): Set<string>;
46
+ //# sourceMappingURL=diff-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-model.d.ts","sourceRoot":"","sources":["../src/diff-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;IAC7C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAaD,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,UAE9D;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,UAExC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,EAAE,CAgB9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAErE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,WAExE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,EAAE,CAqBpG;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,GAAG,oBAAoB,CAahG;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAC5B,QAAQ,EAAE,MAAM,GACf,GAAG,CAAC,MAAM,CAAC,CAKb;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAEvF"}
@@ -0,0 +1,87 @@
1
+ const STATUS_LABELS = {
2
+ added: "Added",
3
+ modified: "Modified",
4
+ deleted: "Deleted",
5
+ renamed: "Renamed",
6
+ copied: "Copied",
7
+ type_changed: "Type changed",
8
+ untracked: "Untracked",
9
+ unknown: "Changed",
10
+ };
11
+ export const LONG_DIFF_LINE_THRESHOLD = 400;
12
+ export function statusLabel(status) {
13
+ return STATUS_LABELS[status] ?? "Changed";
14
+ }
15
+ export function fileName(filePath) {
16
+ return filePath.split("/").filter(Boolean).pop() ?? filePath;
17
+ }
18
+ export function buildFilePatches(file) {
19
+ return file.patches.map((patch) => {
20
+ const textPatch = patch.patch?.trimEnd() ?? null;
21
+ const lineCount = textPatch ? textPatch.split("\n").length : 0;
22
+ return {
23
+ kind: patch.kind,
24
+ patch: textPatch && textPatch.length > 0 ? textPatch : null,
25
+ lineCount,
26
+ additions: patch.additions,
27
+ deletions: patch.deletions,
28
+ binary: patch.binary,
29
+ oversized: patch.oversized,
30
+ truncated: patch.truncated,
31
+ warnings: patch.warnings,
32
+ };
33
+ });
34
+ }
35
+ export function buildFilePatch(file) {
36
+ return buildFilePatches(file).find((patch) => patch.patch)?.patch ?? null;
37
+ }
38
+ export function isLongDiffFile(file) {
39
+ return file.lineCount > LONG_DIFF_LINE_THRESHOLD;
40
+ }
41
+ export function toFileViewModels(diff) {
42
+ return (diff?.files ?? []).map((file) => {
43
+ const patches = buildFilePatches(file);
44
+ const lineCount = patches.reduce((count, patch) => count + patch.lineCount, 0);
45
+ return {
46
+ path: file.path,
47
+ oldPath: file.oldPath,
48
+ status: file.status,
49
+ additions: file.additions,
50
+ deletions: file.deletions,
51
+ binary: file.binary,
52
+ oversized: file.oversized,
53
+ truncated: file.truncated,
54
+ warnings: file.warnings,
55
+ patchKinds: file.patches.map((patch) => patch.kind),
56
+ patches,
57
+ patch: patches.find((patch) => patch.patch)?.patch ?? null,
58
+ lineCount,
59
+ longDiff: isLongDiffFile({ lineCount }),
60
+ };
61
+ });
62
+ }
63
+ export function diffSummary(diff) {
64
+ const stats = diff?.stats;
65
+ const fileCount = stats?.fileCount ?? 0;
66
+ const additions = stats?.additions ?? 0;
67
+ const deletions = stats?.deletions ?? 0;
68
+ const warningCount = diff?.warnings.length ?? 0;
69
+ return {
70
+ changedLabel: `${fileCount} ${fileCount === 1 ? "file" : "files"}`,
71
+ lineLabel: `+${additions} / -${deletions}`,
72
+ warningCount,
73
+ truncated: Boolean(diff?.truncated),
74
+ };
75
+ }
76
+ export function nextExpandedFileSet(current, filePath) {
77
+ const next = new Set(current);
78
+ if (next.has(filePath))
79
+ next.delete(filePath);
80
+ else
81
+ next.add(filePath);
82
+ return next;
83
+ }
84
+ export function initialExpandedFileSet(files) {
85
+ return new Set(files.filter((file) => !file.longDiff).map((file) => file.path));
86
+ }
87
+ //# sourceMappingURL=diff-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-model.js","sourceRoot":"","sources":["../src/diff-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { default as manifest } from "./manifest.js";
2
+ export { default as worker } from "./worker.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { default as manifest } from "./manifest.js";
2
+ export { default as worker } from "./worker.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PaperclipPluginManifestV1 } from "@paperclipai/plugin-sdk";
2
+ declare const manifest: PaperclipPluginManifestV1;
3
+ export default manifest;
4
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAKzE,QAAA,MAAM,QAAQ,EAAE,yBA6Bf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,34 @@
1
+ const PLUGIN_ID = "paperclip.workspace-diff";
2
+ const CHANGES_TAB_SLOT_ID = "workspace-changes-tab";
3
+ const manifest = {
4
+ id: PLUGIN_ID,
5
+ apiVersion: 1,
6
+ version: "0.1.0",
7
+ displayName: "Workspace Changes",
8
+ description: "Adds a Changes tab to execution and project workspaces using plugin-local Git diff computation and @pierre/diffs.",
9
+ author: "Paperclip",
10
+ categories: ["workspace", "ui"],
11
+ capabilities: [
12
+ "ui.detailTab.register",
13
+ "execution.workspaces.read",
14
+ "project.workspaces.read",
15
+ ],
16
+ entrypoints: {
17
+ worker: "./dist/worker.js",
18
+ ui: "./dist/ui",
19
+ },
20
+ ui: {
21
+ slots: [
22
+ {
23
+ type: "detailTab",
24
+ id: CHANGES_TAB_SLOT_ID,
25
+ displayName: "Changes",
26
+ exportName: "ChangesTab",
27
+ entityTypes: ["execution_workspace", "project_workspace"],
28
+ order: 25,
29
+ },
30
+ ],
31
+ },
32
+ };
33
+ export default manifest;
34
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAC7C,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAEpD,MAAM,QAAQ,GAA8B;IAC1C,EAAE,EAAE,SAAS;IACb,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,mHAAmH;IAChI,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;IAC/B,YAAY,EAAE;QACZ,uBAAuB;QACvB,2BAA2B;QAC3B,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,MAAM,EAAE,kBAAkB;QAC1B,EAAE,EAAE,WAAW;KAChB;IACD,EAAE,EAAE;QACF,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,mBAAmB;gBACvB,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE,YAAY;gBACxB,WAAW,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;gBACzD,KAAK,EAAE,EAAE;aACV;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PluginDetailTabProps } from "@paperclipai/plugin-sdk/ui";
2
+ export declare function ErrorState({ message, onRetry, }: {
3
+ message: string;
4
+ onRetry: () => void;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ export declare function ChangesTab({ context }: PluginDetailTabProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA8NvE,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,2CA6BA;AAqFD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,oBAAoB,2CAkR3D"}