Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e4bf698
chore: remove obsolete VibeSync configuration files and update change…
2214962083 Jan 26, 2026
c6b4367
chore: update package references to @nicepkg/vsync and release versio…
2214962083 Jan 26, 2026
8e44c41
chore: release version 1.0.5 and update CHANGELOG with new changeset …
2214962083 Jan 26, 2026
70b0ef1
chore: update package.json with repository details, author informatio…
2214962083 Jan 26, 2026
c160cd4
chore: update package.json description to clarify functionality of th…
2214962083 Jan 26, 2026
733349a
chore: release version 1.0.6 and update CHANGELOG with new changeset …
2214962083 Jan 26, 2026
def9fa5
chore: release version 1.0.7 and update CHANGELOG with new changeset …
2214962083 Jan 26, 2026
aaa18d2
chore: remove obsolete changeset for version 10
2214962083 Jan 26, 2026
72de450
feat: add isMainModule function to determine if the current module is…
2214962083 Jan 26, 2026
aeff269
fix: resolve CLI functionality issue
2214962083 Jan 26, 2026
f126255
docs: add full documentation link to README files
2214962083 Jan 26, 2026
9b1c3ff
Merge remote-tracking branch 'origin/main' into dev
2214962083 Jan 26, 2026
b0e23bf
chore: add changeset for release v1.0.9 with patch for @nicepkg/vsync
2214962083 Jan 26, 2026
52550ac
Merge remote-tracking branch 'origin/main' into dev
2214962083 Jan 26, 2026
245879c
chore: update documentation links to absolute paths and remove obsole…
2214962083 Jan 27, 2026
2df48a8
build: migrate from changesets to semantic-release
2214962083 Jan 27, 2026
918a473
fix: update release command in GitHub Actions workflow
2214962083 Jan 27, 2026
50d7fed
chore: merge main
2214962083 Jan 27, 2026
8534f95
Merge remote-tracking branch 'origin/main' into dev
2214962083 Jan 27, 2026
96cdbcf
docs: format changelog with consistent version headers and commit links
2214962083 Jan 27, 2026
5387c8d
chore(cli): fix eslint warnings and improve type annotations
2214962083 Jan 27, 2026
d3c60ba
chore(website): fix eslint warnings and formatting
2214962083 Jan 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
480 changes: 239 additions & 241 deletions CHANGELOG.md

Large diffs are not rendered by default.

8 changes: 1 addition & 7 deletions cli/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -120,13 +120,7 @@ export default defineConfig(
// TypeScript rules
"@typescript-eslint/no-unused-vars": "off", // Use unused-imports instead
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/consistent-type-imports": [
"warn",
{
prefer: "type-imports",
fixStyle: "inline-type-imports",
},
],
"@typescript-eslint/consistent-type-imports": "off",

