@kolatts/pncli 1.26.0 → 2.0.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.
@@ -4,19 +4,21 @@ import {
4
4
  loadConfig,
5
5
  loadJsonFile,
6
6
  maskConfig,
7
+ normalizeBaseUrl,
7
8
  setConfigValue,
8
9
  setRepoConfigValue,
9
10
  writeGlobalConfig,
10
11
  writeRepoConfig
11
- } from "./chunk-JOAWUILY.js";
12
+ } from "./chunk-PXKUQPPF.js";
12
13
  export {
13
14
  getGlobalConfigPath,
14
15
  loadConfig,
15
16
  loadJsonFile,
16
17
  maskConfig,
18
+ normalizeBaseUrl,
17
19
  setConfigValue,
18
20
  setRepoConfigValue,
19
21
  writeGlobalConfig,
20
22
  writeRepoConfig
21
23
  };
22
- //# sourceMappingURL=config-SQ3YHJHI.js.map
24
+ //# sourceMappingURL=config-YHYQTGKT.js.map
@@ -2,9 +2,10 @@
2
2
  import {
3
3
  HttpClient,
4
4
  createHttpClient
5
- } from "./chunk-AGELHQKO.js";
5
+ } from "./chunk-ZDJYOI3W.js";
6
+ import "./chunk-HZF6WQPU.js";
6
7
  export {
7
8
  HttpClient,
8
9
  createHttpClient
9
10
  };
10
- //# sourceMappingURL=http-WCDXXCKQ.js.map
11
+ //# sourceMappingURL=http-6QJU2SWP.js.map
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ debug,
4
+ fail,
5
+ isDebugEnabled,
6
+ log,
7
+ setGlobalOptions,
8
+ setGlobalUser,
9
+ success,
10
+ warn,
11
+ writeRawOutput
12
+ } from "./chunk-HZF6WQPU.js";
13
+ export {
14
+ debug,
15
+ fail,
16
+ isDebugEnabled,
17
+ log,
18
+ setGlobalOptions,
19
+ setGlobalUser,
20
+ success,
21
+ warn,
22
+ writeRawOutput
23
+ };
24
+ //# sourceMappingURL=output-XT3WT5L5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolatts/pncli",
3
- "version": "1.26.0",
3
+ "version": "2.0.0",
4
4
  "description": "The Paperwork Nightmare CLI — One command does what three meetings couldn't.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,7 +9,9 @@ metadata:
9
9
  services: config
10
10
  ---
11
11
 
12
- pncli gives AI agents and humans unified CLI access to enterprise tools: Jira, Bitbucket, Confluence, SonarQube, SDElements, Azure DevOps, Jenkins, Artifactory, IBM UrbanCode Deploy, Checkmarx, ServiceNow, Contrast Security IAST, Sonatype IQ Server, OpenShift / Kubernetes, Dynatrace, and LogScale.
12
+ pncli gives AI agents and humans unified CLI access to enterprise tools: Jira, Bitbucket, Confluence, SonarQube, SDElements, Azure DevOps, Jenkins, Artifactory, Checkmarx, ServiceNow, Contrast Security IAST, Sonatype IQ Server, OpenShift / Kubernetes, Dynatrace, LogScale, and Figma.
13
+
14
+ Every service authenticates the same way: a personal access token you generate in that tool's own UI and put in an env var or the config file. If a tool you need is missing from the table below, it is not out of scope by default — pncli covers enterprise tooling broadly, and the only hard requirement is personal-access-token auth.
13
15
 
14
16
  ## Two config levels
15
17
 
@@ -47,7 +49,6 @@ For detailed setup of any service, read the included file for that service.
47
49
  | SonarQube | `sonarqube.md` | Code quality issues |
48
50
  | SDElements | `sde.md` | Threat model tasks |
49
51
  | Checkmarx | `checkmarx.md` | SAST findings |
50
- | IBM UrbanCode Deploy | `udeploy.md` | Component versions, deployments |
51
52
  | Jenkins | `jenkins.md` | Builds, job status |
