@numairbaseer/scifcode 0.2.0 → 0.3.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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Scifcode is the user-facing configuration wrapper for the Scifcode coding agent powered by Poolside Laguna.
4
4
 
5
- This v0.1 is intentionally small: it installs one global `scifcode` command, configures the Scifcode runtime to use Laguna, and launches the coding agent with Scifcode defaults.
5
+ It installs one global `scifcode` command, configures the Scifcode runtime to use Laguna, and launches the coding agent with Scifcode defaults.
6
6
 
7
7
  ## Install
8
8
 
@@ -21,6 +21,50 @@ Supported runtime packages cover:
21
21
  - Windows: arm64 and x64
22
22
  - baseline x64 builds for CPUs without AVX2
23
23
 
24
+ ## Offline install and update
25
+
26
+ Each `v*` GitHub release includes platform archives containing a standalone
27
+ `scifcode` launcher and its pinned `scifcode-runtime`. The target machine does
28
+ not need Node.js, Bun, npm, or network access.
29
+
30
+ Transfer the archive, the versioned offline `SHA256SUMS` file, and its
31
+ `.sigstore.json` bundle through the approved media process. Verify the signed
32
+ checksum manifest and the archive, then extract it and run the included
33
+ installer:
34
+
35
+ ```bash
36
+ cosign verify-blob scifcode-0.3.0-offline-SHA256SUMS \
37
+ --bundle scifcode-0.3.0-offline-SHA256SUMS.sigstore.json \
38
+ --certificate-identity \
39
+ https://github.com/numairbaseer/scifcode/.github/workflows/release-cli.yml@refs/tags/v0.3.0 \
40
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com
41
+ sha256sum -c scifcode-0.3.0-offline-SHA256SUMS
42
+ tar -xzf scifcode-0.3.0-linux-x64-baseline.tar.gz
43
+ cd scifcode-0.3.0-linux-x64-baseline
44
+ ./install.sh
45
+ ```
46
+
47
+ On Windows, extract the archive and run:
48
+
49
+ ```powershell
50
+ .\install.ps1
51
+ ```
52
+
53
+ Installing a newer archive performs an offline update. Versions are retained
54
+ under the installation root so an administrator can restore an earlier
55
+ version. Unix installs default to `~/.local/share/scifcode`; Windows installs
56
+ default to `%LOCALAPPDATA%\Programs\Scifcode`.
57
+
58
+ The release workflow signs every offline archive and the release-level
59
+ checksum manifest with a keyless Sigstore certificate tied to the tagged
60
+ GitHub Actions workflow. It verifies every signature before publishing the
61
+ release assets; no long-lived signing key is required.
62
+
63
+ Publish the matching `runtime-vX.Y.Z` runtime release before tagging the CLI as
64
+ `vX.Y.Z`. The CLI workflow downloads the exact platform runtime package pinned
65
+ in `package.json`, compiles the launcher, and attaches the completed offline
66
+ archives to the CLI release.
67
+
24
68
  ## Log in
25
69
 
26
70
  Authenticate once through the Scifcode control-plane portal. The CLI opens a
@@ -67,8 +111,8 @@ This happens before the runtime launches, so no separate initialization command
67
111
  | --- | ---: | --- | --- |
68
112
  | `SCIFCODE_CONTROL_PLANE_URL` | no | `http://localhost:8080` | Alternative to `login --control-plane`; useful for managed installation and automation |
69
113
  | `SCIFCODE_SESSION_TOKEN` | no | stored login session | Ephemeral process override for the control-plane session |
70
- | `SCIFCODE_CONTEXT_WINDOW` | no | `32768` | Context window reported for `scifcode-1.0` |
71
- | `SCIFCODE_MAX_TOKENS` | no | `8192` | Maximum output tokens reported for `scifcode-1.0` |
114
+ | `SCIFCODE_CONTEXT_WINDOW` | no | `32768` | Context window reported for `scifcoder-1.0` |
115
+ | `SCIFCODE_MAX_TOKENS` | no | `8192` | Maximum output tokens reported for `scifcoder-1.0` |
72
116
  | `SCIFCODE_RUNTIME_BIN` | no | installed platform package | Override path to a compiled Scifcode runtime binary |
73
117
  | `SCIFCODE_SOURCE_DIR` | no | adjacent `../scifcode` | Development-only path to the Scifcode source fork |
74
118
  | `SCIFCODE_BUN_BIN` | no | auto-detected | Development-only Bun executable used to run the fork from source |
@@ -126,6 +170,13 @@ Scifcode launches the installed platform runtime directly with argument arrays
126
170
  and does not use shell string execution. Bun/source execution remains available
127
171
  only as a local-development fallback.
128
172
 
173
+ For usage analytics, Scifcode snapshots the Git working tree when an agent
174
+ session starts and reports the aggregate number of added and deleted lines when
175
+ the session ends. The snapshot uses an isolated temporary Git index, so staged,
176
+ unstaged, and untracked work that existed before the session is preserved and
177
+ excluded from the count. Source code and file names are never sent to the
178
+ control plane.
179
+
129
180
  ## Third-party notices
130
181
 
131
182
  Scifcode uses third-party open-source software internally. See `THIRD_PARTY_NOTICES.md`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numairbaseer/scifcode",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Scifcode: a coding CLI agent powered by Poolside Laguna.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -18,17 +18,18 @@
18
18
  "bin",
19
19
  "src",
20
20
  "assets",
21
+ "sbom",
21
22
  "README.md",
22
23
  "LICENSE",
23
24
  "THIRD_PARTY_NOTICES.md"
24
25
  ],
25
26
  "scripts": {
26
27
  "test": "node --test",
27
- "lint": "node --check bin/scifcode.js && node --check src/cli.js && node --check src/constants.js && node --check src/control-plane-auth.js && node --check src/env-config.js && node --check src/ensure-scifcode-config.js && node --check src/paths.js && node --check src/run-runtime.js",
28
+ "lint": "node --check bin/scifcode.js && node --check src/cli.js && node --check src/code-usage.js && node --check src/constants.js && node --check src/control-plane-auth.js && node --check src/env-config.js && node --check src/ensure-scifcode-config.js && node --check src/paths.js && node --check src/run-runtime.js",
28
29
  "prepack": "npm test && npm run lint"
29
30
  },
30
31
  "dependencies": {
31
- "@numairbaseer/scifcode-runtime": "0.2.0"
32
+ "@numairbaseer/scifcode-runtime": "0.3.0"
32
33
  },
