Compare commits
19 commits
Author | SHA1 | Date | |
---|---|---|---|
12c6d3f841 |
|||
37b8a37d5f |
|||
ecd055d3eb |
|||
7038897594 |
|||
c44822ffa3 | |||
3f6eab94c1 |
|||
de3f5e697c |
|||
703db757bc |
|||
50ecd8ce86 |
|||
618e00b677 |
|||
|
deb4eabbce | ||
1f0d3aa030 |
|||
|
f8f7ede4b9 | ||
a38aedc248 |
|||
|
e77e7fbac8 | ||
6a1b731730 |
|||
|
18a7d4e156 | ||
69fa25bc1d |
|||
81ee09b42f |
7 changed files with 1418 additions and 100 deletions
|
@ -20,6 +20,9 @@ jobs:
|
|||
pull-requests: write
|
||||
id-token: write
|
||||
steps:
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
- name: Create Release
|
||||
uses: https://git.kjan.de/actions/semantic-release@v1.1.0
|
||||
with:
|
||||
|
|
24
CHANGELOG.md
24
CHANGELOG.md
|
@ -1,3 +1,27 @@
|
|||
## [0.3.3](https://git.kjan.de/jank/project-cli/compare/v0.3.2...v0.3.3) (2025-06-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Fix wrong config ([1f0d3aa](https://git.kjan.de/jank/project-cli/commit/1f0d3aa030d462b7f1df1646b7b4431a8ef43d2c))
|
||||
|
||||
## [0.3.2](https://git.kjan.de/jank/project-cli/compare/v0.3.1...v0.3.2) (2025-06-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Remove stupid toml ([a38aedc](https://git.kjan.de/jank/project-cli/commit/a38aedc2481930a9bc5ac4454e5b0b4b6fff5104))
|
||||
|
||||
## [0.3.1](https://git.kjan.de/jank/project-cli/compare/v0.3.0...v0.3.1) (2025-06-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Setup bun ([6a1b731](https://git.kjan.de/jank/project-cli/commit/6a1b7317308fdeb2719c258f6c2b62463d81ca3a))
|
||||
|
||||
## [0.3.0](https://git.kjan.de/jank/project-cli/compare/v0.2.2...v0.3.0) (2025-06-19)
|
||||
|
||||
### Features
|
||||
|
||||
* Add some compiling ([81ee09b](https://git.kjan.de/jank/project-cli/commit/81ee09b42fafa5300e384a236602ee22f838da00))
|
||||
|
||||
## [0.2.2](https://git.kjan.de/jank/project-cli/compare/v0.2.1...v0.2.2) (2025-06-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import fs from "fs";
|
||||
import os from "os";
|
||||
import * as toml from "@std/toml";
|
||||
|
||||
export const configPath = os.homedir() + "/.config/project-cli/";
|
||||
|
||||
|
@ -21,9 +20,9 @@ export function getProjects(): Project[] {
|
|||
}
|
||||
|
||||
export function getConfiguration(): Configuration {
|
||||
return toml.parse(
|
||||
fs.readFileSync(configPath + "config.toml").toString(),
|
||||
) as unknown as Configuration;
|
||||
return JSON.parse(
|
||||
fs.readFileSync(configPath + "config.json").toString(),
|
||||
) as Configuration;
|
||||
}
|
||||
|
||||
export function addProject(project: Project) {
|
||||
|
@ -45,10 +44,8 @@ export function generateDefaultConfig() {
|
|||
cloningCommand: "git clone %s %n",
|
||||
};
|
||||
|
||||
const configString = toml.stringify(
|
||||
defaultConfig as unknown as Record<string, unknown>,
|
||||
);
|
||||
fs.writeFileSync(configPath + "config.toml", configString);
|
||||
const configString = JSON.stringify(defaultConfig);
|
||||
fs.writeFileSync(configPath + "config.json", configString);
|
||||
|
||||
const projects: Project[] = [];
|
||||
saveProjects(projects);
|
||||
|
|
152
index.ts
152
index.ts
|
@ -1,3 +1,5 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
import fs from "fs";
|
||||
import { confirm, select, input } from "@inquirer/prompts";
|
||||
import { exit } from "process";
|
||||
|
@ -10,66 +12,108 @@ import {
|
|||
type Project,
|
||||
} from "./configuration/configuration";
|
||||
import { execSync } from "child_process";
|
||||
import { program } from "commander";
|
||||
|
||||
if (!fs.existsSync(configPath + "config.toml")) {
|
||||
const createConfig = await confirm({
|
||||
message: "No cofig has been found. Would you like to generate a new one?",
|
||||
});
|
||||
import packageJson from "./package.json";
|
||||
export const VERSION = packageJson.version;
|
||||
|
||||
if (createConfig) {
|
||||
generateDefaultConfig();
|
||||
} else {
|
||||
console.log(
|
||||
"This project can not run without the config. Either create it yourself or generate the default.",
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
const CLI_NAME = "pcli";
|
||||
|
||||
if (
|
||||
!getProjects() ||
|
||||
getProjects().length == 0 ||
|
||||
getProjects().length == undefined
|
||||
) {
|
||||
const anwser = await select({
|
||||
message: "Create a new Project",
|
||||
choices: ["Clone a project with git", "Create a new empty Project"],
|
||||
});
|
||||
if (anwser == "Clone a project with git") {
|
||||
const repoUrl = await input({ message: "What is the url of the repo?" });
|
||||
const wantsCustomName = await confirm({
|
||||
message: "Would you like to give this project a custom name?",
|
||||
default: false,
|
||||
});
|
||||
let customName = "";
|
||||
if (wantsCustomName) {
|
||||
customName = await input({
|
||||
message: "What would you like the custom name to be?",
|
||||
program
|
||||
.name("project-cli")
|
||||
.description("A cli for managing projects")
|
||||
.version(VERSION)
|
||||
.action(async () => {
|
||||
if (!fs.existsSync(configPath + "config.json")) {
|
||||
const createConfig = await confirm({
|
||||
message:
|
||||
"No cofig has been found. Would you like to generate a new one?",
|
||||
});
|
||||
|
||||
if (createConfig) {
|
||||
generateDefaultConfig();
|
||||
} else {
|
||||
console.log(
|
||||
"This project can not run without the config. Either create it yourself or generate the default.",
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
execSync(
|
||||
"cd " +
|
||||
if (
|
||||
!getProjects() ||
|
||||
getProjects().length == 0 ||
|
||||
getProjects().length == undefined
|
||||
) {
|
||||
const anwser = await select({
|
||||
message: "Create a new Project",
|
||||
choices: ["Clone a project with git", "Create a new empty Project"],
|
||||
});
|
||||
if (anwser == "Clone a project with git") {
|
||||
const repoUrl = await input({
|
||||
message: "What is the url of the repo?",
|
||||
});
|
||||
const wantsCustomName = await confirm({
|
||||
message: "Would you like to give this project a custom name?",
|
||||
default: false,
|
||||
});
|
||||
let customName = "";
|
||||
if (wantsCustomName) {
|
||||
customName = await input({
|
||||
message: "What would you like the custom name to be?",
|
||||
});
|
||||
}
|
||||
|
||||
execSync(
|
||||
"cd " +
|
||||
getConfiguration().projectsDirectory +
|
||||
" && " +
|
||||
getConfiguration()
|
||||
.cloningCommand.replace("%s", repoUrl)
|
||||
.replace("%n", customName),
|
||||
);
|
||||
|
||||
const newProject: Project = {
|
||||
name: customName,
|
||||
};
|
||||
addProject(newProject);
|
||||
} else if (anwser == "Create a new empty Project") {
|
||||
const name = await input({
|
||||
message: "What would you like to call the project?",
|
||||
});
|
||||
fs.mkdirSync(getConfiguration().projectsDirectory + "/" + name);
|
||||
const newProject: Project = {
|
||||
name: name,
|
||||
};
|
||||
addProject(newProject);
|
||||
}
|
||||
}
|
||||
|
||||
const pickedProject = await select({
|
||||
message: "Which Project would you like to go to?",
|
||||
choices: getProjects().map((project: Project) => project.name),
|
||||
});
|
||||
|
||||
console.log(
|
||||
"__EXEC__ cd " +
|
||||
getConfiguration().projectsDirectory +
|
||||
" && " +
|
||||
getConfiguration()
|
||||
.cloningCommand.replace("%s", repoUrl)
|
||||
.replace("%n", customName),
|
||||
"/" +
|
||||
pickedProject,
|
||||
);
|
||||
|
||||
const newProject: Project = {
|
||||
name: customName,
|
||||
};
|
||||
addProject(newProject);
|
||||
} else if (anwser == "Create a new empty Project") {
|
||||
const name = await input({
|
||||
message: "What would you like to call the project?",
|
||||
});
|
||||
fs.mkdirSync(getConfiguration().projectsDirectory + "/" + name);
|
||||
const newProject: Project = {
|
||||
name: name,
|
||||
};
|
||||
addProject(newProject);
|
||||
}
|
||||
}
|
||||
console.log(getProjects());
|
||||
console.log(getProjects());
|
||||
});
|
||||
|
||||
program.command("init").action(() => {
|
||||
console.log(`${CLI_NAME}() {
|
||||
command ${CLI_NAME} "$@" | while IFS= read -r line; do
|
||||
if [[ $line == __EXEC__* ]]; then
|
||||
eval "\${line#__EXEC__}"
|
||||
else
|
||||
echo "$line"
|
||||
fi
|
||||
done
|
||||
}`);
|
||||
});
|
||||
|
||||
program.parse();
|
||||
|
|
48
package-lock.json
generated
48
package-lock.json
generated
|
@ -1,18 +1,17 @@
|
|||
{
|
||||
"name": "proj-cli",
|
||||
"version": "0.2.2",
|
||||
"version": "0.3.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "proj-cli",
|
||||
"version": "0.2.2",
|
||||
"version": "0.3.3",
|
||||
"dependencies": {
|
||||
"@saithodev/semantic-release-gitea": "^2.1.0",
|
||||
"@semantic-release/changelog": "^6.0.3",
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"@semantic-release/release-notes-generator": "^14.0.3",
|
||||
"@std/toml": "npm:@jsr/std__toml",
|
||||
"@types/commander": "^2.12.5",
|
||||
"@types/inquirer": "^9.0.8",
|
||||
"commander": "^14.0.0",
|
||||
|
@ -21,6 +20,9 @@
|
|||
"inquirer": "^12.6.3",
|
||||
"semantic-release": "^24.2.5"
|
||||
},
|
||||
"bin": {
|
||||
"pcli": "dist/index.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest"
|
||||
},
|
||||
|
@ -490,11 +492,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@jsr/std__collections": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://npm.jsr.io/~/11/@jsr/std__collections/1.1.1.tgz",
|
||||
"integrity": "sha512-bS4Y5f80IUeDUf+0BgVVWValgBeGcJ/UwFYTC5PBIJtrFqwEmU8IohDBwFLJILyUtiAB1jbJewl0K+REEQ9kQQ=="
|
||||
},
|
||||
"node_modules/@nodelib/fs.scandir": {
|
||||
"version": "2.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
|
||||
|
@ -639,9 +636,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@octokit/request": {
|
||||
"version": "10.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.2.tgz",
|
||||
"integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==",
|
||||
"version": "10.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz",
|
||||
"integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/endpoint": "^11.0.0",
|
||||
|
@ -1388,15 +1385,6 @@
|
|||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@std/toml": {
|
||||
"name": "@jsr/std__toml",
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://npm.jsr.io/~/11/@jsr/std__toml/1.0.8.tgz",
|
||||
"integrity": "sha512-rnMoiySl30TrsdnfKcroYEWIBlmPvdNoA8fn/Njy3rsZR9C8k5nUeo9kWP/D/PhxYlUaYPtmQ31YhNqGpmEZ3Q==",
|
||||
"dependencies": {
|
||||
"@jsr/std__collections": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@szmarczak/http-timer": {
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
|
||||
|
@ -1410,13 +1398,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@types/bun": {
|
||||
"version": "1.2.16",
|
||||
"resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.2.16.tgz",
|
||||
"integrity": "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ==",
|
||||
"version": "1.2.17",
|
||||
"resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.2.17.tgz",
|
||||
"integrity": "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"bun-types": "1.2.16"
|
||||
"bun-types": "1.2.17"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/cacheable-request": {
|
||||
|
@ -1493,9 +1481,9 @@
|
|||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "24.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz",
|
||||
"integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==",
|
||||
"version": "24.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz",
|
||||
"integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~7.8.0"
|
||||
|
@ -1681,9 +1669,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/bun-types": {
|
||||
"version": "1.2.16",
|
||||
"resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.2.16.tgz",
|
||||
"integrity": "sha512-ciXLrHV4PXax9vHvUrkvun9VPVGOVwbbbBF/Ev1cXz12lyEZMoJpIJABOfPcN9gDJRaiKF9MVbSygLg4NXu3/A==",
|
||||
"version": "1.2.17",
|
||||
"resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.2.17.tgz",
|
||||
"integrity": "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
|
14
package.json
14
package.json
|
@ -1,8 +1,19 @@
|
|||
{
|
||||
"name": "proj-cli",
|
||||
"version": "0.2.2",
|
||||
"version": "0.3.3",
|
||||
"module": "index.ts",
|
||||
"type": "module",
|
||||
"bin": {
|
||||
"pcli": "./dist/index.js"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "bun build index.ts --outfile dist/index.js --target node",
|
||||
"dev": "bun run index.ts",
|
||||
"prepublishOnly": "bun run build"
|
||||
},
|
||||
"files": [
|
||||
"dist/"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest"
|
||||
},
|
||||
|
@ -14,7 +25,6 @@
|
|||
"@semantic-release/changelog": "^6.0.3",
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"@semantic-release/release-notes-generator": "^14.0.3",
|
||||
"@std/toml": "npm:@jsr/std__toml",
|
||||
"@types/commander": "^2.12.5",
|
||||
"@types/inquirer": "^9.0.8",
|
||||
"commander": "^14.0.0",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue