jammincms 0.1.0 → 0.1.3
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/dist/index.js +72 -2
- package/dist/index.js.map +1 -1
- package/extension/background.js +1 -0
- package/extension/content.js +584 -0
- package/extension/manifest.json +35 -0
- package/extension/options.html +425 -0
- package/extension/options.js +25 -0
- package/extension/popup.html +191 -0
- package/extension/popup.js +1 -0
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -2,18 +2,59 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { startServer } from './server.js';
|
|
4
4
|
import { checkClaudeAvailable } from './claude.js';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { cpSync, existsSync, mkdirSync, rmSync } from 'fs';
|
|
5
8
|
const program = new Command();
|
|
9
|
+
const EXTENSION_FOLDER = 'jammin-cms-extension';
|
|
10
|
+
function getExtensionSource() {
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
return join(__dirname, '..', 'extension');
|
|
14
|
+
}
|
|
15
|
+
function getExtensionDir() {
|
|
16
|
+
return join(process.cwd(), EXTENSION_FOLDER);
|
|
17
|
+
}
|
|
18
|
+
function ensureExtensionInstalled() {
|
|
19
|
+
const extensionSource = getExtensionSource();
|
|
20
|
+
const extensionDir = getExtensionDir();
|
|
21
|
+
if (!existsSync(extensionSource)) {
|
|
22
|
+
return { installed: false, path: extensionDir, fresh: false };
|
|
23
|
+
}
|
|
24
|
+
const alreadyExists = existsSync(extensionDir);
|
|
25
|
+
if (!alreadyExists) {
|
|
26
|
+
mkdirSync(extensionDir, { recursive: true });
|
|
27
|
+
cpSync(extensionSource, extensionDir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
return { installed: true, path: extensionDir, fresh: !alreadyExists };
|
|
30
|
+
}
|
|
31
|
+
function printExtensionInstructions(path) {
|
|
32
|
+
console.log('\n┌─────────────────────────────────────────────────────────┐');
|
|
33
|
+
console.log('│ Chrome Extension Setup │');
|
|
34
|
+
console.log('├─────────────────────────────────────────────────────────┤');
|
|
35
|
+
console.log('│ 1. Open chrome://extensions │');
|
|
36
|
+
console.log('│ 2. Enable "Developer mode" (top right) │');
|
|
37
|
+
console.log('│ 3. Click "Load unpacked" and select: │');
|
|
38
|
+
console.log(`│ ${path}`);
|
|
39
|
+
console.log('└─────────────────────────────────────────────────────────┘\n');
|
|
40
|
+
}
|
|
6
41
|
async function start(port) {
|
|
7
42
|
if (isNaN(port) || port < 1 || port > 65535) {
|
|
8
43
|
console.error('Invalid port number');
|
|
9
44
|
process.exit(1);
|
|
10
45
|
}
|
|
46
|
+
// Ensure extension is available
|
|
47
|
+
const ext = ensureExtensionInstalled();
|
|
48
|
+
if (ext.fresh) {
|
|
49
|
+
console.log('Extension installed to:', ext.path);
|
|
50
|
+
printExtensionInstructions(ext.path);
|
|
51
|
+
}
|
|
11
52
|
// Check if Claude CLI is available
|
|
12
53
|
const claudeAvailable = await checkClaudeAvailable();
|
|
13
54
|
if (!claudeAvailable) {
|
|
14
55
|
console.warn('Warning: Claude CLI not found in PATH');
|
|
15
56
|
console.warn('Install it with: npm install -g @anthropic-ai/claude-code');
|
|
16
|
-
console.warn('The server will start but edit jobs will fail
|
|
57
|
+
console.warn('The server will start but edit jobs will fail.\n');
|
|
17
58
|
}
|
|
18
59
|
else {
|
|
19
60
|
console.log('Claude CLI: available');
|
|
@@ -39,7 +80,7 @@ async function start(port) {
|
|
|
39
80
|
program
|
|
40
81
|
.name('jammincms')
|
|
41
82
|
.description('Local bridge server for Jammin CMS Chrome extension')
|
|
42
|
-
.version('1.
|
|
83
|
+
.version('0.1.3')
|
|
43
84
|
.option('-p, --port <port>', 'Port to listen on', '9876')
|
|
44
85
|
.action(async (options) => {
|
|
45
86
|
const port = parseInt(options.port, 10);
|
|
@@ -82,5 +123,34 @@ program
|
|
|
82
123
|
process.exit(1);
|
|
83
124
|
});
|
|
84
125
|
});
|
|
126
|
+
program
|
|
127
|
+
.command('extension-path')
|
|
128
|
+
.description('Print the path to the Chrome extension')
|
|
129
|
+
.action(() => {
|
|
130
|
+
const ext = ensureExtensionInstalled();
|
|
131
|
+
if (!ext.installed) {
|
|
132
|
+
console.error('Extension files not found in package.');
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
console.log(ext.path);
|
|
136
|
+
});
|
|
137
|
+
program
|
|
138
|
+
.command('reinstall-extension')
|
|
139
|
+
.description('Reinstall the Chrome extension (replaces existing)')
|
|
140
|
+
.action(() => {
|
|
141
|
+
const extensionSource = getExtensionSource();
|
|
142
|
+
const extensionDir = getExtensionDir();
|
|
143
|
+
if (!existsSync(extensionSource)) {
|
|
144
|
+
console.error('Extension files not found in package.');
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
if (existsSync(extensionDir)) {
|
|
148
|
+
rmSync(extensionDir, { recursive: true });
|
|
149
|
+
}
|
|
150
|
+
mkdirSync(extensionDir, { recursive: true });
|
|
151
|
+
cpSync(extensionSource, extensionDir, { recursive: true });
|
|
152
|
+
console.log('Extension reinstalled to:', extensionDir);
|
|
153
|
+
printExtensionInstructions(extensionDir);
|
|
154
|
+
});
|
|
85
155
|
program.parse();
|
|
86
156
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var g=Object.defineProperty;var p=(n,e,t)=>e in n?g(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var a=(n,e,t)=>p(n,typeof e!="symbol"?e+"":e,t);const f={bridgeUrl:"ws://localhost:9876",claudePath:"claude",defaultEditor:"auto",showStatusPanel:!0,autoSave:!1},d={SITES:"jammin_sites",SETTINGS:"jammin_settings"};async function S(){return(await chrome.storage.sync.get(d.SITES))[d.SITES]||[]}function j(n,e){for(const t of e)if(t.enabled&&_(n,t.urlPattern))return t}function _(n,e){const t=e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,".*").replace(/\*/g,"[^/]*");return new RegExp(`^${t}$`).test(n)}async function u(){const n=await chrome.storage.sync.get(d.SETTINGS);return{...f,...n[d.SETTINGS]}}class m{constructor(){a(this,"ws",null);a(this,"reconnectTimer",null);a(this,"messageHandlers",new Set);a(this,"connectionStatus",{connected:!1});a(this,"pendingMessages",[]);a(this,"jobs",new Map);this.connect()}async connect(){var o;if(((o=this.ws)==null?void 0:o.readyState)===WebSocket.OPEN)return;const t=(await u()).bridgeUrl;try{this.ws=new WebSocket(t),this.ws.onopen=()=>{console.log("[Jammin] Connected to bridge"),this.connectionStatus={connected:!0},this.send({type:"ping"});for(const s of this.pendingMessages)this.send(s);this.pendingMessages=[]},this.ws.onmessage=s=>{try{const c=JSON.parse(s.data);this.handleMessage(c)}catch(c){console.error("[Jammin] Failed to parse message:",c)}},this.ws.onclose=()=>{console.log("[Jammin] Disconnected from bridge"),this.connectionStatus={connected:!1},this.ws=null,this.scheduleReconnect()},this.ws.onerror=s=>{console.error("[Jammin] WebSocket error:",s),this.connectionStatus={connected:!1,error:"Connection failed"}}}catch(s){console.error("[Jammin] Failed to connect:",s),this.connectionStatus={connected:!1,error:s instanceof Error?s.message:"Connection failed"},this.scheduleReconnect()}}scheduleReconnect(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=setTimeout(()=>{this.connect()},5e3)}handleMessage(e){e.type==="pong"&&(this.connectionStatus={connected:!0,bridgeVersion:e.version,claudeAvailable:e.claudeAvailable}),"jobId"in e&&e.jobId&&this.updateJobStatus(e);for(const t of this.messageHandlers)try{t(e)}catch(o){console.error("[Jammin] Message handler error:",o)}}updateJobStatus(e){if(!("jobId"in e)||!e.jobId)return;const t=e.jobId;let o=this.jobs.get(t);switch(e.type){case"job_accepted":this.jobs.set(t,{id:t,status:"pending",output:"",phase:"thinking"});break;case"job_progress":o&&(o.output+=e.output,o.phase=e.phase,o.status="running");break;case"job_complete":o&&(o.status=e.success?"complete":"error",o.filesChanged=e.filesChanged,o.error=e.error);break;case"job_cancelled":o&&(o.status="cancelled");break}}send(e){var t;((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN?this.ws.send(JSON.stringify(e)):(this.pendingMessages.push(e),this.connect())}getStatus(){return this.connectionStatus}getJobStatus(e){return this.jobs.get(e)}addMessageHandler(e){this.messageHandlers.add(e)}removeMessageHandler(e){this.messageHandlers.delete(e)}disconnect(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.ws&&(this.ws.close(),this.ws=null)}}const r=new m,i=new Map;chrome.runtime.onMessage.addListener((n,e,t)=>{var s;const o=(s=e.tab)==null?void 0:s.id;return w(n,o).then(t).catch(c=>{console.error("[Jammin] Error handling message:",c),t({action:"error",payload:{message:c instanceof Error?c.message:"Unknown error"}})}),!0});async function w(n,e){switch(n.action){case"get_site_config":{const{url:t}=n.payload,o=await S();return{action:"site_config",payload:j(t,o)||null}}case"submit_changes":case"submit_changes_force":{const{projectPath:t,siteUrl:o,changes:s,customInstructions:c}=n.payload,l=crypto.randomUUID(),h=await u(),b=n.action==="submit_changes_force";return e&&(i.has(e)||i.set(e,new Set),i.get(e).add(l)),r.send({type:"submit_edit",jobId:l,projectPath:t,siteUrl:o,changes:s,customInstructions:c,claudePath:h.claudePath,skipGitCheck:b}),{action:"job_accepted",payload:{jobId:l}}}case"cancel_job":{const{jobId:t}=n.payload;return r.send({type:"cancel_job",jobId:t}),{action:"job_cancelled",payload:{jobId:t}}}case"open_editor":{const{projectPath:t,file:o}=n.payload;return r.send({type:"open_editor",projectPath:t,file:o}),{action:"job_accepted",payload:{}}}case"get_connection_status":return{action:"connection_status",payload:r.getStatus()};case"get_job_status":{const{jobId:t}=n.payload;return{action:"job_progress",payload:r.getJobStatus(t)}}default:throw new Error(`Unknown action: ${n.action}`)}}r.addMessageHandler(n=>{if(!("jobId"in n)||!n.jobId)return;const e=n.jobId;for(const[t,o]of i)if(o.has(e)){let s;switch(n.type){case"job_progress":s="job_progress";break;case"job_complete":s="job_complete",o.delete(e);break;case"job_cancelled":s="job_cancelled",o.delete(e);break;case"git_dirty":s="git_dirty";break;default:return}chrome.tabs.sendMessage(t,{action:s,payload:n})}});chrome.tabs.onRemoved.addListener(n=>{i.delete(n)});console.log("[Jammin] Background service worker initialized");
|