mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-02 18:45:34 +08:00
Merge branch 'main' into fix/network-setup-improvements
This commit is contained in:
@@ -42,4 +42,4 @@ HOST=0.0.0.0
|
|||||||
VITE_CONTEXT_WINDOW=160000
|
VITE_CONTEXT_WINDOW=160000
|
||||||
CONTEXT_WINDOW=160000
|
CONTEXT_WINDOW=160000
|
||||||
|
|
||||||
# VITE_IS_PLATFORM=false
|
|
||||||
|
|||||||
17
CHANGELOG.md
17
CHANGELOG.md
@@ -3,6 +3,23 @@
|
|||||||
All notable changes to CloudCLI UI will be documented in this file.
|
All notable changes to CloudCLI UI will be documented in this file.
|
||||||
|
|
||||||
|
|
||||||
|
## [1.25.2](https://github.com/siteboon/claudecodeui/compare/v1.25.0...v1.25.2) (2026-03-11)
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
* **i18n:** localize plugin settings for all languages ([#515](https://github.com/siteboon/claudecodeui/issues/515)) ([621853c](https://github.com/siteboon/claudecodeui/commit/621853cbfb4233b34cb8cc2e1ed10917ba424352))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* codeql user value provided path validation ([aaa14b9](https://github.com/siteboon/claudecodeui/commit/aaa14b9fc0b9b51c4fb9d1dba40fada7cbbe0356))
|
||||||
|
* numerous bugs ([#528](https://github.com/siteboon/claudecodeui/issues/528)) ([a77f213](https://github.com/siteboon/claudecodeui/commit/a77f213dd5d0b2538dea091ab8da6e55d2002f2f))
|
||||||
|
* **security:** disable executable gray-matter frontmatter in commands ([b9c902b](https://github.com/siteboon/claudecodeui/commit/b9c902b016f411a942c8707dd07d32b60bad087c))
|
||||||
|
* session reconnect catch-up, always-on input, frozen session recovery ([#524](https://github.com/siteboon/claudecodeui/issues/524)) ([4d8fb6e](https://github.com/siteboon/claudecodeui/commit/4d8fb6e30aa03d7cdb92bd62b7709422f9d08e32))
|
||||||
|
|
||||||
|
### Refactoring
|
||||||
|
|
||||||
|
* new settings page design and new pill component ([8ddeeb0](https://github.com/siteboon/claudecodeui/commit/8ddeeb0ce8d0642560bd3fa149236011dc6e3707))
|
||||||
|
|
||||||
## [1.25.0](https://github.com/siteboon/claudecodeui/compare/v1.24.0...v1.25.0) (2026-03-10)
|
## [1.25.0](https://github.com/siteboon/claudecodeui/compare/v1.24.0...v1.25.0) (2026-03-10)
|
||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@siteboon/claude-code-ui",
|
"name": "@siteboon/claude-code-ui",
|
||||||
"version": "1.25.0",
|
"version": "1.25.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@siteboon/claude-code-ui",
|
"name": "@siteboon/claude-code-ui",
|
||||||
"version": "1.25.0",
|
"version": "1.25.2",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@siteboon/claude-code-ui",
|
"name": "@siteboon/claude-code-ui",
|
||||||
"version": "1.25.0",
|
"version": "1.25.2",
|
||||||
"description": "A web-based UI for Claude Code CLI",
|
"description": "A web-based UI for Claude Code CLI",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "server/index.js",
|
"main": "server/index.js",
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ import { promises as fs } from 'fs';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { fileURLToPath } from 'url';
|
import { fileURLToPath } from 'url';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import matter from 'gray-matter';
|
|
||||||
import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS } from '../../shared/modelConstants.js';
|
import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS } from '../../shared/modelConstants.js';
|
||||||
|
import { parseFrontmatter } from '../utils/frontmatter.js';
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
const __dirname = path.dirname(__filename);
|
const __dirname = path.dirname(__filename);
|
||||||
@@ -38,7 +38,7 @@ async function scanCommandsDirectory(dir, baseDir, namespace) {
|
|||||||
// Parse markdown file for metadata
|
// Parse markdown file for metadata
|
||||||
try {
|
try {
|
||||||
const content = await fs.readFile(fullPath, 'utf8');
|
const content = await fs.readFile(fullPath, 'utf8');
|
||||||
const { data: frontmatter, content: commandContent } = matter(content);
|
const { data: frontmatter, content: commandContent } = parseFrontmatter(content);
|
||||||
|
|
||||||
// Calculate relative path from baseDir for command name
|
// Calculate relative path from baseDir for command name
|
||||||
const relativePath = path.relative(baseDir, fullPath);
|
const relativePath = path.relative(baseDir, fullPath);
|
||||||
@@ -475,7 +475,7 @@ router.post('/load', async (req, res) => {
|
|||||||
|
|
||||||
// Read and parse the command file
|
// Read and parse the command file
|
||||||
const content = await fs.readFile(commandPath, 'utf8');
|
const content = await fs.readFile(commandPath, 'utf8');
|
||||||
const { data: metadata, content: commandContent } = matter(content);
|
const { data: metadata, content: commandContent } = parseFrontmatter(content);
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
path: commandPath,
|
path: commandPath,
|
||||||
@@ -560,7 +560,7 @@ router.post('/execute', async (req, res) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const content = await fs.readFile(commandPath, 'utf8');
|
const content = await fs.readFile(commandPath, 'utf8');
|
||||||
const { data: metadata, content: commandContent } = matter(content);
|
const { data: metadata, content: commandContent } = parseFrontmatter(content);
|
||||||
// Basic argument replacement (will be enhanced in command parser utility)
|
// Basic argument replacement (will be enhanced in command parser utility)
|
||||||
let processedContent = commandContent;
|
let processedContent = commandContent;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import matter from 'gray-matter';
|
|
||||||
import { promises as fs } from 'fs';
|
import { promises as fs } from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { execFile } from 'child_process';
|
import { execFile } from 'child_process';
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
import { parse as parseShellCommand } from 'shell-quote';
|
import { parse as parseShellCommand } from 'shell-quote';
|
||||||
|
import { parseFrontmatter } from './frontmatter.js';
|
||||||
|
|
||||||
const execFileAsync = promisify(execFile);
|
const execFileAsync = promisify(execFile);
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ const BASH_COMMAND_ALLOWLIST = [
|
|||||||
*/
|
*/
|
||||||
export function parseCommand(content) {
|
export function parseCommand(content) {
|
||||||
try {
|
try {
|
||||||
const parsed = matter(content);
|
const parsed = parseFrontmatter(content);
|
||||||
return {
|
return {
|
||||||
data: parsed.data || {},
|
data: parsed.data || {},
|
||||||
content: parsed.content || '',
|
content: parsed.content || '',
|
||||||
|
|||||||
18
server/utils/frontmatter.js
Normal file
18
server/utils/frontmatter.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import matter from 'gray-matter';
|
||||||
|
|
||||||
|
const disabledFrontmatterEngine = () => ({});
|
||||||
|
|
||||||
|
const frontmatterOptions = {
|
||||||
|
language: 'yaml',
|
||||||
|
// Disable JS/JSON frontmatter parsing to avoid executable project content.
|
||||||
|
// Mirrors Gatsby's mitigation for gray-matter.
|
||||||
|
engines: {
|
||||||
|
js: disabledFrontmatterEngine,
|
||||||
|
javascript: disabledFrontmatterEngine,
|
||||||
|
json: disabledFrontmatterEngine
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export function parseFrontmatter(content) {
|
||||||
|
return matter(content, frontmatterOptions);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user