@numairbaseer/scifcode 0.2.0 → 0.3.1

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,49 @@ 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.1-offline-SHA256SUMS \
37
+ --bundle scifcode-0.3.1-offline-SHA256SUMS.sigstore.json \
38
+ --certificate-identity \
39
+ https://github.com/numairbaseer/scifcode/.github/workflows/release-cli.yml@refs/tags/v0.3.1 \
40
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com
41
+ sha256sum -c scifcode-0.3.1-offline-SHA256SUMS
42
+ tar -xzf scifcode-0.3.1-linux-x64-baseline.tar.gz
43
+ cd scifcode-0.3.1-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 runtime version pinned in `package.json` before tagging the CLI.
64
+ The CLI workflow downloads that exact platform runtime package, compiles the
65
+ launcher, and attaches the completed offline archives to the CLI release.
66
+
24
67
  ## Log in
25
68
 
26
69
  Authenticate once through the Scifcode control-plane portal. The CLI opens a
@@ -67,8 +110,8 @@ This happens before the runtime launches, so no separate initialization command
67
110
  | --- | ---: | --- | --- |
68
111
  | `SCIFCODE_CONTROL_PLANE_URL` | no | `http://localhost:8080` | Alternative to `login --control-plane`; useful for managed installation and automation |
69
112
  | `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` |
113
+ | `SCIFCODE_CONTEXT_WINDOW` | no | `32768` | Context window reported for `scifcoder-1.0` |
114
+ | `SCIFCODE_MAX_TOKENS` | no | `8192` | Maximum output tokens reported for `scifcoder-1.0` |
72
115
  | `SCIFCODE_RUNTIME_BIN` | no | installed platform package | Override path to a compiled Scifcode runtime binary |
73
116
  | `SCIFCODE_SOURCE_DIR` | no | adjacent `../scifcode` | Development-only path to the Scifcode source fork |
74
117
  | `SCIFCODE_BUN_BIN` | no | auto-detected | Development-only Bun executable used to run the fork from source |
@@ -126,6 +169,13 @@ Scifcode launches the installed platform runtime directly with argument arrays
126
169
  and does not use shell string execution. Bun/source execution remains available
127
170
  only as a local-development fallback.
128
171
 
172
+ For usage analytics, Scifcode snapshots the Git working tree when an agent
173
+ session starts and reports the aggregate number of added and deleted lines when
174
+ the session ends. The snapshot uses an isolated temporary Git index, so staged,
175
+ unstaged, and untracked work that existed before the session is preserved and
176
+ excluded from the count. Source code and file names are never sent to the
177
+ control plane.
178
+
129
179
  ## Third-party notices
130
180
 
