@ade-syofyan/feature-map-pro 0.21.0-pro.3 → 0.22.0-pro.1
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/README.md +14 -4
- package/assets/brand/feature-map.png +0 -0
- package/bin/feature-map-pro.mjs +4 -2
- package/lib/prompts.mjs +68 -0
- package/package.json +3 -2
- package/release.json +13 -13
package/README.md
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
|
+
<p align="center"><img src="assets/brand/feature-map.png" width="112" alt="Feature Map" /></p>
|
|
2
|
+
|
|
1
3
|
# Feature Map Pro Installer
|
|
2
4
|
|
|
3
5
|
Installer gratis untuk Feature Map Pro. Fitur premium memerlukan lisensi per email.
|
|
4
6
|
Source mesin Pro tidak termasuk dalam paket npm; binary diunduh dari rilis resmi.
|
|
5
7
|
|
|
6
8
|
```bash
|
|
7
|
-
npx @ade-syofyan/feature-map-pro@
|
|
9
|
+
npx @ade-syofyan/feature-map-pro@latest install
|
|
8
10
|
```
|
|
9
11
|
|
|
10
|
-
Masukkan email pembelian dan kode lisensi dari Ade Syofyan.
|
|
12
|
+
Masukkan email pembelian dan kode lisensi dari Ade Syofyan. Saat mengetik atau paste,
|
|
13
|
+
kode disamarkan dengan titik dan jumlah karakter. Tekan Enter untuk memeriksa lisensi;
|
|
14
|
+
Ctrl+U menghapus input dan Ctrl+C membatalkan. Anda juga bisa memakai
|
|
11
15
|
`--license-file /path/to/buyer.license`. Jangan memasukkan kode ke argumen command.
|
|
12
|
-
Setelah aktif, buka sesi agent baru. Status: `npx @ade-syofyan/feature-map-pro@
|
|
16
|
+
Setelah aktif, buka sesi agent baru. Status: `npx @ade-syofyan/feature-map-pro@latest license status`.
|
|
13
17
|
|
|
14
18
|
Platform yang tersedia tercantum di release.json: macOS Apple Silicon, Windows x64,
|
|
15
19
|
dan Linux x64 (glibc, Ubuntu 22.04 atau lebih baru). Windows ARM, Linux ARM dan
|
|
16
|
-
Alpine/musl belum didukung. Windows memakai tar bawaan Windows 10/11. Node 20+, tar, Git, serta Python 3
|
|
20
|
+
Alpine/musl dan Mac Intel belum didukung. Windows memakai tar bawaan Windows 10/11. Node 20+, tar, Git, serta Python 3
|
|
17
21
|
untuk hook/core Free diperlukan. Installer memasang skill Codex; `--activate-only`
|
|
18
22
|
mengaktifkan tanpa memasang skill. Plugin Claude Code dapat dipasang manual dari
|
|
19
23
|
folder paket melalui pengelola plugin, dengan satu sumber feature-map aktif.
|
|
@@ -22,3 +26,9 @@ Lisensi diverifikasi offline sebelum instalasi skill dan setiap command premium.
|
|
|
22
26
|
Instalasi lama disalin ke folder backup di luar folder skills. Core Free tetap MIT.
|
|
23
27
|
Kompilasi mempersulit pembacaan source; bukan jaminan anti-reverse-engineering
|
|
24
28
|
atau pencegahan penyalinan binary. Pembelian/harga: ade.syofyan@gmail.com.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
Versi 0.22.0-pro.1 menambahkan Riwayat Aturan, Bekal Tugas dan Lanjut Tugas.
|
|
32
|
+
Agent membaca aturan sebelum edit dan memeriksa kembali kebijakan/bukti usang
|
|
33
|
+
ketika melanjutkan tugas. Review tetap wajib; laporan bukan pengunci editor atau
|
|
34
|
+
jaminan semua konflik kebijakan terdeteksi. Jalankan command --help untuk opsi.
|
|
Binary file
|
package/bin/feature-map-pro.mjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import {fileURLToPath} from 'node:url';
|
|
4
4
|
import {activateAndInstall,ensurePayload,installSkills,runEngine} from '../lib/installer.mjs';
|
|
5
|
+
import {activateWithPrompt} from '../lib/prompts.mjs';
|
|
5
6
|
|
|
6
7
|
const manifest=JSON.parse(fs.readFileSync(fileURLToPath(new URL('../release.json',import.meta.url)),'utf8'));
|
|
7
8
|
const args=process.argv.slice(2);
|
|
@@ -17,7 +18,8 @@ if(!args.length||args[0]==='--help'||args[0]==='help') {
|
|
|
17
18
|
if(!['--email','--license-file'].includes(args[i])||!args[i+1]) throw new Error('Opsi instalasi tidak dikenal. Gunakan --help.');
|
|
18
19
|
activation.push(args[i]==='--license-file'?'--file':args[i],args[++i]);
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
const result=await activateWithPrompt(root,activation);
|
|
22
|
+
activateAndInstall(()=>result,()=>{
|
|
21
23
|
const backup=activateOnly?null:installSkills(root);
|
|
22
24
|
console.log('Pro aktif. Buka sesi baru untuk memuat instruksi Pro.');
|
|
23
25
|
if(backup) console.log('Salinan skill sebelumnya: '+backup);
|
|
@@ -25,5 +27,5 @@ if(!args.length||args[0]==='--help'||args[0]==='help') {
|
|
|
25
27
|
} else {
|
|
26
28
|
process.exitCode=runEngine(root,args).status??2;
|
|
27
29
|
}
|
|
28
|
-
} catch(error) {console.error('Gagal: '+error.message);process.exitCode=2;}
|
|
30
|
+
} catch(error) {console.error('Gagal: '+error.message);process.exitCode=error.exitCode||2;}
|
|
29
31
|
}
|
package/lib/prompts.mjs
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {createInterface,emitKeypressEvents} from 'node:readline';
|
|
2
|
+
import {runEngine} from './installer.mjs';
|
|
3
|
+
|
|
4
|
+
export function readLicense({input=process.stdin,output=process.stdout}={}) {
|
|
5
|
+
return new Promise((resolve,reject)=>{
|
|
6
|
+
let value='',pasting=false,finished=false;
|
|
7
|
+
const wasRaw=Boolean(input.isRaw);
|
|
8
|
+
const draw=(message='')=>output.write('\r\x1b[2KKode lisensi: '+ '•'.repeat(Math.min([...value].length,20))+` (${[...value].length} karakter)`+(message?' — '+message:''));
|
|
9
|
+
function finish(error) {
|
|
10
|
+
if(finished)return;finished=true;
|
|
11
|
+
input.removeListener('keypress',onKey);input.removeListener('end',onEnd);input.removeListener('error',onError);
|
|
12
|
+
input.setRawMode(wasRaw);input.pause();output.write('\x1b[?2004l\n');
|
|
13
|
+
if(error)reject(error);else resolve(value);
|
|
14
|
+
value='';
|
|
15
|
+
}
|
|
16
|
+
const onEnd=()=>finish(new Error('Input lisensi terputus. Coba lagi.'));
|
|
17
|
+
const onError=()=>finish(new Error('Input lisensi tidak bisa dibaca.'));
|
|
18
|
+
function onKey(text,key={}) {
|
|
19
|
+
if(finished)return;
|
|
20
|
+
if(key.name==='paste-start'){pasting=true;return;}
|
|
21
|
+
if(key.name==='paste-end'){pasting=false;draw();return;}
|
|
22
|
+
if(key.ctrl&&key.name==='c')return finish(Object.assign(new Error('Aktivasi dibatalkan.'),{exitCode:130}));
|
|
23
|
+
if(key.ctrl&&key.name==='d')return onEnd();
|
|
24
|
+
if(key.ctrl&&key.name==='u'){value='';draw();return;}
|
|
25
|
+
if(key.name==='return'||key.name==='enter') {
|
|
26
|
+
if(pasting)return;
|
|
27
|
+
if(!value.trim()){draw('Masukkan kode lisensi');return;}
|
|
28
|
+
return finish();
|
|
29
|
+
}
|
|
30
|
+
if(key.name==='backspace'){value=[...value].slice(0,-1).join('');draw();return;}
|
|
31
|
+
if(text&&!key.ctrl&&!key.meta&&!text.includes('\x1b')) {
|
|
32
|
+
value+=(text.replace(/[\x00-\x20\x7f]/g,''));
|
|
33
|
+
if(value.length>16384)return finish(new Error('Kode lisensi terlalu panjang. Cek lagi.'));
|
|
34
|
+
draw();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
emitKeypressEvents(input);input.setRawMode(true);
|
|
38
|
+
input.on('keypress',onKey);input.once('end',onEnd);input.once('error',onError);
|
|
39
|
+
output.write('Tempel kode lisensi, lalu tekan Enter. Ctrl+U hapus; Ctrl+C batal.\n\x1b[?2004h');draw();input.resume();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function activateWithPrompt(root,args,{input=process.stdin,output=process.stdout,run=runEngine}={}) {
|
|
44
|
+
if(!input.isTTY||!output.isTTY||args.includes('--file'))return run(root,['license','activate',...args]);
|
|
45
|
+
const activation=[...args];
|
|
46
|
+
if(!activation.includes('--email')) {
|
|
47
|
+
const prompt=createInterface({input,output});
|
|
48
|
+
try {
|
|
49
|
+
const email=await new Promise((resolve,reject)=>{
|
|
50
|
+
let settled=false;
|
|
51
|
+
const finish=(error,value)=>{
|
|
52
|
+
if(settled)return;settled=true;
|
|
53
|
+
prompt.removeListener('close',closed);prompt.removeListener('SIGINT',cancelled);input.removeListener('error',failed);
|
|
54
|
+
if(error)reject(error);else resolve(value);
|
|
55
|
+
};
|
|
56
|
+
const closed=()=>finish(new Error('Input email terputus. Coba lagi.'));
|
|
57
|
+
const cancelled=()=>finish(Object.assign(new Error('Aktivasi dibatalkan.'),{exitCode:130}));
|
|
58
|
+
const failed=()=>finish(new Error('Input email tidak bisa dibaca.'));
|
|
59
|
+
prompt.once('close',closed);prompt.once('SIGINT',cancelled);input.once('error',failed);
|
|
60
|
+
prompt.question('Email pembelian: ',value=>finish(null,value));
|
|
61
|
+
});
|
|
62
|
+
activation.push('--email',email);
|
|
63
|
+
} finally {prompt.close();}
|
|
64
|
+
}
|
|
65
|
+
const token=await readLicense({input,output});
|
|
66
|
+
output.write('Memeriksa lisensi…\n');
|
|
67
|
+
return run(root,['license','activate',...activation],{input:token+'\n',stdio:['pipe','inherit','inherit']});
|
|
68
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ade-syofyan/feature-map-pro",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0-pro.1",
|
|
4
4
|
"description": "Installer and launcher for licensed Feature Map Pro",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"lib/",
|
|
13
13
|
"release.json",
|
|
14
14
|
"README.md",
|
|
15
|
-
"LICENSE"
|
|
15
|
+
"LICENSE",
|
|
16
|
+
"assets/"
|
|
16
17
|
],
|
|
17
18
|
"engines": {
|
|
18
19
|
"node": ">=20"
|
package/release.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0-pro.1",
|
|
4
4
|
"artifacts": {
|
|
5
5
|
"darwin-arm64": {
|
|
6
|
-
"sha256": "
|
|
7
|
-
"engine_sha256": "
|
|
8
|
-
"size":
|
|
9
|
-
"url": "https://github.com/ade-syofyan/feature-map-installer/releases/download/v0.
|
|
6
|
+
"sha256": "d4d9076e1dc230b969cf1a1224195015f78b7b042580052c74424920342b1572",
|
|
7
|
+
"engine_sha256": "8442bfa866c4143b69fd0fd9aa8ac6f2fad906ed8ac1e116cb981dc793e4354d",
|
|
8
|
+
"size": 15511242,
|
|
9
|
+
"url": "https://github.com/ade-syofyan/feature-map-installer/releases/download/v0.22.0-pro.1/feature-map-pro-0.22.0-pro.1-darwin-arm64.tar.gz"
|
|
10
10
|
},
|
|
11
11
|
"linux-x64": {
|
|
12
|
-
"sha256": "
|
|
13
|
-
"engine_sha256": "
|
|
14
|
-
"size":
|
|
15
|
-
"url": "https://github.com/ade-syofyan/feature-map-installer/releases/download/v0.
|
|
12
|
+
"sha256": "407bd58f870d34f6315dd1d94a4acaa93ce3edcbd2eee90f631809a020869ec8",
|
|
13
|
+
"engine_sha256": "c6efcfabc2e400f73f6525adf0092c8a069cc2c819f7b5af8f814cf8bae1cdd2",
|
|
14
|
+
"size": 19455741,
|
|
15
|
+
"url": "https://github.com/ade-syofyan/feature-map-installer/releases/download/v0.22.0-pro.1/feature-map-pro-0.22.0-pro.1-linux-x64.tar.gz"
|
|
16
16
|
},
|
|
17
17
|
"win32-x64": {
|
|
18
|
-
"sha256": "
|
|
19
|
-
"engine_sha256": "
|
|
20
|
-
"size":
|
|
21
|
-
"url": "https://github.com/ade-syofyan/feature-map-installer/releases/download/v0.
|
|
18
|
+
"sha256": "1d44c5f4db35108fd889ff35bb698b763fa1e55322c7e481e204783c0f3e7974",
|
|
19
|
+
"engine_sha256": "26d1e3f5a87120e706d45cad049c082d514f67aaae92ef22887cf326a2adf1b4",
|
|
20
|
+
"size": 12843960,
|
|
21
|
+
"url": "https://github.com/ade-syofyan/feature-map-installer/releases/download/v0.22.0-pro.1/feature-map-pro-0.22.0-pro.1-win32-x64.tar.gz"
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|