33
34
  "engines": {
34
35
  "node": ">=22.19.0"
@@ -0,0 +1 @@
1
+ 0cffa66b37db6ac57f8674c4333a7d7538f1fa8c1290073b53f5daaf5e45bc78 scifcode-0.3.0-all-platforms.cdx.json
@@ -0,0 +1 @@
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"2670340931","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1788228290","inclusionPromise":{"signedEntryTimestamp":"MEYCIQCNThOoX9+RP8aK+xIGZCAig0S90RsmalBfsMzZ9xtLuAIhALwurxlXxal0mHGdmIi4VXbddgFPwPkStcaOrMQGZfFF"},"inclusionProof":{"logIndex":"2548436669","rootHash":"YoAnB5VLJUYhx8XLqMqhUBIj2NCaSWnDxbCJW0WMcwA=","treeSize":"2548436688","hashes":["MHpRHAfk9ew2epuavTPtp55QwT/aYkHD4O+1VMyhekY=","uEK78hAhOJYtxzGucUdhvLIcru8aTSgt2Pvr/ocsOPo=","WKMTJCh9xSA0JlvsC2pkxsROsyTLrXOkTFJRxhF/Ml4=","xCEM/MXK/TMOydPcTPTi3HN1C/k22ZuniihkVskaoGk=","VIGKZ4THxvJ0K+6Jzw75JVxxUWl+mDau2BjSC/yRjg8=","fwEheFWEE6If6/2zr00OBc47rcn5x7UK5o/iY2kgDbY=","Dg3J/nrjcbfDFZ95U3E2k+MigcpD0rTYzyIIUzvmKxg=","DfYNZ8ZruiXAOuQwlMedsYnaK8/QftEZ+XdioF06AkI=","yxm1n7WV1D9Ocx/PAatNvrH4sPbKRT7G2fC1Tk/KuI0=","iDGA2apU6OrdVY64HuuevCjq1OLTD0dTNjzpAHUzjIE=","teOA0aoFI4b4vp2Yey4S54m0vCXTtmwt4iFnHHiCKNg=","p07sZPiNhS3OKedAe6eZnpNiY4alN/6vFHSwmzD+XeM=","0x+NthETNYNp/FuWTune0hSsB75R/jw5TVMLuguVBt0=","xyOt2GKNFZJCSWNl1S4wKoCid/PFKOYR1XcNE/ZPkJ8=","zY/PhpISrIBFRZyHncbk1o+GE9n0L8P+0JwBnaBs+FM=","88k9bhVfFtycpvkQKEbIw1Ql9DnXkT/cvWFa/NEgXeQ=","fABv5KbTDQGTSJg+5k8zHZQKwnOUQHo6srePRzgEpf8=","ddECIA46kQzLbMwjR1L9WCHUWrsqVGYIgRiw6XlG1xs=","0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=","SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2548436688\nYoAnB5VLJUYhx8XLqMqhUBIj2NCaSWnDxbCJW0WMcwA=\n\n— rekor.sigstore.dev wNI9ajBEAiB+YTa7sjFBaarIcZvV7b36/lJ0nwj/myPeMUdBCSjhnQIgMuZQ1wTHTz4vCb/hvbTruX7javMh4EvWa754FbK3MvA=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmNmZhODJkZjE4Zjg3ZGJkOWFlOTY4MWQxMGQxNjI5ZjA5NGE1M2ZiNmMzOWQzNGUyNWMyMWYxMTAxMzQ3OWMzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURqblppcWF3L1hTS0VoSlEvNmQ2bUJqaEJnTWx2R1piOWhWWWVGdVh0SnJRSWdOazBZUEVMbGRyQ1o3amdjVXpjSmJ5b0RzMURqeVd0RzQrS0lzdGlORUxnPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFNla05EUW5NeVowRjNTVUpCWjBsVlRuSTBhRmRJYnpaVUwyUkRjRkF4TkhBdlVDOVdia3RWUkdSWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUVhoTlJFbDNUa1JSTlZkb1kwNU5hbGwzVDFSQmVFMUVTWGhPUkZFMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZpWW5aS2IxRlVRMmQ2TUZOa2NEaERTWFJCVFVoR2F6UlVaV3BLUVVKWk9XMUxWWFlLYTBkcmJUaFdZM2d3Tm0xNU1EZERNelFyVUVjeVJ6WTBOVkVyV0d4R01IUjVWMEp1WTJocVFsQnVSMlZCVTFsUll6WlBRMEpsZDNkbloxaHZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZzT1dwSENtZG5NVzVOWTBKUGNsa3ZUemRwU0hkd05tNXdZVGRKZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGUldVUldVakJTUVZGSUwwSkdPSGRZV1ZwaVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERJMU1XSlhSbkJqYlVwb1l6SldiQXBqYVRsNldUSnNiVmt5T1d0YVV6aDFXakpzTUdGSVZtbE1NMlIyWTIxMGJXSkhPVE5qZVRsNVdsZDRiRmxZVG14TVYwNXpZVk0xTldKWGVFRmpiVlp0Q21ONU9UQlpWMlI2VEROWmQweHFUWFZOUkVFMVFtZHZja0puUlVWQldVOHZUVUZGUWtKRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhZS1ltNU5kVm95YkRCaFNGWnBaRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOUWtsSFEybHpSMEZSVVVKbk56aDNRVkZKUlVKSVFqRmpNbWQzVG1kWlN3cExkMWxDUWtGSFJIWjZRVUpCZDFGdlQxZFNhRTlFVFRWTlYxVXlXV3BOZDFwcVZYcGFhbFpxV2tkTk5GcEVaR2xOTWxKb1dXcEdiVmt5UlRSTk1scHRDazVIVFROTmVrRnFRbWR2Y2tKblJVVkJXVTh2VFVGRlJVSkNWbE5hVjNoc1dWaE9iRWxHVGtSVFZWbG5VVEk1YTFwVFFrUlVSV3QzU1hkWlMwdDNXVUlLUWtGSFJIWjZRVUpDVVZGV1ltNVdkRmxYYkhsWmJVWjZXbGRXZVV3elRtcGhWMXBxWWpKU2JFMUNORWREYVhOSFFWRlJRbWMzT0hkQlVWbEZSVWhLYkFwYWJrMTJaRWRHYm1ONU9USk5RelI2VEdwQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacUNtUkhiSFppYmsxMVdqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUhjMGREYVhOSFFWRlJRbWMzT0hkQlVXdEZXRkY0WW1GSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWpVeFlsZEdjR050U21oak1sWnNZMms1ZWxreWJHMVpNamxyV2xNNGRWb3liREJoU0ZacFRETmtkZ3BqYlhSdFlrYzVNMk41T1hsYVYzaHNXVmhPYkV4WFRuTmhVelUxWWxkNFFXTnRWbTFqZVRrd1dWZGtla3d6V1hkTWFrMTFUVVJCTkVKbmIzSkNaMFZGQ2tGWlR5OU5RVVZMUWtOdlRVdEViR3RaVkdkNlQxUkdiRTV0U1hwTlIxa3hUVEpaTVZreVVtcFBSMUV6V1dwT2ExbFhTWGhhYlU1b1QwUk9iVnBxVW1vS1RucE5kMGhSV1V0TGQxbENRa0ZIUkhaNlFVSkRkMUZRUkVFeGJtRllVbTlrVjBsMFlVYzVlbVJIVm10TlJHZEhRMmx6UjBGUlVVSm5OemgzUVZGM1JRcExaM2R2WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREkxTVdKWFJuQmpiVXBvWXpKV2JHTnBPWHBaTW14dFdUSTVhMXBVUVRSQ1oyOXlDa0puUlVWQldVOHZUVUZGVGtKRGIwMUxSR3hyV1ZSbmVrOVVSbXhPYlVsNlRVZFpNVTB5V1RGWk1sSnFUMGRSTTFscVRtdFpWMGw0V20xT2FFOUVUbTBLV21wU2FrNTZUWGRKUVZsTFMzZFpRa0pCUjBSMmVrRkNSR2RSVTBSQ1FubGFWMXA2VEROU2FGb3pUWFprYWtGMVRYazBkMDFDYjBkRGFYTkhRVkZSUWdwbk56aDNRVkU0UlVSQmQwdE5WRTB3VG1wVk1VMVVWWGxPUkVGMlFtZHZja0puUlVWQldVOHZUVUZGVVVKRFJVMUlNbWd3WkVoQ2VrOXBPSFphTW13d0NtRklWbWxNYlU1MllsTTVkV1JYTVdoaFdFcHBXVmhPYkZwWVNYZEhRVmxMUzNkWlFrSkJSMFIyZWtGQ1JWRlJTMFJCWjNoTmFsa3pUMFJCTWs5RVFuSUtRbWR2Y2tKblJVVkJXVTh2VFVGRlUwSkdNRTFYTW1nd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemwxWkZjeGFHRllTbWxaV0U1c1dsaEpkZ3BqTWs1d1dtMU9kbHBIVlhaTWJXUndaRWRvTVZscE9UTmlNMHB5V20xNGRtUXpUWFpqYlZaeldsZEdlbHBUTVdwaVIydDFaVmN4YzFGSVNteGFiazEyQ21SSFJtNWplVGt5VFVNMGVreHFRWGRQUVZsTFMzZFpRa0pCUjBSMmVrRkNSWGRSY1VSRFp6VmFSMFUwVFhwcmVGcFVXbWxOZWtKdFRsUk9iVTVYVG1zS1dYcG9hMDR5U1hwYVIwWnBUVmRhYWxsVVozcGFiVmt3V1hwamVrMUNVVWREYVhOSFFWRlJRbWMzT0hkQlVsRkZRbWQzUldOSVZucGhSRUpqUW1kdmNncENaMFZGUVZsUEwwMUJSVlpDUlRSTlZFZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZtbE1iVTUyWWxNNWRXUlhNV2hoV0VwcFdWaE9iRnBZU1haak1rNXdDbHB0VG5aYVIxVjJXVmRPTUdGWE9YVmplVGw1WkZjMWVreDZUWHBPUkZsNFRWUlZlRTFFU1hsTU1rWXdaRWRXZEdOSVVucE1la1YzUm5kWlMwdDNXVUlLUWtGSFJIWjZRVUpHWjFGS1JFRmtkMk50YkRKWldGSnNUVUpOUjBOcGMwZEJVVkZDWnpjNGQwRlNZMFZDVVhkRVltNUNkRTFGTkVkRGFYTkhRVkZSUWdwbk56aDNRVkpuUlZGQmR5dGpiVlozWW5wd2RXUlhNV2hoV0VwcFdWaE9iRnBZU2tGTlZFa3lUbnBuZDA1cVozWmpNazV3V20xT2RscEhWa0ZOVkUwd0NrNXFWVEZOVkZWNVRrUndiR0p1V25CamJUbDFZbGRXZFdSRWNIVmpSekIzWjFselIwTnBjMGRCVVZGQ01XNXJRMEpCU1VWbVVWSTNRVWhyUVdSM1JHUUtVRlJDY1hoelkxSk5iVTFhU0doNVdscDZZME52YTNCbGRVNDBPSEptSzBocGJrdEJUSGx1ZFdwblFVRkJZVUpoZEd0U1VVRkJRVVZCZDBKSlRVVlpRd3BKVVVRMlUyTnRWVFZPWmtsRWJGUndUM0YwVDJSTloxRklZVGhyTldVdlFUYzFOMWR1VERsaFdFZEhjbkJCU1doQlRraHBNVVIzWm1kRVVWbHZaVVI0Q2xWQk1IZFNORmRSY0c5cGFGTkZSVEY2VERST2FETmFaWFozTm1WTlFXOUhRME54UjFOTk5EbENRVTFFUVRKblFVMUhWVU5OUnpSb1drbE5ZWGxITlU4S2QxbEVPVGt6VGtZM1ltTkJWV2t4VGk5blFsWlJVRWxOSzNKT2FHOWxValZ0Y1ZNNVNIcDFibHBtUmpSVFJuRnlXamw0VFhGUlNYaEJTelZ5YUZkRFFncG1OREJrT1Zsd1JYQnlZMFpPUkVodEswTXZVWGxGUlZSR2RFRTBZMGgzV0hjNU4zSm5iVWRrVW5ZdmExSk5lVnBuZWxwU1EwUmFPVVZSUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgIf5OgasegNyGoUrQSdiIVwVr8eSV5+Vx7qj9FUmRgzkCFD9x3QCN1L+z5zonTPlYv4KsRu0tGA8yMDI2MDkwMTAyMDQ0OVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTAxMDIwNDQ5WjAvBgkqhkiG9w0BCQQxIgQg2YwWnzGPhehuka8MMdfng0VJn1yOOrSuAB99cMrORJkwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwAy4JghX669DtMAxHnCcvK0+fbiy+qKeRZFtGoxenFhubOLdOvLpMyygY4Os1Yc0eAjEAsAIqcKWQ/rc8jY0vLBECry1zQLzH5tirL8IymyAFOqIRnXIsKZlh1gT12UEMGJjk"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"9vqC3xj4fb2a6WgdENFinwlKU/tsOdNOJcIfEQE0ecM="},"signature":"MEUCIQDjnZiqaw/XSKEhJQ/6d6mBjhBgMlvGZb9hVYeFuXtJrQIgNk0YPELldrCZ7jgcUzcJbyoDs1DjyWtG4+KIstiNELg="}}
@@ -0,0 +1,677 @@
1
+ {
2
+ "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
3
+ "bomFormat": "CycloneDX",
4
+ "specVersion": "1.6",
5
+ "version": 1,
6
+ "metadata": {
7
+ "tools": {
8
+ "components": [
9
+ {
10
+ "type": "application",
11
+ "name": "npm",
12
+ "version": "12.0.2"
13
+ },
14
+ {
15
+ "type": "library",
16
+ "name": "cyclonedx-library",
17
+ "group": "@cyclonedx",
18
+ "version": "10.2.0",
19
+ "author": "Jan Kowalleck",
20
+ "description": "Core functionality of CycloneDX for JavaScript (Node.js or WebBrowser).",
21
+ "licenses": [
22
+ {
23
+ "license": {
24
+ "id": "Apache-2.0"
25
+ }
26
+ }
27
+ ],
28
+ "externalReferences": [
29
+ {
30
+ "url": "https://github.com/CycloneDX/cyclonedx-javascript-library/issues",
31
+ "type": "issue-tracker",
32
+ "comment": "as detected from PackageJson property \"bugs.url\""
33
+ },
34
+ {
35
+ "url": "git+https://github.com/CycloneDX/cyclonedx-javascript-library.git",
36
+ "type": "vcs",
37
+ "comment": "as detected from PackageJson property \"repository.url\""
38
+ },
39
+ {
40
+ "url": "https://github.com/CycloneDX/cyclonedx-javascript-library#readme",
41
+ "type": "website",
42
+ "comment": "as detected from PackageJson property \"homepage\""
43
+ }
44
+ ],
45
+ "properties": [
46
+ {
47
+ "name": "cdx:npm:package:constraint:engine:node",
48
+ "value": ">=20.18.0"
49
+ }
50
+ ]
51
+ },
52
+ {
53
+ "type": "application",
54
+ "name": "cyclonedx-npm",
55
+ "group": "@cyclonedx",
56
+ "version": "6.0.0",
57
+ "author": "Jan Kowalleck",
58
+ "description": "Create CycloneDX Software Bill of Materials (SBOM) from NPM projects.",
59
+ "licenses": [
60
+ {
61
+ "license": {
62
+ "id": "Apache-2.0"
63
+ }
64
+ }
65
+ ],
66
+ "externalReferences": [
67
+ {
68
+ "url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
69
+ "type": "issue-tracker",
70
+ "comment": "as detected from PackageJson property \"bugs.url\""
71
+ },
72
+ {
73
+ "url": "git+https://github.com/CycloneDX/cyclonedx-node-npm.git",
74
+ "type": "vcs",
75
+ "comment": "as detected from PackageJson property \"repository.url\""
76
+ },
77
+ {
78
+ "url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
79
+ "type": "website",
80
+ "comment": "as detected from PackageJson property \"homepage\""
81
+ }
82
+ ],
83
+ "properties": [
84
+ {
85
+ "name": "cdx:npm:package:constraint:engine:node",
86
+ "value": ">=20.18.0"
87
+ },
88
+ {
89
+ "name": "cdx:npm:package:constraint:engine:npm",
90
+ "value": ">=9"
91
+ }
92
+ ]
93
+ }
94
+ ]
95
+ },
96
+ "component": {
97
+ "type": "application",
98
+ "name": "scifcode",
99
+ "group": "@numairbaseer",
100
+ "version": "0.3.0",
101
+ "bom-ref": "@numairbaseer/scifcode@0.3.0",
102
+ "description": "Scifcode: a coding CLI agent powered by Poolside Laguna.",
103
+ "licenses": [
104
+ {
105
+ "license": {
106
+ "name": "Proprietary",
107
+ "acknowledgement": "declared"
108
+ }
109
+ }
110
+ ],
111
+ "purl": "pkg:npm/%40numairbaseer/scifcode@0.3.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2Fnumairbaseer%2Fscifcode.git",
112
+ "externalReferences": [
113
+ {
114
+ "url": "https://github.com/numairbaseer/scifcode/issues",
115
+ "type": "issue-tracker",
116
+ "comment": "as detected from PackageJson property \"bugs.url\""
117
+ },
118
+ {
119
+ "url": "git+https://github.com/numairbaseer/scifcode.git",
120
+ "type": "vcs",
121
+ "comment": "as detected from PackageJson property \"repository.url\""
122
+ },
123
+ {
124
+ "url": "https://github.com/numairbaseer/scifcode#readme",
125
+ "type": "website",
126
+ "comment": "as detected from PackageJson property \"homepage\""
127
+ }
128
+ ],
129
+ "properties": [
130
+ {
131
+ "name": "cdx:npm:package:constraint:engine:node",
132
+ "value": ">=22.19.0"
133
+ },
134
+ {
135
+ "name": "cdx:npm:package:path",
136
+ "value": ""
137
+ }
138
+ ]
139
+ },
140
+ "properties": [
141
+ {
142
+ "name": "cdx:reproducible",
143
+ "value": "true"
144
+ }
145
+ ]
146
+ },
147
+ "components": [
148
+ {
149
+ "type": "library",
150
+ "name": "scifcode-runtime-darwin-arm64",
151
+ "group": "@numairbaseer",
152
+ "version": "0.3.0",
153
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-arm64@0.3.0",
154
+ "scope": "optional",
155
+ "licenses": [
156
+ {
157
+ "license": {
158
+ "id": "MIT",
159
+ "acknowledgement": "declared"
160
+ }
161
+ }
162
+ ],
163
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-darwin-arm64@0.3.0",
164
+ "externalReferences": [
165
+ {
166
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-darwin-arm64/-/scifcode-runtime-darwin-arm64-0.3.0.tgz",
167
+ "type": "distribution",
168
+ "hashes": [
169
+ {
170
+ "alg": "SHA-512",
171
+ "content": "cc4b0857e0e62538c0c9ce34560685159db5ec69ca5b9ad25e98c30729ab24569c0aeff2b4df37eaa919a7c3509313fe86b93fde9682c401fc9e08311762c3d5"
172
+ }
173
+ ],
174
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
175
+ }
176
+ ],
177
+ "properties": [
178
+ {
179
+ "name": "cdx:npm:package:path",
180
+ "value": "node_modules/@numairbaseer/scifcode-runtime-darwin-arm64"
181
+ }
182
+ ]
183
+ },
184
+ {
185
+ "type": "library",
186
+ "name": "scifcode-runtime-darwin-x64-baseline",
187
+ "group": "@numairbaseer",
188
+ "version": "0.3.0",
189
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-x64-baseline@0.3.0",
190
+ "scope": "optional",
191
+ "licenses": [
192
+ {
193
+ "license": {
194
+ "id": "MIT",
195
+ "acknowledgement": "declared"
196
+ }
197
+ }
198
+ ],
199
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-darwin-x64-baseline@0.3.0",
200
+ "externalReferences": [
201
+ {
202
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-darwin-x64-baseline/-/scifcode-runtime-darwin-x64-baseline-0.3.0.tgz",
203
+ "type": "distribution",
204
+ "hashes": [
205
+ {
206
+ "alg": "SHA-512",
207
+ "content": "e55ec7e050f6a4f6a2868ee51140409e66f3a8c0383ad32db95f841771e3f9ca08313529c9d8b764b6ed00f64ea35b9c03a2e7f599a34f4192b0b8c09ebde120"
208
+ }
209
+ ],
210
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
211
+ }
212
+ ],
213
+ "properties": [
214
+ {
215
+ "name": "cdx:npm:package:path",
216
+ "value": "node_modules/@numairbaseer/scifcode-runtime-darwin-x64-baseline"
217
+ }
218
+ ]
219
+ },
220
+ {
221
+ "type": "library",
222
+ "name": "scifcode-runtime-darwin-x64",
223
+ "group": "@numairbaseer",
224
+ "version": "0.3.0",
225
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-x64@0.3.0",
226
+ "scope": "optional",
227
+ "licenses": [
228
+ {
229
+ "license": {
230
+ "id": "MIT",
231
+ "acknowledgement": "declared"
232
+ }
233
+ }
234
+ ],
235
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-darwin-x64@0.3.0",
236
+ "externalReferences": [
237
+ {
238
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-darwin-x64/-/scifcode-runtime-darwin-x64-0.3.0.tgz",
239
+ "type": "distribution",
240
+ "hashes": [
241
+ {
242
+ "alg": "SHA-512",
243
+ "content": "d7f72ddbd03fb0516b14e96a42a9b8ccb9ac7c20a01184e8e7ec7591bab18e41a7b174375437917ba07a84eb9118801bc75b932dc755d1b2ac436970b7568b71"
244
+ }
245
+ ],
246
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
247
+ }
248
+ ],
249
+ "properties": [
250
+ {
251
+ "name": "cdx:npm:package:path",
252
+ "value": "node_modules/@numairbaseer/scifcode-runtime-darwin-x64"
253
+ }
254
+ ]
255
+ },
256
+ {
257
+ "type": "library",
258
+ "name": "scifcode-runtime-linux-arm64-musl",
259
+ "group": "@numairbaseer",
260
+ "version": "0.3.0",
261
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-arm64-musl@0.3.0",
262
+ "scope": "optional",
263
+ "licenses": [
264
+ {
265
+ "license": {
266
+ "id": "MIT",
267
+ "acknowledgement": "declared"
268
+ }
269
+ }
270
+ ],
271
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-linux-arm64-musl@0.3.0",
272
+ "externalReferences": [
273
+ {
274
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-linux-arm64-musl/-/scifcode-runtime-linux-arm64-musl-0.3.0.tgz",
275
+ "type": "distribution",
276
+ "hashes": [
277
+ {
278
+ "alg": "SHA-512",
279
+ "content": "af627809b8f33bff762606a36669a0c1ce5f093292be497bcd05400d8d81de8ba7eb49c0a13a1ee25063eabf71f3eee70073832e616fd5cef2d7b535aeb28d54"
280
+ }
281
+ ],
282
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
283
+ }
284
+ ],
285
+ "properties": [
286
+ {
287
+ "name": "cdx:npm:package:path",
288
+ "value": "node_modules/@numairbaseer/scifcode-runtime-linux-arm64-musl"
289
+ }
290
+ ]
291
+ },
292
+ {
293
+ "type": "library",
294
+ "name": "scifcode-runtime-linux-arm64",
295
+ "group": "@numairbaseer",
296
+ "version": "0.3.0",
297
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-arm64@0.3.0",
298
+ "scope": "optional",
299
+ "licenses": [
300
+ {
301
+ "license": {
302
+ "id": "MIT",
303
+ "acknowledgement": "declared"
304
+ }
305
+ }
306
+ ],
307
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-linux-arm64@0.3.0",
308
+ "externalReferences": [
309
+ {
310
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-linux-arm64/-/scifcode-runtime-linux-arm64-0.3.0.tgz",
311
+ "type": "distribution",
312
+ "hashes": [
313
+ {
314
+ "alg": "SHA-512",
315
+ "content": "8f89ed9a7f37e3227041f28eb84973eeced9e06d72b596d82aa6fe1ad1726ca85d75056f186cce8c6d43f2f6173ce5e5874ecf42e73c9edf204c465dfbe6cca0"
316
+ }
317
+ ],
318
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
319
+ }
320
+ ],
321
+ "properties": [
322
+ {
323
+ "name": "cdx:npm:package:path",
324
+ "value": "node_modules/@numairbaseer/scifcode-runtime-linux-arm64"
325
+ }
326
+ ]
327
+ },
328
+ {
329
+ "type": "library",
330
+ "name": "scifcode-runtime-linux-x64-baseline-musl",
331
+ "group": "@numairbaseer",
332
+ "version": "0.3.0",
333
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-baseline-musl@0.3.0",
334
+ "scope": "optional",
335
+ "licenses": [
336
+ {
337
+ "license": {
338
+ "id": "MIT",
339
+ "acknowledgement": "declared"
340
+ }
341
+ }
342
+ ],
343
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-linux-x64-baseline-musl@0.3.0",
344
+ "externalReferences": [
345
+ {
346
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-linux-x64-baseline-musl/-/scifcode-runtime-linux-x64-baseline-musl-0.3.0.tgz",
347
+ "type": "distribution",
348
+ "hashes": [
349
+ {
350
+ "alg": "SHA-512",
351
+ "content": "e72ebb235bb27a5f7831843a4c9dc2074a87cb8272193f191b4a10be932100744441a200df1f43300b2f21a57fe0aa943d155efd78dd5db0e0e76f9793bd9096"
352
+ }
353
+ ],
354
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
355
+ }
356
+ ],
357
+ "properties": [
358
+ {
359
+ "name": "cdx:npm:package:path",
360
+ "value": "node_modules/@numairbaseer/scifcode-runtime-linux-x64-baseline-musl"
361
+ }
362
+ ]
363
+ },
364
+ {
365
+ "type": "library",
366
+ "name": "scifcode-runtime-linux-x64-baseline",
367
+ "group": "@numairbaseer",
368
+ "version": "0.3.0",
369
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-baseline@0.3.0",
370
+ "scope": "optional",
371
+ "licenses": [
372
+ {
373
+ "license": {
374
+ "id": "MIT",
375
+ "acknowledgement": "declared"
376
+ }
377
+ }
378
+ ],
379
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-linux-x64-baseline@0.3.0",
380
+ "externalReferences": [
381
+ {
382
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-linux-x64-baseline/-/scifcode-runtime-linux-x64-baseline-0.3.0.tgz",
383
+ "type": "distribution",
384
+ "hashes": [
385
+ {
386
+ "alg": "SHA-512",
387
+ "content": "630587b514cdb40bc2d985366da7cd111098a36690eb159eafec1855b89cf54c0b78bce43032b3f520485382a5b476554eae3b9acc2bf810865736e9101b40fa"
388
+ }
389
+ ],
390
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
391
+ }
392
+ ],
393
+ "properties": [
394
+ {
395
+ "name": "cdx:npm:package:path",
396
+ "value": "node_modules/@numairbaseer/scifcode-runtime-linux-x64-baseline"
397
+ }
398
+ ]
399
+ },
400
+ {
401
+ "type": "library",
402
+ "name": "scifcode-runtime-linux-x64-musl",
403
+ "group": "@numairbaseer",
404
+ "version": "0.3.0",
405
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-musl@0.3.0",
406
+ "scope": "optional",
407
+ "licenses": [
408
+ {
409
+ "license": {
410
+ "id": "MIT",
411
+ "acknowledgement": "declared"
412
+ }
413
+ }
414
+ ],
415
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-linux-x64-musl@0.3.0",
416
+ "externalReferences": [
417
+ {
418
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-linux-x64-musl/-/scifcode-runtime-linux-x64-musl-0.3.0.tgz",
419
+ "type": "distribution",
420
+ "hashes": [
421
+ {
422
+ "alg": "SHA-512",
423
+ "content": "0c5157cf534e1a2dabe508e0802306a00a264d05da3294e6b577e76976d782f78e447bba1d2a63e8442dfb0e824c020f5be3fcfd27e76848a872712a0de44a5d"
424
+ }
425
+ ],
426
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
427
+ }
428
+ ],
429
+ "properties": [
430
+ {
431
+ "name": "cdx:npm:package:path",
432
+ "value": "node_modules/@numairbaseer/scifcode-runtime-linux-x64-musl"
433
+ }
434
+ ]
435
+ },
436
+ {
437
+ "type": "library",
438
+ "name": "scifcode-runtime-linux-x64",
439
+ "group": "@numairbaseer",
440
+ "version": "0.3.0",
441
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64@0.3.0",
442
+ "scope": "optional",
443
+ "licenses": [
444
+ {
445
+ "license": {
446
+ "id": "MIT",
447
+ "acknowledgement": "declared"
448
+ }
449
+ }
450
+ ],
451
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-linux-x64@0.3.0",
452
+ "externalReferences": [
453
+ {
454
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-linux-x64/-/scifcode-runtime-linux-x64-0.3.0.tgz",
455
+ "type": "distribution",
456
+ "hashes": [
457
+ {
458
+ "alg": "SHA-512",
459
+ "content": "9af6c05e64e6466a09405b7225953f25475a26f4adac7919b57311f8acaf5d2ccd610510ef6be8e32f529cf51ac4e684dfb027764a19548940e9b8fa9dd04a15"
460
+ }
461
+ ],
462
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
463
+ }
464
+ ],
465
+ "properties": [
466
+ {
467
+ "name": "cdx:npm:package:path",
468
+ "value": "node_modules/@numairbaseer/scifcode-runtime-linux-x64"
469
+ }
470
+ ]
471
+ },
472
+ {
473
+ "type": "library",
474
+ "name": "scifcode-runtime-windows-arm64",
475
+ "group": "@numairbaseer",
476
+ "version": "0.3.0",
477
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-arm64@0.3.0",
478
+ "scope": "optional",
479
+ "licenses": [
480
+ {
481
+ "license": {
482
+ "id": "MIT",
483
+ "acknowledgement": "declared"
484
+ }
485
+ }
486
+ ],
487
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-windows-arm64@0.3.0",
488
+ "externalReferences": [
489
+ {
490
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-windows-arm64/-/scifcode-runtime-windows-arm64-0.3.0.tgz",
491
+ "type": "distribution",
492
+ "hashes": [
493
+ {
494
+ "alg": "SHA-512",
495
+ "content": "72ccf3a6301c8dbb89db7c3c1b830516774fcc37af907c15e4f7aa0932bf07c3579c33e09775ffd8d431579e79ae0e1d1484485083b605f4a5f1f4e654edb40c"
496
+ }
497
+ ],
498
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
499
+ }
500
+ ],
501
+ "properties": [
502
+ {
503
+ "name": "cdx:npm:package:path",
504
+ "value": "node_modules/@numairbaseer/scifcode-runtime-windows-arm64"
505
+ }
506
+ ]
507
+ },
508
+ {
509
+ "type": "library",
510
+ "name": "scifcode-runtime-windows-x64-baseline",
511
+ "group": "@numairbaseer",
512
+ "version": "0.3.0",
513
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-x64-baseline@0.3.0",
514
+ "scope": "optional",
515
+ "licenses": [
516
+ {
517
+ "license": {
518
+ "id": "MIT",
519
+ "acknowledgement": "declared"
520
+ }
521
+ }
522
+ ],
523
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-windows-x64-baseline@0.3.0",
524
+ "externalReferences": [
525
+ {
526
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-windows-x64-baseline/-/scifcode-runtime-windows-x64-baseline-0.3.0.tgz",
527
+ "type": "distribution",
528
+ "hashes": [
529
+ {
530
+ "alg": "SHA-512",
531
+ "content": "24a9128da5b85709eb94f6ea6c728eb557aefee65221ac13891b68e312c39c0f61abb5d835d95614bd804c6424d11daebe9a13098befa2d57e8857cc452f1bb3"
532
+ }
533
+ ],
534
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
535
+ }
536
+ ],
537
+ "properties": [
538
+ {
539
+ "name": "cdx:npm:package:path",
540
+ "value": "node_modules/@numairbaseer/scifcode-runtime-windows-x64-baseline"
541
+ }
542
+ ]
543
+ },
544
+ {
545
+ "type": "library",
546
+ "name": "scifcode-runtime-windows-x64",
547
+ "group": "@numairbaseer",
548
+ "version": "0.3.0",
549
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-x64@0.3.0",
550
+ "scope": "optional",
551
+ "licenses": [
552
+ {
553
+ "license": {
554
+ "id": "MIT",
555
+ "acknowledgement": "declared"
556
+ }
557
+ }
558
+ ],
559
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime-windows-x64@0.3.0",
560
+ "externalReferences": [
561
+ {
562
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime-windows-x64/-/scifcode-runtime-windows-x64-0.3.0.tgz",
563
+ "type": "distribution",
564
+ "hashes": [
565
+ {
566
+ "alg": "SHA-512",
567
+ "content": "532aa3e20824a694c764827b93e28103f6b0ea4c795800e78e1f64815b186be367f341616436ad24b576d7550f7b1d71d379476f0d8c9da78febb8acd4ba97a5"
568
+ }
569
+ ],
570
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
571
+ }
572
+ ],
573
+ "properties": [
574
+ {
575
+ "name": "cdx:npm:package:path",
576
+ "value": "node_modules/@numairbaseer/scifcode-runtime-windows-x64"
577
+ }
578
+ ]
579
+ },
580
+ {
581
+ "type": "library",
582
+ "name": "scifcode-runtime",
583
+ "group": "@numairbaseer",
584
+ "version": "0.3.0",
585
+ "bom-ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime@0.3.0",
586
+ "licenses": [
587
+ {
588
+ "license": {
589
+ "id": "MIT",
590
+ "acknowledgement": "declared"
591
+ }
592
+ }
593
+ ],
594
+ "purl": "pkg:npm/%40numairbaseer/scifcode-runtime@0.3.0",
595
+ "externalReferences": [
596
+ {
597
+ "url": "https://registry.npmjs.org/@numairbaseer/scifcode-runtime/-/scifcode-runtime-0.3.0.tgz",
598
+ "type": "distribution",
599
+ "hashes": [
600
+ {
601
+ "alg": "SHA-512",
602
+ "content": "808cf270df03cd8cca0b0755ef12680f2e31ee56e4621bbdef0ad600973783c81f25fdd59c4223dac99c7c59e481b2a5116304cbd166496b3108eefc52425571"
603
+ }
604
+ ],
605
+ "comment": "as detected from npm-ls property \"resolved\" and property \"integrity\""
606
+ }
607
+ ],
608
+ "properties": [
609
+ {
610
+ "name": "cdx:npm:package:path",
611
+ "value": "node_modules/@numairbaseer/scifcode-runtime"
612
+ }
613
+ ]
614
+ }
615
+ ],
616
+ "dependencies": [
617
+ {
618
+ "ref": "@numairbaseer/scifcode@0.3.0",
619
+ "dependsOn": [
620
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime@0.3.0"
621
+ ]
622
+ },
623
+ {
624
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-arm64@0.3.0"
625
+ },
626
+ {
627
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-x64-baseline@0.3.0"
628
+ },
629
+ {
630
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-x64@0.3.0"
631
+ },
632
+ {
633
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-arm64-musl@0.3.0"
634
+ },
635
+ {
636
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-arm64@0.3.0"
637
+ },
638
+ {
639
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-baseline-musl@0.3.0"
640
+ },
641
+ {
642
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-baseline@0.3.0"
643
+ },
644
+ {
645
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-musl@0.3.0"
646
+ },
647
+ {
648
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64@0.3.0"
649
+ },
650
+ {
651
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-arm64@0.3.0"
652
+ },
653
+ {
654
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-x64-baseline@0.3.0"
655
+ },
656
+ {
657
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-x64@0.3.0"
658
+ },
659
+ {
660
+ "ref": "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime@0.3.0",
661
+ "dependsOn": [
662
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-arm64@0.3.0",
663
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-x64-baseline@0.3.0",
664
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-darwin-x64@0.3.0",
665
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-arm64-musl@0.3.0",
666
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-arm64@0.3.0",
667
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-baseline-musl@0.3.0",
668
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-baseline@0.3.0",
669
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64-musl@0.3.0",
670
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-linux-x64@0.3.0",
671
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-arm64@0.3.0",
672
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-x64-baseline@0.3.0",
673
+ "@numairbaseer/scifcode@0.3.0|@numairbaseer/scifcode-runtime-windows-x64@0.3.0"
674
+ ]
675
+ }
676
+ ]
677
+ }
package/src/cli.js CHANGED
@@ -1,10 +1,8 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
4
1
  import { ensureScifcodeConfig } from "./ensure-scifcode-config.js";
