deskssh 0.0.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/.eslintrc.cjs +21 -0
- package/.github/workflows/ci.yml +40 -0
- package/.prettierignore +5 -0
- package/.prettierrc.json +6 -0
- package/CONTRIBUTING.md +59 -0
- package/LICENSE +661 -0
- package/README.md +66 -0
- package/package.json +51 -0
- package/packages/cli/README.md +11 -0
- package/packages/cli/bin/deskssh.js +12 -0
- package/packages/cli/package.json +37 -0
- package/packages/core/dist/index.d.ts +2 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +6 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/package.json +22 -0
- package/packages/core/src/index.test.ts +8 -0
- package/packages/core/src/index.ts +6 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/server/dist/index.d.ts +3 -0
- package/packages/server/dist/index.d.ts.map +1 -0
- package/packages/server/dist/index.js +7 -0
- package/packages/server/dist/index.js.map +1 -0
- package/packages/server/package.json +19 -0
- package/packages/server/src/index.ts +8 -0
- package/packages/server/tsconfig.json +10 -0
- package/packages/web/dist/assets/index-DNUNZ8WK.js +65 -0
- package/packages/web/dist/index.html +12 -0
- package/packages/web/index.html +12 -0
- package/packages/web/node_modules/.bin/browserslist +17 -0
- package/packages/web/node_modules/.bin/vite +17 -0
- package/packages/web/package.json +27 -0
- package/packages/web/src/App.tsx +17 -0
- package/packages/web/src/i18n/en.ts +8 -0
- package/packages/web/src/i18n/es.ts +7 -0
- package/packages/web/src/i18n/index.ts +27 -0
- package/packages/web/src/main.tsx +12 -0
- package/packages/web/tsconfig.json +14 -0
- package/packages/web/vite.config.ts +6 -0
- package/pnpm-workspace.yaml +2 -0
- package/specs/001-core/plan.md +246 -0
- package/specs/001-core/spec.md +206 -0
- package/specs/001-core/tasks.md +110 -0
- package/specs/constitution.md +110 -0
- package/specs/glossary.md +35 -0
- package/specs/vision.md +145 -0
- package/tsconfig.base.json +23 -0
- package/tsconfig.json +4 -0
- package/vitest.config.ts +7 -0
package/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<h1 align="center">DeskSSH</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>A graphical desktop over plain SSH.</strong><br>
|
|
5
|
+
The GUI is synthesized on the client; every action is translated into commands
|
|
6
|
+
executed on the remote host. <em>It is not remote desktop.</em>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What is it?
|
|
12
|
+
|
|
13
|
+
You connect via SSH to a server **with no graphical environment** and DeskSSH
|
|
14
|
+
shows you a familiar desktop βfile manager, terminal, system monitor, editor,
|
|
15
|
+
service managerβ¦β. Behind the scenes, every click runs the equivalent command
|
|
16
|
+
(`ls`, `stat`, `mv`, `systemctl`, `ps`β¦) and the interface is built from its
|
|
17
|
+
output.
|
|
18
|
+
|
|
19
|
+
### What makes it different
|
|
20
|
+
|
|
21
|
+
- **Not VNC/RDP/X.** No pixels travel: the GUI is generated locally.
|
|
22
|
+
- **Agentless.** Installs nothing on the server; only needs SSH and standard POSIX
|
|
23
|
+
utilities.
|
|
24
|
+
- **Transparent.** You can always see the command behind each action.
|
|
25
|
+
- **100% open source.**
|
|
26
|
+
|
|
27
|
+
## Origin and motivation
|
|
28
|
+
|
|
29
|
+
DeskSSH started as a project in **ASP.NET with .NET 8**. As it grew, I felt
|
|
30
|
+
overwhelmed by the sheer number of commands and cases the tool could end up
|
|
31
|
+
covering. I began reviewing and improving the code with the help of AI, but ended
|
|
32
|
+
up making a more radical decision: **restart the project from scratch**, also with
|
|
33
|
+
AI, in order to:
|
|
34
|
+
|
|
35
|
+
- use languages and technologies **more widely accepted by the community**, and
|
|
36
|
+
- leverage **npm's ease of distribution** for simple adoption.
|
|
37
|
+
|
|
38
|
+
This rewrite is developed with **Spec-Driven Development**: decisions are
|
|
39
|
+
documented in `specs/` before any code is written.
|
|
40
|
+
|
|
41
|
+
The reason for making it **open source** is simple: I want DeskSSH to become a
|
|
42
|
+
**genuinely useful and popular** tool, built and improved by the community.
|
|
43
|
+
|
|
44
|
+
## Status
|
|
45
|
+
|
|
46
|
+
π§ **In design.** The project is developed with **Spec-Driven Development**: right
|
|
47
|
+
now only the specification exists; code comes later. Start with:
|
|
48
|
+
|
|
49
|
+
- [`specs/vision.md`](specs/vision.md) β the why and the where-to (the vision).
|
|
50
|
+
- [`specs/constitution.md`](specs/constitution.md) β the project's principles.
|
|
51
|
+
- [`specs/001-core/spec.md`](specs/001-core/spec.md) β what DeskSSH does.
|
|
52
|
+
- [`specs/001-core/plan.md`](specs/001-core/plan.md) β how it will be built.
|
|
53
|
+
- [`specs/glossary.md`](specs/glossary.md) β the domain vocabulary.
|
|
54
|
+
|
|
55
|
+
## How to contribute
|
|
56
|
+
|
|
57
|
+
This project follows SDD: design discussions happen in `specs/` **before** they
|
|
58
|
+
reach the code. To propose something, open the conversation on the relevant
|
|
59
|
+
document. (Detailed contribution guide: pending β `M0`.)
|
|
60
|
+
|
|
61
|
+
## License
|
|
62
|
+
|
|
63
|
+
[**GNU AGPL-3.0-or-later**](LICENSE). Strong copyleft with a network clause: if you
|
|
64
|
+
modify DeskSSH and offer it as a network-accessible service, you must publish your
|
|
65
|
+
changes. Chosen so the project and all its improvements stay free. See
|
|
66
|
+
[`specs/constitution.md`](specs/constitution.md), Article 9.
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "deskssh",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "A graphical desktop over plain SSH β workspace root",
|
|
6
|
+
"license": "AGPL-3.0-or-later",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=20"
|
|
10
|
+
},
|
|
11
|
+
"packageManager": "pnpm@9.15.9",
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "pnpm -r build",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"typecheck": "tsc -b",
|
|
17
|
+
"lint": "eslint .",
|
|
18
|
+
"format": "prettier --write .",
|
|
19
|
+
"format:check": "prettier --check ."
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^20.14.0",
|
|
23
|
+
"@typescript-eslint/eslint-plugin": "^7.13.0",
|
|
24
|
+
"@typescript-eslint/parser": "^7.13.0",
|
|
25
|
+
"eslint": "^8.57.0",
|
|
26
|
+
"eslint-config-prettier": "^9.1.0",
|
|
27
|
+
"prettier": "^3.3.2",
|
|
28
|
+
"typescript": "^5.4.5",
|
|
29
|
+
"vitest": "^1.6.0"
|
|
30
|
+
},
|
|
31
|
+
"main": "index.js",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"eslint-scope": "^7.2.2",
|
|
34
|
+
"eslint-visitor-keys": "^3.4.3"
|
|
35
|
+
},
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/nestorrguez/DeskSSH.git"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"ssh",
|
|
42
|
+
"desk",
|
|
43
|
+
"gui",
|
|
44
|
+
"client"
|
|
45
|
+
],
|
|
46
|
+
"author": "Nestor Rodriguez",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/nestorrguez/DeskSSH/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/nestorrguez/DeskSSH#readme"
|
|
51
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# DeskSSH
|
|
2
|
+
|
|
3
|
+
**A graphical desktop over plain SSH.** The GUI is synthesized on the client and
|
|
4
|
+
every action is translated into commands executed on the remote host. _Not remote
|
|
5
|
+
desktop. Agentless._
|
|
6
|
+
|
|
7
|
+
> β οΈ **Early development β not yet functional.** This `0.0.1` reserves the package
|
|
8
|
+
> name and provides the future `deskssh` launch command. Follow progress on GitHub.
|
|
9
|
+
|
|
10
|
+
- Repository & docs: https://github.com/nestorrguez/DeskSSH
|
|
11
|
+
- License: **AGPL-3.0-or-later**
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// DeskSSH CLI β placeholder for the self-hosted (npm) distribution.
|
|
3
|
+
// DeskSSH is in early development and not yet functional; this entry exists to
|
|
4
|
+
// reserve the package name and provide the future `deskssh` launch command.
|
|
5
|
+
|
|
6
|
+
console.log(`DeskSSH 0.0.1 β early development, not yet functional.
|
|
7
|
+
|
|
8
|
+
A graphical desktop over plain SSH: the GUI is synthesized client-side and
|
|
9
|
+
every action maps to remote commands. Not remote desktop. Agentless.
|
|
10
|
+
|
|
11
|
+
Follow progress: https://github.com/nestorrguez/DeskSSH
|
|
12
|
+
`);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "deskssh",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A graphical desktop over plain SSH. Early development β not yet functional.",
|
|
5
|
+
"license": "AGPL-3.0-or-later",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"deskssh": "bin/deskssh.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"ssh",
|
|
16
|
+
"sftp",
|
|
17
|
+
"gui",
|
|
18
|
+
"desktop",
|
|
19
|
+
"sysadmin",
|
|
20
|
+
"devops",
|
|
21
|
+
"agentless"
|
|
22
|
+
],
|
|
23
|
+
"homepage": "https://github.com/nestorrguez/DeskSSH",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/nestorrguez/DeskSSH.git"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/nestorrguez/DeskSSH/issues"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=20"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "true"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @deskssh/core β frontend-agnostic core.
|
|
2
|
+
// SSH sessions, OS adapters and the capability contract live here (M1).
|
|
3
|
+
// This file is the public surface of the package; it stays intentionally small
|
|
4
|
+
// and re-exports the stable API as it lands.
|
|
5
|
+
export const CORE_PACKAGE = '@deskssh/core';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,wEAAwE;AACxE,+EAA+E;AAC/E,6CAA6C;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deskssh/core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "DeskSSH frontend-agnostic core: SSH sessions, OS adapters, capability contract",
|
|
5
|
+
"license": "AGPL-3.0-or-later",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -b",
|
|
20
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @deskssh/core β frontend-agnostic core.
|
|
2
|
+
// SSH sessions, OS adapters and the capability contract live here (M1).
|
|
3
|
+
// This file is the public surface of the package; it stays intentionally small
|
|
4
|
+
// and re-exports the stable API as it lands.
|
|
5
|
+
|
|
6
|
+
export const CORE_PACKAGE = '@deskssh/core';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAChD,eAAO,MAAM,eAAe,kBAAe,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// @deskssh/server β web gateway.
|
|
2
|
+
// Holds live SSH sessions, authenticates the gateway user and exposes the API
|
|
3
|
+
// (HTTP for one-off actions, WebSocket for PTY and streams). Built on @deskssh/core.
|
|
4
|
+
import { CORE_PACKAGE } from '@deskssh/core';
|
|
5
|
+
export const SERVER_PACKAGE = '@deskssh/server';
|
|
6
|
+
export const CORE_DEPENDENCY = CORE_PACKAGE;
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,8EAA8E;AAC9E,qFAAqF;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deskssh/server",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "DeskSSH web gateway: keeps SSH sessions alive and exposes the API",
|
|
5
|
+
"license": "AGPL-3.0-or-later",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc -b",
|
|
14
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@deskssh/core": "workspace:*"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @deskssh/server β web gateway.
|
|
2
|
+
// Holds live SSH sessions, authenticates the gateway user and exposes the API
|
|
3
|
+
// (HTTP for one-off actions, WebSocket for PTY and streams). Built on @deskssh/core.
|
|
4
|
+
|
|
5
|
+
import { CORE_PACKAGE } from '@deskssh/core';
|
|
6
|
+
|
|
7
|
+
export const SERVER_PACKAGE = '@deskssh/server';
|
|
8
|
+
export const CORE_DEPENDENCY = CORE_PACKAGE;
|