52
53
  | Artifactory | `artifactory.md` | Packages, repos |
53
54
  | ServiceNow | `servicenow.md` | Change requests, incidents |
@@ -56,6 +57,8 @@ For detailed setup of any service, read the included file for that service.
56
57
  | OpenShift / Kubernetes | `openshift.md` | Pod health, events, logs, metrics |
57
58
  | Dynatrace | `dynatrace.md` | Services, entities, problems, traces, Kubernetes workloads |
58
59
  | LogScale | `logscale.md` | Log queries, repository listing |
60
+ | Split.IO | `splitio.md` | Feature flag discovery, targeting updates, Change Requests |
61
+ | Figma | `figma.md` | Design files, comments, version history |
59
62
  | Skills Marketplace | `marketplace.md` | Install org-internal skills |
60
63
 
61
64
  ## Setup walkthrough
@@ -0,0 +1,62 @@
1
+ # Figma
2
+
3
+ pncli uses the Figma REST API directly; no external CLI is required.
4
+
5
+ ## Configuration
6
+
7
+ | Key | Environment variable | Purpose |
8
+ |---|---|---|
9
+ | `figma.baseUrl` | `PNCLI_FIGMA_BASE_URL` | Figma API base URL — always `https://api.figma.com` |
10
+ | `figma.token` | `PNCLI_FIGMA_TOKEN` | Personal access token |
11
+
12
+ Generate a personal access token in Figma under **Account Settings → Personal access tokens**.
13
+
14
+ ```bash
15
+ pncli config set figma.baseUrl https://api.figma.com
16
+ pncli config set figma.token <your-token>
17
+ pncli config test
18
+ ```
19
+
20
+ ## Finding a Figma file key
21
+
22
+ The file key is the alphanumeric segment in a Figma URL. Both URL formats are accepted:
23
+
24
+ ```
25
+ https://www.figma.com/design/ABCDEFGH1234/My-Design-Name
26
+ ^^^^^^^^^^^^
27
+ https://www.figma.com/file/ABCDEFGH1234/My-Design-Name
28
+ ^^^^^^^^^^^^
29
+ ```
30
+
31
+ You can pass either the raw file key or the full URL to any `figma` command.
32
+
33
+ ## Commands
34
+
35
+ ```bash
36
+ # Get current user — useful for verifying credentials
37
+ pncli figma me
38
+
39
+ # Get file metadata and structure summary (component and style counts)
40
+ pncli figma file ABCDEFGH1234
41
+ pncli figma file "https://www.figma.com/design/ABCDEFGH1234/My-Design"
42
+
43
+ # Include the full document node tree (can be large)
44
+ pncli figma file ABCDEFGH1234 --document
45
+
46
+ # Get all comments on a file
47
+ pncli figma comments ABCDEFGH1234
48
+
49
+ # Get comments as of a specific point in time
50
+ pncli figma comments ABCDEFGH1234 --as-of 2026-08-01T00:00:00Z
51
+
52
+ # Get version history
53
+ pncli figma versions ABCDEFGH1234
54
+
55
+ # List files in a Figma project (project ID is visible in the project URL)
56
+ pncli figma project-files 123456789
57
+ ```
58
+
59
+ ## Notes
60
+
61
+ - `figma file` returns a summary by default: name, last-modified, version, thumbnail URL, role, editor type, schema version, and counts of components and styles. Pass `--document` to include the full document node tree (this can be very large for complex designs).
62
+ - Passing a Figma image (screenshot or export) rather than a link is **not supported** — pncli works with the Figma REST API only, not image analysis. Use the file key or URL instead.
@@ -49,3 +49,50 @@ pncli config set --repo defaults.jenkins.baseUrl https://jenkins.myteam.imagile.
49
49
  ```
50
50
 
51
51
  Resolution order (highest to lowest): project `.pncli.json` → global config → `PNCLI_JENKINS_BASE_URL` env var.
52
+
53
+ ## Multiple Jenkins instances
54
+
55
+ When you work with more than one Jenkins controller (e.g. a stable production instance plus ephemeral pipeline-as-code instances), add a `jenkinsInstances` array to your global config:
56
+
57
+ ```json
58
+ {
59
+ "jenkinsInstances": [
60
+ {
61
+ "name": "prod",
62
+ "baseUrl": "https://jenkins.imagile.dev",
63
+ "username": "you@example.com",
64
+ "apiToken": "abc12345"
65
+ },
66
+ {
67
+ "name": "ephemeral",
68
+ "baseUrl": "https://jenkins-tmp.imagile.dev",
69
+ "username": "you@example.com",
70
+ "apiToken": "abc12345"
71
+ }
72
+ ]
73
+ }
74
+ ```
75
+
76
+ Manage the array with the `instance` subcommands, which append rather than replace:
77
+
78
+ ```
79
+ pncli jenkins instance add --name prod --base-url jenkins.imagile.dev --username you@example.com --api-token abc12345
80
+ pncli jenkins instance add --name ephemeral --base-url jenkins-tmp.imagile.dev --username you@example.com
81
+ pncli jenkins instance list
82
+ pncli jenkins instance remove --name ephemeral
83
+ ```
84
+
85
+ Omit `--api-token` on an interactive terminal and pncli prompts for it, which keeps the token out of your shell history. `instance list` masks every token as `***`. Adding a name that already exists is rejected unless you pass `--force`, which overwrites that entry in place.
86
+
87
+ `pncli config set jenkinsInstances '[...]'` also works, but it **replaces** the whole array — you must re-supply every instance you want to keep, including tokens that `config check` masks. Prefer `instance add`.
88
+
89
+ Then select an instance at run-time with `--instance`:
90
+
91
+ ```
92
+ pncli jenkins --instance ephemeral pipeline list
93
+ pncli jenkins --instance prod pipeline run --name my-job --wait
94
+ ```
95
+
96
+ When `--instance` is omitted, pncli uses the default `jenkins.*` config as usual.
97
+
98
+ **Note:** Per-instance credentials are read only from the global config file — there is no env-var override for a named instance. To override Jenkins credentials at runtime (CI/CD, GitHub Actions), use the default `jenkins.*` config with `PNCLI_JENKINS_BASE_URL`, `PNCLI_JENKINS_USERNAME`, and `PNCLI_JENKINS_API_TOKEN`, and omit `--instance`.
@@ -85,6 +85,27 @@ pncli openshift pod-metrics --namespace my-namespace
85
85
  Returns per-pod, per-container CPU and memory usage. Requires the metrics-server to be
86
86
  installed in the cluster (`GET /apis/metrics.k8s.io/v1beta1/...`).
87
87
 
88
+ ### Get combined resource usage, limits, and requests
89
+
90
+ ```bash
91
+ pncli openshift resource-usage --namespace my-namespace
92
+ pncli openshift resource-usage --namespace my-namespace --label-selector app=my-app
93
+ pncli openshift resource-usage --namespace my-namespace --csv
94
+ ```
95
+
96
+ Fetches pod specs (limits/requests) and metrics-server usage in parallel, joins them by
97
+ pod + container, and normalizes all values to **millicores (m)** for CPU and **mebibytes (Mi)**
98
+ for memory. Pods without metrics (e.g. not Running) appear with empty usage columns.
99
+
100
+ Use `--csv` to emit a spreadsheet-ready CSV suitable for Excel:
101
+
102
+ ```
103
+ Pod,Container,CPU Usage (m),Memory Usage (Mi),CPU Limits (m),Memory Limits (Mi),CPU Requests (m),Memory Requests (Mi)
104
+ my-pod-abc,app,45,128,500,256,100,128
105
+ ```
106
+
107
+ Requires the metrics-server (`GET /apis/metrics.k8s.io/v1beta1/...`) — same as `pod-metrics`.
108
+
88
109
  ## Test connectivity
89
110
 
90
111
  ```bash