5
2
  import { loadScifcodeEnv } from "./env-config.js";
6
3
  import { runRuntime } from "./run-runtime.js";
7
4
  import { login, logout, whoami } from "./control-plane-auth.js";
5
+ import packageJson from "../package.json" with { type: "json" };
8
6
 
9
7
  export function printHelp(stdout = console.log) {
10
8
  stdout(`Scifcode - coding CLI agent powered by Poolside Laguna
@@ -30,11 +28,7 @@ Private config files:
30
28
  }
31
29
 
32
30
  export function getPackageVersion() {
33
- const currentFile = fileURLToPath(import.meta.url);
34
- const srcDir = path.dirname(currentFile);
35
- const packagePath = path.join(srcDir, "..", "package.json");
36
- const pkg = JSON.parse(fs.readFileSync(packagePath, "utf8"));
37
- return pkg.version;
31
+ return packageJson.version;
38
32
  }
39
33
 
40
34
  function createConsoleWriters(stdout, stderr) {
@@ -0,0 +1,86 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { spawnSync } from "node:child_process";
6
+
7
+ function runGit(args, options = {}) {
8
+ const result = (options.spawnSyncFn || spawnSync)("git", args, {
9
+ cwd: options.cwd,
10
+ env: options.env,
11
+ encoding: "utf8",
12
+ stdio: ["ignore", "pipe", "pipe"]
13
+ });
14
+ if (result.error) throw result.error;
15
+ if (result.status !== 0) {
16
+ throw new Error(String(result.stderr || "Git command failed.").trim());
17
+ }
18
+ return String(result.stdout || "").trim();
19
+ }
20
+
21
+ function snapshotWorkingTree(repoDir, options = {}) {
22
+ const temporaryDir = fs.mkdtempSync(path.join(options.tmpDir || os.tmpdir(), "scifcode-git-index-"));
23
+ const indexPath = path.join(temporaryDir, "index");
24
+ const env = { ...(options.env || process.env), GIT_INDEX_FILE: indexPath };
25
+ try {
26
+ try {
27
+ runGit(["read-tree", "HEAD"], { ...options, cwd: repoDir, env });
28
+ } catch {
29
+ runGit(["read-tree", "--empty"], { ...options, cwd: repoDir, env });
30
+ }
31
+ runGit(["add", "-A"], { ...options, cwd: repoDir, env });
32
+ return runGit(["write-tree"], { ...options, cwd: repoDir, env });
33
+ } finally {
34
+ fs.rmSync(temporaryDir, { recursive: true, force: true });
35
+ }
36
+ }
37
+
38
+ function countChangedLines(numstat) {
39
+ return numstat.split("\n").reduce((total, line) => {
40
+ if (!line) return total;
41
+ const [added, deleted] = line.split("\t");
42
+ const additions = Number.parseInt(added, 10);
43
+ const deletions = Number.parseInt(deleted, 10);
44
+ return total
45
+ + (Number.isNaN(additions) ? 0 : additions)
46
+ + (Number.isNaN(deletions) ? 0 : deletions);
47
+ }, 0);
48
+ }
49
+
50
+ export function createCodeUsageReporter(options = {}) {
51
+ const cwd = options.cwd || process.cwd();
52
+ let repoDir;
53
+ let startingTree;
54
+ try {
55
+ repoDir = runGit(["rev-parse", "--show-toplevel"], { ...options, cwd });
56
+ startingTree = snapshotWorkingTree(repoDir, options);
57
+ } catch {
58
+ return null;
59
+ }
60
+
61
+ const eventId = (options.randomUUIDFn || crypto.randomUUID)();
62
+ return {
63
+ eventId,
64
+ async report() {
65
+ const endingTree = snapshotWorkingTree(repoDir, options);
66
+ const numstat = runGit(["diff", "--no-ext-diff", "--numstat", startingTree, endingTree], {
67
+ ...options,
68
+ cwd: repoDir,
69
+ env: options.env || process.env
70
+ });
71
+ const linesChanged = countChangedLines(numstat);
72
+ const response = await (options.fetchFn || fetch)(`${options.controlPlaneUrl}/usage/code`, {
73
+ method: "POST",
74
+ headers: {
75
+ authorization: `Bearer ${options.sessionToken}`,
76
+ "content-type": "application/json"
77
+ },
78
+ body: JSON.stringify({ eventId, linesChanged })
79
+ });
80
+ if (!response.ok) {
81
+ throw new Error(`Control-plane request failed: HTTP ${response.status}`);
82
+ }
83
+ return { eventId, linesChanged };
84
+ }
85
+ };
86
+ }
package/src/constants.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export const DEFAULT_PROVIDER_NAME = "scifcode";
2
2
  export const DEFAULT_CONTROL_PLANE_URL = "http://localhost:8080";
3
- export const DEFAULT_MODEL = "scifcode-1.0";
4
- export const DEFAULT_MODEL_NAME = "scifcode-1.0";
3
+ export const DEFAULT_MODEL = "scifcoder-1.0";
4
+ export const DEFAULT_MODEL_NAME = "scifcoder-1.0";
5
5
  export const DEFAULT_CONTEXT_WINDOW = 32768;
6
6
  export const DEFAULT_MAX_TOKENS = 8192;
7
7
  export const SESSION_TOKEN_ENV_NAME = "SCIFCODE_SESSION_TOKEN";
@@ -3,8 +3,9 @@ import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { spawn } from "node:child_process";
5
5
  import { fileURLToPath } from "node:url";
6
- import { DEFAULT_MODEL, DEFAULT_PROVIDER_NAME, SESSION_TOKEN_ENV_NAME } from "./constants.js";
6
+ import { DEFAULT_MODEL, DEFAULT_PROVIDER_NAME, SESSION_TOKEN_ENV_NAME, getControlPlaneUrl } from "./constants.js";
7
7
  import { readSession } from "./control-plane-auth.js";
8
+ import { createCodeUsageReporter } from "./code-usage.js";
8
9
 
9
10
  function executableOnPath(name, env = process.env) {
10
11
  return String(env.PATH || "").split(path.delimiter).map(dir => path.join(dir, name)).find(fs.existsSync);
@@ -25,12 +26,21 @@ function findInstalledRuntime(options = {}) {
25
26
  }
26
27
  }
27
28
 
29
+ function findBundledRuntime(options = {}) {
30
+ const runtimePlatform = options.platform || process.platform;
31
+ const binaryName = runtimePlatform === "win32" ? "scifcode-runtime.exe" : "scifcode-runtime";
32
+ const candidate = path.join(path.dirname(options.execPath || process.execPath), binaryName);
33
+ return fs.existsSync(candidate) ? candidate : undefined;
34
+ }
35
+
28
36
  export function resolveRuntime(options = {}) {
29
37
  const env = options.env || process.env;
30
38
  if (env.SCIFCODE_RUNTIME_BIN) {
31
39
  if (!fs.existsSync(env.SCIFCODE_RUNTIME_BIN)) throw new Error(`SCIFCODE_RUNTIME_BIN does not exist: ${env.SCIFCODE_RUNTIME_BIN}`);
32
40
  return { command: env.SCIFCODE_RUNTIME_BIN, argsPrefix: [], source: "binary" };
33
41
  }
42
+ const bundledBin = findBundledRuntime(options);
43
+ if (bundledBin) return { command: bundledBin, argsPrefix: [], source: "binary" };
34
44
  const installedBin = findInstalledRuntime(options);
35
45
  if (installedBin) return { command: installedBin, argsPrefix: [], source: "package" };
36
46
  const sourceDir = env.SCIFCODE_SOURCE_DIR || defaultSourceDir();
@@ -86,6 +96,7 @@ export function buildRuntimeEnv(env = process.env, options = {}) {
86
96
  const runtimeEnv = { ...env };
87
97
  if (!runtimeEnv[SESSION_TOKEN_ENV_NAME]) {
88
98
  const session = (options.readSessionFn || readSession)({ homeDir: options.homeDir });
99
+ options.onSession?.(session);
89
100
  const expiresAt = session?.expiresAt ? Date.parse(session.expiresAt) : Number.POSITIVE_INFINITY;
90
101
  if (session?.sessionToken && expiresAt > Date.now()) {
91
102
  runtimeEnv[SESSION_TOKEN_ENV_NAME] = session.sessionToken;
@@ -105,18 +116,38 @@ export function runRuntime(userArgs = [], options = {}) {
105
116
  const env = options.env || process.env;
106
117
  const stderr = options.stderr || console.error;
107
118
  const exit = options.exit || process.exit;
108
- const runtimeEnv = buildRuntimeEnv(env, options);
119
+ let storedSession;
120
+ const runtimeEnv = buildRuntimeEnv(env, {
121
+ ...options,
122
+ onSession: session => { storedSession = session; }
123
+ });
109
124
  if (!validateSession(runtimeEnv)) { printMissingSession(stderr); exit(1); return null; }
110
125
  let runtime;
111
126
  try { runtime = (options.resolveRuntimeFn || resolveRuntime)({ env }); }
112
127
  catch (error) { stderr("Failed to resolve the Scifcode agent runtime."); stderr(error.message); exit(1); return null; }
113
128
  const projectDir = options.cwd || process.cwd();
129
+ let codeUsageReporter;
130
+ try {
131
+ codeUsageReporter = (options.createCodeUsageReporterFn || createCodeUsageReporter)({
132
+ cwd: projectDir,
133
+ env: runtimeEnv,
134
+ sessionToken: runtimeEnv[SESSION_TOKEN_ENV_NAME],
135
+ controlPlaneUrl: storedSession?.controlPlaneUrl || getControlPlaneUrl(env),
136
+ fetchFn: options.fetchFn
137
+ });
138
+ } catch (error) {
139
+ stderr(`Could not start Git diff tracking: ${error.message}`);
140
+ }
114
141
  const child = (options.spawnFn || spawn)(runtime.command, buildRuntimeArgs(userArgs, runtimeEnv, runtime, projectDir), {
115
142
  stdio: "inherit",
116
143
  env: runtimeEnv,
117
144
  cwd: runtime.cwd || projectDir
118
145
  });
119
- child.on("exit", code => exit(code ?? 0));
146
+ child.on("exit", code => {
147
+ Promise.resolve(codeUsageReporter?.report())
148
+ .catch(error => stderr(`Could not report code usage: ${error.message}`))
149
+ .finally(() => exit(code ?? 0));
150
+ });
120
151
  child.on("error", error => { stderr("Failed to launch Scifcode."); stderr(error.message); exit(1); });
121
152
  return child;
122
153
  }