ikanban 0.4.1 → 0.4.2
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ikanban",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "iKanban CLI: AI and security scans of your own repo, with results filed into iKanban",
|
|
5
5
|
"bin": { "ikanban": "bin/ikanban.js" },
|
|
6
6
|
"files": ["bin", "lib", "hooks", "scanners", "README.md", "LICENSE.md"],
|
|
@@ -57,7 +57,7 @@ PROMPTFOO_VERSION = "0.123.1"
|
|
|
57
57
|
# so this string is the release identity. Bump it when publishing a release —
|
|
58
58
|
# a customer pinning a version is pinning this value, and re-uploading different
|
|
59
59
|
# bytes under a version someone already fetched defeats the sha256 they pinned.
|
|
60
|
-
AISCAN_VERSION = "0.5.
|
|
60
|
+
AISCAN_VERSION = "0.5.1"
|
|
61
61
|
|
|
62
62
|
# The ten categories, their labels, and their plugins -- the forward map, copied
|
|
63
63
|
# from promptfoo's OWASP_LLM_TOP_10_MAPPING (src/redteam/constants/frameworks.ts).
|
|
@@ -741,6 +741,8 @@ def slug(text: str) -> str:
|
|
|
741
741
|
# "running" at the start, "passed" / "failed" / "skipped" at the end with a one-line detail,
|
|
742
742
|
# then the report as log chunks. A plan without Pipelines (402) or any error never fails the scan.
|
|
743
743
|
_UUID = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.I)
|
|
744
|
+
# Every iKanban scanner reports into one named lane, not the server's "legacy" lane.
|
|
745
|
+
PIPE_RUN = "security-scan"
|
|
744
746
|
PIPE_CHUNK = 15 * 1024 # the server takes 16 KB per chunk
|
|
745
747
|
LAST_RUN = {"report": "", "detail": "", "skipped": False}
|
|
746
748
|
|
|
@@ -824,7 +826,7 @@ class Pipeline:
|
|
|
824
826
|
|
|
825
827
|
def start(self):
|
|
826
828
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": "running",
|
|
827
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
829
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
828
830
|
|
|
829
831
|
def finish(self, code):
|
|
830
832
|
status = "failed" if code else ("skipped" if LAST_RUN["skipped"] else "passed")
|
|
@@ -832,10 +834,10 @@ class Pipeline:
|
|
|
832
834
|
if code == 1 and not LAST_RUN["skipped"]:
|
|
833
835
|
detail = (detail + " (at or above --fail-on)").strip()
|
|
834
836
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": status,
|
|
835
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
837
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
836
838
|
"detail": detail[:300] or None})
|
|
837
839
|
for chunk in log_chunks(mask_report(LAST_RUN["report"])):
|
|
838
|
-
self._post("pipeline-logs", {"task": self.task, "stage": self.stage, "text": chunk})
|
|
840
|
+
self._post("pipeline-logs", {"task": self.task, "run": PIPE_RUN, "stage": self.stage, "text": chunk})
|
|
839
841
|
|
|
840
842
|
|
|
841
843
|
def run_main(stage, main_fn, argv=None):
|
|
@@ -42,7 +42,7 @@ import urllib.request
|
|
|
42
42
|
from datetime import datetime, timezone
|
|
43
43
|
from pathlib import Path
|
|
44
44
|
|
|
45
|
-
DASTSCAN_VERSION = "1.1.
|
|
45
|
+
DASTSCAN_VERSION = "1.1.1"
|
|
46
46
|
|
|
47
47
|
SEVERITIES = ["critical", "high", "medium", "low", "info"]
|
|
48
48
|
SEVERITY_RANK = {s: i for i, s in enumerate(SEVERITIES)}
|
|
@@ -266,6 +266,8 @@ def slug(text: str) -> str:
|
|
|
266
266
|
# "running" at the start, "passed" / "failed" / "skipped" at the end with a one-line detail,
|
|
267
267
|
# then the report as log chunks. A plan without Pipelines (402) or any error never fails the scan.
|
|
268
268
|
_UUID = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.I)
|
|
269
|
+
# Every iKanban scanner reports into one named lane, not the server's "legacy" lane.
|
|
270
|
+
PIPE_RUN = "security-scan"
|
|
269
271
|
PIPE_CHUNK = 15 * 1024 # the server takes 16 KB per chunk
|
|
270
272
|
LAST_RUN = {"report": "", "detail": "", "skipped": False}
|
|
271
273
|
|
|
@@ -349,7 +351,7 @@ class Pipeline:
|
|
|
349
351
|
|
|
350
352
|
def start(self):
|
|
351
353
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": "running",
|
|
352
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
354
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
353
355
|
|
|
354
356
|
def finish(self, code):
|
|
355
357
|
status = "failed" if code else ("skipped" if LAST_RUN["skipped"] else "passed")
|
|
@@ -357,10 +359,10 @@ class Pipeline:
|
|
|
357
359
|
if code == 1 and not LAST_RUN["skipped"]:
|
|
358
360
|
detail = (detail + " (at or above --fail-on)").strip()
|
|
359
361
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": status,
|
|
360
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
362
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
361
363
|
"detail": detail[:300] or None})
|
|
362
364
|
for chunk in log_chunks(mask_report(LAST_RUN["report"])):
|
|
363
|
-
self._post("pipeline-logs", {"task": self.task, "stage": self.stage, "text": chunk})
|
|
365
|
+
self._post("pipeline-logs", {"task": self.task, "run": PIPE_RUN, "stage": self.stage, "text": chunk})
|
|
364
366
|
|
|
365
367
|
|
|
366
368
|
def run_main(stage, main_fn, argv=None):
|
|
@@ -51,7 +51,7 @@ from dataclasses import dataclass, field
|
|
|
51
51
|
from datetime import datetime, timezone
|
|
52
52
|
from pathlib import Path
|
|
53
53
|
|
|
54
|
-
INFRASCAN_VERSION = "1.1.
|
|
54
|
+
INFRASCAN_VERSION = "1.1.1"
|
|
55
55
|
|
|
56
56
|
SEVERITIES = ["critical", "high", "medium", "low", "info"]
|
|
57
57
|
SEVERITY_RANK = {s: i for i, s in enumerate(SEVERITIES)}
|
|
@@ -577,6 +577,8 @@ def slug(text: str) -> str:
|
|
|
577
577
|
# "running" at the start, "passed" / "failed" / "skipped" at the end with a one-line detail,
|
|
578
578
|
# then the report as log chunks. A plan without Pipelines (402) or any error never fails the scan.
|
|
579
579
|
_UUID = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.I)
|
|
580
|
+
# Every iKanban scanner reports into one named lane, not the server's "legacy" lane.
|
|
581
|
+
PIPE_RUN = "security-scan"
|
|
580
582
|
PIPE_CHUNK = 15 * 1024 # the server takes 16 KB per chunk
|
|
581
583
|
LAST_RUN = {"report": "", "detail": "", "skipped": False}
|
|
582
584
|
INVENTORY: list = [] # (scope, table rows) per --path, for the report
|
|
@@ -661,7 +663,7 @@ class Pipeline:
|
|
|
661
663
|
|
|
662
664
|
def start(self):
|
|
663
665
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": "running",
|
|
664
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
666
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
665
667
|
|
|
666
668
|
def finish(self, code):
|
|
667
669
|
status = "failed" if code else ("skipped" if LAST_RUN["skipped"] else "passed")
|
|
@@ -669,10 +671,10 @@ class Pipeline:
|
|
|
669
671
|
if code == 1 and not LAST_RUN["skipped"]:
|
|
670
672
|
detail = (detail + " (at or above --fail-on)").strip()
|
|
671
673
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": status,
|
|
672
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
674
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
673
675
|
"detail": detail[:300] or None})
|
|
674
676
|
for chunk in log_chunks(mask_report(LAST_RUN["report"])):
|
|
675
|
-
self._post("pipeline-logs", {"task": self.task, "stage": self.stage, "text": chunk})
|
|
677
|
+
self._post("pipeline-logs", {"task": self.task, "run": PIPE_RUN, "stage": self.stage, "text": chunk})
|
|
676
678
|
|
|
677
679
|
|
|
678
680
|
def run_main(stage, main_fn, argv=None):
|
|
@@ -64,7 +64,7 @@ from pathlib import Path
|
|
|
64
64
|
# that npm no longer hosts the package. Starting at 1.0.0 rather than continuing
|
|
65
65
|
# the npm package's 0.1.x line: that counter belonged to the wrapper, not to
|
|
66
66
|
# this file, and reusing it would suggest a continuity that does not exist.
|
|
67
|
-
SECSCAN_VERSION = "1.5.
|
|
67
|
+
SECSCAN_VERSION = "1.5.1"
|
|
68
68
|
|
|
69
69
|
SEVERITIES = ["critical", "high", "medium", "low", "info"]
|
|
70
70
|
SEVERITY_RANK = {s: i for i, s in enumerate(SEVERITIES)}
|
|
@@ -901,6 +901,8 @@ def slug(text: str) -> str:
|
|
|
901
901
|
# "running" at the start, "passed" / "failed" / "skipped" at the end with a one-line detail,
|
|
902
902
|
# then the report as log chunks. A plan without Pipelines (402) or any error never fails the scan.
|
|
903
903
|
_UUID = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.I)
|
|
904
|
+
# Every iKanban scanner reports into one named lane, not the server's "legacy" lane.
|
|
905
|
+
PIPE_RUN = "security-scan"
|
|
904
906
|
PIPE_CHUNK = 15 * 1024 # the server takes 16 KB per chunk
|
|
905
907
|
LAST_RUN = {"report": "", "detail": "", "skipped": False}
|
|
906
908
|
|
|
@@ -984,7 +986,7 @@ class Pipeline:
|
|
|
984
986
|
|
|
985
987
|
def start(self):
|
|
986
988
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": "running",
|
|
987
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
989
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}"})
|
|
988
990
|
|
|
989
991
|
def finish(self, code):
|
|
990
992
|
status = "failed" if code else ("skipped" if LAST_RUN["skipped"] else "passed")
|
|
@@ -992,10 +994,10 @@ class Pipeline:
|
|
|
992
994
|
if code == 1 and not LAST_RUN["skipped"]:
|
|
993
995
|
detail = (detail + " (at or above --fail-on)").strip()
|
|
994
996
|
self._post("pipeline-events", {"task": self.task, "stage": self.stage, "status": status,
|
|
995
|
-
"source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
997
|
+
"run": PIPE_RUN, "source": "laptop", "actor": f"ikanban-{self.stage}",
|
|
996
998
|
"detail": detail[:300] or None})
|
|
997
999
|
for chunk in log_chunks(mask_report(LAST_RUN["report"])):
|
|
998
|
-
self._post("pipeline-logs", {"task": self.task, "stage": self.stage, "text": chunk})
|
|
1000
|
+
self._post("pipeline-logs", {"task": self.task, "run": PIPE_RUN, "stage": self.stage, "text": chunk})
|
|
999
1001
|
|
|
1000
1002
|
|
|
1001
1003
|
def run_main(stage, main_fn, argv=None):
|