@hienlh/ppm 0.13.66 → 0.13.67
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.
- package/.opencode/.env.example +98 -0
- package/.opencode/skills/ads-management/scripts/.env.example +13 -0
- package/.opencode/skills/ai-multimodal/.env.example +230 -0
- package/.opencode/skills/cip-design/.env.example +6 -0
- package/.opencode/skills/devops/.env.example +76 -0
- package/.opencode/skills/docs-seeker/.env.example +15 -0
- package/.opencode/skills/elevenlabs/.env.example +3 -0
- package/.opencode/skills/marketing-dashboard/.env.example +15 -0
- package/.opencode/skills/marketing-dashboard/app/.env.example +2 -0
- package/.opencode/skills/marketing-dashboard/server/.env.example +2 -0
- package/.opencode/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/.opencode/skills/mcp-management/scripts/dist/cli.js +160 -0
- package/.opencode/skills/mcp-management/scripts/dist/mcp-client.js +183 -0
- package/.opencode/skills/payment-integration/scripts/.env.example +20 -0
- package/.opencode/skills/sequential-thinking/.env.example +8 -0
- package/CHANGELOG.md +9 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-DLKD1Xjj.js +1 -0
- package/dist/web/assets/{audio-preview-B8XiU4Bw.js → audio-preview-Iq-XRBGw.js} +1 -1
- package/dist/web/assets/{chat-tab-B1m7T_2n.js → chat-tab-DkVXRD9e.js} +3 -3
- package/dist/web/assets/{code-editor-CQSDgP7X.js → code-editor-M6wHw8AZ.js} +2 -2
- package/dist/web/assets/{conflict-editor-BPjmtXlC.js → conflict-editor-D_8t44Wi.js} +1 -1
- package/dist/web/assets/{database-viewer-Cl31pR9W.js → database-viewer-Cj5yCn4w.js} +1 -1
- package/dist/web/assets/diff-viewer-BgPv67fJ.js +4 -0
- package/dist/web/assets/{docx-preview-D_P_e_0O.js → docx-preview-BbmDvXdS.js} +1 -1
- package/dist/web/assets/extension-webview-CP_AtfYs.js +3 -0
- package/dist/web/assets/{git-log-panel-CAa4j8NA.js → git-log-panel-DPRoZgWG.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-2a0r4GHr.js +1 -0
- package/dist/web/assets/{glide-data-grid-DbtdLkFk.js → glide-data-grid-BrtUKC3w.js} +1 -1
- package/dist/web/assets/{image-preview-DjWCljN-.js → image-preview-BFj-ipom.js} +1 -1
- package/dist/web/assets/{index-PZd81rhr.js → index-CJZZ6v1o.js} +4 -4
- package/dist/web/assets/info-3K5VOQVL-CWKw4e0V.js +1 -0
- package/dist/web/assets/keybindings-store-BOV4khyp.js +1 -0
- package/dist/web/assets/{markdown-renderer-BojoStRy.js → markdown-renderer-B63eYfrn.js} +3 -3
- package/dist/web/assets/notification-store-BklO85um.js +1 -0
- package/dist/web/assets/packet-RMMSAZCW-Ar00Wbhd.js +1 -0
- package/dist/web/assets/{pdf-preview-19LY16zS.js → pdf-preview-JOwOGTIk.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-Q4ssDdib.js +1 -0
- package/dist/web/assets/{port-forwarding-tab-DIqVwGrL.js → port-forwarding-tab-DJRRbLGF.js} +1 -1
- package/dist/web/assets/{postgres-viewer-DOTykgcg.js → postgres-viewer-AIOBOfCg.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-kq5v4OKX.js +1 -0
- package/dist/web/assets/{settings-store-BFlBSwKg.js → settings-store-CSDOihqv.js} +1 -1
- package/dist/web/assets/{settings-tab-C5S_iYSH.js → settings-tab-BMHf9pO5.js} +1 -1
- package/dist/web/assets/{sql-query-editor-BsxW0lTw.js → sql-query-editor-Dw9UvzWt.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-Fq4NnQg6.js → sqlite-viewer-HusTxs1Z.js} +1 -1
- package/dist/web/assets/system-monitor-tab-BNJIkOan.js +1 -0
- package/dist/web/assets/{terminal-tab-Lu2U4vpg.js → terminal-tab-W1VShnP7.js} +1 -1
- package/dist/web/assets/treemap-KZPCXAKY-DChODgHt.js +1 -0
- package/dist/web/assets/{use-monaco-theme-6AirEH08.js → use-monaco-theme-qx6SfVRk.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-DU911Xa9.js → vendor-mermaid-DCie7hiR.js} +2 -2
- package/dist/web/assets/{video-preview-8Vrdwy25.js → video-preview-BPAYbuvs.js} +1 -1
- package/dist/web/index.html +3 -3
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +0 -0
- package/src/server/routes/git.ts +2 -1
- package/src/services/git.service.ts +17 -7
- package/src/services/resource-monitor-utils.ts +8 -5
- package/src/services/resource-monitor.service.ts +2 -1
- package/src/web/components/editor/diff-viewer.tsx +1 -0
- package/src/web/components/extensions/extension-webview.tsx +2 -2
- package/src/web/components/system/system-monitor-group-row.tsx +27 -7
- package/src/web/components/system/system-monitor-tab.tsx +1 -1
- package/src/web/hooks/use-extension-ws.ts +16 -3
- package/src/web/hooks/use-resource-monitor.ts +1 -1
- package/bun.lock +0 -2170
- package/bunfig.toml +0 -2
- package/dist/web/assets/architecture-PBZL5I3N-CS5Rvu_a.js +0 -1
- package/dist/web/assets/diff-viewer-sbO35hMr.js +0 -4
- package/dist/web/assets/extension-webview-B2Q7T_NQ.js +0 -3
- package/dist/web/assets/gitGraph-HDMCJU4V-BjUgCE-3.js +0 -1
- package/dist/web/assets/info-3K5VOQVL-Bu3VpM9a.js +0 -1
- package/dist/web/assets/keybindings-store-DZjJtyij.js +0 -1
- package/dist/web/assets/notification-store-CgsqI4c0.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-C83Lg2yy.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-DoT-QQxi.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-B6r4mqYF.js +0 -1
- package/dist/web/assets/system-monitor-tab-C51mwQcv.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-3t3gW0fB.js +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Management CLI - Command-line interface for MCP operations
|
|
4
|
+
*/
|
|
5
|
+
import { MCPClientManager } from './mcp-client.js';
|
|
6
|
+
import { writeFileSync, mkdirSync } from 'fs';
|
|
7
|
+
import { dirname, join } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
const GLOBAL_TIMEOUT_MS = parseInt(process.env.MCP_TIMEOUT || '120000', 10);
|
|
12
|
+
let globalManager = null;
|
|
13
|
+
function setupShutdownHandlers() {
|
|
14
|
+
const shutdown = async (signal) => {
|
|
15
|
+
console.log(`\nReceived ${signal}, cleaning up...`);
|
|
16
|
+
if (globalManager) {
|
|
17
|
+
await globalManager.cleanup();
|
|
18
|
+
}
|
|
19
|
+
process.exit(0);
|
|
20
|
+
};
|
|
21
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
22
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
23
|
+
process.on('SIGHUP', () => shutdown('SIGHUP'));
|
|
24
|
+
process.on('unhandledRejection', (reason) => {
|
|
25
|
+
console.error('Unhandled rejection:', reason);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function main() {
|
|
30
|
+
const args = process.argv.slice(2);
|
|
31
|
+
const command = args[0];
|
|
32
|
+
// Setup shutdown handlers
|
|
33
|
+
setupShutdownHandlers();
|
|
34
|
+
// Check for help flags BEFORE connecting to servers
|
|
35
|
+
if (!command || command === '--help' || command === 'help') {
|
|
36
|
+
printUsage();
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
// Global timeout
|
|
40
|
+
const timeoutHandle = setTimeout(() => {
|
|
41
|
+
console.error('Global timeout exceeded, forcing exit');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}, GLOBAL_TIMEOUT_MS);
|
|
44
|
+
timeoutHandle.unref();
|
|
45
|
+
const manager = new MCPClientManager();
|
|
46
|
+
globalManager = manager;
|
|
47
|
+
try {
|
|
48
|
+
// Load config
|
|
49
|
+
await manager.loadConfig();
|
|
50
|
+
console.log('✓ Config loaded');
|
|
51
|
+
// Connect to all servers
|
|
52
|
+
await manager.connectAll();
|
|
53
|
+
console.log('✓ Connected to all MCP servers\n');
|
|
54
|
+
switch (command) {
|
|
55
|
+
case 'list-tools':
|
|
56
|
+
await listTools(manager);
|
|
57
|
+
break;
|
|
58
|
+
case 'list-prompts':
|
|
59
|
+
await listPrompts(manager);
|
|
60
|
+
break;
|
|
61
|
+
case 'list-resources':
|
|
62
|
+
await listResources(manager);
|
|
63
|
+
break;
|
|
64
|
+
case 'call-tool':
|
|
65
|
+
await callTool(manager, args[1], args[2], args[3]);
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
printUsage();
|
|
69
|
+
}
|
|
70
|
+
await manager.cleanup();
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('Error:', error);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function listTools(manager) {
|
|
79
|
+
const tools = await manager.getAllTools();
|
|
80
|
+
console.log(`Found ${tools.length} tools:\n`);
|
|
81
|
+
for (const tool of tools) {
|
|
82
|
+
console.log(`📦 ${tool.serverName} / ${tool.name}`);
|
|
83
|
+
console.log(` ${tool.description}`);
|
|
84
|
+
if (tool.inputSchema?.properties) {
|
|
85
|
+
console.log(` Parameters: ${Object.keys(tool.inputSchema.properties).join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
console.log('');
|
|
88
|
+
}
|
|
89
|
+
// Save tools to JSON file
|
|
90
|
+
const assetsDir = join(__dirname, '..', 'assets');
|
|
91
|
+
const toolsPath = join(assetsDir, 'tools.json');
|
|
92
|
+
try {
|
|
93
|
+
mkdirSync(assetsDir, { recursive: true });
|
|
94
|
+
writeFileSync(toolsPath, JSON.stringify(tools, null, 2));
|
|
95
|
+
console.log(`\n✓ Tools saved to ${toolsPath}`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(`\n✗ Failed to save tools: ${error}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function listPrompts(manager) {
|
|
102
|
+
const prompts = await manager.getAllPrompts();
|
|
103
|
+
console.log(`Found ${prompts.length} prompts:\n`);
|
|
104
|
+
for (const prompt of prompts) {
|
|
105
|
+
console.log(`💬 ${prompt.serverName} / ${prompt.name}`);
|
|
106
|
+
console.log(` ${prompt.description}`);
|
|
107
|
+
if (prompt.arguments && prompt.arguments.length > 0) {
|
|
108
|
+
console.log(` Arguments: ${prompt.arguments.map((a) => a.name).join(', ')}`);
|
|
109
|
+
}
|
|
110
|
+
console.log('');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function listResources(manager) {
|
|
114
|
+
const resources = await manager.getAllResources();
|
|
115
|
+
console.log(`Found ${resources.length} resources:\n`);
|
|
116
|
+
for (const resource of resources) {
|
|
117
|
+
console.log(`📄 ${resource.serverName} / ${resource.name}`);
|
|
118
|
+
console.log(` URI: ${resource.uri}`);
|
|
119
|
+
if (resource.description) {
|
|
120
|
+
console.log(` ${resource.description}`);
|
|
121
|
+
}
|
|
122
|
+
if (resource.mimeType) {
|
|
123
|
+
console.log(` Type: ${resource.mimeType}`);
|
|
124
|
+
}
|
|
125
|
+
console.log('');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function callTool(manager, serverName, toolName, argsJson) {
|
|
129
|
+
if (!serverName || !toolName || !argsJson) {
|
|
130
|
+
console.error('Usage: cli.ts call-tool <server> <tool> <json-args>');
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
const args = JSON.parse(argsJson);
|
|
134
|
+
console.log(`Calling ${serverName}/${toolName}...`);
|
|
135
|
+
const result = await manager.callTool(serverName, toolName, args);
|
|
136
|
+
console.log('\nResult:');
|
|
137
|
+
console.log(JSON.stringify(result, null, 2));
|
|
138
|
+
}
|
|
139
|
+
function printUsage() {
|
|
140
|
+
console.log(`
|
|
141
|
+
MCP Management CLI
|
|
142
|
+
|
|
143
|
+
Usage:
|
|
144
|
+
cli.ts <command> [options]
|
|
145
|
+
|
|
146
|
+
Commands:
|
|
147
|
+
list-tools List all tools and save to assets/tools.json
|
|
148
|
+
list-prompts List all prompts from all MCP servers
|
|
149
|
+
list-resources List all resources from all MCP servers
|
|
150
|
+
call-tool <server> <tool> <json> Call a specific tool
|
|
151
|
+
|
|
152
|
+
Examples:
|
|
153
|
+
cli.ts list-tools
|
|
154
|
+
cli.ts call-tool memory create_entities '{"entities":[{"name":"Alice","entityType":"person"}]}'
|
|
155
|
+
cli.ts call-tool human-mcp playwright_screenshot_fullpage '{"url":"https://example.com"}'
|
|
156
|
+
|
|
157
|
+
Note: Tool analysis is done by the LLM reading assets/tools.json directly.
|
|
158
|
+
`);
|
|
159
|
+
}
|
|
160
|
+
main();
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Client - Core client for interacting with MCP servers
|
|
4
|
+
*/
|
|
5
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
7
|
+
import { readFile } from 'fs/promises';
|
|
8
|
+
import { resolve } from 'path';
|
|
9
|
+
export class MCPClientManager {
|
|
10
|
+
config = null;
|
|
11
|
+
clients = new Map();
|
|
12
|
+
transports = new Map();
|
|
13
|
+
async loadConfig(configPath = '.claude/.mcp.json') {
|
|
14
|
+
const fullPath = resolve(process.cwd(), configPath);
|
|
15
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
16
|
+
const config = JSON.parse(content);
|
|
17
|
+
this.config = config;
|
|
18
|
+
return config;
|
|
19
|
+
}
|
|
20
|
+
async connectToServer(serverName) {
|
|
21
|
+
if (!this.config?.mcpServers[serverName]) {
|
|
22
|
+
throw new Error(`Server ${serverName} not found in config`);
|
|
23
|
+
}
|
|
24
|
+
const serverConfig = this.config.mcpServers[serverName];
|
|
25
|
+
const transport = new StdioClientTransport({
|
|
26
|
+
command: serverConfig.command,
|
|
27
|
+
args: serverConfig.args,
|
|
28
|
+
env: serverConfig.env
|
|
29
|
+
});
|
|
30
|
+
const client = new Client({
|
|
31
|
+
name: `mcp-manager-${serverName}`,
|
|
32
|
+
version: '1.0.0'
|
|
33
|
+
}, { capabilities: {} });
|
|
34
|
+
await client.connect(transport);
|
|
35
|
+
this.clients.set(serverName, client);
|
|
36
|
+
this.transports.set(serverName, transport); // Track transport!
|
|
37
|
+
return client;
|
|
38
|
+
}
|
|
39
|
+
async connectAll() {
|
|
40
|
+
if (!this.config) {
|
|
41
|
+
throw new Error('Config not loaded. Call loadConfig() first.');
|
|
42
|
+
}
|
|
43
|
+
const serverNames = Object.keys(this.config.mcpServers);
|
|
44
|
+
console.log(`Connecting to ${serverNames.length} servers sequentially...`);
|
|
45
|
+
for (const serverName of serverNames) {
|
|
46
|
+
try {
|
|
47
|
+
await this.connectToServer(serverName);
|
|
48
|
+
console.log(`✓ ${serverName} connected`);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`✗ ${serverName} failed:`, error);
|
|
52
|
+
// Continue with other servers
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async getAllTools() {
|
|
57
|
+
const allTools = [];
|
|
58
|
+
for (const [serverName, client] of this.clients.entries()) {
|
|
59
|
+
try {
|
|
60
|
+
const response = await client.listTools({}, { timeout: 300000 });
|
|
61
|
+
for (const tool of response.tools) {
|
|
62
|
+
allTools.push({
|
|
63
|
+
serverName,
|
|
64
|
+
name: tool.name,
|
|
65
|
+
description: tool.description || '',
|
|
66
|
+
inputSchema: tool.inputSchema,
|
|
67
|
+
outputSchema: tool.outputSchema
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error?.code === -32601) {
|
|
73
|
+
console.warn(`${serverName} does not support listTools`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error(`Error from ${serverName}:`, error);
|
|
77
|
+
}
|
|
78
|
+
// Continue with other servers!
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return allTools;
|
|
82
|
+
}
|
|
83
|
+
async getAllPrompts() {
|
|
84
|
+
const allPrompts = [];
|
|
85
|
+
for (const [serverName, client] of this.clients.entries()) {
|
|
86
|
+
try {
|
|
87
|
+
const response = await client.listPrompts({}, { timeout: 300000 });
|
|
88
|
+
for (const prompt of response.prompts) {
|
|
89
|
+
allPrompts.push({
|
|
90
|
+
serverName,
|
|
91
|
+
name: prompt.name,
|
|
92
|
+
description: prompt.description || '',
|
|
93
|
+
arguments: prompt.arguments
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error?.code === -32601) {
|
|
99
|
+
console.warn(`${serverName} does not support listPrompts`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.error(`Error from ${serverName}:`, error);
|
|
103
|
+
}
|
|
104
|
+
// Continue with other servers!
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return allPrompts;
|
|
108
|
+
}
|
|
109
|
+
async getAllResources() {
|
|
110
|
+
const allResources = [];
|
|
111
|
+
for (const [serverName, client] of this.clients.entries()) {
|
|
112
|
+
try {
|
|
113
|
+
const response = await client.listResources({}, { timeout: 300000 });
|
|
114
|
+
for (const resource of response.resources) {
|
|
115
|
+
allResources.push({
|
|
116
|
+
serverName,
|
|
117
|
+
uri: resource.uri,
|
|
118
|
+
name: resource.name,
|
|
119
|
+
description: resource.description,
|
|
120
|
+
mimeType: resource.mimeType
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error?.code === -32601) {
|
|
126
|
+
console.warn(`${serverName} does not support listResources`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
console.error(`Error from ${serverName}:`, error);
|
|
130
|
+
}
|
|
131
|
+
// Continue with other servers!
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return allResources;
|
|
135
|
+
}
|
|
136
|
+
async callTool(serverName, toolName, args) {
|
|
137
|
+
const client = this.clients.get(serverName);
|
|
138
|
+
if (!client)
|
|
139
|
+
throw new Error(`Not connected to server: ${serverName}`);
|
|
140
|
+
return await client.callTool({ name: toolName, arguments: args }, undefined, { timeout: 300000 });
|
|
141
|
+
}
|
|
142
|
+
async getPrompt(serverName, promptName, args) {
|
|
143
|
+
const client = this.clients.get(serverName);
|
|
144
|
+
if (!client)
|
|
145
|
+
throw new Error(`Not connected to server: ${serverName}`);
|
|
146
|
+
return await client.getPrompt({ name: promptName, arguments: args }, { timeout: 300000 });
|
|
147
|
+
}
|
|
148
|
+
async readResource(serverName, uri) {
|
|
149
|
+
const client = this.clients.get(serverName);
|
|
150
|
+
if (!client)
|
|
151
|
+
throw new Error(`Not connected to server: ${serverName}`);
|
|
152
|
+
return await client.readResource({ uri }, { timeout: 300000 });
|
|
153
|
+
}
|
|
154
|
+
async cleanup() {
|
|
155
|
+
// Close clients with timeout
|
|
156
|
+
const cleanupPromises = [];
|
|
157
|
+
for (const [serverName, client] of this.clients.entries()) {
|
|
158
|
+
cleanupPromises.push((async () => {
|
|
159
|
+
try {
|
|
160
|
+
await client.close();
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.warn(`Warning closing ${serverName}:`, error);
|
|
164
|
+
}
|
|
165
|
+
})());
|
|
166
|
+
}
|
|
167
|
+
await Promise.race([
|
|
168
|
+
Promise.all(cleanupPromises),
|
|
169
|
+
new Promise((resolve) => setTimeout(resolve, 5000))
|
|
170
|
+
]);
|
|
171
|
+
// CRITICAL: Close transports to kill subprocesses
|
|
172
|
+
for (const [serverName, transport] of this.transports.entries()) {
|
|
173
|
+
try {
|
|
174
|
+
await transport.close();
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.warn(`Warning closing ${serverName} transport:`, error);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
this.clients.clear();
|
|
181
|
+
this.transports.clear();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SePay Configuration
|
|
2
|
+
SEPAY_MERCHANT_ID=SP-TEST-XXXXXXX
|
|
3
|
+
SEPAY_SECRET_KEY=spsk_test_xxxxxxxxxxxxx
|
|
4
|
+
SEPAY_ENV=sandbox # or 'production'
|
|
5
|
+
|
|
6
|
+
# SePay Webhook Configuration
|
|
7
|
+
SEPAY_WEBHOOK_AUTH_TYPE=api_key # or 'oauth2' or 'none'
|
|
8
|
+
SEPAY_WEBHOOK_API_KEY=your_webhook_api_key
|
|
9
|
+
|
|
10
|
+
# Polar Configuration
|
|
11
|
+
POLAR_ACCESS_TOKEN=polar_xxxxxxxxxxxxxxxx
|
|
12
|
+
POLAR_SERVER=sandbox # or 'production'
|
|
13
|
+
POLAR_ORG_ID=org_xxxxxxxxxxxxx
|
|
14
|
+
|
|
15
|
+
# Polar Webhook Configuration
|
|
16
|
+
POLAR_WEBHOOK_SECRET=base64_encoded_secret
|
|
17
|
+
|
|
18
|
+
# Optional: Database or other configuration
|
|
19
|
+
# DATABASE_URL=postgresql://user:password@localhost:5432/dbname
|
|
20
|
+
# REDIS_URL=redis://localhost:6379
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Sequential Thinking Configuration
|
|
2
|
+
|
|
3
|
+
# Disable thought logging output (useful for automated processing)
|
|
4
|
+
# Set to "true" to disable console logging
|
|
5
|
+
DISABLE_THOUGHT_LOGGING=false
|
|
6
|
+
|
|
7
|
+
# History file location (optional, defaults to scripts/.thought-history.json)
|
|
8
|
+
# THOUGHT_HISTORY_FILE=/path/to/custom/history.json
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.13.67] - 2026-05-06
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- **Extension tabs auto-focus**: Git Graph and other extension tabs no longer steal focus on page load, project switch, or WS reconnect — only explicit user opens (Cmd+G, command palette) trigger focus
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- **Commit-to-commit diff**: Diff viewer now supports comparing a file between two commits via `ref2` parameter, not just commit vs working tree
|
|
10
|
+
- **Process age column**: System monitor shows how long each process has been running
|
|
11
|
+
|
|
3
12
|
## [0.13.66] - 2026-05-06
|
|
4
13
|
|
|
5
14
|
### Fixed
|
|
@@ -71,4 +71,4 @@ This skill covers the `ppm` CLI, its HTTP API, and its config DB. It does **not*
|
|
|
71
71
|
- Third-party extensions (inspect via `ppm ext list`).
|
|
72
72
|
- The Claude Agent SDK internals (separate skill).
|
|
73
73
|
|
|
74
|
-
<!-- Generated for PPM v0.13.
|
|
74
|
+
<!-- Generated for PPM v0.13.67 at build time. Re-run `ppm export skill --install` to refresh. -->
|
|
@@ -700,7 +700,7 @@ Restart the server (keeps tunnel alive)
|
|
|
700
700
|
Manage and inspect discovered skills & commands
|
|
701
701
|
|
|
702
702
|
**Options:**
|
|
703
|
-
- `--project <path>` — Project path (default: `"/
|
|
703
|
+
- `--project <path>` — Project path (default: `"/home/hienlh/Projects/ppm"`)
|
|
704
704
|
|
|
705
705
|
**Usage:** `ppm skills [options] [command]`
|
|
706
706
|
|
|
@@ -710,7 +710,7 @@ List all discovered skills and commands
|
|
|
710
710
|
|
|
711
711
|
**Options:**
|
|
712
712
|
- `--json` — JSON output
|
|
713
|
-
- `--project <path>` — Project path (default: `"/
|
|
713
|
+
- `--project <path>` — Project path (default: `"/home/hienlh/Projects/ppm"`)
|
|
714
714
|
|
|
715
715
|
### `ppm skills search`
|
|
716
716
|
|
|
@@ -718,7 +718,7 @@ Fuzzy search skills and commands
|
|
|
718
718
|
|
|
719
719
|
**Options:**
|
|
720
720
|
- `--json` — JSON output
|
|
721
|
-
- `--project <path>` — Project path (default: `"/
|
|
721
|
+
- `--project <path>` — Project path (default: `"/home/hienlh/Projects/ppm"`)
|
|
722
722
|
|
|
723
723
|
**Usage:** `ppm skills search [options] <query>`
|
|
724
724
|
|
|
@@ -728,7 +728,7 @@ Show detailed info for a specific skill
|
|
|
728
728
|
|
|
729
729
|
**Options:**
|
|
730
730
|
- `--json` — JSON output
|
|
731
|
-
- `--project <path>` — Project path (default: `"/
|
|
731
|
+
- `--project <path>` — Project path (default: `"/home/hienlh/Projects/ppm"`)
|
|
732
732
|
|
|
733
733
|
**Usage:** `ppm skills info [options] <name>`
|
|
734
734
|
|
|
@@ -210,4 +210,4 @@ _Base URL: `http://localhost:8080` (default; override via `ppm config set port <
|
|
|
210
210
|
- `ws://<host>/ws/terminal` — PTY terminal multiplexer
|
|
211
211
|
- `ws://<host>/ws/extensions` — extension host channel
|
|
212
212
|
|
|
213
|
-
<!-- Generated from src/server/routes/ for PPM v0.13.
|
|
213
|
+
<!-- Generated from src/server/routes/ for PPM v0.13.67 -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{G as e}from"./vendor-mermaid-DCie7hiR.js";export{e as createArchitectureServices};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./createLucideIcon-BjHrJDVb.js";import{t as n}from"./file-exclamation-point-B__2Hrd6.js";import"./api-client-DiZgVOok.js";import{t as r}from"./utils-E0yyGxXt.js";import{et as i}from"./index-
|
|
1
|
+
import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./createLucideIcon-BjHrJDVb.js";import{t as n}from"./file-exclamation-point-B__2Hrd6.js";import"./api-client-DiZgVOok.js";import{t as r}from"./utils-E0yyGxXt.js";import{et as i}from"./index-CJZZ6v1o.js";import{t as a}from"./use-blob-url-DCUIEzjB.js";var o=t(`music`,[[`path`,{d:`M9 18V5l12-2v13`,key:`1jmyc2`}],[`circle`,{cx:`6`,cy:`18`,r:`3`,key:`fqmcym`}],[`circle`,{cx:`18`,cy:`16`,r:`3`,key:`1hluhg`}]]),s=e();function c({filePath:e,projectName:t}){let{blobUrl:c,error:l}=a(e,t);return l?(0,s.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,s.jsx)(n,{className:`size-10 text-text-subtle`}),(0,s.jsx)(`p`,{className:`text-sm`,children:`Failed to load audio.`})]}):c?(0,s.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-4 p-4 bg-surface`,children:[(0,s.jsx)(o,{className:`size-16 text-text-subtle`}),(0,s.jsx)(`p`,{className:`text-sm text-text-secondary truncate max-w-xs`,children:r(e)}),(0,s.jsx)(`audio`,{src:c,controls:!0,className:`w-full max-w-md`})]}):(0,s.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,s.jsx)(i,{className:`size-5 animate-spin text-text-subtle`})})}export{c as AudioPreview};
|