131
181
  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.1",
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
+ 5beb76ad4360faf39923650154f96ee29ded1d8906c6d79b261d7d3f1fda8dbf scifcode-0.3.1-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":"2670411872","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1788228646","inclusionPromise":{"signedEntryTimestamp":"MEYCIQDeIPHDGbBDrT/m2ZoSY/dbYzWLvZfNnYZxOjC9B5Jm2QIhAK9rppYhd66VCtuWvP89kIZAFhA+LsEpnSNFhGqvYRbN"},"inclusionProof":{"logIndex":"2548507610","rootHash":"T1hVm5Lc3d7fxEJnT0vZGQnGT1wpRmvDoM82e/n7Trs=","treeSize":"2548507621","hashes":["gzrVdbRVYdpDYfyKfkyYcdHwvW5kXzgdzpDosoathzc=","fBOeOdh0ALzbBEb1xpuKC0dj5uB1sf9/L5VD6AXw2dA=","/UafA0mVumaLdy5pHOmqNPrJuA0/MyaPmv66FU+UrKY=","4qSIsYbu+jJRQLPIyWdcwX1JOL932GlxMfTbN9P1ILU=","kefwyD4VVZ6zJ6lM6lBkCRYHlrWBzt0Xd7iTLSwOZZI=","s27wSf9BtallmmRNl1Vw5CCB31c+iNqbZjr6WRd/AHY=","g1XF/Cx8/L7zdSwJ3ZaRl7MinXzpKpwq7dFnc35g3Qs=","LaUpfWF691yffmNygzUYYFcpCC7k3qPCitIVLPoT1Cs=","vdpV1ekwa/0Trf5VU4mKX7PGA9b73/vpM8+FXGvKzSE=","oWYAl2jSrRUQEAa3+fdE49fU0P9jgvjM87YVoOHCBTc=","XVeI+RQJkmWTR3ECAxsWEv0r8XKYqVbwRNylmkn3Ztw=","8IqZjcuovBbRPA+94+DQEZJsh/4likdrpfmNVDIBgP8=","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\n2548507621\nT1hVm5Lc3d7fxEJnT0vZGQnGT1wpRmvDoM82e/n7Trs=\n\n— rekor.sigstore.dev wNI9ajBGAiEAyMujrvFM3K+ol2G8fCbHNCs+Ev1t4ke/XzgFpIloFP4CIQDGQa13BCdLmR6XqmN+8ye+pfgkqr6eZY2dFuMChWzWYw==\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjZjhlZjRmYzA0YWQ4ZTRjYjlkZDIyYWY1Mzc2ZmQxYzEwYmNhYzczODNlNWIzY2I3YzdkMDBmMGE3YzJhODhhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNEZFdRZ0s4RFNtd2MvaFNEOE5OakRuMjk4TEVHVFdnR0Rza3VVVzh4eUJRSWdJM21ZTFJpNThoTnlBOEZvcEFkSi9hN2ZwcDhPNUFTZjJrcUlmdk0yNWRRPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFNWRU5EUW5OMVowRjNTVUpCWjBsVlIwRk9WVVZMVTNSMU9GWmtkRGQ0V2pOU1Uyd3ZjMmRRYkRkSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUVhoTlJFbDRUVVJSTWxkb1kwNU5hbGwzVDFSQmVFMUVTWGxOUkZFeVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZSV1dnNVJWaEpSalkyYzNaVFNXODBUM05CWVhRMFpqbEJOVEpqWjFGMWVsbFFjVUlLY2pVNFEwTlROelI1TDJSSVJrdHpNemt4U21wUFRITnllWHBLWkRKb1ZHMWpXSFJOZDBaRWJDOXdNa00wTVhSWVVVdFBRMEpsYjNkbloxaHRUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlY0Um1kb0NsQlBTazlJT0dSdWRIVjNja1ZuWWt0SlIwUmFTV2hCZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGUldVUldVakJTUVZGSUwwSkdPSGRZV1ZwaVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERJMU1XSlhSbkJqYlVwb1l6SldiQXBqYVRsNldUSnNiVmt5T1d0YVV6aDFXakpzTUdGSVZtbE1NMlIyWTIxMGJXSkhPVE5qZVRsNVdsZDRiRmxZVG14TVYwNXpZVk0xTldKWGVFRmpiVlp0Q21ONU9UQlpWMlI2VEROWmQweHFUWFZOVkVFMVFtZHZja0puUlVWQldVOHZUVUZGUWtKRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhZS1ltNU5kVm95YkRCaFNGWnBaRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOUWtsSFEybHpSMEZSVVVKbk56aDNRVkZKUlVKSVFqRmpNbWQzVG1kWlN3cExkMWxDUWtGSFJIWjZRVUpCZDFGdlRXcFdhMDV0VFhwT2JWRjRUMFJKZDAxRVNYaGFWRkV6VFdwak1FOUVUbXhOVkd0NlQxUldhMDlFWTNkYWFtTjVDazFYUlRKWmVrRnFRbWR2Y2tKblJVVkJXVTh2VFVGRlJVSkNWbE5hVjNoc1dWaE9iRWxHVGtSVFZWbG5VVEk1YTFwVFFrUlVSV3QzU1hkWlMwdDNXVUlLUWtGSFJIWjZRVUpDVVZGV1ltNVdkRmxYYkhsWmJVWjZXbGRXZVV3elRtcGhWMXBxWWpKU2JFMUNORWREYVhOSFFWRlJRbWMzT0hkQlVWbEZSVWhLYkFwYWJrMTJaRWRHYm1ONU9USk5RelI2VEdwRmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacUNtUkhiSFppYmsxMVdqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUhjMGREYVhOSFFWRlJRbWMzT0hkQlVXdEZXRkY0WW1GSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWpVeFlsZEdjR050U21oak1sWnNZMms1ZWxreWJHMVpNamxyV2xNNGRWb3liREJoU0ZacFRETmtkZ3BqYlhSdFlrYzVNMk41T1hsYVYzaHNXVmhPYkV4WFRuTmhVelUxWWxkNFFXTnRWbTFqZVRrd1dWZGtla3d6V1hkTWFrMTFUVlJCTkVKbmIzSkNaMFZGQ2tGWlR5OU5RVVZMUWtOdlRVdEVTVEZhUkZwcVRYcGFhMDFVWjNsTlJFRjVUVmRWTUU1NlNUTk9SR2Q2V2xSRk5VMTZhekZhUkdjelRVZFpNMDFxUm1nS1RtMU5kMGhSV1V0TGQxbENRa0ZIUkhaNlFVSkRkMUZRUkVFeGJtRllVbTlrVjBsMFlVYzVlbVJIVm10TlJHZEhRMmx6UjBGUlVVSm5OemgzUVZGM1JRcExaM2R2WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREkxTVdKWFJuQmpiVXBvWXpKV2JHTnBPWHBaTW14dFdUSTVhMXBVUVRSQ1oyOXlDa0puUlVWQldVOHZUVUZGVGtKRGIwMUxSRWt4V2tSYWFrMTZXbXROVkdkNVRVUkJlVTFYVlRCT2Vra3pUa1JuZWxwVVJUVk5lbXN4V2tSbk0wMUhXVE1LVFdwR2FFNXRUWGRKUVZsTFMzZFpRa0pCUjBSMmVrRkNSR2RSVTBSQ1FubGFWMXA2VEROU2FGb3pUWFprYWtGMVRYazBlRTFDYjBkRGFYTkhRVkZSUWdwbk56aDNRVkU0UlVSQmQwdE5WRTB3VG1wVk1VMVVWWGxPUkVGMlFtZHZja0puUlVWQldVOHZUVUZGVVVKRFJVMUlNbWd3WkVoQ2VrOXBPSFphTW13d0NtRklWbWxNYlU1MllsTTVkV1JYTVdoaFdFcHBXVmhPYkZwWVNYZEhRVmxMUzNkWlFrSkJSMFIyZWtGQ1JWRlJTMFJCWjNoTmFsa3pUMFJCTWs5RVFuSUtRbWR2Y2tKblJVVkJXVTh2VFVGRlUwSkdNRTFYTW1nd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemwxWkZjeGFHRllTbWxaV0U1c1dsaEpkZ3BqTWs1d1dtMU9kbHBIVlhaTWJXUndaRWRvTVZscE9UTmlNMHB5V20xNGRtUXpUWFpqYlZaeldsZEdlbHBUTVdwaVIydDFaVmN4YzFGSVNteGFiazEyQ21SSFJtNWplVGt5VFVNMGVreHFSWGRQUVZsTFMzZFpRa0pCUjBSMmVrRkNSWGRSY1VSRFozbE9WMUV5V1hwTk1scEVSVFJOYWtGM1RXcEdiRTVFWTNrS1RucFJORTB5VlhoUFZFMDFUbGRSTkU1NlFtMU9la2w0V1ZSYWFrMUNVVWREYVhOSFFWRlJRbWMzT0hkQlVsRkZRbWQzUldOSVZucGhSRUpqUW1kdmNncENaMFZGUVZsUEwwMUJSVlpDUlRSTlZFZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZtbE1iVTUyWWxNNWRXUlhNV2hoV0VwcFdWaE9iRnBZU1haak1rNXdDbHB0VG5aYVIxVjJXVmRPTUdGWE9YVmplVGw1WkZjMWVreDZUWHBPUkZsNFRsUkpOVTVxUVRKTU1rWXdaRWRXZEdOSVVucE1la1YzUm5kWlMwdDNXVUlLUWtGSFJIWjZRVUpHWjFGS1JFRmtkMk50YkRKWldGSnNUVUpOUjBOcGMwZEJVVkZDWnpjNGQwRlNZMFZDVVhkRVltNUNkRTFGTkVkRGFYTkhRVkZSUWdwbk56aDNRVkpuUlZGQmR5dGpiVlozWW5wd2RXUlhNV2hoV0VwcFdWaE9iRnBZU2tGTlZFa3lUbnBuZDA1cVozWmpNazV3V20xT2RscEhWa0ZOVkUwd0NrNXFWVEZOVkZWNVRrUndiR0p1V25CamJUbDFZbGRXZFdSRWNIVmpSekIzWjFsclIwTnBjMGRCVVZGQ01XNXJRMEpCU1VWbGQxSTFRVWhqUVdSUlJHUUtVRlJDY1hoelkxSk5iVTFhU0doNVdscDZZME52YTNCbGRVNDBPSEptSzBocGJrdEJUSGx1ZFdwblFVRkJZVUpoZFRkWlprRkJRVVZCZDBKSFRVVlJRd3BKUkN0WFZWSTFaak5DV1VkYVVVRnZVekpNYVZJNFdIRnZkbXBJZVc5eVpIVXZSVkE0VWpGc2RHeG5kVUZwUVUxa04yOXplR2RKSzFsaFdWcG5jM2hwQ25nd2JWVkhSSEkwYlRaR04wVnBjM2h3Y0dveFpFMTBTbU5FUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV2UVVSQ2JFRnFSVUU1YVV4MlVVbEROM2RxUkVNS1RUVjZVRk16VVdFMVJtUnhjbUZEY0hSUksyOHdaVmhIUW1wdVdFeDFlVlJSYjJkdk9USkNPR0UxUW1KTll5dDFkRXd6YlVGcVFVaFlOV1ZrVldORlVRcFljMlJQUzB4TFVEZHhNMmhMS3pCSVJIUXhTakpvVVZodFlrWXJaR041Y3pWU09UaExOWGt2YWpKU1VWSXpaRlJwV2xaMU1EUlpQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQg395HrEir3Q3iv8q+QQIcYv8uGkQQrilwfOnQIePzJ4UCFQDhP1i531hQtBSQ9D+g1x9vcTtAlBgPMjAyNjA5MDEwMjEwNDZaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHaMIIB1gIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDkwMTAyMTA0NlowLwYJKoZIhvcNAQkEMSIEIEiO/tyD8mRn/vTD+9KQjWblSrKX6X/gdcwEehFik2hmMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRmMGQCMHJ4B3yF+aMyEaN1ExdPGdWTUmgSvlA3YO944MER8zsklq1ATY4OLJWemyX0X43hVgIwRzksemJjxSZMeQL+15uiaduiHZdhdG/u9xnwZXjT6Qcr7S1CIN3nYDT/OWDKNxOq"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"z470/AStjky53SKvU3b9HBC8rHOD5bPLfH0A8KfCqIo="},"signature":"MEUCIQCDdWQgK8DSmwc/hSD8NNjDn298LEGTWgGDskuUW8xyBQIgI3mYLRi58hNyA8FopAdJ/a7fpp8O5ASf2kqIfvM25dQ="}}
@@ -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.1",
101
+ "bom-ref": "@numairbaseer/scifcode@0.3.1",
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.1?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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1|@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.1",
619
+ "dependsOn": [
620
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime@0.3.0"
621
+ ]
622
+ },
623
+ {
624
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-darwin-arm64@0.3.0"
625
+ },
626
+ {
627
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-darwin-x64-baseline@0.3.0"
628
+ },
629
+ {
630
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-darwin-x64@0.3.0"
631
+ },
632
+ {
633
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-arm64-musl@0.3.0"
634
+ },
635
+ {
636
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-arm64@0.3.0"
637
+ },
638
+ {
639
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64-baseline-musl@0.3.0"
640
+ },
641
+ {
642
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64-baseline@0.3.0"
643
+ },
644
+ {
645
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64-musl@0.3.0"
646
+ },
647
+ {
648
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64@0.3.0"
649
+ },
650
+ {
651
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-windows-arm64@0.3.0"
652
+ },
653
+ {
654
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-windows-x64-baseline@0.3.0"
655
+ },
656
+ {
657
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-windows-x64@0.3.0"
658
+ },
659
+ {
660
+ "ref": "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime@0.3.0",
661
+ "dependsOn": [
662
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-darwin-arm64@0.3.0",
663
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-darwin-x64-baseline@0.3.0",
664
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-darwin-x64@0.3.0",
665
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-arm64-musl@0.3.0",
666
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-arm64@0.3.0",
667
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64-baseline-musl@0.3.0",
668
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64-baseline@0.3.0",
669
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64-musl@0.3.0",
670
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-linux-x64@0.3.0",
671
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-windows-arm64@0.3.0",
672
+ "@numairbaseer/scifcode@0.3.1|@numairbaseer/scifcode-runtime-windows-x64-baseline@0.3.0",
673
+ "@numairbaseer/scifcode@0.3.1|@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
  }