Skip to content

Releases: karibew/argus-cli

argus 0.5.0

Choose a tag to compare

@reel reel released this 03 Oct 15:34

argus 0.5.0

One output system across every command, a guard that writes scan evidence
only where it judged, and refusals that say what to do. Tried end to end
before this tag: 0.5.0-rc.1 and rc.2, on two real Projects, and on a Linux
account with umask 002.

Breaking, read first:

  • A committed profile: in .argus.yml must be a profile directory name:
    lowercase letters, digits, dot, underscore and hyphen, not starting with a
    dot. A config naming "Generic" or "acme app" is now refused under the rule
    project-config, and init asks again rather than writing one.
  • argus dast and argus guard run refuse an --out that another user could
    replace while a scanner starts (rule private-out): a directory on the way
    that belongs to another user, or that others can write to without the sticky
    bit. A directory writable only by your own per-user group, as umask 002
    leaves one on most Linux systems, is allowed. The refusal names the directory
    and the chmod that fixes it. Write access granted by an ACL is not detected.
  • A scope's exclude_paths must be a list of paths. A single string, an empty
    item, or an item holding a line break or a non-ASCII byte is refused under
    scope-file; before, each was silently dropped, and ZAP could request a URL
    the scope meant to exclude.

What changed:

  • Every command speaks through one output system. A terminal gets colour,
    aligned rows and a held-back view of bookkeeping; a pipe or a CI log gets
    every line, plain. -q prints only what needs you (refusals, failures,
    SUSPECT, NOT CHECKED, the verdict); -v prints everything; --no-color,
    --plain and --no-input do what they say. docs/CI.md lists them.
  • Refusals are one block: REFUSED, the rule word a CI job can match, and what
    to do. docs/CI.md lists every rule word and the commands that print it.
  • argus init asks its questions in place, answered with the arrow keys or by
    typing; piped, it asks nothing. It asks git whether .argus/ is ignored and
    adds the entry when nothing ignores it.
  • gate and review report a scanner that is not installed, left an empty or
    misshapen report, or could not read a directory, as NOT CHECKED, never as
    clean.
  • dast streams each stage live and summarises every SUSPECT and failed stage,
    even under -q. Its exit is 3 over 1 over 4, whatever order the stages ran.
    The one file it writes, operator.md, is only ever created, in the directory
    it judged and holds for the whole run; each scanner runs in that same
    directory, and a replaced --out stops the run and says so. The exclude list
    is printed in ZAP's run, the one tool that honours it, and one line says the
    other tools do not.
  • A run writes only files it creates, never through a link or a second name,
    and never into argus's own inputs.
  • Whether evidence is gitignored is asked of the repository the evidence is
    actually in, without running that repository's hooks or fsmonitor, and
    without trusting GIT_DIR and friends from the environment.
  • A command printed for you to paste stays one inert command, whatever bytes a
    path holds.
  • dast speaks as dast:, its own voice. Its stages are section headings, and
    where the evidence is is said once, as dast: output. The Guard's rows inside
    a run are unchanged.
  • dast --intrusive is refused in one block under the rule tier, exit 1 as
    before; a run into argus's own inputs, or into a Project outside .argus/, is
    refused under argus-inputs, argus-data or run-dir.
  • A committed output: in .argus.yml must be valid UTF-8 with no character that
    can rewrite a terminal line; a hostile value could hide rows or forge one.
  • A directory named with non-ASCII letters, such as café, is printed as itself
    in a private-out refusal, with its chmod line to paste.
  • No command formats its own status line; a test keeps it that way.

