@enbox/gitd 0.0.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/LICENSE +177 -0
- package/README.md +134 -0
- package/dist/esm/ci.js +76 -0
- package/dist/esm/ci.js.map +1 -0
- package/dist/esm/cli/agent.js +86 -0
- package/dist/esm/cli/agent.js.map +1 -0
- package/dist/esm/cli/commands/ci.js +278 -0
- package/dist/esm/cli/commands/ci.js.map +1 -0
- package/dist/esm/cli/commands/clone.js +77 -0
- package/dist/esm/cli/commands/clone.js.map +1 -0
- package/dist/esm/cli/commands/daemon.js +132 -0
- package/dist/esm/cli/commands/daemon.js.map +1 -0
- package/dist/esm/cli/commands/github-api.js +36 -0
- package/dist/esm/cli/commands/github-api.js.map +1 -0
- package/dist/esm/cli/commands/init.js +69 -0
- package/dist/esm/cli/commands/init.js.map +1 -0
- package/dist/esm/cli/commands/issue.js +293 -0
- package/dist/esm/cli/commands/issue.js.map +1 -0
- package/dist/esm/cli/commands/log.js +90 -0
- package/dist/esm/cli/commands/log.js.map +1 -0
- package/dist/esm/cli/commands/migrate.js +444 -0
- package/dist/esm/cli/commands/migrate.js.map +1 -0
- package/dist/esm/cli/commands/notification.js +141 -0
- package/dist/esm/cli/commands/notification.js.map +1 -0
- package/dist/esm/cli/commands/org.js +353 -0
- package/dist/esm/cli/commands/org.js.map +1 -0
- package/dist/esm/cli/commands/patch.js +375 -0
- package/dist/esm/cli/commands/patch.js.map +1 -0
- package/dist/esm/cli/commands/registry.js +501 -0
- package/dist/esm/cli/commands/registry.js.map +1 -0
- package/dist/esm/cli/commands/release.js +197 -0
- package/dist/esm/cli/commands/release.js.map +1 -0
- package/dist/esm/cli/commands/repo.js +148 -0
- package/dist/esm/cli/commands/repo.js.map +1 -0
- package/dist/esm/cli/commands/serve.js +148 -0
- package/dist/esm/cli/commands/serve.js.map +1 -0
- package/dist/esm/cli/commands/setup.js +92 -0
- package/dist/esm/cli/commands/setup.js.map +1 -0
- package/dist/esm/cli/commands/shim.js +75 -0
- package/dist/esm/cli/commands/shim.js.map +1 -0
- package/dist/esm/cli/commands/social.js +206 -0
- package/dist/esm/cli/commands/social.js.map +1 -0
- package/dist/esm/cli/commands/web.js +36 -0
- package/dist/esm/cli/commands/web.js.map +1 -0
- package/dist/esm/cli/commands/wiki.js +185 -0
- package/dist/esm/cli/commands/wiki.js.map +1 -0
- package/dist/esm/cli/flags.js +29 -0
- package/dist/esm/cli/flags.js.map +1 -0
- package/dist/esm/cli/main.js +331 -0
- package/dist/esm/cli/main.js.map +1 -0
- package/dist/esm/cli/repo-context.js +53 -0
- package/dist/esm/cli/repo-context.js.map +1 -0
- package/dist/esm/daemon/adapter.js +18 -0
- package/dist/esm/daemon/adapter.js.map +1 -0
- package/dist/esm/daemon/adapters/github.js +112 -0
- package/dist/esm/daemon/adapters/github.js.map +1 -0
- package/dist/esm/daemon/adapters/go.js +51 -0
- package/dist/esm/daemon/adapters/go.js.map +1 -0
- package/dist/esm/daemon/adapters/index.js +32 -0
- package/dist/esm/daemon/adapters/index.js.map +1 -0
- package/dist/esm/daemon/adapters/npm.js +51 -0
- package/dist/esm/daemon/adapters/npm.js.map +1 -0
- package/dist/esm/daemon/adapters/oci.js +62 -0
- package/dist/esm/daemon/adapters/oci.js.map +1 -0
- package/dist/esm/daemon/index.js +12 -0
- package/dist/esm/daemon/index.js.map +1 -0
- package/dist/esm/daemon/server.js +167 -0
- package/dist/esm/daemon/server.js.map +1 -0
- package/dist/esm/git-remote/credential-helper.js +106 -0
- package/dist/esm/git-remote/credential-helper.js.map +1 -0
- package/dist/esm/git-remote/credential-main.js +109 -0
- package/dist/esm/git-remote/credential-main.js.map +1 -0
- package/dist/esm/git-remote/index.js +10 -0
- package/dist/esm/git-remote/index.js.map +1 -0
- package/dist/esm/git-remote/main.js +78 -0
- package/dist/esm/git-remote/main.js.map +1 -0
- package/dist/esm/git-remote/parse-url.js +60 -0
- package/dist/esm/git-remote/parse-url.js.map +1 -0
- package/dist/esm/git-remote/resolve.js +175 -0
- package/dist/esm/git-remote/resolve.js.map +1 -0
- package/dist/esm/git-remote/service.js +82 -0
- package/dist/esm/git-remote/service.js.map +1 -0
- package/dist/esm/git-server/auth.js +211 -0
- package/dist/esm/git-server/auth.js.map +1 -0
- package/dist/esm/git-server/bundle-restore.js +180 -0
- package/dist/esm/git-server/bundle-restore.js.map +1 -0
- package/dist/esm/git-server/bundle-sync.js +233 -0
- package/dist/esm/git-server/bundle-sync.js.map +1 -0
- package/dist/esm/git-server/did-service.js +73 -0
- package/dist/esm/git-server/did-service.js.map +1 -0
- package/dist/esm/git-server/git-backend.js +186 -0
- package/dist/esm/git-server/git-backend.js.map +1 -0
- package/dist/esm/git-server/http-handler.js +295 -0
- package/dist/esm/git-server/http-handler.js.map +1 -0
- package/dist/esm/git-server/index.js +16 -0
- package/dist/esm/git-server/index.js.map +1 -0
- package/dist/esm/git-server/push-authorizer.js +62 -0
- package/dist/esm/git-server/push-authorizer.js.map +1 -0
- package/dist/esm/git-server/ref-sync.js +132 -0
- package/dist/esm/git-server/ref-sync.js.map +1 -0
- package/dist/esm/git-server/server.js +185 -0
- package/dist/esm/git-server/server.js.map +1 -0
- package/dist/esm/git-server/verify.js +109 -0
- package/dist/esm/git-server/verify.js.map +1 -0
- package/dist/esm/github-shim/helpers.js +273 -0
- package/dist/esm/github-shim/helpers.js.map +1 -0
- package/dist/esm/github-shim/index.js +13 -0
- package/dist/esm/github-shim/index.js.map +1 -0
- package/dist/esm/github-shim/issues.js +318 -0
- package/dist/esm/github-shim/issues.js.map +1 -0
- package/dist/esm/github-shim/pulls.js +423 -0
- package/dist/esm/github-shim/pulls.js.map +1 -0
- package/dist/esm/github-shim/releases.js +154 -0
- package/dist/esm/github-shim/releases.js.map +1 -0
- package/dist/esm/github-shim/repos.js +86 -0
- package/dist/esm/github-shim/repos.js.map +1 -0
- package/dist/esm/github-shim/server.js +351 -0
- package/dist/esm/github-shim/server.js.map +1 -0
- package/dist/esm/github-shim/users.js +61 -0
- package/dist/esm/github-shim/users.js.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indexer/api.js +132 -0
- package/dist/esm/indexer/api.js.map +1 -0
- package/dist/esm/indexer/crawler.js +256 -0
- package/dist/esm/indexer/crawler.js.map +1 -0
- package/dist/esm/indexer/index.js +9 -0
- package/dist/esm/indexer/index.js.map +1 -0
- package/dist/esm/indexer/main.js +76 -0
- package/dist/esm/indexer/main.js.map +1 -0
- package/dist/esm/indexer/store.js +334 -0
- package/dist/esm/indexer/store.js.map +1 -0
- package/dist/esm/issues.js +133 -0
- package/dist/esm/issues.js.map +1 -0
- package/dist/esm/notifications.js +47 -0
- package/dist/esm/notifications.js.map +1 -0
- package/dist/esm/org.js +90 -0
- package/dist/esm/org.js.map +1 -0
- package/dist/esm/patches.js +136 -0
- package/dist/esm/patches.js.map +1 -0
- package/dist/esm/refs.js +54 -0
- package/dist/esm/refs.js.map +1 -0
- package/dist/esm/registry.js +81 -0
- package/dist/esm/registry.js.map +1 -0
- package/dist/esm/releases.js +78 -0
- package/dist/esm/releases.js.map +1 -0
- package/dist/esm/repo.js +150 -0
- package/dist/esm/repo.js.map +1 -0
- package/dist/esm/resolver/index.js +10 -0
- package/dist/esm/resolver/index.js.map +1 -0
- package/dist/esm/resolver/resolve.js +189 -0
- package/dist/esm/resolver/resolve.js.map +1 -0
- package/dist/esm/resolver/trust-chain.js +155 -0
- package/dist/esm/resolver/trust-chain.js.map +1 -0
- package/dist/esm/resolver/verify.js +186 -0
- package/dist/esm/resolver/verify.js.map +1 -0
- package/dist/esm/shims/go/index.js +9 -0
- package/dist/esm/shims/go/index.js.map +1 -0
- package/dist/esm/shims/go/proxy.js +275 -0
- package/dist/esm/shims/go/proxy.js.map +1 -0
- package/dist/esm/shims/go/server.js +70 -0
- package/dist/esm/shims/go/server.js.map +1 -0
- package/dist/esm/shims/index.js +15 -0
- package/dist/esm/shims/index.js.map +1 -0
- package/dist/esm/shims/npm/index.js +9 -0
- package/dist/esm/shims/npm/index.js.map +1 -0
- package/dist/esm/shims/npm/registry.js +234 -0
- package/dist/esm/shims/npm/registry.js.map +1 -0
- package/dist/esm/shims/npm/server.js +72 -0
- package/dist/esm/shims/npm/server.js.map +1 -0
- package/dist/esm/shims/oci/index.js +9 -0
- package/dist/esm/shims/oci/index.js.map +1 -0
- package/dist/esm/shims/oci/registry.js +276 -0
- package/dist/esm/shims/oci/registry.js.map +1 -0
- package/dist/esm/shims/oci/server.js +82 -0
- package/dist/esm/shims/oci/server.js.map +1 -0
- package/dist/esm/social.js +70 -0
- package/dist/esm/social.js.map +1 -0
- package/dist/esm/web/html.js +123 -0
- package/dist/esm/web/html.js.map +1 -0
- package/dist/esm/web/index.js +7 -0
- package/dist/esm/web/index.js.map +1 -0
- package/dist/esm/web/routes.js +420 -0
- package/dist/esm/web/routes.js.map +1 -0
- package/dist/esm/web/server.js +225 -0
- package/dist/esm/web/server.js.map +1 -0
- package/dist/esm/wiki.js +63 -0
- package/dist/esm/wiki.js.map +1 -0
- package/dist/types/ci.d.ts +203 -0
- package/dist/types/ci.d.ts.map +1 -0
- package/dist/types/cli/agent.d.ts +59 -0
- package/dist/types/cli/agent.d.ts.map +1 -0
- package/dist/types/cli/commands/ci.d.ts +16 -0
- package/dist/types/cli/commands/ci.d.ts.map +1 -0
- package/dist/types/cli/commands/clone.d.ts +13 -0
- package/dist/types/cli/commands/clone.d.ts.map +1 -0
- package/dist/types/cli/commands/daemon.d.ts +29 -0
- package/dist/types/cli/commands/daemon.d.ts.map +1 -0
- package/dist/types/cli/commands/github-api.d.ts +14 -0
- package/dist/types/cli/commands/github-api.d.ts.map +1 -0
- package/dist/types/cli/commands/init.d.ts +11 -0
- package/dist/types/cli/commands/init.d.ts.map +1 -0
- package/dist/types/cli/commands/issue.d.ts +16 -0
- package/dist/types/cli/commands/issue.d.ts.map +1 -0
- package/dist/types/cli/commands/log.d.ts +13 -0
- package/dist/types/cli/commands/log.d.ts.map +1 -0
- package/dist/types/cli/commands/migrate.d.ts +19 -0
- package/dist/types/cli/commands/migrate.d.ts.map +1 -0
- package/dist/types/cli/commands/notification.d.ts +16 -0
- package/dist/types/cli/commands/notification.d.ts.map +1 -0
- package/dist/types/cli/commands/org.d.ts +19 -0
- package/dist/types/cli/commands/org.d.ts.map +1 -0
- package/dist/types/cli/commands/patch.d.ts +17 -0
- package/dist/types/cli/commands/patch.d.ts.map +1 -0
- package/dist/types/cli/commands/registry.d.ts +25 -0
- package/dist/types/cli/commands/registry.d.ts.map +1 -0
- package/dist/types/cli/commands/release.d.ts +13 -0
- package/dist/types/cli/commands/release.d.ts.map +1 -0
- package/dist/types/cli/commands/repo.d.ts +15 -0
- package/dist/types/cli/commands/repo.d.ts.map +1 -0
- package/dist/types/cli/commands/serve.d.ts +22 -0
- package/dist/types/cli/commands/serve.d.ts.map +1 -0
- package/dist/types/cli/commands/setup.d.ts +16 -0
- package/dist/types/cli/commands/setup.d.ts.map +1 -0
- package/dist/types/cli/commands/shim.d.ts +16 -0
- package/dist/types/cli/commands/shim.d.ts.map +1 -0
- package/dist/types/cli/commands/social.d.ts +19 -0
- package/dist/types/cli/commands/social.d.ts.map +1 -0
- package/dist/types/cli/commands/web.d.ts +14 -0
- package/dist/types/cli/commands/web.d.ts.map +1 -0
- package/dist/types/cli/commands/wiki.d.ts +14 -0
- package/dist/types/cli/commands/wiki.d.ts.map +1 -0
- package/dist/types/cli/flags.d.ts +16 -0
- package/dist/types/cli/flags.d.ts.map +1 -0
- package/dist/types/cli/main.d.ts +69 -0
- package/dist/types/cli/main.d.ts.map +1 -0
- package/dist/types/cli/repo-context.d.ts +30 -0
- package/dist/types/cli/repo-context.d.ts.map +1 -0
- package/dist/types/daemon/adapter.d.ts +74 -0
- package/dist/types/daemon/adapter.d.ts.map +1 -0
- package/dist/types/daemon/adapters/github.d.ts +10 -0
- package/dist/types/daemon/adapters/github.d.ts.map +1 -0
- package/dist/types/daemon/adapters/go.d.ts +10 -0
- package/dist/types/daemon/adapters/go.d.ts.map +1 -0
- package/dist/types/daemon/adapters/index.d.ts +22 -0
- package/dist/types/daemon/adapters/index.d.ts.map +1 -0
- package/dist/types/daemon/adapters/npm.d.ts +10 -0
- package/dist/types/daemon/adapters/npm.d.ts.map +1 -0
- package/dist/types/daemon/adapters/oci.d.ts +10 -0
- package/dist/types/daemon/adapters/oci.d.ts.map +1 -0
- package/dist/types/daemon/index.d.ts +14 -0
- package/dist/types/daemon/index.d.ts.map +1 -0
- package/dist/types/daemon/server.d.ts +55 -0
- package/dist/types/daemon/server.d.ts.map +1 -0
- package/dist/types/git-remote/credential-helper.d.ts +49 -0
- package/dist/types/git-remote/credential-helper.d.ts.map +1 -0
- package/dist/types/git-remote/credential-main.d.ts +24 -0
- package/dist/types/git-remote/credential-main.d.ts.map +1 -0
- package/dist/types/git-remote/index.d.ts +10 -0
- package/dist/types/git-remote/index.d.ts.map +1 -0
- package/dist/types/git-remote/main.d.ts +23 -0
- package/dist/types/git-remote/main.d.ts.map +1 -0
- package/dist/types/git-remote/parse-url.d.ts +32 -0
- package/dist/types/git-remote/parse-url.d.ts.map +1 -0
- package/dist/types/git-remote/resolve.d.ts +30 -0
- package/dist/types/git-remote/resolve.d.ts.map +1 -0
- package/dist/types/git-remote/service.d.ts +75 -0
- package/dist/types/git-remote/service.d.ts.map +1 -0
- package/dist/types/git-server/auth.d.ts +129 -0
- package/dist/types/git-server/auth.d.ts.map +1 -0
- package/dist/types/git-server/bundle-restore.d.ts +48 -0
- package/dist/types/git-server/bundle-restore.d.ts.map +1 -0
- package/dist/types/git-server/bundle-sync.d.ts +90 -0
- package/dist/types/git-server/bundle-sync.d.ts.map +1 -0
- package/dist/types/git-server/did-service.d.ts +26 -0
- package/dist/types/git-server/did-service.d.ts.map +1 -0
- package/dist/types/git-server/git-backend.d.ts +84 -0
- package/dist/types/git-server/git-backend.d.ts.map +1 -0
- package/dist/types/git-server/http-handler.d.ts +73 -0
- package/dist/types/git-server/http-handler.d.ts.map +1 -0
- package/dist/types/git-server/index.d.ts +16 -0
- package/dist/types/git-server/index.d.ts.map +1 -0
- package/dist/types/git-server/push-authorizer.d.ts +38 -0
- package/dist/types/git-server/push-authorizer.d.ts.map +1 -0
- package/dist/types/git-server/ref-sync.d.ts +52 -0
- package/dist/types/git-server/ref-sync.d.ts.map +1 -0
- package/dist/types/git-server/server.d.ts +70 -0
- package/dist/types/git-server/server.d.ts.map +1 -0
- package/dist/types/git-server/verify.d.ts +12 -0
- package/dist/types/git-server/verify.d.ts.map +1 -0
- package/dist/types/github-shim/helpers.d.ts +108 -0
- package/dist/types/github-shim/helpers.d.ts.map +1 -0
- package/dist/types/github-shim/index.d.ts +15 -0
- package/dist/types/github-shim/index.d.ts.map +1 -0
- package/dist/types/github-shim/issues.d.ts +24 -0
- package/dist/types/github-shim/issues.d.ts.map +1 -0
- package/dist/types/github-shim/pulls.d.ts +31 -0
- package/dist/types/github-shim/pulls.d.ts.map +1 -0
- package/dist/types/github-shim/releases.d.ts +18 -0
- package/dist/types/github-shim/releases.d.ts.map +1 -0
- package/dist/types/github-shim/repos.d.ts +21 -0
- package/dist/types/github-shim/repos.d.ts.map +1 -0
- package/dist/types/github-shim/server.d.ts +53 -0
- package/dist/types/github-shim/server.d.ts.map +1 -0
- package/dist/types/github-shim/users.d.ts +17 -0
- package/dist/types/github-shim/users.d.ts.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/indexer/api.d.ts +32 -0
- package/dist/types/indexer/api.d.ts.map +1 -0
- package/dist/types/indexer/crawler.d.ts +72 -0
- package/dist/types/indexer/crawler.d.ts.map +1 -0
- package/dist/types/indexer/index.d.ts +12 -0
- package/dist/types/indexer/index.d.ts.map +1 -0
- package/dist/types/indexer/main.d.ts +21 -0
- package/dist/types/indexer/main.d.ts.map +1 -0
- package/dist/types/indexer/store.d.ts +168 -0
- package/dist/types/indexer/store.d.ts.map +1 -0
- package/dist/types/issues.d.ts +395 -0
- package/dist/types/issues.d.ts.map +1 -0
- package/dist/types/notifications.d.ts +93 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/org.d.ts +232 -0
- package/dist/types/org.d.ts.map +1 -0
- package/dist/types/patches.d.ts +410 -0
- package/dist/types/patches.d.ts.map +1 -0
- package/dist/types/refs.d.ts +114 -0
- package/dist/types/refs.d.ts.map +1 -0
- package/dist/types/registry.d.ts +212 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/releases.d.ts +204 -0
- package/dist/types/releases.d.ts.map +1 -0
- package/dist/types/repo.d.ts +450 -0
- package/dist/types/repo.d.ts.map +1 -0
- package/dist/types/resolver/index.d.ts +13 -0
- package/dist/types/resolver/index.d.ts.map +1 -0
- package/dist/types/resolver/resolve.d.ts +80 -0
- package/dist/types/resolver/resolve.d.ts.map +1 -0
- package/dist/types/resolver/trust-chain.d.ts +54 -0
- package/dist/types/resolver/trust-chain.d.ts.map +1 -0
- package/dist/types/resolver/verify.d.ts +62 -0
- package/dist/types/resolver/verify.d.ts.map +1 -0
- package/dist/types/shims/go/index.d.ts +11 -0
- package/dist/types/shims/go/index.d.ts.map +1 -0
- package/dist/types/shims/go/proxy.d.ts +51 -0
- package/dist/types/shims/go/proxy.d.ts.map +1 -0
- package/dist/types/shims/go/server.d.ts +23 -0
- package/dist/types/shims/go/server.d.ts.map +1 -0
- package/dist/types/shims/index.d.ts +18 -0
- package/dist/types/shims/index.d.ts.map +1 -0
- package/dist/types/shims/npm/index.d.ts +11 -0
- package/dist/types/shims/npm/index.d.ts.map +1 -0
- package/dist/types/shims/npm/registry.d.ts +46 -0
- package/dist/types/shims/npm/registry.d.ts.map +1 -0
- package/dist/types/shims/npm/server.d.ts +23 -0
- package/dist/types/shims/npm/server.d.ts.map +1 -0
- package/dist/types/shims/oci/index.d.ts +11 -0
- package/dist/types/shims/oci/index.d.ts.map +1 -0
- package/dist/types/shims/oci/registry.d.ts +56 -0
- package/dist/types/shims/oci/registry.d.ts.map +1 -0
- package/dist/types/shims/oci/server.d.ts +23 -0
- package/dist/types/shims/oci/server.d.ts.map +1 -0
- package/dist/types/social.d.ts +162 -0
- package/dist/types/social.d.ts.map +1 -0
- package/dist/types/web/html.d.ts +23 -0
- package/dist/types/web/html.d.ts.map +1 -0
- package/dist/types/web/index.d.ts +8 -0
- package/dist/types/web/index.d.ts.map +1 -0
- package/dist/types/web/routes.d.ts +21 -0
- package/dist/types/web/routes.d.ts.map +1 -0
- package/dist/types/web/server.d.ts +38 -0
- package/dist/types/web/server.d.ts.map +1 -0
- package/dist/types/wiki.d.ts +143 -0
- package/dist/types/wiki.d.ts.map +1 -0
- package/package.json +108 -0
- package/schemas/ci/check-run.json +23 -0
- package/schemas/ci/check-suite.json +23 -0
- package/schemas/issues/assignment.json +17 -0
- package/schemas/issues/comment.json +14 -0
- package/schemas/issues/issue.json +20 -0
- package/schemas/issues/label.json +17 -0
- package/schemas/issues/reaction.json +14 -0
- package/schemas/issues/status-change.json +14 -0
- package/schemas/notifications/notification.json +20 -0
- package/schemas/org/org-member.json +17 -0
- package/schemas/org/org.json +26 -0
- package/schemas/org/team-member.json +17 -0
- package/schemas/org/team.json +17 -0
- package/schemas/patches/merge-result.json +14 -0
- package/schemas/patches/patch-status-change.json +14 -0
- package/schemas/patches/patch.json +20 -0
- package/schemas/patches/review-comment.json +17 -0
- package/schemas/patches/review.json +14 -0
- package/schemas/patches/revision.json +30 -0
- package/schemas/refs/git-ref.json +32 -0
- package/schemas/registry/attestation.json +23 -0
- package/schemas/registry/package-version.json +23 -0
- package/schemas/registry/package.json +32 -0
- package/schemas/releases/release.json +17 -0
- package/schemas/repo/collaborator.json +17 -0
- package/schemas/repo/repo.json +35 -0
- package/schemas/repo/settings.json +39 -0
- package/schemas/repo/topic.json +14 -0
- package/schemas/repo/webhook.json +26 -0
- package/schemas/social/activity.json +23 -0
- package/schemas/social/follow.json +17 -0
- package/schemas/social/star.json +20 -0
- package/schemas/wiki/wiki-history.json +20 -0
- package/schemas/wiki/wiki-page.json +17 -0
- package/src/ci.ts +118 -0
- package/src/cli/agent.ts +117 -0
- package/src/cli/commands/ci.ts +300 -0
- package/src/cli/commands/clone.ts +78 -0
- package/src/cli/commands/daemon.ts +129 -0
- package/src/cli/commands/github-api.ts +30 -0
- package/src/cli/commands/init.ts +69 -0
- package/src/cli/commands/issue.ts +321 -0
- package/src/cli/commands/log.ts +106 -0
- package/src/cli/commands/migrate.ts +525 -0
- package/src/cli/commands/notification.ts +148 -0
- package/src/cli/commands/org.ts +381 -0
- package/src/cli/commands/patch.ts +413 -0
- package/src/cli/commands/registry.ts +542 -0
- package/src/cli/commands/release.ts +189 -0
- package/src/cli/commands/repo.ts +160 -0
- package/src/cli/commands/serve.ts +153 -0
- package/src/cli/commands/setup.ts +97 -0
- package/src/cli/commands/shim.ts +79 -0
- package/src/cli/commands/social.ts +221 -0
- package/src/cli/commands/web.ts +30 -0
- package/src/cli/commands/wiki.ts +199 -0
- package/src/cli/flags.ts +28 -0
- package/src/cli/main.ts +350 -0
- package/src/cli/repo-context.ts +55 -0
- package/src/daemon/adapter.ts +95 -0
- package/src/daemon/adapters/github.ts +86 -0
- package/src/daemon/adapters/go.ts +47 -0
- package/src/daemon/adapters/index.ts +36 -0
- package/src/daemon/adapters/npm.ts +47 -0
- package/src/daemon/adapters/oci.ts +59 -0
- package/src/daemon/index.ts +16 -0
- package/src/daemon/server.ts +204 -0
- package/src/git-remote/credential-helper.ts +114 -0
- package/src/git-remote/credential-main.ts +118 -0
- package/src/git-remote/index.ts +10 -0
- package/src/git-remote/main.ts +74 -0
- package/src/git-remote/parse-url.ts +81 -0
- package/src/git-remote/resolve.ts +207 -0
- package/src/git-remote/service.ts +126 -0
- package/src/git-server/auth.ts +308 -0
- package/src/git-server/bundle-restore.ts +217 -0
- package/src/git-server/bundle-sync.ts +300 -0
- package/src/git-server/did-service.ts +77 -0
- package/src/git-server/git-backend.ts +222 -0
- package/src/git-server/http-handler.ts +386 -0
- package/src/git-server/index.ts +16 -0
- package/src/git-server/push-authorizer.ts +77 -0
- package/src/git-server/ref-sync.ts +166 -0
- package/src/git-server/server.ts +236 -0
- package/src/git-server/verify.ts +116 -0
- package/src/github-shim/helpers.ts +311 -0
- package/src/github-shim/index.ts +35 -0
- package/src/github-shim/issues.ts +389 -0
- package/src/github-shim/pulls.ts +500 -0
- package/src/github-shim/releases.ts +185 -0
- package/src/github-shim/repos.ts +95 -0
- package/src/github-shim/server.ts +334 -0
- package/src/github-shim/users.ts +63 -0
- package/src/index.ts +26 -0
- package/src/indexer/api.ts +162 -0
- package/src/indexer/crawler.ts +290 -0
- package/src/indexer/index.ts +22 -0
- package/src/indexer/main.ts +83 -0
- package/src/indexer/store.ts +408 -0
- package/src/issues.ts +200 -0
- package/src/notifications.ts +80 -0
- package/src/org.ts +147 -0
- package/src/patches.ts +203 -0
- package/src/refs.ts +94 -0
- package/src/registry.ts +132 -0
- package/src/releases.ts +124 -0
- package/src/repo.ts +234 -0
- package/src/resolver/index.ts +42 -0
- package/src/resolver/resolve.ts +244 -0
- package/src/resolver/trust-chain.ts +217 -0
- package/src/resolver/verify.ts +237 -0
- package/src/shims/go/index.ts +14 -0
- package/src/shims/go/proxy.ts +336 -0
- package/src/shims/go/server.ts +82 -0
- package/src/shims/index.ts +20 -0
- package/src/shims/npm/index.ts +14 -0
- package/src/shims/npm/registry.ts +288 -0
- package/src/shims/npm/server.ts +84 -0
- package/src/shims/oci/index.ts +14 -0
- package/src/shims/oci/registry.ts +334 -0
- package/src/shims/oci/server.ts +94 -0
- package/src/social.ts +116 -0
- package/src/web/html.ts +120 -0
- package/src/web/index.ts +8 -0
- package/src/web/routes.ts +449 -0
- package/src/web/server.ts +256 -0
- package/src/wiki.ts +102 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git backend — wraps Git CLI commands for bare repository management.
|
|
3
|
+
*
|
|
4
|
+
* Provides a thin abstraction over `git init --bare`, `git upload-pack`, and
|
|
5
|
+
* `git receive-pack` for use by the smart HTTP transport handler.
|
|
6
|
+
*
|
|
7
|
+
* All repositories are stored as bare repos under a configurable base
|
|
8
|
+
* directory, organized by DID: `<basePath>/<did-hash>/<repo-name>.git`
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import { spawn } from 'node:child_process';
|
|
23
|
+
import { join, resolve } from 'node:path';
|
|
24
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// GitBackend
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Manages bare git repositories on the filesystem and spawns git subprocess
|
|
30
|
+
* for smart HTTP transport.
|
|
31
|
+
*/
|
|
32
|
+
export class GitBackend {
|
|
33
|
+
constructor(options) {
|
|
34
|
+
this._basePath = options.basePath;
|
|
35
|
+
}
|
|
36
|
+
/** Get the base path for all repositories. */
|
|
37
|
+
get basePath() {
|
|
38
|
+
return this._basePath;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute the filesystem path for a repository.
|
|
42
|
+
*
|
|
43
|
+
* @param did - The DID of the repository owner
|
|
44
|
+
* @param repo - The repository name
|
|
45
|
+
* @returns Absolute path to the bare repo directory
|
|
46
|
+
* @throws If the repo name contains path traversal characters
|
|
47
|
+
*/
|
|
48
|
+
repoPath(did, repo) {
|
|
49
|
+
validateRepoName(repo);
|
|
50
|
+
const didHash = hashDid(did);
|
|
51
|
+
const repoDir = join(this._basePath, didHash, `${repo}.git`);
|
|
52
|
+
const resolved = resolve(repoDir);
|
|
53
|
+
const base = resolve(this._basePath);
|
|
54
|
+
if (!resolved.startsWith(base + '/') && resolved !== base) {
|
|
55
|
+
throw new Error(`Path traversal detected: repo name '${repo}' escapes base directory`);
|
|
56
|
+
}
|
|
57
|
+
return resolved;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check whether a repository exists on disk.
|
|
61
|
+
*
|
|
62
|
+
* @param did - The DID of the repository owner
|
|
63
|
+
* @param repo - The repository name
|
|
64
|
+
*/
|
|
65
|
+
exists(did, repo) {
|
|
66
|
+
const path = this.repoPath(did, repo);
|
|
67
|
+
return existsSync(join(path, 'HEAD'));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Initialize a new bare repository.
|
|
71
|
+
*
|
|
72
|
+
* @param did - The DID of the repository owner
|
|
73
|
+
* @param repo - The repository name
|
|
74
|
+
* @returns The path to the new bare repository
|
|
75
|
+
* @throws If `git init --bare` fails
|
|
76
|
+
*/
|
|
77
|
+
initRepo(did, repo) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
const path = this.repoPath(did, repo);
|
|
80
|
+
mkdirSync(path, { recursive: true });
|
|
81
|
+
const exitCode = yield runGit(['init', '--bare', path]);
|
|
82
|
+
if (exitCode !== 0) {
|
|
83
|
+
throw new Error(`git init --bare failed with exit code ${exitCode} for ${path}`);
|
|
84
|
+
}
|
|
85
|
+
return path;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Spawn `git upload-pack` for fetch/clone operations.
|
|
90
|
+
*
|
|
91
|
+
* @param did - The DID of the repository owner
|
|
92
|
+
* @param repo - The repository name
|
|
93
|
+
* @returns A GitProcess with stdin/stdout streams for the subprocess
|
|
94
|
+
* @throws If the repository does not exist
|
|
95
|
+
*/
|
|
96
|
+
uploadPack(did, repo) {
|
|
97
|
+
this._assertRepoExists(did, repo);
|
|
98
|
+
const path = this.repoPath(did, repo);
|
|
99
|
+
return spawnGitService('upload-pack', path);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Spawn `git receive-pack` for push operations.
|
|
103
|
+
*
|
|
104
|
+
* @param did - The DID of the repository owner
|
|
105
|
+
* @param repo - The repository name
|
|
106
|
+
* @returns A GitProcess with stdin/stdout streams for the subprocess
|
|
107
|
+
* @throws If the repository does not exist
|
|
108
|
+
*/
|
|
109
|
+
receivePack(did, repo) {
|
|
110
|
+
this._assertRepoExists(did, repo);
|
|
111
|
+
const path = this.repoPath(did, repo);
|
|
112
|
+
return spawnGitService('receive-pack', path);
|
|
113
|
+
}
|
|
114
|
+
/** Throw if the repo doesn't exist on disk. */
|
|
115
|
+
_assertRepoExists(did, repo) {
|
|
116
|
+
if (!this.exists(did, repo)) {
|
|
117
|
+
throw new Error(`Repository not found: ${did}/${repo}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Helpers
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
/** Allowed characters in a repository name: alphanumeric, dots, hyphens, underscores. */
|
|
125
|
+
const SAFE_REPO_NAME_RE = /^[a-zA-Z0-9._-]+$/;
|
|
126
|
+
/**
|
|
127
|
+
* Validate that a repository name is safe for filesystem use.
|
|
128
|
+
* Rejects path traversal components and unsafe characters.
|
|
129
|
+
*
|
|
130
|
+
* @throws If the repo name is invalid
|
|
131
|
+
*/
|
|
132
|
+
function validateRepoName(name) {
|
|
133
|
+
if (!name || !SAFE_REPO_NAME_RE.test(name)) {
|
|
134
|
+
throw new Error(`Invalid repository name: '${name}'. Names must match ${SAFE_REPO_NAME_RE}`);
|
|
135
|
+
}
|
|
136
|
+
if (name === '.' || name === '..' || name.startsWith('.git')) {
|
|
137
|
+
throw new Error(`Invalid repository name: '${name}'`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Hash a DID to a short filesystem-safe directory name. */
|
|
141
|
+
function hashDid(did) {
|
|
142
|
+
return createHash('sha256').update(did).digest('hex').slice(0, 16);
|
|
143
|
+
}
|
|
144
|
+
/** Run a git command and return the exit code. */
|
|
145
|
+
function runGit(args) {
|
|
146
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
const child = spawn('git', args, { stdio: 'pipe' });
|
|
149
|
+
child.on('error', reject);
|
|
150
|
+
child.on('exit', (code) => resolve(code !== null && code !== void 0 ? code : 128));
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Spawn a git service subprocess (upload-pack or receive-pack) and return
|
|
156
|
+
* web-standard ReadableStream/WritableStream wrappers around its stdio.
|
|
157
|
+
*/
|
|
158
|
+
function spawnGitService(service, repoPath) {
|
|
159
|
+
const child = spawn('git', [service, '--stateless-rpc', repoPath], {
|
|
160
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
161
|
+
});
|
|
162
|
+
const stdout = new ReadableStream({
|
|
163
|
+
start(controller) {
|
|
164
|
+
child.stdout.on('data', (chunk) => controller.enqueue(new Uint8Array(chunk)));
|
|
165
|
+
child.stdout.on('end', () => controller.close());
|
|
166
|
+
child.stdout.on('error', (err) => controller.error(err));
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
const stdin = new WritableStream({
|
|
170
|
+
write(chunk) {
|
|
171
|
+
child.stdin.write(chunk);
|
|
172
|
+
},
|
|
173
|
+
close() {
|
|
174
|
+
child.stdin.end();
|
|
175
|
+
},
|
|
176
|
+
abort() {
|
|
177
|
+
child.stdin.destroy();
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
const exitCode = new Promise((resolve, reject) => {
|
|
181
|
+
child.on('error', reject);
|
|
182
|
+
child.on('exit', (code) => resolve(code !== null && code !== void 0 ? code : 128));
|
|
183
|
+
});
|
|
184
|
+
return { stdout, stdin, exitCode };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=git-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-backend.js","sourceRoot":"","sources":["../../../src/git-server/git-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git smart HTTP transport handler.
|
|
3
|
+
*
|
|
4
|
+
* Implements the server side of Git's smart HTTP protocol (v1):
|
|
5
|
+
* - `GET /<did>/<repo>/info/refs?service=git-upload-pack` — ref discovery (clone/fetch)
|
|
6
|
+
* - `POST /<did>/<repo>/git-upload-pack` — pack negotiation (clone/fetch)
|
|
7
|
+
* - `GET /<did>/<repo>/info/refs?service=git-receive-pack` — ref discovery (push)
|
|
8
|
+
* - `POST /<did>/<repo>/git-receive-pack` — receive pack (push)
|
|
9
|
+
*
|
|
10
|
+
* When `onRepoNotFound` is provided, the handler auto-restores repos from
|
|
11
|
+
* DWN bundle records on first access (cold-start). This enables commodity
|
|
12
|
+
* git hosts to serve repos they've never seen before.
|
|
13
|
+
*
|
|
14
|
+
* The handler is a pure function `(Request) => Response | Promise<Response>`
|
|
15
|
+
* suitable for use with `Bun.serve()`, `Deno.serve()`, or any fetch-compatible
|
|
16
|
+
* HTTP runtime.
|
|
17
|
+
*
|
|
18
|
+
* URL format: `/<did>/<repo>/...`
|
|
19
|
+
* The DID is URL-encoded in the path (colons are preserved since they're
|
|
20
|
+
* valid in path segments).
|
|
21
|
+
*
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
25
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
26
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
27
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
28
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
29
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
30
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
import { spawn } from 'node:child_process';
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Handler factory
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Create a fetch-compatible HTTP handler for Git smart HTTP transport.
|
|
39
|
+
*
|
|
40
|
+
* @param options - Handler configuration
|
|
41
|
+
* @returns A function that handles incoming HTTP requests
|
|
42
|
+
*/
|
|
43
|
+
export function createGitHttpHandler(options) {
|
|
44
|
+
const { backend, authenticatePush, onPushComplete, onRepoNotFound, pathPrefix = '' } = options;
|
|
45
|
+
/**
|
|
46
|
+
* Ensure a repo exists on disk, attempting DWN bundle restore if absent.
|
|
47
|
+
* Returns `true` when the repo is available (or was restored).
|
|
48
|
+
*/
|
|
49
|
+
function ensureRepo(did, repo) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
if (backend.exists(did, repo)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (onRepoNotFound) {
|
|
55
|
+
const repoPath = backend.repoPath(did, repo);
|
|
56
|
+
try {
|
|
57
|
+
return yield onRepoNotFound(did, repo, repoPath);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.error(`onRepoNotFound error for ${did}/${repo}: ${err.message}`);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return (request) => __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
const url = new URL(request.url);
|
|
69
|
+
let pathname = url.pathname;
|
|
70
|
+
// Strip path prefix.
|
|
71
|
+
if (pathPrefix && pathname.startsWith(pathPrefix)) {
|
|
72
|
+
pathname = pathname.slice(pathPrefix.length);
|
|
73
|
+
}
|
|
74
|
+
// Parse the route.
|
|
75
|
+
const route = parseRoute(pathname);
|
|
76
|
+
if (!route) {
|
|
77
|
+
return new Response('Not Found', { status: 404 });
|
|
78
|
+
}
|
|
79
|
+
const { did, repo, action } = route;
|
|
80
|
+
// -----------------------------------------------------------------------
|
|
81
|
+
// GET /<did>/<repo>/info/refs?service=<service>
|
|
82
|
+
// -----------------------------------------------------------------------
|
|
83
|
+
if (request.method === 'GET' && action === 'info/refs') {
|
|
84
|
+
const service = url.searchParams.get('service');
|
|
85
|
+
if (service !== 'git-upload-pack' && service !== 'git-receive-pack') {
|
|
86
|
+
return new Response('Dumb HTTP transport is not supported. Use git smart HTTP.', { status: 403 });
|
|
87
|
+
}
|
|
88
|
+
// Auth check for push ref discovery.
|
|
89
|
+
if (service === 'git-receive-pack' && authenticatePush) {
|
|
90
|
+
const authorized = yield authenticatePush(request, did, repo);
|
|
91
|
+
if (!authorized) {
|
|
92
|
+
return new Response('Unauthorized', {
|
|
93
|
+
status: 401,
|
|
94
|
+
headers: { 'WWW-Authenticate': 'Basic realm="gitd"' },
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Ensure repo exists (auto-restore from DWN if possible).
|
|
99
|
+
if (!(yield ensureRepo(did, repo))) {
|
|
100
|
+
return new Response('Repository not found', { status: 404 });
|
|
101
|
+
}
|
|
102
|
+
return handleInfoRefs(backend, did, repo, service);
|
|
103
|
+
}
|
|
104
|
+
// -----------------------------------------------------------------------
|
|
105
|
+
// POST /<did>/<repo>/git-upload-pack
|
|
106
|
+
// -----------------------------------------------------------------------
|
|
107
|
+
if (request.method === 'POST' && action === 'git-upload-pack') {
|
|
108
|
+
if (!(yield ensureRepo(did, repo))) {
|
|
109
|
+
return new Response('Repository not found', { status: 404 });
|
|
110
|
+
}
|
|
111
|
+
return handleServiceRpc(backend, did, repo, 'upload-pack', request);
|
|
112
|
+
}
|
|
113
|
+
// -----------------------------------------------------------------------
|
|
114
|
+
// POST /<did>/<repo>/git-receive-pack
|
|
115
|
+
// -----------------------------------------------------------------------
|
|
116
|
+
if (request.method === 'POST' && action === 'git-receive-pack') {
|
|
117
|
+
// Auth check for push.
|
|
118
|
+
if (authenticatePush) {
|
|
119
|
+
const authorized = yield authenticatePush(request, did, repo);
|
|
120
|
+
if (!authorized) {
|
|
121
|
+
return new Response('Unauthorized', {
|
|
122
|
+
status: 401,
|
|
123
|
+
headers: { 'WWW-Authenticate': 'Basic realm="gitd"' },
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!(yield ensureRepo(did, repo))) {
|
|
128
|
+
return new Response('Repository not found', { status: 404 });
|
|
129
|
+
}
|
|
130
|
+
const response = yield handleServiceRpc(backend, did, repo, 'receive-pack', request);
|
|
131
|
+
// Fire the post-push callback asynchronously (don't block the response).
|
|
132
|
+
if (onPushComplete && response.status === 200) {
|
|
133
|
+
const repoPath = backend.repoPath(did, repo);
|
|
134
|
+
onPushComplete(did, repo, repoPath).catch((err) => {
|
|
135
|
+
console.error(`onPushComplete error for ${did}/${repo}: ${err.message}`);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return response;
|
|
139
|
+
}
|
|
140
|
+
return new Response('Not Found', { status: 404 });
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Route parsing
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
/**
|
|
147
|
+
* Parse a URL path into DID, repo, and action components.
|
|
148
|
+
*
|
|
149
|
+
* Expected format: `/<did>/<repo>/<action>`
|
|
150
|
+
* The DID occupies exactly 3 colon-separated segments: `did:<method>:<id>`.
|
|
151
|
+
* However, since the DID is in the URL path, we split by `/` and reconstruct.
|
|
152
|
+
*
|
|
153
|
+
* URL form: `/<did-scheme>:<did-method>:<did-id>/<repo>/<action...>`
|
|
154
|
+
* Example: `/did:dht:abc123/my-repo/info/refs`
|
|
155
|
+
*/
|
|
156
|
+
function parseRoute(pathname) {
|
|
157
|
+
// Remove leading slash.
|
|
158
|
+
const path = pathname.startsWith('/') ? pathname.slice(1) : pathname;
|
|
159
|
+
// The DID is the first path segment (contains colons, not slashes).
|
|
160
|
+
const firstSlash = path.indexOf('/');
|
|
161
|
+
if (firstSlash === -1) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
const did = decodeURIComponent(path.slice(0, firstSlash));
|
|
165
|
+
// Validate it looks like a DID.
|
|
166
|
+
if (!did.startsWith('did:') || did.split(':').length < 3) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
// Remaining path: <repo>/<action...>
|
|
170
|
+
const rest = path.slice(firstSlash + 1);
|
|
171
|
+
const secondSlash = rest.indexOf('/');
|
|
172
|
+
if (secondSlash === -1) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
const repo = rest.slice(0, secondSlash);
|
|
176
|
+
const action = rest.slice(secondSlash + 1);
|
|
177
|
+
if (!repo || !action) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
// Reject path-traversal and unsafe repo names.
|
|
181
|
+
if (!/^[a-zA-Z0-9._-]+$/.test(repo) || repo === '.' || repo === '..') {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
return { did, repo, action };
|
|
185
|
+
}
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// Git smart HTTP protocol handlers
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
/** Git pkt-line helper: encode a single line. */
|
|
190
|
+
function pktLine(line) {
|
|
191
|
+
const len = line.length + 4;
|
|
192
|
+
return len.toString(16).padStart(4, '0') + line;
|
|
193
|
+
}
|
|
194
|
+
/** Git pkt-line flush: `0000`. */
|
|
195
|
+
const PKT_FLUSH = '0000';
|
|
196
|
+
/**
|
|
197
|
+
* Handle `GET /info/refs?service=<service>`.
|
|
198
|
+
*
|
|
199
|
+
* Runs `git <service> --stateless-rpc --advertise-refs` and wraps the output
|
|
200
|
+
* in the smart HTTP ref advertisement format.
|
|
201
|
+
*/
|
|
202
|
+
function handleInfoRefs(backend, did, repo, service) {
|
|
203
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
204
|
+
const gitService = service === 'git-upload-pack' ? 'upload-pack' : 'receive-pack';
|
|
205
|
+
const repoPath = backend.repoPath(did, repo);
|
|
206
|
+
// Run git with --advertise-refs to get the ref listing.
|
|
207
|
+
const refData = yield spawnAndCollect(gitService, repoPath);
|
|
208
|
+
if (refData === null) {
|
|
209
|
+
return new Response('Git service error', { status: 500 });
|
|
210
|
+
}
|
|
211
|
+
// Build the smart HTTP response: service announcement + ref data.
|
|
212
|
+
const encoder = new TextEncoder();
|
|
213
|
+
const announcement = pktLine(`# service=${service}\n`) + PKT_FLUSH;
|
|
214
|
+
const announcementBytes = encoder.encode(announcement);
|
|
215
|
+
const body = new Uint8Array(announcementBytes.length + refData.length);
|
|
216
|
+
body.set(announcementBytes, 0);
|
|
217
|
+
body.set(refData, announcementBytes.length);
|
|
218
|
+
return new Response(body, {
|
|
219
|
+
status: 200,
|
|
220
|
+
headers: {
|
|
221
|
+
'Content-Type': `application/x-${service}-advertisement`,
|
|
222
|
+
'Cache-Control': 'no-cache',
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Handle `POST /git-upload-pack` or `POST /git-receive-pack`.
|
|
229
|
+
*
|
|
230
|
+
* Pipes the request body to `git <service> --stateless-rpc` stdin and
|
|
231
|
+
* streams stdout back as the response.
|
|
232
|
+
*/
|
|
233
|
+
function handleServiceRpc(backend, did, repo, service, request) {
|
|
234
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
235
|
+
const gitProcess = service === 'upload-pack'
|
|
236
|
+
? backend.uploadPack(did, repo)
|
|
237
|
+
: backend.receivePack(did, repo);
|
|
238
|
+
// Pipe request body into git subprocess stdin.
|
|
239
|
+
if (request.body) {
|
|
240
|
+
const writer = gitProcess.stdin.getWriter();
|
|
241
|
+
const reader = request.body.getReader();
|
|
242
|
+
try {
|
|
243
|
+
while (true) {
|
|
244
|
+
const { done, value } = yield reader.read();
|
|
245
|
+
if (done) {
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
yield writer.write(value);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
yield writer.close();
|
|
253
|
+
reader.releaseLock();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const writer = gitProcess.stdin.getWriter();
|
|
258
|
+
yield writer.close();
|
|
259
|
+
}
|
|
260
|
+
return new Response(gitProcess.stdout, {
|
|
261
|
+
status: 200,
|
|
262
|
+
headers: {
|
|
263
|
+
'Content-Type': `application/x-git-${service}-result`,
|
|
264
|
+
'Cache-Control': 'no-cache',
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
// Helpers
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
/**
|
|
273
|
+
* Spawn `git <service> --stateless-rpc --advertise-refs` and collect stdout.
|
|
274
|
+
* Returns `null` if the process exits with a non-zero code.
|
|
275
|
+
*/
|
|
276
|
+
function spawnAndCollect(service, repoPath) {
|
|
277
|
+
return new Promise((resolve, reject) => {
|
|
278
|
+
const child = spawn('git', [service, '--stateless-rpc', '--advertise-refs', repoPath], {
|
|
279
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
280
|
+
});
|
|
281
|
+
const chunks = [];
|
|
282
|
+
child.stdout.on('data', (chunk) => chunks.push(chunk));
|
|
283
|
+
child.stdout.on('error', reject);
|
|
284
|
+
child.on('error', reject);
|
|
285
|
+
child.on('exit', (code) => {
|
|
286
|
+
if (code !== 0) {
|
|
287
|
+
resolve(null);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
resolve(new Uint8Array(Buffer.concat(chunks)));
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=http-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-handler.js","sourceRoot":"","sources":["../../../src/git-server/http-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git transport server — smart HTTP git backend with DID-based push auth.
|
|
3
|
+
*
|
|
4
|
+
* @module git-server
|
|
5
|
+
*/
|
|
6
|
+
export * from './auth.js';
|
|
7
|
+
export * from './bundle-restore.js';
|
|
8
|
+
export * from './bundle-sync.js';
|
|
9
|
+
export * from './did-service.js';
|
|
10
|
+
export * from './git-backend.js';
|
|
11
|
+
export * from './http-handler.js';
|
|
12
|
+
export * from './push-authorizer.js';
|
|
13
|
+
export * from './ref-sync.js';
|
|
14
|
+
export * from './server.js';
|
|
15
|
+
export * from './verify.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/git-server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DWN-based push authorization — checks collaborator roles in the DWN.
|
|
3
|
+
*
|
|
4
|
+
* When a DID attempts to push to a repository, this module queries the
|
|
5
|
+
* DWN for `repo/maintainer` and `repo/contributor` role records to
|
|
6
|
+
* determine if the pusher is authorized.
|
|
7
|
+
*
|
|
8
|
+
* Authorization rules:
|
|
9
|
+
* - The repo owner (DID that owns the DWN) can always push
|
|
10
|
+
* - DIDs with a `maintainer` role record can push
|
|
11
|
+
* - DIDs with a `contributor` role record can push
|
|
12
|
+
* - All other DIDs are rejected
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Public API
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Create a `PushAuthorizer` that checks DWN collaborator role records.
|
|
30
|
+
*
|
|
31
|
+
* The authorizer queries the ForgeRepoProtocol for `maintainer` and
|
|
32
|
+
* `contributor` role records matching the pusher's DID. The repo owner
|
|
33
|
+
* is always authorized.
|
|
34
|
+
*
|
|
35
|
+
* @param options - Authorizer configuration
|
|
36
|
+
* @returns A PushAuthorizer callback
|
|
37
|
+
*/
|
|
38
|
+
export function createDwnPushAuthorizer(options) {
|
|
39
|
+
const { repo, ownerDid } = options;
|
|
40
|
+
return (did, owner, _repoName) => __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
// The owner can always push to their own repos.
|
|
42
|
+
if (did === owner || did === ownerDid) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
// Query for maintainer role records for this DID.
|
|
46
|
+
const { records: maintainers } = yield repo.records.query('repo/maintainer', {
|
|
47
|
+
filter: { tags: { did } },
|
|
48
|
+
});
|
|
49
|
+
if (maintainers.length > 0) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
// Query for contributor role records for this DID.
|
|
53
|
+
const { records: contributors } = yield repo.records.query('repo/contributor', {
|
|
54
|
+
filter: { tags: { did } },
|
|
55
|
+
});
|
|
56
|
+
if (contributors.length > 0) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=push-authorizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-authorizer.js","sourceRoot":"","sources":["../../../src/git-server/push-authorizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;AAqBH,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAiC;IACvE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEnC,OAAO,CAAO,GAAW,EAAE,KAAa,EAAE,SAAiB,EAAoB,EAAE;QAC/E,gDAAgD;QAChD,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAwB,EAAE;YAClF,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAyB,EAAE;YACpF,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAA,CAAC;AACJ,CAAC"}
|