@a-company/paradigm 3.28.0 → 3.43.0
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/{accept-orchestration-6EM5EHXA.js → accept-orchestration-ZUWQUHSK.js} +6 -6
- package/dist/add-VSPZ6FM4.js +81 -0
- package/dist/{aggregate-M5WMUI6B.js → aggregate-SV3VGEIL.js} +2 -2
- package/dist/assess-UHBDYIK7.js +68 -0
- package/dist/{beacon-XL2ALH5O.js → beacon-3SJV4DAP.js} +2 -2
- package/dist/calibration-WWHK73WU.js +135 -0
- package/dist/{chunk-C5ZE6WEX.js → chunk-2SKXFXIT.js} +91 -1
- package/dist/{chunk-AK5M6KJB.js → chunk-36TKPM5Z.js} +20 -2
- package/dist/{chunk-W4VFKZVF.js → chunk-7COU5S2Z.js} +3 -3
- package/dist/{chunk-3BAMPB6I.js → chunk-7WEKMZ46.js} +2 -147
- package/dist/{chunk-SCC77UUP.js → chunk-AKIMFN6I.js} +3 -3
- package/dist/{chunk-3DYYXGDC.js → chunk-CDMAMDSG.js} +33 -0
- package/dist/{chunk-7IJ5JVKT.js → chunk-CZEIK3Y2.js} +913 -40
- package/dist/{chunk-MRENOFTR.js → chunk-EDOAWN7J.js} +6 -1
- package/dist/chunk-F3BCHPYT.js +143 -0
- package/dist/chunk-GT5QGC2H.js +253 -0
- package/dist/{chunk-N6RNYCZD.js → chunk-HIKKOCXY.js} +1 -1
- package/dist/{chunk-J26YQVAK.js → chunk-J4E6K5MG.js} +1 -1
- package/dist/chunk-L27I3CPZ.js +357 -0
- package/dist/{chunk-KWDTBXP2.js → chunk-LHLIAYQ3.js} +1 -1
- package/dist/{chunk-OXG5GVDJ.js → chunk-P7XSBJE3.js} +1 -1
- package/dist/{chunk-Z7W7HNRG.js → chunk-QDXI2DHR.js} +1 -1
- package/dist/{chunk-BRILIG7Z.js → chunk-QIOCFXDQ.js} +42 -0
- package/dist/{chunk-ZOH24ZPF.js → chunk-QWA26UNO.js} +7 -7
- package/dist/{lore-server-ILPHKWLK.js → chunk-RAB5IKPR.js} +77 -112
- package/dist/{chunk-BKMNLROM.js → chunk-RGFANZ4Q.js} +448 -147
- package/dist/{chunk-R2SGQ22F.js → chunk-YW5OCVKB.js} +448 -2
- package/dist/{chunk-6P4IFIK2.js → chunk-ZGUAAVMA.js} +53 -4
- package/dist/{commands-6ZVTD74M.js → commands-LEPFD7S5.js} +452 -1
- package/dist/config-schema-3YNIFJCJ.js +152 -0
- package/dist/{constellation-NXU6Q2HM.js → constellation-FAGT45TU.js} +2 -2
- package/dist/{context-audit-RI4R2WRH.js → context-audit-557EO6PK.js} +138 -8
- package/dist/{cost-CTGSLSOC.js → cost-UD3WPEKZ.js} +1 -1
- package/dist/{cursorrules-XBWFX66V.js → cursorrules-3TKZ4E4R.js} +2 -2
- package/dist/{delete-YTASL4SM.js → delete-RRK4RL6Y.js} +1 -1
- package/dist/{diff-AH7L4PRQ.js → diff-IP5CIARP.js} +6 -6
- package/dist/{dist-AG5JNIZU-HW2FWNTZ.js → dist-5QE2BB2B-X6DYVSUL.js} +59 -5
- package/dist/{dist-KY5HGDDL.js → dist-OGTSAZ55.js} +58 -4
- package/dist/{dist-IKBGY7FQ.js → dist-RVKYUCRU.js} +3 -1
- package/dist/{dist-7U64HDSC.js → dist-UXWV4OKX.js} +8 -2
- package/dist/{dist-RMAIFRTW.js → dist-Y7I3CFY5.js} +5 -3
- package/dist/{doctor-INBOLZC7.js → doctor-GKZJU7QG.js} +1 -1
- package/dist/{edit-S7NZD7H7.js → edit-4CLNN5JG.js} +1 -1
- package/dist/{graph-ERNQQQ7C.js → graph-YYUXI3F7.js} +1 -1
- package/dist/graph-server-ZPXRSGCW.js +116 -0
- package/dist/{habits-7BORPC2F.js → habits-O37HTUKE.js} +2 -2
- package/dist/index.js +207 -89
- package/dist/integrity-MK2OP5TA.js +194 -0
- package/dist/integrity-checker-J7YXRTBT.js +11 -0
- package/dist/{lint-53GPXKKI.js → lint-HYWGS3JJ.js} +1 -1
- package/dist/{list-QTFWN35D.js → list-BTLFHSRC.js} +1 -1
- package/dist/list-IUCYPGMK.js +57 -0
- package/dist/{lore-loader-S5BXMH27.js → lore-loader-VTEEZDX3.js} +3 -1
- package/dist/lore-server-NOOAHKJX.js +118 -0
- package/dist/mcp.js +2616 -112
- package/dist/migrate-FQVGQNXZ.js +889 -0
- package/dist/{migrate-assessments-FPR6C35Z.js → migrate-assessments-JP6Q5KME.js} +1 -1
- package/dist/{orchestrate-HMSQ2CED.js → orchestrate-A226N6FC.js} +6 -6
- package/dist/platform-server-KK4OCRTV.js +891 -0
- package/dist/{probe-SN4BNXOC.js → probe-7JK7IDNI.js} +5 -5
- package/dist/{providers-YW3FG6DA.js → providers-YNFSL6HK.js} +1 -1
- package/dist/quiz-I75NU2QQ.js +99 -0
- package/dist/{record-UGN75GTB.js → record-46CLR4OG.js} +11 -2
- package/dist/{reindex-YG3KIXAK.js → reindex-NZQRGKPN.js} +3 -2
- package/dist/{remember-IEBQHXHZ.js → remember-4EUZKIIB.js} +1 -1
- package/dist/{retag-URLJLMSK.js → retag-KC4JVRLE.js} +1 -1
- package/dist/{review-725ZKA7U.js → review-Q7M4CRB5.js} +1 -1
- package/dist/{ripple-DFMXLFWI.js → ripple-RI3LOT6R.js} +2 -2
- package/dist/{sentinel-FUR3QKCJ.js → sentinel-BKYTBT7M.js} +1 -1
- package/dist/sentinel-bridge-IZTXYS5M.js +109 -0
- package/dist/sentinel-ui/assets/{index-Zh1YM0C9.css → index-CJ1Wx083.css} +1 -1
- package/dist/sentinel-ui/assets/index-S1VJ67dT.js +62 -0
- package/dist/sentinel-ui/assets/index-S1VJ67dT.js.map +1 -0
- package/dist/sentinel-ui/index.html +2 -2
- package/dist/sentinel.js +6 -6
- package/dist/{serve-DIALBCTU.js → serve-22A4XOIG.js} +1 -1
- package/dist/{university-A66BMZ4Z.js → serve-2YJ6D2Y6.js} +9 -8
- package/dist/serve-3V2WXLGM.js +33 -0
- package/dist/{server-2VICPDUR.js → server-OFEJ2HJP.js} +25 -2
- package/dist/{server-OWBK2WFS.js → server-RDLQ3DK7.js} +49 -4
- package/dist/{setup-HOI52TN3.js → setup-M2ZKLKNN.js} +4 -4
- package/dist/{shift-DRF5M3G6.js → shift-LNMKFYLR.js} +73 -14
- package/dist/{show-GEVVQWWG.js → show-P7GYO43X.js} +1 -1
- package/dist/show-PKZMYKRN.js +82 -0
- package/dist/{snapshot-XHINQBZS.js → snapshot-Y3COXK4T.js} +2 -2
- package/dist/{spawn-DIY7T4QW.js → spawn-SSXZX45U.js} +2 -2
- package/dist/status-KLHALGW4.js +71 -0
- package/dist/{summary-NV7SBV5O.js → summary-5NQNOD3F.js} +2 -2
- package/dist/{sweep-5POCF2E4.js → sweep-EZU3GU6S.js} +1 -1
- package/dist/symphony-ROEKK7VD.js +999 -0
- package/dist/{team-YOGT2Q2X.js → team-HGLJXWQG.js} +7 -7
- package/dist/{timeline-RKXNRMKF.js → timeline-ANC7LVDL.js} +1 -1
- package/dist/{triage-GJ6GK647.js → triage-POXJ2TIX.js} +2 -2
- package/dist/university-content/courses/.purpose +7 -1
- package/dist/university-content/courses/para-101.json +53 -0
- package/dist/university-content/courses/para-501.json +166 -0
- package/dist/university-content/plsat/.purpose +6 -0
- package/dist/university-content/plsat/v3.0.json +400 -1
- package/dist/university-content/reference.json +48 -0
- package/dist/university-ui/assets/{index-TcsCEBMo.js → index-tfi5xN4Q.js} +2 -2
- package/dist/university-ui/assets/{index-TcsCEBMo.js.map → index-tfi5xN4Q.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/dist/{upgrade-65QOQXRC.js → upgrade-ANX3LVSA.js} +1 -0
- package/dist/validate-GD5XWILV.js +134 -0
- package/dist/{validate-TKKRGJKC.js → validate-ZVPNN4FL.js} +1 -1
- package/dist/{workspace-L27RR5MF.js → workspace-UIUTHZTD.js} +6 -6
- package/package.json +4 -2
- package/platform-ui/dist/assets/GitSection-C-GQWHcu.css +1 -0
- package/platform-ui/dist/assets/GitSection-DvyJBF_-.js +4 -0
- package/platform-ui/dist/assets/GraphSection-BiQrXqfs.js +8 -0
- package/platform-ui/dist/assets/GraphSection-BlgXTl53.css +1 -0
- package/platform-ui/dist/assets/LoreSection-BaH1FaRb.js +1 -0
- package/platform-ui/dist/assets/LoreSection-C3EixkjW.css +1 -0
- package/platform-ui/dist/assets/SentinelSection-BI-aIYKL.css +1 -0
- package/platform-ui/dist/assets/SentinelSection-DemAznjI.js +1 -0
- package/platform-ui/dist/assets/index-CfpZFjea.css +1 -0
- package/platform-ui/dist/assets/index-DDKhCt-w.js +57 -0
- package/platform-ui/dist/index.html +14 -0
- package/dist/graph-server-BZ73HTAT.js +0 -251
- package/dist/sentinel-ui/assets/index-C_Wstm64.js +0 -62
- package/dist/sentinel-ui/assets/index-C_Wstm64.js.map +0 -1
- /package/dist/{chunk-5SXMV4SP.js → chunk-FS3WTUHY.js} +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Crimson+Pro:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-tfi5xN4Q.js"></script>
|
|
12
12
|
<link rel="stylesheet" crossorigin href="/assets/index-CMrxD7y5.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
@@ -35,6 +35,7 @@ async function upgradeCommand(targetPath, options) {
|
|
|
35
35
|
const rootDir = targetPath ? path.resolve(targetPath) : process.cwd();
|
|
36
36
|
const projectName = path.basename(rootDir);
|
|
37
37
|
const spinner = ora();
|
|
38
|
+
console.log(chalk.yellow("\n `paradigm upgrade` is deprecated. Use `paradigm migrate` instead.\n"));
|
|
38
39
|
console.log(chalk.blue("\n\u{1F504} Paradigm Upgrade\n"));
|
|
39
40
|
if (options.fromHorizon) {
|
|
40
41
|
const result = await migrateFromHorizon(rootDir, projectName, options, spinner);
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadPath,
|
|
4
|
+
loadQuiz,
|
|
5
|
+
loadUniversityIndex
|
|
6
|
+
} from "./chunk-GT5QGC2H.js";
|
|
7
|
+
import "./chunk-ZXMDA7VB.js";
|
|
8
|
+
|
|
9
|
+
// src/commands/university/validate.ts
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
import * as fs from "fs";
|
|
12
|
+
import * as path from "path";
|
|
13
|
+
async function universityValidateCommand(options) {
|
|
14
|
+
const rootDir = process.cwd();
|
|
15
|
+
const index = loadUniversityIndex(rootDir);
|
|
16
|
+
if (!index || index.totalContent === 0) {
|
|
17
|
+
console.log(chalk.yellow("\n No university content to validate.\n"));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const issues = [];
|
|
21
|
+
let entriesToCheck = index.entries;
|
|
22
|
+
if (options.id) {
|
|
23
|
+
entriesToCheck = entriesToCheck.filter((e) => e.id === options.id);
|
|
24
|
+
if (entriesToCheck.length === 0) {
|
|
25
|
+
console.error(chalk.red(`
|
|
26
|
+
Content "${options.id}" not found
|
|
27
|
+
`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let knownSymbols = null;
|
|
32
|
+
if (options.deep) {
|
|
33
|
+
knownSymbols = /* @__PURE__ */ new Set();
|
|
34
|
+
const scanIndexPath = path.join(rootDir, ".paradigm", "scan-index.json");
|
|
35
|
+
if (fs.existsSync(scanIndexPath)) {
|
|
36
|
+
try {
|
|
37
|
+
const raw = JSON.parse(fs.readFileSync(scanIndexPath, "utf8"));
|
|
38
|
+
if (raw.symbols && Array.isArray(raw.symbols)) {
|
|
39
|
+
for (const sym of raw.symbols) {
|
|
40
|
+
if (sym.symbol) knownSymbols.add(sym.symbol);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const allContentIds = new Set(index.entries.map((e) => e.id));
|
|
48
|
+
for (const entry of entriesToCheck) {
|
|
49
|
+
if (!entry.title) {
|
|
50
|
+
issues.push({ contentId: entry.id, severity: "error", check: "missing-title", message: "Content is missing a title" });
|
|
51
|
+
}
|
|
52
|
+
if (entry.type === "quiz") {
|
|
53
|
+
const quiz = loadQuiz(rootDir, entry.id);
|
|
54
|
+
if (!quiz) {
|
|
55
|
+
issues.push({ contentId: entry.id, severity: "error", check: "unreadable-quiz", message: "Quiz file could not be parsed" });
|
|
56
|
+
} else {
|
|
57
|
+
for (const q of quiz.questions) {
|
|
58
|
+
if (!q.choices || !(q.correct in q.choices)) {
|
|
59
|
+
issues.push({
|
|
60
|
+
contentId: entry.id,
|
|
61
|
+
severity: "error",
|
|
62
|
+
check: "invalid-quiz-answer",
|
|
63
|
+
message: `Question ${q.id}: correct "${q.correct}" not in choices [${Object.keys(q.choices || {}).join(", ")}]`,
|
|
64
|
+
fix: `Set correct to one of: ${Object.keys(q.choices || {}).join(", ")}`
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (entry.type === "path") {
|
|
71
|
+
const lp = loadPath(rootDir, entry.id);
|
|
72
|
+
if (!lp) {
|
|
73
|
+
issues.push({ contentId: entry.id, severity: "error", check: "unreadable-path", message: "Learning path file could not be parsed" });
|
|
74
|
+
} else {
|
|
75
|
+
for (const step of lp.steps) {
|
|
76
|
+
if (!step.content.startsWith("plsat:") && !allContentIds.has(step.content)) {
|
|
77
|
+
issues.push({
|
|
78
|
+
contentId: entry.id,
|
|
79
|
+
severity: "error",
|
|
80
|
+
check: "broken-path-step",
|
|
81
|
+
message: `Step references "${step.content}" which doesn't exist`,
|
|
82
|
+
fix: `Create content with id "${step.content}"`
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (knownSymbols && entry.symbols.length > 0) {
|
|
89
|
+
for (const sym of entry.symbols) {
|
|
90
|
+
if (!knownSymbols.has(sym)) {
|
|
91
|
+
issues.push({
|
|
92
|
+
contentId: entry.id,
|
|
93
|
+
severity: "warning",
|
|
94
|
+
check: "broken-symbol-ref",
|
|
95
|
+
message: `Symbol "${sym}" not found in scan-index`
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (options.json) {
|
|
102
|
+
console.log(JSON.stringify({
|
|
103
|
+
status: issues.some((i) => i.severity === "error") ? "errors" : issues.length > 0 ? "warnings" : "healthy",
|
|
104
|
+
totalContent: index.totalContent,
|
|
105
|
+
checked: entriesToCheck.length,
|
|
106
|
+
issues
|
|
107
|
+
}, null, 2));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(chalk.blue(`
|
|
111
|
+
University Validation (${entriesToCheck.length} items${options.deep ? ", deep mode" : ""})
|
|
112
|
+
`));
|
|
113
|
+
if (issues.length === 0) {
|
|
114
|
+
console.log(chalk.green(" All checks passed.\n"));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const errors = issues.filter((i) => i.severity === "error");
|
|
118
|
+
const warnings = issues.filter((i) => i.severity === "warning");
|
|
119
|
+
for (const issue of errors) {
|
|
120
|
+
console.log(chalk.red(` x ${issue.contentId}: ${issue.message}`));
|
|
121
|
+
if (issue.fix) console.log(chalk.gray(` Fix: ${issue.fix}`));
|
|
122
|
+
}
|
|
123
|
+
for (const issue of warnings) {
|
|
124
|
+
console.log(chalk.yellow(` ! ${issue.contentId}: ${issue.message}`));
|
|
125
|
+
if (issue.fix) console.log(chalk.gray(` Fix: ${issue.fix}`));
|
|
126
|
+
}
|
|
127
|
+
console.log();
|
|
128
|
+
if (errors.length > 0) console.log(chalk.red(` ${errors.length} error${errors.length > 1 ? "s" : ""}`));
|
|
129
|
+
if (warnings.length > 0) console.log(chalk.yellow(` ${warnings.length} warning${warnings.length > 1 ? "s" : ""}`));
|
|
130
|
+
console.log();
|
|
131
|
+
}
|
|
132
|
+
export {
|
|
133
|
+
universityValidateCommand
|
|
134
|
+
};
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
workspaceInitCommand,
|
|
5
5
|
workspaceReindexCommand,
|
|
6
6
|
workspaceStatusCommand
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-P7XSBJE3.js";
|
|
8
|
+
import "./chunk-7COU5S2Z.js";
|
|
9
|
+
import "./chunk-36TKPM5Z.js";
|
|
10
|
+
import "./chunk-ZGUAAVMA.js";
|
|
11
|
+
import "./chunk-EDOAWN7J.js";
|
|
12
12
|
import "./chunk-IRKUEJVW.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-QDXI2DHR.js";
|
|
14
14
|
import "./chunk-4NCFWYGG.js";
|
|
15
15
|
import "./chunk-ZXMDA7VB.js";
|
|
16
16
|
export {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a-company/paradigm",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.43.0",
|
|
4
4
|
"description": "Unified CLI for Paradigm developer tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"dist",
|
|
16
16
|
"templates",
|
|
17
17
|
"lore-ui/dist",
|
|
18
|
-
"graph-ui/dist"
|
|
18
|
+
"graph-ui/dist",
|
|
19
|
+
"platform-ui/dist"
|
|
19
20
|
],
|
|
20
21
|
"scripts": {
|
|
21
22
|
"build": "node scripts/generate-hooks.mjs && tsup && npm run build:sentinel-assets && npm run build:university-assets",
|
|
@@ -23,6 +24,7 @@
|
|
|
23
24
|
"check:hooks": "node scripts/generate-hooks.mjs --check",
|
|
24
25
|
"build:lore-ui": "cd lore-ui && npx vite build",
|
|
25
26
|
"build:graph-ui": "cd graph-ui && npx vite build",
|
|
27
|
+
"build:platform-ui": "cd platform-ui && npx vite build",
|
|
26
28
|
"build:university-assets": "rm -rf dist/university-ui dist/university-content && cp -r ../university/ui/dist dist/university-ui && cp -r ../university/src/content dist/university-content",
|
|
27
29
|
"dev": "tsup src/index.ts --format esm --dts --watch",
|
|
28
30
|
"test": "vitest run",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.git-section{display:flex;flex-direction:column;height:100%;overflow:hidden}.git-branch-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:var(--p-bg-secondary);border-bottom:1px solid var(--p-border);min-height:40px}.git-branch-bar__left{display:flex;align-items:center;gap:8px}.git-branch-bar__icon{font-size:16px;color:var(--p-text-muted)}.git-branch-bar__name{font-size:13px;font-weight:600;color:var(--p-text-primary)}.git-branch-bar__badge{font-size:11px;padding:1px 6px;border-radius:10px;background:var(--p-bg-tertiary);font-variant-numeric:tabular-nums}.git-branch-bar__badge--ahead{color:var(--p-accent-green)}.git-branch-bar__badge--behind{color:var(--p-accent-orange)}.git-branch-bar__refresh{background:none;border:none;color:var(--p-text-muted);cursor:pointer;font-size:16px;padding:4px 8px;border-radius:var(--p-radius);transition:background var(--p-transition),color var(--p-transition)}.git-branch-bar__refresh:hover{background:var(--p-bg-hover);color:var(--p-text-primary)}.git-branch-bar__refresh:disabled{opacity:.5;cursor:default}.git-tabs{display:flex;gap:0;border-bottom:1px solid var(--p-border);padding:0 16px;background:var(--p-bg-secondary)}.git-tabs__btn{background:none;border:none;border-bottom:2px solid transparent;color:var(--p-text-muted);cursor:pointer;font-size:13px;font-family:inherit;padding:8px 16px;transition:color var(--p-transition),border-color var(--p-transition)}.git-tabs__btn:hover{color:var(--p-text-secondary)}.git-tabs__btn--active{color:var(--p-accent-blue);border-bottom-color:var(--p-accent-blue)}.git-files-layout{flex:1;display:flex;overflow:hidden}.git-files-layout__sidebar{width:280px;min-width:280px;border-right:1px solid var(--p-border);display:flex;flex-direction:column;overflow:hidden}.git-files-layout__main{flex:1;overflow:auto}.git-file-list{flex:1;overflow-y:auto;padding:8px 0}.git-file-list__empty{padding:24px 16px;color:var(--p-text-muted);font-size:13px;text-align:center}.git-file-group{margin-bottom:4px}.git-file-group__header{display:flex;align-items:center;justify-content:space-between;padding:4px 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--p-text-muted)}.git-file-group__count{background:var(--p-bg-tertiary);padding:0 6px;border-radius:8px;font-size:10px}.git-file-item{display:flex;align-items:center;gap:6px;padding:4px 12px;cursor:pointer;transition:background var(--p-transition)}.git-file-item:hover{background:var(--p-bg-hover)}.git-file-item--selected{background:var(--p-bg-tertiary)}.git-file-item__indicator{width:6px;height:6px;border-radius:50%;flex-shrink:0}.git-file-item__indicator--staged{background:var(--p-accent-green)}.git-file-item__indicator--unstaged{background:var(--p-accent-orange)}.git-file-item__indicator--untracked{background:var(--p-text-muted)}.git-file-item__name{flex:1;font-size:12px;color:var(--p-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.git-file-item__action{background:none;border:none;color:var(--p-text-muted);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:3px;opacity:0;transition:opacity var(--p-transition),background var(--p-transition)}.git-file-item:hover .git-file-item__action{opacity:1}.git-file-item__action:hover{background:var(--p-bg-secondary);color:var(--p-text-primary)}.git-diff-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--p-text-muted);font-size:13px}.git-diff{display:flex;flex-direction:column;height:100%}.git-diff__header{padding:8px 16px;font-size:12px;font-weight:600;color:var(--p-text-secondary);background:var(--p-bg-secondary);border-bottom:1px solid var(--p-border)}.git-diff__content{flex:1;overflow:auto;margin:0;padding:0;font-family:SF Mono,Menlo,Monaco,Courier New,monospace;font-size:12px;line-height:20px;-moz-tab-size:4;tab-size:4}.git-diff__line{display:flex;min-height:20px;padding:0 8px}.git-diff__line--add{background:#3fb9501a;color:var(--p-accent-green)}.git-diff__line--remove{background:#f851491a;color:var(--p-accent-red)}.git-diff__line--hunk{background:#58a6ff14;color:var(--p-accent-blue);font-style:italic}.git-diff__line--context{color:var(--p-text-secondary)}.git-diff__gutter{width:48px;min-width:48px;text-align:right;padding-right:12px;color:var(--p-text-muted);-webkit-user-select:none;user-select:none}.git-diff__text{white-space:pre;flex:1}.git-commit-composer{border-top:1px solid var(--p-border);padding:8px;background:var(--p-bg-secondary);position:relative}.git-commit-composer__input-wrap{position:relative}.git-commit-composer__textarea{width:100%;background:var(--p-bg-primary);border:1px solid var(--p-border);border-radius:var(--p-radius);color:var(--p-text-primary);font-family:inherit;font-size:12px;padding:8px;resize:none;outline:none;transition:border-color var(--p-transition)}.git-commit-composer__textarea:focus{border-color:var(--p-border-active)}.git-commit-composer__textarea:disabled{opacity:.5}.git-commit-composer__suggestions{position:absolute;bottom:100%;left:0;right:0;background:var(--p-bg-secondary);border:1px solid var(--p-border);border-radius:var(--p-radius);margin-bottom:4px;max-height:200px;overflow-y:auto;z-index:20}.git-commit-composer__suggestion{padding:4px 8px;font-size:12px;color:var(--p-text-primary);cursor:pointer}.git-commit-composer__suggestion:hover,.git-commit-composer__suggestion--active{background:var(--p-bg-hover)}.git-commit-composer__actions{display:flex;gap:8px;margin-top:8px}.git-commit-composer__btn{flex:1;padding:6px 12px;border:none;border-radius:var(--p-radius);font-family:inherit;font-size:12px;font-weight:500;cursor:pointer;transition:opacity var(--p-transition)}.git-commit-composer__btn:disabled{opacity:.4;cursor:default}.git-commit-composer__btn--commit{background:var(--p-accent-green);color:#fff}.git-commit-composer__btn--push{background:var(--p-accent-blue);color:#fff}.git-log-layout{flex:1;overflow-y:auto;padding:0}.git-commit-log{display:flex;flex-direction:column}.git-commit-log__empty{padding:24px 16px;color:var(--p-text-muted);font-size:13px;text-align:center}.git-commit-log__item{padding:10px 16px;border-bottom:1px solid var(--p-bg-tertiary)}.git-commit-log__item:hover{background:var(--p-bg-secondary)}.git-commit-log__header{display:flex;gap:8px;align-items:baseline}.git-commit-log__hash{font-size:12px;font-family:SF Mono,Menlo,monospace;color:var(--p-accent-blue);flex-shrink:0}.git-commit-log__message{font-size:13px;color:var(--p-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-commit-log__meta{display:flex;gap:12px;margin-top:4px;align-items:center;flex-wrap:wrap}.git-commit-log__author{font-size:11px;color:var(--p-text-secondary)}.git-commit-log__date{font-size:11px;color:var(--p-text-muted);font-variant-numeric:tabular-nums}.git-commit-log__symbols{display:flex;gap:4px;flex-wrap:wrap}.git-commit-log__symbol-badge{font-size:10px;padding:0 5px;background:var(--p-bg-tertiary);border-radius:8px}.git-commit-log__load-more{background:none;border:none;color:var(--p-accent-blue);cursor:pointer;font-family:inherit;font-size:13px;padding:12px 16px;text-align:center;transition:background var(--p-transition)}.git-commit-log__load-more:hover{background:var(--p-bg-secondary)}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{c as F,j as t,r as f}from"./index-DDKhCt-w.js";const l=F((a,o)=>({branch:"",ahead:0,behind:0,staged:[],unstaged:[],untracked:[],commits:[],commitTotal:0,commitOffset:0,branches:[],selectedFile:null,selectedFileStaged:!1,diffContent:"",commitMessage:"",activeTab:"files",loading:!1,pushing:!1,committing:!1,symbols:[],fetchStatus:async()=>{try{const s=await fetch("/api/git/status");if(!s.ok)return;const i=await s.json();a({branch:i.branch,ahead:i.ahead,behind:i.behind,staged:i.staged,unstaged:i.unstaged,untracked:i.untracked})}catch{}},fetchBranches:async()=>{try{const s=await fetch("/api/git/branches");if(!s.ok)return;const i=await s.json();a({branches:i.branches||[]})}catch{}},fetchLog:async(s=!0)=>{try{const i=s?0:o().commitOffset,e=await fetch(`/api/git/log?limit=20&offset=${i}`);if(!e.ok)return;const n=await e.json();a(s?{commits:n.commits,commitTotal:n.total,commitOffset:20}:r=>({commits:[...r.commits,...n.commits],commitTotal:n.total,commitOffset:r.commitOffset+20}))}catch{}},loadMoreCommits:async()=>{await o().fetchLog(!1)},selectFile:async(s,i)=>{a({selectedFile:s,selectedFileStaged:i,diffContent:""});try{const e=new URLSearchParams({path:s});i&&e.set("staged","true");const n=await fetch(`/api/git/diff?${e}`);if(!n.ok)return;const r=await n.json();a({diffContent:r.diff||"(no diff available)"})}catch{a({diffContent:"(error loading diff)"})}},clearSelection:()=>a({selectedFile:null,diffContent:""}),stageFiles:async s=>{try{(await fetch("/api/git/stage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:s})})).ok&&await o().fetchStatus()}catch{}},unstageFiles:async s=>{try{(await fetch("/api/git/unstage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:s})})).ok&&await o().fetchStatus()}catch{}},commit:async()=>{const s=o().commitMessage.trim();if(!s)return!1;a({committing:!0});try{return(await fetch("/api/git/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:s})})).ok?(a({commitMessage:""}),await Promise.all([o().fetchStatus(),o().fetchLog()]),!0):!1}catch{return!1}finally{a({committing:!1})}},push:async()=>{a({pushing:!0});try{return(await fetch("/api/git/push",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?(await o().fetchStatus(),!0):!1}catch{return!1}finally{a({pushing:!1})}},setCommitMessage:s=>a({commitMessage:s}),setActiveTab:s=>a({activeTab:s}),fetchSymbols:async()=>{try{const s=await fetch("/api/symbols");if(!s.ok)return;const n=((await s.json()).symbols||[]).map(r=>`${{component:"#",flow:"$",gate:"^",signal:"!",aspect:"~"}[r.category||""]||"#"}${r.name||r.id}`);a({symbols:n})}catch{}},refresh:async()=>{a({loading:!0}),await Promise.all([o().fetchStatus(),o().fetchLog(),o().fetchBranches()]),a({loading:!1})}}));function M(){const a=l(n=>n.branch),o=l(n=>n.ahead),s=l(n=>n.behind),i=l(n=>n.refresh),e=l(n=>n.loading);return t.jsxs("div",{className:"git-branch-bar",children:[t.jsxs("div",{className:"git-branch-bar__left",children:[t.jsx("span",{className:"git-branch-bar__icon",children:"⎇"}),t.jsx("span",{className:"git-branch-bar__name",children:a||"..."}),o>0&&t.jsxs("span",{className:"git-branch-bar__badge git-branch-bar__badge--ahead",title:`${o} ahead`,children:["↑",o]}),s>0&&t.jsxs("span",{className:"git-branch-bar__badge git-branch-bar__badge--behind",title:`${s} behind`,children:["↓",s]})]}),t.jsx("button",{className:"git-branch-bar__refresh",onClick:i,disabled:e,title:"Refresh",children:e?"⏳":"↻"})]})}function C({title:a,files:o,type:s,selectedFile:i,onSelect:e,onAction:n,actionLabel:r}){return o.length===0?null:t.jsxs("div",{className:"git-file-group",children:[t.jsxs("div",{className:"git-file-group__header",children:[t.jsx("span",{className:"git-file-group__title",children:a}),t.jsx("span",{className:"git-file-group__count",children:o.length})]}),o.map(g=>t.jsxs("div",{className:`git-file-item ${i===g?"git-file-item--selected":""}`,onClick:()=>e(g,s==="staged"),children:[t.jsx("span",{className:`git-file-item__indicator git-file-item__indicator--${s}`}),t.jsx("span",{className:"git-file-item__name",title:g,children:g}),t.jsx("button",{className:"git-file-item__action",onClick:m=>{m.stopPropagation(),n([g])},title:r,children:s==="staged"?"−":"+"})]},g))]})}function $(){const a=l(m=>m.staged),o=l(m=>m.unstaged),s=l(m=>m.untracked),i=l(m=>m.selectedFile),e=l(m=>m.selectFile),n=l(m=>m.stageFiles),r=l(m=>m.unstageFiles),g=a.length===0&&o.length===0&&s.length===0;return t.jsxs("div",{className:"git-file-list",children:[g&&t.jsx("div",{className:"git-file-list__empty",children:"Working tree clean"}),t.jsx(C,{title:"Staged",files:a,type:"staged",selectedFile:i,onSelect:e,onAction:r,actionLabel:"Unstage"}),t.jsx(C,{title:"Modified",files:o,type:"unstaged",selectedFile:i,onSelect:e,onAction:n,actionLabel:"Stage"}),t.jsx(C,{title:"Untracked",files:s,type:"untracked",selectedFile:i,onSelect:e,onAction:n,actionLabel:"Stage"})]})}function O(a){const o=a.split(`
|
|
2
|
+
`).slice(0,2e3),s=[];let i=0,e=0;for(const n of o)if(n.startsWith("@@")){const r=n.match(/@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);r&&(i=parseInt(r[1]),e=parseInt(r[2])),s.push({type:"hunk",content:n})}else n.startsWith("+")?(s.push({type:"add",content:n,lineNum:String(e)}),e++):n.startsWith("-")?(s.push({type:"remove",content:n,lineNum:String(i)}),i++):n.startsWith("diff ")||n.startsWith("index ")||n.startsWith("---")||n.startsWith("+++")?s.push({type:"context",content:n}):(s.push({type:"context",content:n,lineNum:String(e)}),i++,e++);return s}function D(){const a=l(i=>i.selectedFile),o=l(i=>i.diffContent);if(!a)return t.jsx("div",{className:"git-diff-empty",children:"Select a file to view its diff"});const s=O(o);return t.jsxs("div",{className:"git-diff",children:[t.jsx("div",{className:"git-diff__header",children:a}),t.jsx("pre",{className:"git-diff__content",children:s.map((i,e)=>t.jsxs("div",{className:`git-diff__line git-diff__line--${i.type}`,children:[t.jsx("span",{className:"git-diff__gutter",children:i.lineNum||""}),t.jsx("span",{className:"git-diff__text",children:i.content})]},e))})]})}const E="#$^!~";function P(){const a=l(c=>c.commitMessage),o=l(c=>c.setCommitMessage),s=l(c=>c.commit),i=l(c=>c.push),e=l(c=>c.committing),n=l(c=>c.pushing),r=l(c=>c.staged),g=l(c=>c.symbols),m=l(c=>c.ahead),j=f.useRef(null),[p,_]=f.useState([]),[N,v]=f.useState(0),[x,S]=f.useState(-1),k=f.useCallback(()=>{const c=j.current;if(!c)return;const d=c.selectionStart,y=c.value.substring(0,d);let b=-1;for(let h=y.length-1;h>=0;h--){const u=y[h];if(u===" "||u===`
|
|
3
|
+
`)break;if(E.includes(u)){b=h;break}}if(b>=0){const h=y.substring(b).toLowerCase(),u=g.filter(L=>L.toLowerCase().startsWith(h)).slice(0,8);_(u),v(0),S(b)}else _([]),S(-1)},[g]),w=f.useCallback(c=>{const d=j.current;if(!d||x<0)return;const y=a.substring(0,x),b=a.substring(d.selectionStart),h=y+c+" "+b;o(h),_([]),S(-1),setTimeout(()=>{if(d){const u=x+c.length+1;d.selectionStart=u,d.selectionEnd=u,d.focus()}},0)},[a,x,o]),T=f.useCallback(c=>{p.length>0&&(c.key==="ArrowDown"?(c.preventDefault(),v(d=>Math.min(d+1,p.length-1))):c.key==="ArrowUp"?(c.preventDefault(),v(d=>Math.max(d-1,0))):c.key==="Enter"||c.key==="Tab"?(c.preventDefault(),w(p[N])):c.key==="Escape"&&_([]))},[p,N,w]);return f.useEffect(()=>{const c=()=>_([]);return document.addEventListener("click",c),()=>document.removeEventListener("click",c)},[]),t.jsxs("div",{className:"git-commit-composer",children:[t.jsxs("div",{className:"git-commit-composer__input-wrap",children:[t.jsx("textarea",{ref:j,className:"git-commit-composer__textarea",placeholder:r.length>0?"Commit message...":"No staged files to commit",value:a,onChange:c=>{o(c.target.value),k()},onKeyUp:k,onKeyDown:T,disabled:r.length===0,rows:3}),p.length>0&&t.jsx("div",{className:"git-commit-composer__suggestions",onClick:c=>c.stopPropagation(),children:p.map((c,d)=>t.jsx("div",{className:`git-commit-composer__suggestion ${d===N?"git-commit-composer__suggestion--active":""}`,onClick:()=>w(c),children:c},c))})]}),t.jsxs("div",{className:"git-commit-composer__actions",children:[t.jsx("button",{className:"git-commit-composer__btn git-commit-composer__btn--commit",onClick:s,disabled:e||r.length===0||!a.trim(),children:e?"Committing...":`Commit (${r.length})`}),t.jsx("button",{className:"git-commit-composer__btn git-commit-composer__btn--push",onClick:i,disabled:n||m===0,children:n?"Pushing...":`Push${m>0?` (${m})`:""}`})]})]})}const A={"#":"var(--p-symbol-component)",$:"var(--p-symbol-flow)","^":"var(--p-symbol-gate)","!":"var(--p-symbol-signal)","~":"var(--p-symbol-aspect)"};function R(a){try{const o=new Date(a),i=Date.now()-o.getTime();return i<36e5?`${Math.floor(i/6e4)}m ago`:i<864e5?`${Math.floor(i/36e5)}h ago`:i<6048e5?`${Math.floor(i/864e5)}d ago`:o.toLocaleDateString()}catch{return a}}function W(){const a=l(e=>e.commits),o=l(e=>e.commitOffset),s=l(e=>e.commitTotal),i=l(e=>e.loadMoreCommits);return t.jsxs("div",{className:"git-commit-log",children:[a.length===0&&t.jsx("div",{className:"git-commit-log__empty",children:"No commits found"}),a.map(e=>t.jsxs("div",{className:"git-commit-log__item",children:[t.jsxs("div",{className:"git-commit-log__header",children:[t.jsx("span",{className:"git-commit-log__hash",children:e.shortHash}),t.jsx("span",{className:"git-commit-log__message",children:e.message.split(`
|
|
4
|
+
`)[0]})]}),t.jsxs("div",{className:"git-commit-log__meta",children:[t.jsx("span",{className:"git-commit-log__author",children:e.author}),t.jsx("span",{className:"git-commit-log__date",children:R(e.date)}),e.symbols.length>0&&t.jsx("span",{className:"git-commit-log__symbols",children:e.symbols.map(n=>t.jsx("span",{className:"git-commit-log__symbol-badge",style:{color:A[n[0]]||"var(--p-text-muted)"},children:n},n))})]})]},e.hash)),o<s&&t.jsx("button",{className:"git-commit-log__load-more",onClick:i,children:"Load more"})]})}const B=[{id:"files",label:"Changes"},{id:"log",label:"History"}];function I(){const a=l(e=>e.activeTab),o=l(e=>e.setActiveTab),s=l(e=>e.refresh),i=l(e=>e.fetchSymbols);return f.useEffect(()=>{s(),i()},[]),t.jsxs("div",{className:"git-section",children:[t.jsx(M,{}),t.jsx("div",{className:"git-tabs",children:B.map(e=>t.jsx("button",{className:`git-tabs__btn ${a===e.id?"git-tabs__btn--active":""}`,onClick:()=>o(e.id),children:e.label},e.id))}),a==="files"&&t.jsxs("div",{className:"git-files-layout",children:[t.jsxs("div",{className:"git-files-layout__sidebar",children:[t.jsx($,{}),t.jsx(P,{})]}),t.jsx("div",{className:"git-files-layout__main",children:t.jsx(D,{})})]}),a==="log"&&t.jsx("div",{className:"git-log-layout",children:t.jsx(W,{})})]})}export{I as default};
|