Known, and not in this release: terminal control bytes in a path still reach
the screen in plain rows (#121); a handful of other refusal gaps are listed in
semgrep notice about its own rule file is counted as an unanalysed file,
which can turn a clean scan into NOT CHECKED (#131).

This release is not signed. SHA256SUMS catches a corrupt download and proves
nothing about who built the bytes; provenance is the decision docs/adr/0008
leaves open.
-----BEGIN PGP SIGNATURE-----

iJEEABYKADkWIQTKKELDW9dCd1WCColBoKZCVabq8AUCasEbaRsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMiwwLDMACgkQQaCmQlWm6vBVXgEA789GZi0KSM/fEun7I/od
368lHCSIDib/UxVCWqBqtEABAOSQwGoovXrNgXadr1WvOSztr5b5QwmLzx+/Y9KL
rIMM
=8sY9
-----END PGP SIGNATURE-----

argus 0.5.0-rc.2

argus 0.5.0-rc.2 Pre-release
Pre-release

Choose a tag to compare

@reel reel released this 25 Sep 20:30

argus 0.5.0-rc.2

The second release candidate. It is a prerelease: install.sh never resolves
it as latest, and the Homebrew formula is not bumped to it. It exists so the
new refusals below can be tried on a Linux machine before 0.5.0 is tagged, and
it is the first release built with the updated QEMU and Buildx actions.

Since 0.5.0-rc.1:

  • dast speaks as dast:, its own voice. Its stages are section headings, and
    where the evidence is is said once, as dast: output. The Guard's rows inside
    a run are unchanged.
  • dast --intrusive is refused in one block under the rule tier, exit 1 as
    before; a run into argus's own inputs, or into a Project outside .argus/, is
    refused under argus-inputs, argus-data or run-dir.
  • A committed output: in .argus.yml must be valid UTF-8 with no character that
    can rewrite a terminal line; a hostile value could hide rows or forge one.
  • A directory named with non-ASCII letters, such as café, is printed as itself
    in a private-out refusal, with its chmod line to paste.
  • No command formats its own status line; a test keeps it that way.

Breaking, read first:

  • A committed profile: in .argus.yml must be a profile directory name:
    lowercase letters, digits, dot, underscore and hyphen, not starting with a
    dot. A config naming "Generic" or "acme app" is now refused under the rule
    project-config, and init asks again rather than writing one.
  • argus dast and argus guard run refuse an --out that another user could
    replace while a scanner starts (rule private-out): a directory on the way
    that belongs to another user, or that others can write to without the sticky
    bit. A directory writable only by your own per-user group, as umask 002
    leaves one on most Linux systems, is allowed. The refusal names the directory
    and the chmod that fixes it. Write access granted by an ACL is not detected.
  • A scope's exclude_paths must be a list of paths. A single string, an empty
    item, or an item holding a line break or a non-ASCII byte is refused under
    scope-file; before, each was silently dropped, and ZAP could request a URL
    the scope meant to exclude.

What changed:

  • Every command speaks through one output system. A terminal gets colour,
    aligned rows and a held-back view of bookkeeping; a pipe or a CI log gets
    every line, plain. -q prints only what needs you (refusals, failures,
    SUSPECT, NOT CHECKED, the verdict); -v prints everything; --no-color,
    --plain and --no-input do what they say. docs/CI.md lists them.
  • Refusals are one block: REFUSED, the rule word a CI job can match, and what
    to do. docs/CI.md lists every rule word and the commands that print it.
  • argus init asks its questions in place, answered with the arrow keys or by
    typing; piped, it asks nothing. It asks git whether .argus/ is ignored and
    adds the entry when nothing ignores it.
  • gate and review report a scanner that is not installed, left an empty or
    misshapen report, or could not read a directory, as NOT CHECKED, never as
    clean.
  • dast streams each stage live and summarises every SUSPECT and failed stage,
    even under -q. Its exit is 3 over 1 over 4, whatever order the stages ran.
    The one file it writes, operator.md, is only ever created, in the directory
    it judged and holds for the whole run; each scanner runs in that same
    directory, and a replaced --out stops the run and says so. The exclude list
    is printed in ZAP's run, the one tool that honours it, and one line says the
    other tools do not.
  • A run writes only files it creates, never through a link or a second name,
    and never into argus's own inputs.
  • Whether evidence is gitignored is asked of the repository the evidence is
    actually in, without running that repository's hooks or fsmonitor, and
    without trusting GIT_DIR and friends from the environment.
  • A command printed for you to paste stays one inert command, whatever bytes a
    path holds.

Known, and not in this candidate: terminal control bytes in a path still reach
the screen in plain rows (#121); a handful of other refusal gaps are listed in

This release is not signed. SHA256SUMS catches a corrupt download and proves
nothing about who built the bytes; provenance is the decision docs/adr/0008
leaves open.
-----BEGIN PGP SIGNATURE-----

iJEEABYKADkWIQTKKELDW9dCd1WCColBoKZCVabq8AUCarbUxBsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMiwwLDMACgkQQaCmQlWm6vDkXgD+MTzoqiTeP1sSIc1jJ5mq
jCwXw4xYDJ7HVyop/WbKvcEBAPhD4xJ5r2+YDnT+v76GGG3mkAIKTiy7P3k216Uo
+pMM
=Jelz
-----END PGP SIGNATURE-----

argus 0.5.0-rc.1

argus 0.5.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@reel reel released this 24 Sep 18:55

argus 0.5.0-rc.1

A release candidate. It is a prerelease: install.sh never resolves it as
latest, and the Homebrew formula is not bumped to it. It exists so the new
refusals below can be tried on a Linux machine before 0.5.0 is tagged.

Breaking, read first:

  • A committed profile: in .argus.yml must be a profile directory name:
    lowercase letters, digits, dot, underscore and hyphen, not starting with a
    dot. A config naming "Generic" or "acme app" is now refused under the rule
    project-config, and init asks again rather than writing one.
  • argus dast and argus guard run refuse an --out that another user could
    replace while a scanner starts (rule private-out): a directory on the way
    that belongs to another user, or that others can write to without the sticky
    bit. A directory writable only by your own per-user group, as umask 002
    leaves one on most Linux systems, is allowed. The refusal names the directory
    and the chmod that fixes it. Write access granted by an ACL is not detected.
  • A scope's exclude_paths must be a list of paths. A single string, an empty
    item, or an item holding a line break or a non-ASCII byte is refused under
    scope-file; before, each was silently dropped, and ZAP could request a URL
    the scope meant to exclude.

What changed:

  • Every command speaks through one output system. A terminal gets colour,
    aligned rows and a held-back view of bookkeeping; a pipe or a CI log gets
    every line, plain. -q prints only what needs you (refusals, failures,
    SUSPECT, NOT CHECKED, the verdict); -v prints everything; --no-color,
    --plain and --no-input do what they say. docs/CI.md lists them.
  • Refusals are one block: REFUSED, the rule word a CI job can match, and what
    to do. docs/CI.md lists every rule word and the commands that print it.
  • argus init asks its questions in place, answered with the arrow keys or by
    typing; piped, it asks nothing. It asks git whether .argus/ is ignored and
    adds the entry when nothing ignores it.
  • gate and review report a scanner that is not installed, left an empty or
    misshapen report, or could not read a directory, as NOT CHECKED, never as
    clean.
  • dast streams each stage live and summarises every SUSPECT and failed stage,
    even under -q. Its exit is 3 over 1 over 4, whatever order the stages ran.
    The one file it writes, operator.md, is only ever created, in the directory
    it judged and holds for the whole run; each scanner runs in that same
    directory, and a replaced --out stops the run and says so. The exclude list
    is printed in ZAP's run, the one tool that honours it, and one line says the
    other tools do not.
  • A run writes only files it creates, never through a link or a second name,
    and never into argus's own inputs.
  • Whether evidence is gitignored is asked of the repository the evidence is
    actually in, without running that repository's hooks or fsmonitor, and
    without trusting GIT_DIR and friends from the environment.
  • A command printed for you to paste stays one inert command, whatever bytes a
    path holds.

Known, and not in this candidate: terminal control bytes in a path still reach
the screen in plain rows (#121); a folder named with non-ASCII letters gets a
chmod line that cannot be pasted as printed, among the refusal gaps in #122.

This release is not signed. SHA256SUMS catches a corrupt download and proves
nothing about who built the bytes; provenance is the decision docs/adr/0008
leaves open.
-----BEGIN PGP SIGNATURE-----

iJEEABYKADkWIQTKKELDW9dCd1WCColBoKZCVabq8AUCarVt6BsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMiwwLDMACgkQQaCmQlWm6vDfZAD/TRDfJyiy5A6KHOzCog9c
1ZIISpsWc2Xh1BLcjRyndyQA+wbFFi890H7JVir1YA3YFaDnBPf4wcbXzHc+gDll
RIIC
=1bgb
-----END PGP SIGNATURE-----

argus 0.4.0

Choose a tag to compare

@reel reel released this 19 Sep 18:09

argus 0.4.0

argus as an installed binary. Every command runs from one binary that carries
its doctrine, and nobody clones argus to use it. This is the first release
published from the public karibew/argus-cli, so installing needs no token:
install.sh, or brew install karibew/tap/argus once the formula is bumped.

  • A Project's .argus.yml pins an Overlay by URL and ref; argus overlay pull
    fetches it, and review, gate, sync and dast take their Profile from it.
  • sync is bound to the Project: it installs the two agents, the skills they
    name, and the pre-flight checklist at .claude/argus/RULES-OF-ENGAGEMENT.md.
    Every path the shipped doctrine names is one the Project has, and lint
    refuses a build where that stops being true.
  • review and gate take the repository you are standing in; a directory that is
    no repository is refused with the reason and both ways forward.
  • doctor, toolbox, verify and dast are new. dast runs behind a guard that
    refuses production, proves ownership live, and reports a stage it cannot
    show examined the target as SUSPECT, never as done. No real staging target
    has been scanned with it yet.
  • Toolbox images are pinned by the digest injected at release and pulled by
    it, never by a tag. They are public packages; pulling needs no login.

Two user-visible breaks from 0.3.0: the config schema is version 2, and
sync is gone - sync takes the Project it is run in.

This release is not signed. SHA256SUMS catches a corrupt download and proves
nothing about who built the bytes; provenance is an open decision recorded in
docs/adr/0008.
-----BEGIN PGP SIGNATURE-----

iJEEABYKADkWIQTKKELDW9dCd1WCColBoKZCVabq8AUCaq7K4RsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMiwwLDMACgkQQaCmQlWm6vA9iAEA7/y0ac5kD4pnWGLB1QQM
RFDEfLTKQKXkjiV6NlrqDdYA/3fAsRILgHoSuEyWvPrdJ8gGCT5VDECMfL7R8f3P
+6sN
=xHCO
-----END PGP SIGNATURE-----

argus 0.4.0-rc.1

argus 0.4.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@reel reel released this 18 Sep 19:22

argus 0.4.0-rc.1

A release candidate, and the first tag release.yml has ever run on. It exists
to find out where the release stops before the real tag does. It is a
prerelease: install.sh never resolves it as latest, and the Homebrew formula is
never bumped to it.

0.4.0 is argus as an installed binary. Every command runs from one binary that
carries its doctrine, and nobody clones argus to use it.

  • A Project's .argus.yml pins an Overlay by URL and ref; argus overlay pull
    fetches it, and review, gate, sync and dast take their Profile from it.
  • sync is bound to the Project: it installs the two agents, the skills they
    name, and the pre-flight checklist at .claude/argus/RULES-OF-ENGAGEMENT.md.
    Every path the shipped doctrine names is one the Project has, and lint
    refuses a build where that stops being true.
  • review and gate take the repository you are standing in; a directory that is
    no repository is refused with the reason and both ways forward.
  • doctor, toolbox, verify and dast are new. dast runs behind a guard that
    refuses production, proves ownership live, and reports a stage it cannot
    show examined the target as SUSPECT, never as done. No real staging target
    has been scanned with it yet.
  • Toolbox images are pinned by the digest injected at release and pulled by it,
    never by a tag. They are public packages; pulling needs no login.
  • Releases are published from the public karibew/argus-cli. Installing needs
    no token: brew install karibew/tap/argus, or install.sh.

Two user-visible breaks from 0.3.0: the config schema is version 2, and
sync is gone - sync takes the Project it is run in.

This release is not signed. SHA256SUMS catches a corrupt download and proves
nothing about who built the bytes; provenance is an open decision recorded in
docs/adr/0008, to be settled on a candidate like this one.
-----BEGIN PGP SIGNATURE-----

iJEEABYKADkWIQTKKELDW9dCd1WCColBoKZCVabq8AUCaq2KThsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMiwwLDMACgkQQaCmQlWm6vASsAEA+Cg+iy4WIz8GzyqG571G
56qhGKysYMsSBS1iBDoJOBcBALg/hk1JDCL6vxRtxZdVaBqbqY2tHOcK+4bDbzdm
MR0B
=U8wu
-----END PGP SIGNATURE-----