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.1",
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.0"
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.0"
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.0"
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.0"
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):