@@ -93,7 +114,8 @@ pncli config test
93
114
 
94
115
  ## Minimum RBAC permissions
95
116
 
96
- The service account needs read access to pods, events, logs, and metrics in the target namespace:
117
+ The service account needs read access to pods, events, logs, and metrics in the target namespace.
118
+ `resource-usage` requires the same metrics-server permission as `pod-metrics`:
97
119
 
98
120
  ```yaml
99
121
  rules:
@@ -0,0 +1,178 @@
1
+ # Split.IO
2
+
3
+ pncli uses the Split Admin API v2 directly; no external CLI is required.
4
+
5
+ ## Configuration
6
+
7
+ | Key | Environment variable | Purpose |
8
+ |---|---|---|
9
+ | `splitio.baseUrl` | `PNCLI_SPLITIO_BASE_URL` | Split Admin API base URL, such as `https://api.split.io` |
10
+ | `splitio.adminApiKey` | `PNCLI_SPLITIO_ADMIN_API_KEY` | Admin API key generated in the Split UI |
11
+
12
+ Generate an Admin API key in the Split UI under **Admin Settings → API Keys → Admin**.
13
+
14
+ ```bash
15
+ pncli config set splitio.baseUrl https://api.split.io
16
+ pncli config set splitio.adminApiKey <your-admin-api-key>
17
+ pncli config test
18
+ ```
19
+
20
+ ## Change Controls
21
+
22
+ Every write command submits a **Change Request** (CR) rather than modifying flag definitions directly. Each CR requires:
23
+
24
+ | Flag | Required | Description |
25
+ |---|---|---|
26
+ | `--mnemonic` | Yes | Short title for the CR (appears in the Split UI) |
27
+ | `--description` | Yes | Longer description of the intent |
28
+ | `--change-number` | Yes | ServiceNow change ticket (e.g. `CHG0001234`) |
29
+ | `--approvers` | Situational | Comma-separated Split user IDs for non-production approvals |
30
+ | `--yes` | Optional | Skip interactive confirmation (for CI/CD pipelines) |
31
+
32
+ All write commands prompt for confirmation unless `--yes` is supplied. The `--dry-run` flag prints the request body without sending it.
33
+
34
+ ## Commands
35
+
36
+ ### Discovery
37
+
38
+ ```bash
39
+ # List all workspaces
40
+ pncli splitio workspaces list
41
+
42
+ # List environments in a workspace
43
+ pncli splitio environments list --workspace <wsId>
44
+
45
+ # List feature flags in a workspace (paginated)
46
+ pncli splitio flags list --workspace <wsId>
47
+ pncli splitio flags list --workspace <wsId> --limit 100 --offset 0
48
+ pncli splitio flags list --workspace <wsId> --flag-set my-flag-set
49
+ ```
50
+
51
+ ### Inspect
52
+
53
+ ```bash
54
+ # Get a flag's global definition (treatments, traffic type, tags)
55
+ pncli splitio flags get --workspace <wsId> --flag my-feature
56
+
57
+ # Get a flag's full definition including targeting rules for one environment
58
+ pncli splitio flags get --workspace <wsId> --flag my-feature --environment <envId>
59
+ ```
60
+
61
+ ### Update (full definition replacement)
62
+
63
+ Provide the complete flag definition as JSON via `--input-file`. Use `pncli splitio flags get --environment` to retrieve the current definition before editing it.
64
+
65
+ ```bash
66
+ pncli splitio flags update \
67
+ --workspace <wsId> --flag my-feature --environment <envId> \
68
+ --mnemonic "SPLIT-001" --description "Enable feature for all users" \
69
+ --change-number CHG0001234 --approvers "user-id-1,user-id-2" \
70
+ --input-file definition.json
71
+ ```
72
+
73
+ The file must contain the full definition object (treatments, rules, defaultRule, etc.).
74
+
75
+ ### Change one rule
76
+
77
+ ```bash
78
+ # Route all traffic in rule 0 to one treatment
79
+ pncli splitio flags set-rule \
80
+ --workspace <wsId> --flag my-feature --environment <envId> \
81
+ --rule-index 0 --treatment on \
82
+ --mnemonic "SPLIT-002" --description "Route beta users to on" \
83
+ --change-number CHG0001234
84
+
85
+ # Weighted distribution for rule 1
86
+ pncli splitio flags set-rule \
87
+ --workspace <wsId> --flag my-feature --environment <envId> \
88
+ --rule-index 1 --weights '[{"treatment":"on","size":80000},{"treatment":"off","size":20000}]' \
89
+ --mnemonic "SPLIT-003" --description "80/20 split for rule 1" \
90
+ --change-number CHG0001234
91
+ ```
92
+
93
+ ### Change default rule
94
+
95
+ ```bash
96
+ pncli splitio flags set-default \
97
+ --workspace <wsId> --flag my-feature --environment <envId> \
98
+ --treatment off \
99
+ --mnemonic "SPLIT-004" --description "Default traffic to off" \
100
+ --change-number CHG0001234
101
+ ```
102
+
103
+ ### Kill and restore
104
+
105
+ ```bash
106
+ # Kill a flag (forces all traffic to the default treatment)
107
+ pncli splitio flags kill \
108
+ --workspace <wsId> --flag my-feature --environment <envId> \
109
+ --mnemonic "SPLIT-005" --description "Emergency kill for incident INC0001234" \
110
+ --change-number CHG0001234 --yes
111
+
112
+ # Restore a killed flag
113
+ pncli splitio flags restore \
114
+ --workspace <wsId> --flag my-feature --environment <envId> \
115
+ --mnemonic "SPLIT-006" --description "Restore after incident resolved" \
116
+ --change-number CHG0001234
117
+ ```
118
+
119
+ ### Archive a flag
120
+
121
+ ```bash
122
+ pncli splitio flags archive \
123
+ --workspace <wsId> --flag my-old-feature \
124
+ --mnemonic "SPLIT-007" --description "Flag is fully rolled out, cleaning up" \
125
+ --change-number CHG0001234
126
+ ```
127
+
128
+ ### Toggle a single flag
129
+
130
+ ```bash
131
+ # Disable
132
+ pncli splitio flags toggle \
133
+ --workspace <wsId> --flag my-feature --environment <envId> \
134
+ --enabled false \
135
+ --mnemonic "SPLIT-008" --description "Disable for maintenance" \
136
+ --change-number CHG0001234
137
+
138
+ # Enable
139
+ pncli splitio flags toggle \
140
+ --workspace <wsId> --flag my-feature --environment <envId> \
141
+ --enabled true \
142
+ --mnemonic "SPLIT-009" --description "Re-enable after maintenance" \
143
+ --change-number CHG0001234
144
+ ```
145
+
146
+ ### Batch-toggle from a file
147
+
148
+ Failures do not stop remaining entries. Each flag creates its own Change Request.
149
+
150
+ ```bash
151
+ # toggles.json:
152
+ # [
153
+ # { "flag": "feature-a", "enabled": false },
154
+ # { "flag": "feature-b", "enabled": true }
155
+ # ]
156
+
157
+ pncli splitio flags batch-toggle \
158
+ --workspace <wsId> --environment <envId> \
159
+ --mnemonic "SPLIT-010" --description "Maintenance window toggles" \
160
+ --change-number CHG0001234 --yes \
161
+ --input-file toggles.json
162
+ ```
163
+
164
+ ### Change Request tracking
165
+
166
+ ```bash
167
+ # List all CRs for a workspace
168
+ pncli splitio change-requests list --workspace <wsId>
169
+
170
+ # Filter by environment and status
171
+ pncli splitio change-requests list --workspace <wsId> \
172
+ --environment <envId> --status REQUESTED
173
+
174
+ # Retrieve a specific CR
175
+ pncli splitio change-requests get --id <crId>
176
+ ```
177
+
178
+ **Valid status values:** `REQUESTED`, `APPROVED`, `REJECTED`, `PUBLISHED`