starpak 0.1.3 → 0.1.5-patch.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 +10 -8
- package/README.zh.md +10 -8
- package/cli/dist/index.cjs +66 -7
- package/package.json +12 -5
- package/server/public/index.html +77 -0
package/README.md
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
# starpak ✨
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Software engineering IDE — cd in, the rest is automatic
|
|
4
4
|
|
|
5
5
|
[中文文档](./README.zh.md)
|
|
6
6
|
|
|
7
|
-
**starpak** is
|
|
7
|
+
**starpak** is evolving from a universal package manager into a **software engineering IDE**. One command turns any code (local project, system package) into a running service — with a Web UI on the way.
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
cd ./my-project && starpak install # install deps
|
|
11
11
|
starpak start # run it
|
|
12
12
|
starpak stop # stop it
|
|
13
|
-
starpak
|
|
13
|
+
starpak status # check status
|
|
14
|
+
starpak logs # view logs
|
|
14
15
|
starpak build # compile
|
|
15
|
-
starpak
|
|
16
|
+
starpak web # start Web UI (coming soon)
|
|
16
17
|
starpak install -s nginx # install system package
|
|
17
|
-
starpak
|
|
18
|
+
starpak search <query> # search GitHub repos
|
|
18
19
|
starpak remove me # uninstall starpak itself
|
|
19
20
|
```
|
|
20
21
|
|
|
@@ -24,7 +25,7 @@ starpak remove me # uninstall starpak itself
|
|
|
24
25
|
2. **Auto install** — installs deps, runs build, no manual config
|
|
25
26
|
3. **Zero-config start** — `cd` into the project and `starpak start`, it just works
|
|
26
27
|
4. **Multi-project** — detects frontend + backend separation, starts all sub-projects
|
|
27
|
-
5. **
|
|
28
|
+
5. **Web UI** — manage projects, view logs, control services from your browser (in development)
|
|
28
29
|
|
|
29
30
|
## Install
|
|
30
31
|
|
|
@@ -49,15 +50,16 @@ npm install -g starpak
|
|
|
49
50
|
| `build -r` | Rebuild (clean + build) |
|
|
50
51
|
| `remove -s <pkg>` | Remove a system package |
|
|
51
52
|
| `search <query>` | Search GitHub repositories |
|
|
53
|
+
| `web` | Start Web management UI (coming soon) |
|
|
52
54
|
| `test install` | Dry-run install (show detection without executing) |
|
|
53
55
|
|
|
54
56
|
## Philosophy
|
|
55
57
|
|
|
56
58
|
- **cd in, the rest is automatic** — one command is all you need
|
|
57
|
-
- **
|
|
59
|
+
- **Web + CLI dual mode** — manage projects from terminal or browser
|
|
58
60
|
- **Adapt, don't replace** — stands on top of apt/npm/make/systemd, doesn't reinvent them
|
|
59
61
|
- **Easter egg** — `starpak remove me` uninstalls itself
|
|
60
62
|
|
|
61
63
|
## License
|
|
62
64
|
|
|
63
|
-
Apache-2.0
|
|
65
|
+
Apache-2.0 — v0.1.5
|
package/README.zh.md
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
# starpak ✨
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 软件工程 IDE — cd 进去,剩下的自动完成
|
|
4
4
|
|
|
5
5
|
[English](./README.md)
|
|
6
6
|
|
|
7
|
-
**starpak**
|
|
7
|
+
**starpak** 正在从一个万能包管理工具向**软件工程 IDE** 进化。一个命令就能把任何代码变成运行中的服务——Web 面板也在路上了。
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
cd ./my-project && starpak install # 安装依赖
|
|
11
11
|
starpak start # 启动项目
|
|
12
12
|
starpak stop # 停止项目
|
|
13
|
-
starpak
|
|
13
|
+
starpak status # 查看状态
|
|
14
|
+
starpak logs # 查看日志
|
|
14
15
|
starpak build # 构建项目
|
|
15
|
-
starpak
|
|
16
|
+
starpak web # 启动 Web 面板(即将推出)
|
|
16
17
|
starpak install -s nginx # 安装系统包
|
|
17
|
-
starpak
|
|
18
|
+
starpak search <关键词> # 搜索 GitHub 仓库
|
|
18
19
|
starpak remove me # 卸载 starpak 自己
|
|
19
20
|
```
|
|
20
21
|
|
|
@@ -24,7 +25,7 @@ starpak remove me # 卸载 starpak 自己
|
|
|
24
25
|
2. **自动安装** — 安装依赖、执行构建,无需手动配置
|
|
25
26
|
3. **零配置启动** — `cd` 进项目目录,`starpak start` 就能跑
|
|
26
27
|
4. **多项目支持** — 自动识别前后端分离项目,启动所有子服务
|
|
27
|
-
5.
|
|
28
|
+
5. **Web 面板** — 在浏览器中管理项目、查看日志、控制服务(开发中)
|
|
28
29
|
|
|
29
30
|
## 安装
|
|
30
31
|
|
|
@@ -49,15 +50,16 @@ npm install -g starpak
|
|
|
49
50
|
| `build -r` | 重新构建(先清理再构建) |
|
|
50
51
|
| `remove -s <包名>` | 卸载系统包 |
|
|
51
52
|
| `search <关键词>` | 搜索 GitHub 仓库 |
|
|
53
|
+
| `web` | 启动 Web 管理面板(即将推出) |
|
|
52
54
|
| `test install` | 模拟安装(显示分析结果,不真执行) |
|
|
53
55
|
|
|
54
56
|
## 设计哲学
|
|
55
57
|
|
|
56
58
|
- **cd 进去,剩下的自动完成** — 一个命令就够了
|
|
57
|
-
-
|
|
59
|
+
- **Web + CLI 双模** — 终端或浏览器都能管理项目
|
|
58
60
|
- **适配而非替代** — 站在 apt/npm/make/systemd 之上,不重复造轮子
|
|
59
61
|
- **彩蛋** — `starpak remove me` 卸载 starpak 自己
|
|
60
62
|
|
|
61
63
|
## 许可证
|
|
62
64
|
|
|
63
|
-
Apache-2.0
|
|
65
|
+
Apache-2.0 — v0.1.5
|
package/cli/dist/index.cjs
CHANGED
|
@@ -5495,7 +5495,7 @@ var zh = {
|
|
|
5495
5495
|
"cmd.help.desc": "\u7785\u7785\u548B\u7528",
|
|
5496
5496
|
"app.name": "starpak \u2728",
|
|
5497
5497
|
"app.desc": "\u8BF6\u563F\uFF0C\u628A\u4F60\u4EE3\u7801\u53D8\u6210\u670D\u52A1\u7684\u9B54\u6CD5\u68D2\uFF5E cd \u8FDB\u53BB\uFF0C\u5269\u4E0B\u7684\u4EA4\u7ED9\u6211",
|
|
5498
|
-
"app.version": "0.1.
|
|
5498
|
+
"app.version": "0.1.5-patch.1",
|
|
5499
5499
|
"help.usage.hint": "\u5514\u2026 \u7528 starpak --help \u770B\u770B\u6211\u80FD\u5E72\u5565\u5427",
|
|
5500
5500
|
"cmd.install.desc": "\u5440\uFF0C\u88C5\u70B9\u5565\u597D\u4E1C\u897F\uFF1F",
|
|
5501
5501
|
"cmd.install.arg.target": "\u9879\u76EE\u76EE\u5F55\u3001GitHub \u4ED3\u5E93\u6216\u5305\u540D\u5566",
|
|
@@ -5551,6 +5551,7 @@ var zh = {
|
|
|
5551
5551
|
"cmd.remove.fail": "\u5378\u4E0D\u6389\u8BF6: {msg}",
|
|
5552
5552
|
"cmd.web.desc": "\u6253\u5F00 Web \u7BA1\u7406\u9762\u677F",
|
|
5553
5553
|
"cmd.web.coming": "StarPak API \u6B63\u5728\u542F\u52A8...",
|
|
5554
|
+
"cmd.web.fail": "\u542F\u52A8 Web \u670D\u52A1\u5668\u5931\u8D25: {msg}",
|
|
5554
5555
|
"cmd.test.desc": "\u6A21\u62DF\u6267\u884C\u547D\u4EE4",
|
|
5555
5556
|
"cmd.test.arg.command": "\u5B50\u547D\u4EE4: install/start/stop/restart/enable/disable/remove/list/status",
|
|
5556
5557
|
"cmd.search.desc": "\u641C\u7D22 GitHub \u4ED3\u5E93",
|
|
@@ -5562,7 +5563,7 @@ var en = {
|
|
|
5562
5563
|
"cmd.help.desc": "Show help",
|
|
5563
5564
|
"app.name": "starpak \u2728",
|
|
5564
5565
|
"app.desc": "A lil magic wand that turns your code into services~ cd in, leave the rest to me",
|
|
5565
|
-
"app.version": "0.1.
|
|
5566
|
+
"app.version": "0.1.5-patch.1",
|
|
5566
5567
|
"help.usage.hint": "Hmm... try starpak --help to see what I can do~",
|
|
5567
5568
|
"cmd.install.desc": "Install something nice",
|
|
5568
5569
|
"cmd.install.arg.target": "Project dir, GitHub repo, or package name",
|
|
@@ -12443,8 +12444,12 @@ async function findSuspiciousFiles(dir, maxDepth = 4) {
|
|
|
12443
12444
|
"start.sh",
|
|
12444
12445
|
"run.sh",
|
|
12445
12446
|
"start.bat",
|
|
12446
|
-
"run.bat"
|
|
12447
|
+
"run.bat",
|
|
12448
|
+
"Package.swift",
|
|
12449
|
+
"build.gradle",
|
|
12450
|
+
"pom.xml"
|
|
12447
12451
|
]);
|
|
12452
|
+
const scriptTargets = /* @__PURE__ */ new Set([".sh", ".bat", ".py", ".rb", ".php", ".pl", ".lua"]);
|
|
12448
12453
|
function scan(d, depth) {
|
|
12449
12454
|
if (depth > maxDepth) return;
|
|
12450
12455
|
try {
|
|
@@ -12491,7 +12496,6 @@ async function analyzeTechStack(files) {
|
|
|
12491
12496
|
if (deps.includes("express")) frameworks.push("express");
|
|
12492
12497
|
if (deps.includes("react")) frameworks.push("react");
|
|
12493
12498
|
if (deps.includes("vue")) frameworks.push("vue");
|
|
12494
|
-
if (deps.includes("svelte")) frameworks.push("svelte");
|
|
12495
12499
|
entryPoint = json.main || json.bin || null;
|
|
12496
12500
|
buildCommand = json.scripts?.build || null;
|
|
12497
12501
|
startCommand = json.scripts?.start || null;
|
|
@@ -12502,9 +12506,7 @@ async function analyzeTechStack(files) {
|
|
|
12502
12506
|
else if ((0, import_fs.existsSync)((0, import_path.join)(dir, "server.js"))) entryPoint = "server.js";
|
|
12503
12507
|
else if ((0, import_fs.existsSync)((0, import_path.join)(dir, "main.js"))) entryPoint = "main.js";
|
|
12504
12508
|
}
|
|
12505
|
-
if (!startCommand) {
|
|
12506
|
-
startCommand = entryPoint ? `node ${entryPoint}` : "node .";
|
|
12507
|
-
}
|
|
12509
|
+
if (!startCommand) startCommand = entryPoint ? `node ${entryPoint}` : "node .";
|
|
12508
12510
|
} catch {
|
|
12509
12511
|
}
|
|
12510
12512
|
}
|
|
@@ -12518,11 +12520,13 @@ async function analyzeTechStack(files) {
|
|
|
12518
12520
|
if (types.includes("requirements.txt") || types.includes("setup.py") || types.includes("pyproject.toml")) {
|
|
12519
12521
|
runtimes.push("python");
|
|
12520
12522
|
systemDeps.push("python3", "python3-pip", "python3-venv");
|
|
12523
|
+
if (!startCommand) startCommand = "python3 main.py";
|
|
12521
12524
|
}
|
|
12522
12525
|
if (types.includes("Cargo.toml")) {
|
|
12523
12526
|
runtimes.push("rust");
|
|
12524
12527
|
systemDeps.push("rustc", "cargo");
|
|
12525
12528
|
buildCommand = buildCommand || "cargo build --release";
|
|
12529
|
+
startCommand = startCommand || "./target/release/app";
|
|
12526
12530
|
}
|
|
12527
12531
|
if (types.includes("go.mod")) {
|
|
12528
12532
|
runtimes.push("go");
|
|
@@ -12530,9 +12534,40 @@ async function analyzeTechStack(files) {
|
|
|
12530
12534
|
buildCommand = buildCommand || "go build -o ./bin/app .";
|
|
12531
12535
|
startCommand = startCommand || "./bin/app";
|
|
12532
12536
|
}
|
|
12537
|
+
if (types.includes("Gemfile")) {
|
|
12538
|
+
runtimes.push("ruby");
|
|
12539
|
+
systemDeps.push("ruby", "bundler");
|
|
12540
|
+
buildCommand = buildCommand || "bundle install";
|
|
12541
|
+
startCommand = startCommand || "bundle exec ruby main.rb";
|
|
12542
|
+
}
|
|
12543
|
+
if (types.includes("composer.json")) {
|
|
12544
|
+
runtimes.push("php");
|
|
12545
|
+
systemDeps.push("php", "composer");
|
|
12546
|
+
buildCommand = buildCommand || "composer install";
|
|
12547
|
+
startCommand = startCommand || "php artisan serve";
|
|
12548
|
+
}
|
|
12549
|
+
if (types.includes("Package.swift")) {
|
|
12550
|
+
runtimes.push("swift");
|
|
12551
|
+
systemDeps.push("swift");
|
|
12552
|
+
buildCommand = buildCommand || "swift build";
|
|
12553
|
+
startCommand = startCommand || "swift run";
|
|
12554
|
+
}
|
|
12555
|
+
if (types.includes("pom.xml")) {
|
|
12556
|
+
runtimes.push("java");
|
|
12557
|
+
systemDeps.push("java", "maven");
|
|
12558
|
+
buildCommand = buildCommand || "mvn package";
|
|
12559
|
+
startCommand = startCommand || "mvn exec:java";
|
|
12560
|
+
}
|
|
12561
|
+
if (types.includes("build.gradle")) {
|
|
12562
|
+
runtimes.push("java");
|
|
12563
|
+
systemDeps.push("java", "gradle");
|
|
12564
|
+
buildCommand = buildCommand || "gradle build";
|
|
12565
|
+
startCommand = startCommand || "gradle run";
|
|
12566
|
+
}
|
|
12533
12567
|
if (types.includes("Dockerfile")) {
|
|
12534
12568
|
runtimes.push("docker");
|
|
12535
12569
|
buildCommand = buildCommand || "docker build -t starpak-app .";
|
|
12570
|
+
startCommand = startCommand || "docker run starpak-app";
|
|
12536
12571
|
}
|
|
12537
12572
|
if (types.includes("Makefile") && !buildCommand) {
|
|
12538
12573
|
if (!runtimes.length) runtimes.push("system");
|
|
@@ -14409,6 +14444,16 @@ async function installFromDir(dir, _name, options = {}) {
|
|
|
14409
14444
|
return detection;
|
|
14410
14445
|
}
|
|
14411
14446
|
|
|
14447
|
+
// core/db/index.ts
|
|
14448
|
+
var import_better_sqlite3 = __toESM(require("better-sqlite3"), 1);
|
|
14449
|
+
var import_path4 = require("path");
|
|
14450
|
+
var import_os2 = require("os");
|
|
14451
|
+
var STARPAK_DIR2 = (0, import_path4.join)((0, import_os2.homedir)(), ".starpak");
|
|
14452
|
+
var DB_PATH = (0, import_path4.join)(STARPAK_DIR2, "starpak.db");
|
|
14453
|
+
|
|
14454
|
+
// core/config/store.ts
|
|
14455
|
+
var import_conf = __toESM(require("conf"), 1);
|
|
14456
|
+
|
|
14412
14457
|
// cli/commands/test/command.ts
|
|
14413
14458
|
async function run12(command, args) {
|
|
14414
14459
|
switch (command) {
|
|
@@ -14420,6 +14465,19 @@ async function run12(command, args) {
|
|
|
14420
14465
|
}
|
|
14421
14466
|
}
|
|
14422
14467
|
|
|
14468
|
+
// cli/commands/web/command.ts
|
|
14469
|
+
async function run13() {
|
|
14470
|
+
console.log("\u542F\u52A8 Web \u7BA1\u7406\u9762\u677F...");
|
|
14471
|
+
try {
|
|
14472
|
+
const { startServer } = await import("../../server/index.js");
|
|
14473
|
+
await startServer();
|
|
14474
|
+
} catch (err) {
|
|
14475
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
14476
|
+
console.error(`\u542F\u52A8 Web \u670D\u52A1\u5668\u5931\u8D25: ${msg}`);
|
|
14477
|
+
process.exit(1);
|
|
14478
|
+
}
|
|
14479
|
+
}
|
|
14480
|
+
|
|
14423
14481
|
// cli/index.ts
|
|
14424
14482
|
var program2 = new Command();
|
|
14425
14483
|
program2.name(t("app.name")).description(t("app.desc")).version(t("app.version"), "-v, --version", t("cmd.version.desc")).helpOption("-h, --help", t("cmd.help.desc")).showHelpAfterError(t("help.usage.hint")).configureOutput({
|
|
@@ -14440,4 +14498,5 @@ program2.command("build").description("\u6784\u5EFA\u9879\u76EE").argument("[tar
|
|
|
14440
14498
|
program2.command("remove").description("\u5378\u8F7D\u7CFB\u7EDF\u5305").argument("<name>", "\u5305\u540D").option("-s, --system", "\u4F7F\u7528\u7CFB\u7EDF\u5305\u7BA1\u7406\u5668\u5378\u8F7D\uFF08apt\uFF09").action(run10);
|
|
14441
14499
|
program2.command("search").description(t("cmd.search.desc")).argument("<query>", t("cmd.search.arg.query")).action(run11);
|
|
14442
14500
|
program2.command("test").description(t("cmd.test.desc")).argument("<command>", t("cmd.test.arg.command")).argument("[args...]", "\u5B50\u547D\u4EE4\u7684\u53C2\u6570").action((command, args) => run12(command, args, {}));
|
|
14501
|
+
program2.command("web").description(t("cmd.web.desc")).action(run13);
|
|
14443
14502
|
program2.parse(process.argv);
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starpak",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5-patch.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
-
"description": "
|
|
6
|
+
"description": "Software engineering IDE — cd in, the rest is automatic",
|
|
7
7
|
"bin": {
|
|
8
8
|
"starpak": "./cli/dist/index.cjs"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"cli/dist/",
|
|
12
|
+
"server/public/",
|
|
12
13
|
"README.md",
|
|
13
14
|
"README.zh.md"
|
|
14
15
|
],
|
|
@@ -29,18 +30,24 @@
|
|
|
29
30
|
"scripts": {
|
|
30
31
|
"prepublish": "npm run build",
|
|
31
32
|
"build": "tsup --config cli/tsup.config.ts",
|
|
32
|
-
"dev": "tsx cli/index.ts"
|
|
33
|
-
"postinstall": "node -e ''"
|
|
33
|
+
"dev": "tsx cli/index.ts"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
+
"better-sqlite3": "^11.0.0",
|
|
36
37
|
"cli-progress": "^3.12.0",
|
|
37
38
|
"commander": "^13.0.0",
|
|
39
|
+
"conf": "^13.0.0",
|
|
38
40
|
"execa": "^9.0.0",
|
|
39
|
-
"
|
|
41
|
+
"express": "^4.21.0",
|
|
42
|
+
"ora": "^8.0.0",
|
|
43
|
+
"ws": "^8.0.0"
|
|
40
44
|
},
|
|
41
45
|
"devDependencies": {
|
|
46
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
42
47
|
"@types/cli-progress": "^3.11.0",
|
|
48
|
+
"@types/express": "^4.17.0",
|
|
43
49
|
"@types/node": "^22.0.0",
|
|
50
|
+
"@types/ws": "^8.5.0",
|
|
44
51
|
"tsup": "^8.0.0",
|
|
45
52
|
"tsx": "^4.0.0",
|
|
46
53
|
"typescript": "^5.7.0"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>starpak Web UI</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body {
|
|
10
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
11
|
+
background: #0f0f0f;
|
|
12
|
+
color: #e0e0e0;
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
.container { text-align: center; }
|
|
20
|
+
.logo {
|
|
21
|
+
font-size: 4rem;
|
|
22
|
+
font-weight: 800;
|
|
23
|
+
letter-spacing: -0.02em;
|
|
24
|
+
background: linear-gradient(135deg, #a78bfa, #60a5fa);
|
|
25
|
+
-webkit-background-clip: text;
|
|
26
|
+
-webkit-text-fill-color: transparent;
|
|
27
|
+
background-clip: text;
|
|
28
|
+
margin-bottom: 0.75rem;
|
|
29
|
+
}
|
|
30
|
+
.subtitle {
|
|
31
|
+
font-size: 1.15rem;
|
|
32
|
+
color: #888;
|
|
33
|
+
margin-bottom: 0.5rem;
|
|
34
|
+
}
|
|
35
|
+
.tagline {
|
|
36
|
+
font-size: 0.9rem;
|
|
37
|
+
color: #555;
|
|
38
|
+
margin-bottom: 2.5rem;
|
|
39
|
+
font-style: italic;
|
|
40
|
+
}
|
|
41
|
+
.badge {
|
|
42
|
+
display: inline-block;
|
|
43
|
+
padding: 0.35rem 1rem;
|
|
44
|
+
border: 1px solid #2a2a2a;
|
|
45
|
+
border-radius: 999px;
|
|
46
|
+
font-size: 0.8rem;
|
|
47
|
+
color: #666;
|
|
48
|
+
}
|
|
49
|
+
.status-bar {
|
|
50
|
+
margin-top: 3rem;
|
|
51
|
+
display: flex;
|
|
52
|
+
gap: 2rem;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
font-size: 0.8rem;
|
|
55
|
+
color: #444;
|
|
56
|
+
}
|
|
57
|
+
.status-bar span { display: flex; align-items: center; gap: 0.4rem; }
|
|
58
|
+
.dot { width: 6px; height: 6px; border-radius: 50%; display: inline-block; }
|
|
59
|
+
.dot-green { background: #22c55e; }
|
|
60
|
+
.dot-yellow { background: #eab308; }
|
|
61
|
+
.version { margin-top: 2.5rem; font-size: 0.75rem; color: #333; }
|
|
62
|
+
</style>
|
|
63
|
+
</head>
|
|
64
|
+
<body>
|
|
65
|
+
<div class="container">
|
|
66
|
+
<div class="logo">starpak</div>
|
|
67
|
+
<p class="subtitle">Software Engineering IDE</p>
|
|
68
|
+
<p class="tagline">cd in, the rest is automatic</p>
|
|
69
|
+
<div class="badge">Web UI — Coming Soon</div>
|
|
70
|
+
<div class="status-bar">
|
|
71
|
+
<span><span class="dot dot-green"></span> API Online</span>
|
|
72
|
+
<span><span class="dot dot-yellow"></span> UI Building</span>
|
|
73
|
+
</div>
|
|
74
|
+
<p class="version">v0.1.5-patch.1</p>
|
|
75
|
+
</div>
|
|
76
|
+
</body>
|
|
77
|
+
</html>
|