@saidulbadhon/jssm-cli 1.7.0 → 1.8.3
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/index.js +34 -116
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3989,7 +3989,11 @@ import { join as join2 } from "path";
|
|
|
3989
3989
|
import { homedir as homedir2 } from "os";
|
|
3990
3990
|
|
|
3991
3991
|
// src/shared/constants.ts
|
|
3992
|
-
var
|
|
3992
|
+
var PROD_HOST = "https://jssm-api.jutsu.ai/api";
|
|
3993
|
+
var DEV_HOST = "http://localhost:3000/api";
|
|
3994
|
+
function getHost() {
|
|
3995
|
+
return process.env.NODE_ENV === "development" ? DEV_HOST : PROD_HOST;
|
|
3996
|
+
}
|
|
3993
3997
|
var DEFAULT_NAMESPACE = "jssm";
|
|
3994
3998
|
var CONFIG_DIR = ".jssm";
|
|
3995
3999
|
var CONFIG_FILE = "config";
|
|
@@ -4109,7 +4113,7 @@ async function resolveConfig() {
|
|
|
4109
4113
|
}
|
|
4110
4114
|
const resolved = {
|
|
4111
4115
|
project: projectConfig.project,
|
|
4112
|
-
host:
|
|
4116
|
+
host: getHost(),
|
|
4113
4117
|
namespace: projectConfig.namespace || globalConfig.namespace || DEFAULT_NAMESPACE,
|
|
4114
4118
|
authToken
|
|
4115
4119
|
};
|
|
@@ -4120,11 +4124,6 @@ function validateResolvedConfig(config) {
|
|
|
4120
4124
|
if (!config.project) {
|
|
4121
4125
|
errors.push("Project name is required");
|
|
4122
4126
|
}
|
|
4123
|
-
if (!config.host) {
|
|
4124
|
-
errors.push(
|
|
4125
|
-
"Host URL is required (set globally with: jssm config set host <url>)"
|
|
4126
|
-
);
|
|
4127
|
-
}
|
|
4128
4127
|
if (!config.authToken) {
|
|
4129
4128
|
errors.push("Not logged in. Run: jssm login");
|
|
4130
4129
|
}
|
|
@@ -4174,21 +4173,21 @@ async function getProjects(host, apiKey) {
|
|
|
4174
4173
|
return apiRequest(url, apiKey);
|
|
4175
4174
|
}
|
|
4176
4175
|
async function pushEnvFile(host, apiKey, project, content, filename = ".env") {
|
|
4177
|
-
const url = `${host}/projects/${project}/files/push`;
|
|
4176
|
+
const url = `${host}/projects/${encodeURIComponent(project)}/files/push`;
|
|
4178
4177
|
return apiRequest(url, apiKey, {
|
|
4179
4178
|
method: "POST",
|
|
4180
4179
|
body: JSON.stringify({ content, filename })
|
|
4181
4180
|
});
|
|
4182
4181
|
}
|
|
4183
4182
|
async function pullEnvFile(host, apiKey, project, filename = ".env") {
|
|
4184
|
-
const url = `${host}/projects/${project}/files/pull?filename=${encodeURIComponent(
|
|
4183
|
+
const url = `${host}/projects/${encodeURIComponent(project)}/files/pull?filename=${encodeURIComponent(
|
|
4185
4184
|
filename
|
|
4186
4185
|
)}`;
|
|
4187
4186
|
const data = await apiRequest(url, apiKey);
|
|
4188
4187
|
return data.content;
|
|
4189
4188
|
}
|
|
4190
4189
|
async function listEnvFiles(host, apiKey, project) {
|
|
4191
|
-
const url = `${host}/projects/${project}/files/list`;
|
|
4190
|
+
const url = `${host}/projects/${encodeURIComponent(project)}/files/list`;
|
|
4192
4191
|
const data = await apiRequest(url, apiKey);
|
|
4193
4192
|
return data.files;
|
|
4194
4193
|
}
|
|
@@ -4365,13 +4364,7 @@ async function initCommand(args2) {
|
|
|
4365
4364
|
}
|
|
4366
4365
|
console.log(`\u2705 Logged in as ${authData.user.email}
|
|
4367
4366
|
`);
|
|
4368
|
-
const
|
|
4369
|
-
const host = flags.host || flags.h || globalConfig.host;
|
|
4370
|
-
if (!host) {
|
|
4371
|
-
console.error("\u274C Host URL is required");
|
|
4372
|
-
console.error("\u{1F4A1} Set it globally: jssm config set host <url>");
|
|
4373
|
-
process.exit(1);
|
|
4374
|
-
}
|
|
4367
|
+
const host = getHost();
|
|
4375
4368
|
const authToken = authData.token;
|
|
4376
4369
|
console.log("\u{1F50D} Analyzing repository...");
|
|
4377
4370
|
const cwd = process.cwd();
|
|
@@ -4527,12 +4520,10 @@ Upload to ${projectName}?`,
|
|
|
4527
4520
|
}
|
|
4528
4521
|
}
|
|
4529
4522
|
}
|
|
4523
|
+
const globalConfig = await loadGlobalConfig();
|
|
4530
4524
|
const projectConfig = {
|
|
4531
4525
|
project: projectName
|
|
4532
4526
|
};
|
|
4533
|
-
if (flags.host && flags.host !== globalConfig.host) {
|
|
4534
|
-
projectConfig.host = flags.host;
|
|
4535
|
-
}
|
|
4536
4527
|
if (flags.namespace && flags.namespace !== globalConfig.namespace) {
|
|
4537
4528
|
projectConfig.namespace = flags.namespace;
|
|
4538
4529
|
}
|
|
@@ -5233,12 +5224,10 @@ async function createProjectCommand(args2) {
|
|
|
5233
5224
|
}
|
|
5234
5225
|
}
|
|
5235
5226
|
const name = flags.n || flags.name || args2[0];
|
|
5236
|
-
const host = flags.host;
|
|
5237
5227
|
if (!name) {
|
|
5238
|
-
console.error("Usage: jssm project create <name>
|
|
5228
|
+
console.error("Usage: jssm project create <name>");
|
|
5239
5229
|
console.error("\nOptions:");
|
|
5240
5230
|
console.error(" -n, --name Project name");
|
|
5241
|
-
console.error(" --host API host URL (optional if config exists)");
|
|
5242
5231
|
process.exit(1);
|
|
5243
5232
|
}
|
|
5244
5233
|
const authToken = await getAuthToken();
|
|
@@ -5247,17 +5236,10 @@ async function createProjectCommand(args2) {
|
|
|
5247
5236
|
console.error("\u{1F4A1} Run: jssm login");
|
|
5248
5237
|
process.exit(1);
|
|
5249
5238
|
}
|
|
5250
|
-
const
|
|
5251
|
-
const projectConfig = await loadProjectConfig();
|
|
5252
|
-
const finalHost = host || projectConfig?.host || globalConfig.host;
|
|
5253
|
-
if (!finalHost) {
|
|
5254
|
-
console.error("\u274C Host is required");
|
|
5255
|
-
console.error("\u{1F4A1} Set globally: jssm config set host <url>");
|
|
5256
|
-
process.exit(1);
|
|
5257
|
-
}
|
|
5239
|
+
const host = getHost();
|
|
5258
5240
|
try {
|
|
5259
5241
|
console.log(`\u{1F4E6} Creating project "${name}"...`);
|
|
5260
|
-
const project = await createProject(
|
|
5242
|
+
const project = await createProject(host, authToken, name);
|
|
5261
5243
|
console.log(`\u2705 Project "${name}" created successfully`);
|
|
5262
5244
|
console.log(` ID: ${project._id}`);
|
|
5263
5245
|
console.log(` Created: ${new Date(project.createdAt).toLocaleString()}`);
|
|
@@ -5281,14 +5263,7 @@ async function listProjectsCommand() {
|
|
|
5281
5263
|
console.error("\u{1F4A1} Run: jssm login");
|
|
5282
5264
|
process.exit(1);
|
|
5283
5265
|
}
|
|
5284
|
-
const
|
|
5285
|
-
const projectConfig = await loadProjectConfig();
|
|
5286
|
-
const host = projectConfig?.host || globalConfig.host;
|
|
5287
|
-
if (!host) {
|
|
5288
|
-
console.error("\u274C Host is required");
|
|
5289
|
-
console.error("\u{1F4A1} Set globally: jssm config set host <url>");
|
|
5290
|
-
process.exit(1);
|
|
5291
|
-
}
|
|
5266
|
+
const host = getHost();
|
|
5292
5267
|
try {
|
|
5293
5268
|
console.log("\u{1F4E6} Fetching projects...\n");
|
|
5294
5269
|
const projects = await getProjects(host, authToken);
|
|
@@ -5362,9 +5337,6 @@ async function statusCommand() {
|
|
|
5362
5337
|
if (Object.keys(globalConfig).length === 0) {
|
|
5363
5338
|
console.log(" (no global config set)");
|
|
5364
5339
|
} else {
|
|
5365
|
-
if (globalConfig.host) {
|
|
5366
|
-
console.log(` Host: ${globalConfig.host}`);
|
|
5367
|
-
}
|
|
5368
5340
|
if (globalConfig.namespace) {
|
|
5369
5341
|
console.log(` Namespace: ${globalConfig.namespace}`);
|
|
5370
5342
|
}
|
|
@@ -5384,9 +5356,8 @@ async function statusCommand() {
|
|
|
5384
5356
|
console.log("\u{1F4C2} Project Configuration");
|
|
5385
5357
|
console.log(` Location: ${projectConfigPath}`);
|
|
5386
5358
|
console.log(` Project: ${projectConfig.project}`);
|
|
5387
|
-
|
|
5388
|
-
|
|
5389
|
-
console.log(` Host: ${projectConfig.host} (override)`);
|
|
5359
|
+
if (projectConfig.environment) {
|
|
5360
|
+
console.log(` Environment: ${projectConfig.environment}`);
|
|
5390
5361
|
}
|
|
5391
5362
|
if (projectConfig.namespace) {
|
|
5392
5363
|
console.log(` Namespace: ${projectConfig.namespace} (override)`);
|
|
@@ -5396,16 +5367,11 @@ async function statusCommand() {
|
|
|
5396
5367
|
if (resolved) {
|
|
5397
5368
|
console.log("\u{1F517} Resolved Configuration (merged)");
|
|
5398
5369
|
console.log(` Project: ${resolved.project}`);
|
|
5399
|
-
console.log(`
|
|
5400
|
-
console.log(` Host: ${resolved.host || "(not set)"}`);
|
|
5370
|
+
console.log(` Host: ${resolved.host} (hardcoded based on NODE_ENV)`);
|
|
5401
5371
|
console.log(` Namespace: ${resolved.namespace}`);
|
|
5402
5372
|
console.log(
|
|
5403
5373
|
` Auth: ${resolved.authToken ? "\u2705 Authenticated" : "\u274C Not authenticated"}`
|
|
5404
5374
|
);
|
|
5405
|
-
if (!resolved.host) {
|
|
5406
|
-
console.log("\n\u26A0\uFE0F Host is not configured");
|
|
5407
|
-
console.log(" Set globally: jssm config set host <url>");
|
|
5408
|
-
}
|
|
5409
5375
|
if (!resolved.authToken) {
|
|
5410
5376
|
console.log("\n\u26A0\uFE0F Not logged in");
|
|
5411
5377
|
console.log(" Run: jssm login");
|
|
@@ -5416,7 +5382,7 @@ async function statusCommand() {
|
|
|
5416
5382
|
}
|
|
5417
5383
|
|
|
5418
5384
|
// src/commands/config.ts
|
|
5419
|
-
var VALID_KEYS = ["
|
|
5385
|
+
var VALID_KEYS = ["namespace"];
|
|
5420
5386
|
async function configCommand(args2) {
|
|
5421
5387
|
const subcommand = args2[0];
|
|
5422
5388
|
switch (subcommand) {
|
|
@@ -5540,12 +5506,11 @@ Commands:
|
|
|
5540
5506
|
path Show configuration file path
|
|
5541
5507
|
|
|
5542
5508
|
Valid Keys:
|
|
5543
|
-
host Default API server URL
|
|
5544
5509
|
namespace Default SSM namespace (default: jssm)
|
|
5545
5510
|
|
|
5546
5511
|
Examples:
|
|
5547
|
-
jssm config set
|
|
5548
|
-
jssm config get
|
|
5512
|
+
jssm config set namespace my-namespace
|
|
5513
|
+
jssm config get namespace
|
|
5549
5514
|
jssm config list
|
|
5550
5515
|
|
|
5551
5516
|
Note:
|
|
@@ -5564,13 +5529,7 @@ async function loginCommand() {
|
|
|
5564
5529
|
console.log(`\u{1F4A1} Use 'jssm logout' to logout`);
|
|
5565
5530
|
return;
|
|
5566
5531
|
}
|
|
5567
|
-
|
|
5568
|
-
let host = globalConfig.host;
|
|
5569
|
-
if (!host) {
|
|
5570
|
-
globalConfig.host = DEFAULT_HOST;
|
|
5571
|
-
await saveGlobalConfig(globalConfig);
|
|
5572
|
-
host = DEFAULT_HOST;
|
|
5573
|
-
}
|
|
5532
|
+
const host = getHost();
|
|
5574
5533
|
console.log("\u{1F510} Login to JSSM\n");
|
|
5575
5534
|
try {
|
|
5576
5535
|
const email = await dist_default4({
|
|
@@ -5604,22 +5563,6 @@ async function loginCommand() {
|
|
|
5604
5563
|
} else {
|
|
5605
5564
|
console.error(`
|
|
5606
5565
|
\u274C Login failed: ${result.error}`);
|
|
5607
|
-
if (result.isConnectionError && host !== DEFAULT_HOST) {
|
|
5608
|
-
console.log(`
|
|
5609
|
-
\u26A0\uFE0F Current host: ${host}`);
|
|
5610
|
-
console.log(` Default host: ${DEFAULT_HOST}`);
|
|
5611
|
-
const resetToDefault = await dist_default3({
|
|
5612
|
-
message: "Would you like to reset the host to default?",
|
|
5613
|
-
default: false
|
|
5614
|
-
});
|
|
5615
|
-
if (resetToDefault) {
|
|
5616
|
-
globalConfig.host = DEFAULT_HOST;
|
|
5617
|
-
await saveGlobalConfig(globalConfig);
|
|
5618
|
-
console.log(`
|
|
5619
|
-
\u2705 Host reset to default: ${DEFAULT_HOST}`);
|
|
5620
|
-
console.log(`\u{1F4A1} Please try logging in again with 'jssm login'`);
|
|
5621
|
-
}
|
|
5622
|
-
}
|
|
5623
5566
|
process.exit(1);
|
|
5624
5567
|
}
|
|
5625
5568
|
} catch (error) {
|
|
@@ -5644,13 +5587,7 @@ async function registerCommand() {
|
|
|
5644
5587
|
);
|
|
5645
5588
|
return;
|
|
5646
5589
|
}
|
|
5647
|
-
|
|
5648
|
-
let host = globalConfig.host;
|
|
5649
|
-
if (!host) {
|
|
5650
|
-
globalConfig.host = DEFAULT_HOST;
|
|
5651
|
-
await saveGlobalConfig(globalConfig);
|
|
5652
|
-
host = DEFAULT_HOST;
|
|
5653
|
-
}
|
|
5590
|
+
const host = getHost();
|
|
5654
5591
|
console.log("\u{1F4DD} Register for JSSM\n");
|
|
5655
5592
|
try {
|
|
5656
5593
|
const name = await dist_default4({
|
|
@@ -5704,22 +5641,6 @@ async function registerCommand() {
|
|
|
5704
5641
|
} else {
|
|
5705
5642
|
console.error(`
|
|
5706
5643
|
\u274C Registration failed: ${result.error}`);
|
|
5707
|
-
if (result.isConnectionError && host !== DEFAULT_HOST) {
|
|
5708
|
-
console.log(`
|
|
5709
|
-
\u26A0\uFE0F Current host: ${host}`);
|
|
5710
|
-
console.log(` Default host: ${DEFAULT_HOST}`);
|
|
5711
|
-
const resetToDefault = await dist_default3({
|
|
5712
|
-
message: "Would you like to reset the host to default?",
|
|
5713
|
-
default: false
|
|
5714
|
-
});
|
|
5715
|
-
if (resetToDefault) {
|
|
5716
|
-
globalConfig.host = DEFAULT_HOST;
|
|
5717
|
-
await saveGlobalConfig(globalConfig);
|
|
5718
|
-
console.log(`
|
|
5719
|
-
\u2705 Host reset to default: ${DEFAULT_HOST}`);
|
|
5720
|
-
console.log(`\u{1F4A1} Please try registering again with 'jssm register'`);
|
|
5721
|
-
}
|
|
5722
|
-
}
|
|
5723
5644
|
process.exit(1);
|
|
5724
5645
|
}
|
|
5725
5646
|
} catch (error) {
|
|
@@ -5750,8 +5671,7 @@ init_auth();
|
|
|
5750
5671
|
var import_chalk = __toESM(require_source(), 1);
|
|
5751
5672
|
async function createToken(args2) {
|
|
5752
5673
|
const auth = await loadAuthData();
|
|
5753
|
-
const
|
|
5754
|
-
const host = globalConfig.host || DEFAULT_HOST;
|
|
5674
|
+
const host = getHost();
|
|
5755
5675
|
if (!auth) {
|
|
5756
5676
|
console.error(import_chalk.default.red("Not logged in. Run: jssm login"));
|
|
5757
5677
|
process.exit(1);
|
|
@@ -5804,7 +5724,7 @@ async function createToken(args2) {
|
|
|
5804
5724
|
);
|
|
5805
5725
|
try {
|
|
5806
5726
|
const response = await fetch(
|
|
5807
|
-
`${host}/api/projects/${project}/envs/${environment}/tokens`,
|
|
5727
|
+
`${host}/api/projects/${encodeURIComponent(project)}/envs/${encodeURIComponent(environment)}/tokens`,
|
|
5808
5728
|
{
|
|
5809
5729
|
method: "POST",
|
|
5810
5730
|
headers: {
|
|
@@ -5847,8 +5767,7 @@ async function createToken(args2) {
|
|
|
5847
5767
|
}
|
|
5848
5768
|
async function listTokens(args2) {
|
|
5849
5769
|
const auth = await loadAuthData();
|
|
5850
|
-
const
|
|
5851
|
-
const host = globalConfig.host || DEFAULT_HOST;
|
|
5770
|
+
const host = getHost();
|
|
5852
5771
|
if (!auth) {
|
|
5853
5772
|
console.error(import_chalk.default.red("Not logged in. Run: jssm login"));
|
|
5854
5773
|
process.exit(1);
|
|
@@ -5881,7 +5800,7 @@ async function listTokens(args2) {
|
|
|
5881
5800
|
}
|
|
5882
5801
|
try {
|
|
5883
5802
|
const response = await fetch(
|
|
5884
|
-
`${host}/api/projects/${project}/envs/${environment}/tokens`,
|
|
5803
|
+
`${host}/api/projects/${encodeURIComponent(project)}/envs/${encodeURIComponent(environment)}/tokens`,
|
|
5885
5804
|
{
|
|
5886
5805
|
headers: { Authorization: `Bearer ${auth.token}` }
|
|
5887
5806
|
}
|
|
@@ -5929,8 +5848,7 @@ Service tokens for ${project}/${environment}:
|
|
|
5929
5848
|
}
|
|
5930
5849
|
async function revokeToken(args2) {
|
|
5931
5850
|
const auth = await loadAuthData();
|
|
5932
|
-
const
|
|
5933
|
-
const host = globalConfig.host || DEFAULT_HOST;
|
|
5851
|
+
const host = getHost();
|
|
5934
5852
|
if (!auth) {
|
|
5935
5853
|
console.error(import_chalk.default.red("Not logged in. Run: jssm login"));
|
|
5936
5854
|
process.exit(1);
|
|
@@ -5970,7 +5888,7 @@ async function revokeToken(args2) {
|
|
|
5970
5888
|
}
|
|
5971
5889
|
try {
|
|
5972
5890
|
const response = await fetch(
|
|
5973
|
-
`${host}/api/projects/${project}/envs/${environment}/tokens/${tokenId}`,
|
|
5891
|
+
`${host}/api/projects/${encodeURIComponent(project)}/envs/${encodeURIComponent(environment)}/tokens/${encodeURIComponent(tokenId)}`,
|
|
5974
5892
|
{
|
|
5975
5893
|
method: "DELETE",
|
|
5976
5894
|
headers: { Authorization: `Bearer ${auth.token}` }
|
|
@@ -6030,7 +5948,7 @@ ${import_chalk.default.bold("Usage in Docker:")}
|
|
|
6030
5948
|
|
|
6031
5949
|
// src/utils/versionCheck.ts
|
|
6032
5950
|
var PACKAGE_NAME = "@saidulbadhon/jssm-cli";
|
|
6033
|
-
var CURRENT_VERSION = "1.
|
|
5951
|
+
var CURRENT_VERSION = "1.8.3";
|
|
6034
5952
|
async function getLatestVersion() {
|
|
6035
5953
|
try {
|
|
6036
5954
|
const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}`);
|
|
@@ -6228,8 +6146,7 @@ Commands:
|
|
|
6228
6146
|
--version Show CLI version
|
|
6229
6147
|
|
|
6230
6148
|
Setup (recommended):
|
|
6231
|
-
# 1.
|
|
6232
|
-
jssm config set host http://localhost:3000
|
|
6149
|
+
# 1. Login (host is automatically configured based on NODE_ENV)
|
|
6233
6150
|
jssm register # or: jssm login
|
|
6234
6151
|
|
|
6235
6152
|
# 2. Initialize a project directory (creates .jssm file)
|
|
@@ -6247,7 +6164,7 @@ Quick Start (all-in-one):
|
|
|
6247
6164
|
Advanced:
|
|
6248
6165
|
# Manage global configuration
|
|
6249
6166
|
jssm config list
|
|
6250
|
-
jssm config set
|
|
6167
|
+
jssm config set namespace my-namespace
|
|
6251
6168
|
|
|
6252
6169
|
# Create project
|
|
6253
6170
|
jssm project create my-app
|
|
@@ -6267,7 +6184,8 @@ Container Secrets (Docker/ECS/EKS):
|
|
|
6267
6184
|
CMD ["node", "app.js"]
|
|
6268
6185
|
|
|
6269
6186
|
Note:
|
|
6270
|
-
-
|
|
6187
|
+
- Host is automatically configured based on NODE_ENV (dev: localhost:3000, prod: jssm-api.jutsu.ai)
|
|
6188
|
+
- Global config (~/.jssm/config) stores preferences (namespace, etc.)
|
|
6271
6189
|
- Auth data (~/.jssm/auth) stores your login session
|
|
6272
6190
|
- Project config (.jssm) stores project name
|
|
6273
6191
|
- Add .jssm to .gitignore (may contain sensitive overrides)
|