xibecode 1.3.5 → 1.3.11

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,118 @@
1
+ import { spawn } from 'node:child_process';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ function spawnBuffer(cmd, args, cwd) {
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(cmd, args, { cwd });
7
+ const chunks = [];
8
+ let stderr = '';
9
+ child.stdout.on('data', (c) => chunks.push(c));
10
+ child.stderr.on('data', (c) => { stderr += c.toString(); });
11
+ child.on('error', reject);
12
+ child.on('close', (code) => {
13
+ if (code !== 0) {
14
+ reject(new Error(`${cmd} ${args.join(' ')} failed (${code}): ${stderr.trim() || 'no stderr'}`));
15
+ return;
16
+ }
17
+ resolve(Buffer.concat(chunks));
18
+ });
19
+ });
20
+ }
21
+ function decodeNullSeparatedPaths(buf) {
22
+ if (!buf.length)
23
+ return [];
24
+ const raw = buf.toString('utf8');
25
+ const parts = raw.split('\0');
26
+ return parts.filter((p) => p.length > 0);
27
+ }
28
+ async function gitRepoRoot(cwd) {
29
+ try {
30
+ const inside = (await spawnBuffer('git', ['rev-parse', '--is-inside-work-tree'], cwd)).toString('utf8').trim();
31
+ if (inside !== 'true')
32
+ return null;
33
+ const root = (await spawnBuffer('git', ['rev-parse', '--show-toplevel'], cwd)).toString('utf8').trim();
34
+ return root || null;
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ async function gitWorkspacePaths(repoRoot) {
41
+ const tracked = decodeNullSeparatedPaths(await spawnBuffer('git', ['ls-files', '-z'], repoRoot));
42
+ const untracked = decodeNullSeparatedPaths(await spawnBuffer('git', ['ls-files', '-z', '-o', '--exclude-standard'], repoRoot));
43
+ return Array.from(new Set([...tracked, ...untracked])).sort((a, b) => a.localeCompare(b));
44
+ }
45
+ function addDirectoryEntries(paths) {
46
+ const dirs = new Set();
47
+ for (const filePath of paths) {
48
+ let dir = path.posix.dirname(filePath);
49
+ while (dir && dir !== '.') {
50
+ dirs.add(dir);
51
+ dir = path.posix.dirname(dir);
52
+ }
53
+ }
54
+ return dirs;
55
+ }
56
+ const BASIC_SKIP = new Set(['node_modules', '.git', '.xibecode', 'dist', 'build', '.next', '.DS_Store', 'coverage']);
57
+ async function walkDir(dirPath, relativeSoFar) {
58
+ const entries = [];
59
+ try {
60
+ const items = await fs.readdir(dirPath, { withFileTypes: true });
61
+ for (const item of items) {
62
+ if (BASIC_SKIP.has(item.name))
63
+ continue;
64
+ const relPath = relativeSoFar ? `${relativeSoFar}/${item.name}` : item.name;
65
+ if (item.isDirectory()) {
66
+ entries.push({ relativePath: relPath, isDirectory: true });
67
+ const sub = await walkDir(path.join(dirPath, item.name), relPath);
68
+ entries.push(...sub);
69
+ }
70
+ else if (item.isFile()) {
71
+ entries.push({ relativePath: relPath, isDirectory: false });
72
+ }
73
+ }
74
+ }
75
+ catch {
76
+ // skip unreadable dirs
77
+ }
78
+ return entries;
79
+ }
80
+ /**
81
+ * List workspace files and directories, respecting .gitignore when inside a git repo.
82
+ * Paths are relative to `cwd` with POSIX separators.
83
+ */
84
+ export async function listWorkspaceFiles(cwd) {
85
+ const root = await gitRepoRoot(cwd);
86
+ if (root) {
87
+ const paths = await gitWorkspacePaths(root);
88
+ // Convert paths from repo-root-relative to cwd-relative
89
+ const cwdRelativePaths = paths.map((p) => {
90
+ const abs = path.join(root, p);
91
+ return path.relative(cwd, abs).replace(/\\/g, '/');
92
+ }).filter((p) => !p.startsWith('..')); // skip files outside cwd
93
+ const dirSet = addDirectoryEntries(cwdRelativePaths);
94
+ const entryMap = new Map();
95
+ for (const p of cwdRelativePaths) {
96
+ entryMap.set(p, { relativePath: p, isDirectory: false });
97
+ }
98
+ for (const d of dirSet) {
99
+ if (!entryMap.has(d)) {
100
+ entryMap.set(d, { relativePath: d, isDirectory: true });
101
+ }
102
+ }
103
+ return Array.from(entryMap.values()).sort((a, b) => {
104
+ if (a.isDirectory !== b.isDirectory)
105
+ return a.isDirectory ? -1 : 1;
106
+ return a.relativePath.localeCompare(b.relativePath);
107
+ });
108
+ }
109
+ // Fallback: non-git directory walk
110
+ const entries = await walkDir(cwd, '');
111
+ entries.sort((a, b) => {
112
+ if (a.isDirectory !== b.isDirectory)
113
+ return a.isDirectory ? -1 : 1;
114
+ return a.relativePath.localeCompare(b.relativePath);
115
+ });
116
+ return entries;
117
+ }
118
+ //# sourceMappingURL=list-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.js","sourceRoot":"","sources":["../../src/utils/list-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Compare semver release cores (major.minor.patch), ignoring prerelease tags.
3
+ * Returns positive if a > b.
4
+ */
5
+ export declare function compareSemverCore(a: string, b: string): number;
6
+ export type UpdateCheckCache = {
7
+ checkedAt: number;
8
+ latest?: string;
9
+ };
10
+ export declare function updateCheckDisabled(): boolean;
11
+ export declare function fetchLatestNpmVersion(options?: {
12
+ timeoutMs?: number;
13
+ registryUrl?: string;
14
+ }): Promise<string>;
15
+ /**
16
+ * Returns registry latest version, using cache when fresh unless forceRefresh.
17
+ */
18
+ export declare function getNpmLatestVersion(options?: {
19
+ forceRefresh?: boolean;
20
+ cacheTtlMs?: number;
21
+ timeoutMs?: number;
22
+ }): Promise<{
23
+ latest: string;
24
+ fromCache: boolean;
25
+ }>;
26
+ /** Where users read release context without a separate publishing workflow. */
27
+ export declare const NPM_PACKAGE_PAGE = "https://www.npmjs.com/package/xibecode";
28
+ /**
29
+ * If registry has a newer version than current, print a short notice to stderr (non-blocking UX).
30
+ * Respects cache TTL to avoid network on every chat start.
31
+ */
32
+ export declare function maybePrintUpdateNotice(currentVersion: string, options?: {
33
+ cacheTtlMs?: number;
34
+ timeoutMs?: number;
35
+ }): Promise<void>;
36
+ //# sourceMappingURL=npm-update-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-update-notice.d.ts","sourceRoot":"","sources":["../../src/utils/npm-update-notice.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS9D;AAMD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,mBAAmB,IAAI,OAAO,CAG7C;AA4BD,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBlB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAwBlD;AAED,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,2CAA2C,CAAC;AAEzE;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -0,0 +1,132 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ /**
5
+ * Compare semver release cores (major.minor.patch), ignoring prerelease tags.
6
+ * Returns positive if a > b.
7
+ */
8
+ export function compareSemverCore(a, b) {
9
+ const coreA = a.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
10
+ const coreB = b.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
11
+ for (let i = 0; i < 3; i++) {
12
+ const x = coreA[i] ?? 0;
13
+ const y = coreB[i] ?? 0;
14
+ if (x !== y)
15
+ return x - y;
16
+ }
17
+ return 0;
18
+ }
19
+ const NPM_PKG = 'xibecode';
20
+ const DEFAULT_REGISTRY = `https://registry.npmjs.org/${NPM_PKG}/latest`;
21
+ const CACHE_NAME = 'update-check.json';
22
+ export function updateCheckDisabled() {
23
+ const v = process.env.XIBECODE_DISABLE_UPDATE_CHECK;
24
+ return v === '1' || v === 'true';
25
+ }
26
+ function cachePath() {
27
+ return join(homedir(), '.xibecode', CACHE_NAME);
28
+ }
29
+ function readCache() {
30
+ if (updateCheckDisabled())
31
+ return null;
32
+ try {
33
+ const p = cachePath();
34
+ if (!existsSync(p))
35
+ return null;
36
+ const raw = readFileSync(p, 'utf8');
37
+ return JSON.parse(raw);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ function writeCache(data) {
44
+ try {
45
+ const dir = join(homedir(), '.xibecode');
46
+ mkdirSync(dir, { recursive: true });
47
+ writeFileSync(cachePath(), JSON.stringify(data), 'utf8');
48
+ }
49
+ catch {
50
+ // best-effort
51
+ }
52
+ }
53
+ export async function fetchLatestNpmVersion(options) {
54
+ const timeoutMs = options?.timeoutMs ?? 2500;
55
+ const url = options?.registryUrl ?? DEFAULT_REGISTRY;
56
+ const ac = new AbortController();
57
+ const t = setTimeout(() => ac.abort(), timeoutMs);
58
+ try {
59
+ const res = await fetch(url, {
60
+ signal: ac.signal,
61
+ headers: { Accept: 'application/json' },
62
+ });
63
+ if (!res.ok) {
64
+ throw new Error(`registry responded ${res.status}`);
65
+ }
66
+ const data = (await res.json());
67
+ if (!data.version || typeof data.version !== 'string') {
68
+ throw new Error('missing version in registry payload');
69
+ }
70
+ return data.version.trim();
71
+ }
72
+ finally {
73
+ clearTimeout(t);
74
+ }
75
+ }
76
+ /**
77
+ * Returns registry latest version, using cache when fresh unless forceRefresh.
78
+ */
79
+ export async function getNpmLatestVersion(options) {
80
+ const cacheTtlMs = options?.cacheTtlMs ?? 48 * 60 * 60 * 1000;
81
+ const now = Date.now();
82
+ const cached = readCache();
83
+ if (!options?.forceRefresh &&
84
+ cached?.latest &&
85
+ now - cached.checkedAt < cacheTtlMs) {
86
+ return { latest: cached.latest, fromCache: true };
87
+ }
88
+ try {
89
+ const latest = await fetchLatestNpmVersion({ timeoutMs: options?.timeoutMs });
90
+ writeCache({ checkedAt: now, latest });
91
+ return { latest, fromCache: false };
92
+ }
93
+ catch {
94
+ writeCache({ checkedAt: now, latest: cached?.latest });
95
+ if (cached?.latest) {
96
+ return { latest: cached.latest, fromCache: true };
97
+ }
98
+ throw new Error('Could not reach npm registry for version check.');
99
+ }
100
+ }
101
+ /** Where users read release context without a separate publishing workflow. */
102
+ export const NPM_PACKAGE_PAGE = 'https://www.npmjs.com/package/xibecode';
103
+ /**
104
+ * If registry has a newer version than current, print a short notice to stderr (non-blocking UX).
105
+ * Respects cache TTL to avoid network on every chat start.
106
+ */
107
+ export async function maybePrintUpdateNotice(currentVersion, options) {
108
+ if (updateCheckDisabled())
109
+ return;
110
+ try {
111
+ const { latest } = await getNpmLatestVersion({
112
+ cacheTtlMs: options?.cacheTtlMs,
113
+ timeoutMs: options?.timeoutMs,
114
+ });
115
+ if (compareSemverCore(latest, currentVersion) <= 0) {
116
+ return;
117
+ }
118
+ const chalk = (await import('chalk')).default;
119
+ const dim = (s) => chalk.dim(s);
120
+ const yellow = (s) => chalk.yellow(s);
121
+ console.error('');
122
+ console.error(yellow(`Update available: ${latest}`) + dim(` (you have ${currentVersion})`));
123
+ console.error(dim(`npm package: ${NPM_PACKAGE_PAGE}`));
124
+ console.error(dim('Upgrade: pnpm add -g xibecode@latest | npm i -g xibecode@latest'));
125
+ console.error(dim('Disable notices: XIBECODE_DISABLE_UPDATE_CHECK=1'));
126
+ console.error('');
127
+ }
128
+ catch {
129
+ // ignore — offline / registry errors should never block chat
130
+ }
131
+ }
132
+ //# sourceMappingURL=npm-update-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-update-notice.js","sourceRoot":"","sources":["../../src/utils/npm-update-notice.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xibecode",
3
- "version": "1.3.5",
3
+ "version": "1.3.11",
4
4
  "description": "AI-powered autonomous coding assistant with AI test generation, multi-model support, and plugin system",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "xibecode-core": "^1.3.5",
35
+ "xibecode-core": "^1.3.10",
36
36
  "@anthropic-ai/sdk": "^0.78.0",
37
37
  "chalk": "^4.1.2",
38
38
  "commander": "^12.0.0",