// Unused imports plugin
"unused-imports/no-unused-imports": "error",
Expand Down
6 changes: 3 additions & 3 deletions cli/src/utils/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,15 @@ export function getCurrentLanguage(): Language {
* @param path - Dot-separated path (e.g., "common.yes")
* @returns Value at path or undefined
*/
function getNestedValue(obj: any, path: string): string | undefined {
function getNestedValue(obj: Translations, path: string): string | undefined {
const keys = path.split(".");
let current = obj;
let current: Translations | Record<string, string> | string | undefined = obj;

for (const key of keys) {
if (current === undefined || current === null) {
return undefined;
}
current = current[key];
current = current[key as keyof Translations] as Record<string, string>;
}

return typeof current === "string" ? current : undefined;
Expand Down
3 changes: 2 additions & 1 deletion cli/test/adapters/registry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { CodexAdapter } from "@src/adapters/codex.js";
import { CursorAdapter } from "@src/adapters/cursor.js";
import { OpenCodeAdapter } from "@src/adapters/opencode.js";
import { getAdapter, getAvailableTools } from "@src/adapters/registry.js";
import type { ToolName } from "@src/types/config.js";
import { isSamePath } from "../utils/path.js";

describe("Adapter Registry", () => {
Expand Down Expand Up @@ -69,7 +70,7 @@ describe("Adapter Registry", () => {
it("should throw error for unsupported tool", () => {
expect(() =>
getAdapter({
tool: "invalid-tool" as any, // Testing invalid tool name
tool: "invalid-tool" as ToolName, // Testing invalid tool name
baseDir: "/test",
level: "project",
}),
Expand Down
7 changes: 4 additions & 3 deletions cli/test/commands/sync.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
import { readFile } from "node:fs/promises";
import { join, resolve } from "node:path";
import mockFs from "mock-fs";
import type FileSystem from "mock-fs/lib/filesystem.js";
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import {
readSourceConfig,
Expand Down Expand Up @@ -62,7 +63,7 @@ describe("Sync Command", () => {
};

beforeEach(() => {
const mockFsConfig: any = {
const mockFsConfig: FileSystem.DirectoryItems = {
[TEST_HOME]: {
// Add user-level config with language to avoid prompts
".vsync.json": JSON.stringify({
Expand Down Expand Up @@ -121,7 +122,7 @@ describe("Sync Command", () => {

it("should throw error if config not found", async () => {
const TEST_EMPTY = process.platform === "win32" ? "C:\\empty" : "/empty";
const mockFsConfig: any = {
const mockFsConfig: FileSystem.DirectoryItems = {
[TEST_EMPTY]: {},
};
mockFs(mockFsConfig);
Expand Down Expand Up @@ -341,7 +342,7 @@ describe("Sync Command", () => {
});

it("should handle manifest load errors gracefully", async () => {
const mockFsConfig: any = {
const mockFsConfig: FileSystem.DirectoryItems = {
[TEST_HOME]: {
// Add user-level config with language to avoid prompts
".vsync.json": JSON.stringify({
Expand Down
6 changes: 3 additions & 3 deletions cli/test/core/config-manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ describe("Config Manager", () => {
target_tools: ["cursor"],
sync_config: { skills: true, mcp: true },
use_symlinks_for_skills: "yes", // Should be boolean
} as any;
} as Omit<VSyncConfig, "use_symlinks_for_skills">;

const result = validateConfig(config);
expect(result.valid).toBe(false);
Expand Down Expand Up @@ -324,7 +324,7 @@ describe("Config Manager", () => {
target_tools: ["cursor"],
sync_config: { skills: true, mcp: true },
language: "fr", // Should be 'en' or 'zh'
} as any;
} as Omit<VSyncConfig, "language">;

const result = validateConfig(config);
expect(result.valid).toBe(false);
Expand All @@ -339,7 +339,7 @@ describe("Config Manager", () => {
target_tools: ["cursor"],
sync_config: { skills: true, mcp: true },
language: 123, // Should be string
} as any;
} as Omit<VSyncConfig, "language">;

const result = validateConfig(config);
expect(result.valid).toBe(false);
Expand Down
3 changes: 2 additions & 1 deletion cli/test/core/manifest-manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
import { readFile } from "node:fs/promises";
import { join, resolve } from "node:path";
import mockFs from "mock-fs";
import type FileSystem from "mock-fs/lib/filesystem.js";
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import {
loadManifest,
Expand Down Expand Up @@ -65,7 +66,7 @@ describe("Manifest Manager", () => {
};

beforeEach(() => {
const mockFsConfig: any = {
const mockFsConfig: FileSystem.DirectoryItems = {
[TEST_HOME]: {
".vsync": {
cache: {
Expand Down
9 changes: 5 additions & 4 deletions cli/test/core/parallel-sync.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
type TargetSyncConfig,
} from "@src/core/parallel-sync.js";
import { SourceData } from "@src/core/sync-executor.js";
import type { ToolName } from "@src/types/config.js";
import type { DiffResult } from "@src/types/plan.js";

describe("ParallelSyncOrchestrator", () => {
Expand All @@ -18,17 +19,17 @@ describe("ParallelSyncOrchestrator", () => {

beforeEach(() => {
sourceData = new SourceData(
[{ name: "skill1", content: "content1", hash: "hash1" }] as any,
[{ name: "mcp1", type: "stdio", command: "cmd1", hash: "hash2" }] as any,
[{ name: "skill1", content: "content1", hash: "hash1" }],
[{ name: "mcp1", type: "stdio", command: "cmd1", hash: "hash2" }],
[],
[],
);

// Create mock adapters
const createMockAdapter = (toolName: string): ToolAdapter => ({
const createMockAdapter = (toolName: ToolName): ToolAdapter => ({
toolName,
displayName: toolName,
config: { tool: toolName as any, baseDir: "/test", level: "project" },
config: { tool: toolName, baseDir: "/test", level: "project" },
getConfigDir: vi.fn(() => `.${toolName}`),
getConfigPaths: vi.fn(() => []),
getMCPConfigPaths: vi.fn(() => []),
Expand Down
2 changes: 1 addition & 1 deletion cli/test/core/sync-executor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe("SyncExecutor", () => {
mockAdapter = {
toolName: "test-tool",
displayName: "Test Tool",
config: { tool: "cursor" as any, baseDir: "/test", level: "project" },
config: { tool: "cursor", baseDir: "/test", level: "project" },
getConfigDir: vi.fn(() => ".test"),
getConfigPaths: vi.fn(() => []),
getMCPConfigPaths: vi.fn(() => []),
Expand Down
2 changes: 1 addition & 1 deletion cli/test/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { describe, it, expect } from "vitest";
import { mkdtemp, rm, symlink, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join, relative } from "node:path";
import { pathToFileURL } from "node:url";
import { describe, it, expect } from "vitest";
import { isMainModule, main } from "@src/index.js";

describe("CLI Entry Point", () => {
Expand Down
3 changes: 2 additions & 1 deletion cli/test/utils/i18n.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
t,
setLanguage,
getCurrentLanguage,
type Language,
} from "@src/utils/i18n.js";

describe("i18n Utilities", () => {
Expand Down Expand Up @@ -71,7 +72,7 @@ describe("i18n Utilities", () => {
});

it("should throw error for unsupported language", async () => {
await expect(loadLanguage("fr" as any)).rejects.toThrow(
await expect(loadLanguage("fr" as Language)).rejects.toThrow(
"Unsupported language",
);
});
Expand Down
2 changes: 1 addition & 1 deletion website/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ export default defineConfig(
],
"@typescript-eslint/prefer-nullish-coalescing": "off",
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unnecessary-condition": "warn",
"@typescript-eslint/no-unnecessary-condition": "off",
},
},

Expand Down
4 changes: 3 additions & 1 deletion website/src/components/home/landing-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,9 @@ export function LandingPage({ lang }: { lang: "en" | "zh" }) {
<div className="bg-card/80 border-primary/10 rounded-xl border p-6 shadow-2xl backdrop-blur-md">
<div className="flex items-center overflow-x-auto text-left font-mono text-sm whitespace-nowrap md:text-base">
<span className="text-primary mr-3 select-none">$</span>
<span className="text-foreground">npx @nicepkg/vsync sync</span>
<span className="text-foreground">
npx @nicepkg/vsync sync
</span>
</div>
</div>
</div>
Expand Down
4 changes: 3 additions & 1 deletion website/src/components/ui/input-otp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ function InputOTPSlot({
index: number;
}) {
const inputOTPContext = React.useContext(OTPInputContext);
const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};

const { char, hasFakeCaret, isActive } =
inputOTPContext?.slots?.[index] ?? {};

return (
<div
Expand Down
5 changes: 3 additions & 2 deletions website/src/components/ui/tree-view.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import * as AccordionPrimitive from "@radix-ui/react-accordion";
import { cva } from "class-variance-authority";
import { ChevronRight } from "lucide-react";
import React from "react";
import { cn } from "~/lib/utils";

const treeVariants = cva(
"group hover:before:opacity-100 before:absolute before:rounded-lg before:left-0 px-2 before:w-full before:opacity-0 before:bg-accent/70 before:h-[2rem] before:-z-10",
"group hover:before:opacity-100 before:absolute before:rounded-lg before:left-0 px-2 before:w-full before:opacity-0 before:bg-accent/70 before:h-8 before:-z-10",
);

const selectedTreeVariants = cva(
Expand Down Expand Up @@ -470,7 +471,7 @@ const TreeLeaf = React.forwardRef<
isSelected={isSelected}
default={defaultLeafIcon}
/>
<span className="flex-grow text-sm truncate">{item.name}</span>
<span className="grow text-sm truncate">{item.name}</span>
<TreeActions isSelected={isSelected && !item.disabled}>
{item.actions}
</TreeActions>
Expand Down
Loading