@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,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OCI Distribution registry shim — translates Docker/Podman pull
|
|
3
|
+
* requests into DWN queries.
|
|
4
|
+
*
|
|
5
|
+
* Implements the read-only subset of the OCI Distribution Spec v2
|
|
6
|
+
* needed by `docker pull` and `podman pull`.
|
|
7
|
+
*
|
|
8
|
+
* Container images are stored in the DWN using the forge-registry
|
|
9
|
+
* protocol with the `oci` ecosystem. The mapping is:
|
|
10
|
+
*
|
|
11
|
+
* OCI concept → DWN record
|
|
12
|
+
* ──────────────────────────────────────
|
|
13
|
+
* Repository → `package` (ecosystem: 'oci')
|
|
14
|
+
* Tag / version → `package/version` (semver = tag)
|
|
15
|
+
* Manifest → `package/version/tarball` (application/vnd.oci.image.manifest.v1+json)
|
|
16
|
+
* Blob / layer → queried by digest from version data
|
|
17
|
+
*
|
|
18
|
+
* Image naming:
|
|
19
|
+
* `localhost:5555/did:dht:abc123/my-image:v1.0.0`
|
|
20
|
+
*
|
|
21
|
+
* The DID and image name are extracted from the Docker repository name.
|
|
22
|
+
*
|
|
23
|
+
* Endpoints (OCI Distribution Spec v2):
|
|
24
|
+
* GET /v2/ API version check
|
|
25
|
+
* GET /v2/{name}/manifests/{reference} Pull manifest (by tag or digest)
|
|
26
|
+
* HEAD /v2/{name}/manifests/{reference} Check manifest existence
|
|
27
|
+
* GET /v2/{name}/blobs/{digest} Pull blob
|
|
28
|
+
* GET /v2/{name}/tags/list List tags
|
|
29
|
+
*
|
|
30
|
+
* @module
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import type { AgentContext } from '../../cli/agent.js';
|
|
34
|
+
|
|
35
|
+
import {
|
|
36
|
+
fetchTarball,
|
|
37
|
+
listVersions,
|
|
38
|
+
resolvePackage,
|
|
39
|
+
resolveVersion,
|
|
40
|
+
} from '../../resolver/resolve.js';
|
|
41
|
+
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Types
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
/** OCI registry HTTP response. */
|
|
47
|
+
export type OciResponse = {
|
|
48
|
+
status : number;
|
|
49
|
+
headers : Record<string, string>;
|
|
50
|
+
body : string | Uint8Array;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Helpers
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
/** OCI-required headers for all responses. */
|
|
58
|
+
function ociHeaders(extra?: Record<string, string>): Record<string, string> {
|
|
59
|
+
return {
|
|
60
|
+
'Docker-Distribution-Api-Version' : 'registry/2.0',
|
|
61
|
+
'Access-Control-Allow-Origin' : '*',
|
|
62
|
+
...extra,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Build a 404 response with OCI error envelope. */
|
|
67
|
+
function notFound(code: string, message: string): OciResponse {
|
|
68
|
+
return {
|
|
69
|
+
status : 404,
|
|
70
|
+
headers : ociHeaders({ 'Content-Type': 'application/json' }),
|
|
71
|
+
body : JSON.stringify({
|
|
72
|
+
errors: [{ code, message, detail: null }],
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Parse an OCI repository name into DID + image name.
|
|
79
|
+
*
|
|
80
|
+
* OCI repositories use the format: `did:<method>:<id>/<image-name>`
|
|
81
|
+
* Docker CLI sends this as the `name` portion of the v2 API path.
|
|
82
|
+
*/
|
|
83
|
+
export function parseOciName(
|
|
84
|
+
name: string,
|
|
85
|
+
): { did: string; imageName: string } | null {
|
|
86
|
+
const match = name.match(
|
|
87
|
+
/^(did:[a-z0-9]+:[a-zA-Z0-9._:%-]+)\/([a-zA-Z0-9._/-]+)$/,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
if (!match) { return null; }
|
|
91
|
+
|
|
92
|
+
return { did: match[1], imageName: match[2] };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Compute a SHA-256 digest of the given data.
|
|
97
|
+
*
|
|
98
|
+
* Returns the digest in OCI format: `sha256:<hex>`.
|
|
99
|
+
*/
|
|
100
|
+
async function sha256Digest(data: Uint8Array | string): Promise<string> {
|
|
101
|
+
const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
102
|
+
const hash = new Uint8Array(
|
|
103
|
+
await crypto.subtle.digest('SHA-256', bytes),
|
|
104
|
+
);
|
|
105
|
+
const hex = Array.from(hash).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
106
|
+
return `sha256:${hex}`;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Handlers
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
|
|
113
|
+
/** GET /v2/ — API version check. */
|
|
114
|
+
function handleApiVersionCheck(): OciResponse {
|
|
115
|
+
return {
|
|
116
|
+
status : 200,
|
|
117
|
+
headers : ociHeaders({ 'Content-Type': 'application/json' }),
|
|
118
|
+
body : JSON.stringify({}),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** GET /v2/{name}/tags/list — list tags for a repository. */
|
|
123
|
+
async function handleTagsList(
|
|
124
|
+
ctx: AgentContext,
|
|
125
|
+
did: string,
|
|
126
|
+
imageName: string,
|
|
127
|
+
): Promise<OciResponse> {
|
|
128
|
+
const pkg = await resolvePackage(ctx, did, imageName, 'oci');
|
|
129
|
+
if (!pkg) {
|
|
130
|
+
return notFound('NAME_UNKNOWN', `repository not found: ${did}/${imageName}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const versions = await listVersions(ctx, did, pkg.contextId);
|
|
134
|
+
const tags = versions.map((v) => v.semver);
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
status : 200,
|
|
138
|
+
headers : ociHeaders({ 'Content-Type': 'application/json' }),
|
|
139
|
+
body : JSON.stringify({
|
|
140
|
+
name: `${did}/${imageName}`,
|
|
141
|
+
tags,
|
|
142
|
+
}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* GET /v2/{name}/manifests/{reference} — pull manifest.
|
|
148
|
+
*
|
|
149
|
+
* The manifest is stored as the tarball record's data. The `reference`
|
|
150
|
+
* can be a tag (semver string) or a digest (`sha256:…`).
|
|
151
|
+
*/
|
|
152
|
+
async function handleGetManifest(
|
|
153
|
+
ctx: AgentContext,
|
|
154
|
+
did: string,
|
|
155
|
+
imageName: string,
|
|
156
|
+
reference: string,
|
|
157
|
+
headOnly: boolean,
|
|
158
|
+
): Promise<OciResponse> {
|
|
159
|
+
const pkg = await resolvePackage(ctx, did, imageName, 'oci');
|
|
160
|
+
if (!pkg) {
|
|
161
|
+
return notFound('NAME_UNKNOWN', `repository not found: ${did}/${imageName}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Resolve by tag or digest.
|
|
165
|
+
let manifestBytes: Uint8Array | null = null;
|
|
166
|
+
|
|
167
|
+
if (reference.startsWith('sha256:')) {
|
|
168
|
+
// Digest-based lookup: iterate versions and match by content digest.
|
|
169
|
+
const versions = await listVersions(ctx, did, pkg.contextId);
|
|
170
|
+
for (const ver of versions) {
|
|
171
|
+
const data = await fetchTarball(ctx, did, ver.contextId);
|
|
172
|
+
if (data) {
|
|
173
|
+
const digest = await sha256Digest(data);
|
|
174
|
+
if (digest === reference) {
|
|
175
|
+
manifestBytes = data;
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
} else {
|
|
181
|
+
// Tag-based lookup.
|
|
182
|
+
const ver = await resolveVersion(ctx, did, pkg.contextId, reference);
|
|
183
|
+
if (ver) {
|
|
184
|
+
manifestBytes = await fetchTarball(ctx, did, ver.contextId);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (!manifestBytes) {
|
|
189
|
+
return notFound('MANIFEST_UNKNOWN', `manifest unknown: ${reference}`);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const digest = await sha256Digest(manifestBytes);
|
|
193
|
+
|
|
194
|
+
// Determine content type from manifest content.
|
|
195
|
+
let contentType = 'application/vnd.oci.image.manifest.v1+json';
|
|
196
|
+
try {
|
|
197
|
+
const parsed = JSON.parse(new TextDecoder().decode(manifestBytes));
|
|
198
|
+
if (parsed.mediaType) {
|
|
199
|
+
contentType = parsed.mediaType as string;
|
|
200
|
+
}
|
|
201
|
+
} catch {
|
|
202
|
+
// Not valid JSON — treat as raw manifest.
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (headOnly) {
|
|
206
|
+
return {
|
|
207
|
+
status : 200,
|
|
208
|
+
headers : ociHeaders({
|
|
209
|
+
'Content-Type' : contentType,
|
|
210
|
+
'Content-Length' : String(manifestBytes.byteLength),
|
|
211
|
+
'Docker-Content-Digest' : digest,
|
|
212
|
+
}),
|
|
213
|
+
body: '',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
status : 200,
|
|
219
|
+
headers : ociHeaders({
|
|
220
|
+
'Content-Type' : contentType,
|
|
221
|
+
'Content-Length' : String(manifestBytes.byteLength),
|
|
222
|
+
'Docker-Content-Digest' : digest,
|
|
223
|
+
}),
|
|
224
|
+
body: manifestBytes,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* GET /v2/{name}/blobs/{digest} — pull a blob.
|
|
230
|
+
*
|
|
231
|
+
* In this shim, blobs are also stored as version tarballs. The digest
|
|
232
|
+
* is matched against all version tarballs for the repository.
|
|
233
|
+
*
|
|
234
|
+
* For a production implementation, blobs would be stored as separate
|
|
235
|
+
* DWN records keyed by content digest.
|
|
236
|
+
*/
|
|
237
|
+
async function handleGetBlob(
|
|
238
|
+
ctx: AgentContext,
|
|
239
|
+
did: string,
|
|
240
|
+
imageName: string,
|
|
241
|
+
digest: string,
|
|
242
|
+
): Promise<OciResponse> {
|
|
243
|
+
const pkg = await resolvePackage(ctx, did, imageName, 'oci');
|
|
244
|
+
if (!pkg) {
|
|
245
|
+
return notFound('NAME_UNKNOWN', `repository not found: ${did}/${imageName}`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Search all versions for a tarball matching the digest.
|
|
249
|
+
const versions = await listVersions(ctx, did, pkg.contextId);
|
|
250
|
+
for (const ver of versions) {
|
|
251
|
+
const data = await fetchTarball(ctx, did, ver.contextId);
|
|
252
|
+
if (data) {
|
|
253
|
+
const d = await sha256Digest(data);
|
|
254
|
+
if (d === digest) {
|
|
255
|
+
return {
|
|
256
|
+
status : 200,
|
|
257
|
+
headers : ociHeaders({
|
|
258
|
+
'Content-Type' : 'application/octet-stream',
|
|
259
|
+
'Content-Length' : String(data.byteLength),
|
|
260
|
+
'Docker-Content-Digest' : digest,
|
|
261
|
+
}),
|
|
262
|
+
body: data,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return notFound('BLOB_UNKNOWN', `blob unknown: ${digest}`);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// Router
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Route an OCI registry request to the appropriate handler.
|
|
277
|
+
*
|
|
278
|
+
* Exported for testing — tests can call this directly without starting
|
|
279
|
+
* an HTTP server.
|
|
280
|
+
*/
|
|
281
|
+
export async function handleOciRequest(
|
|
282
|
+
ctx: AgentContext,
|
|
283
|
+
url: URL,
|
|
284
|
+
method: string = 'GET',
|
|
285
|
+
): Promise<OciResponse> {
|
|
286
|
+
const path = url.pathname;
|
|
287
|
+
|
|
288
|
+
// --- /v2/ — API version check ----------------------------------------
|
|
289
|
+
if (path === '/v2/' || path === '/v2') {
|
|
290
|
+
return handleApiVersionCheck();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// All other endpoints are under /v2/{name}/…
|
|
294
|
+
const v2Match = path.match(/^\/v2\/(.+)\/(manifests|blobs|tags)\/(.+)$/);
|
|
295
|
+
if (!v2Match) {
|
|
296
|
+
// Check for tags/list format: /v2/{name}/tags/list
|
|
297
|
+
const tagsMatch = path.match(/^\/v2\/(.+)\/tags\/list$/);
|
|
298
|
+
if (tagsMatch) {
|
|
299
|
+
const parsed = parseOciName(tagsMatch[1]);
|
|
300
|
+
if (!parsed) {
|
|
301
|
+
return notFound('NAME_INVALID', 'Invalid repository name. Expected did:<method>:<id>/<name>');
|
|
302
|
+
}
|
|
303
|
+
return handleTagsList(ctx, parsed.did, parsed.imageName);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return notFound('NAME_INVALID', 'Invalid v2 API path');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const repoName = v2Match[1];
|
|
310
|
+
const endpoint = v2Match[2];
|
|
311
|
+
const reference = v2Match[3];
|
|
312
|
+
|
|
313
|
+
const parsed = parseOciName(repoName);
|
|
314
|
+
if (!parsed) {
|
|
315
|
+
return notFound('NAME_INVALID', 'Invalid repository name. Expected did:<method>:<id>/<name>');
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
switch (endpoint) {
|
|
319
|
+
case 'manifests':
|
|
320
|
+
return handleGetManifest(ctx, parsed.did, parsed.imageName, reference, method === 'HEAD');
|
|
321
|
+
|
|
322
|
+
case 'blobs':
|
|
323
|
+
return handleGetBlob(ctx, parsed.did, parsed.imageName, reference);
|
|
324
|
+
|
|
325
|
+
case 'tags':
|
|
326
|
+
if (reference === 'list') {
|
|
327
|
+
return handleTagsList(ctx, parsed.did, parsed.imageName);
|
|
328
|
+
}
|
|
329
|
+
return notFound('NAME_INVALID', `Unknown tags endpoint: ${reference}`);
|
|
330
|
+
|
|
331
|
+
default:
|
|
332
|
+
return notFound('NAME_INVALID', `Unknown endpoint: ${endpoint}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OCI Distribution registry shim — HTTP server.
|
|
3
|
+
*
|
|
4
|
+
* Starts a local OCI-compatible registry that resolves DID-scoped
|
|
5
|
+
* container images from DWN records.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* gitd shim oci [--port 5555]
|
|
9
|
+
*
|
|
10
|
+
* Then:
|
|
11
|
+
* docker pull localhost:5555/did:dht:abc123/my-image:v1.0.0
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { Server } from 'node:http';
|
|
17
|
+
|
|
18
|
+
import { createServer } from 'node:http';
|
|
19
|
+
|
|
20
|
+
import type { AgentContext } from '../../cli/agent.js';
|
|
21
|
+
import type { OciResponse } from './registry.js';
|
|
22
|
+
|
|
23
|
+
import { handleOciRequest } from './registry.js';
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Types
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
export type OciShimOptions = {
|
|
30
|
+
ctx : AgentContext;
|
|
31
|
+
port : number;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Server
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
/** Start the OCI registry shim server. Returns the server instance. */
|
|
39
|
+
export function startOciShim(options: OciShimOptions): Server {
|
|
40
|
+
const { ctx, port } = options;
|
|
41
|
+
|
|
42
|
+
const server = createServer(async (req, res) => {
|
|
43
|
+
// CORS preflight.
|
|
44
|
+
if (req.method === 'OPTIONS') {
|
|
45
|
+
res.writeHead(204, {
|
|
46
|
+
'Access-Control-Allow-Origin' : '*',
|
|
47
|
+
'Access-Control-Allow-Methods' : 'GET, HEAD, OPTIONS',
|
|
48
|
+
'Access-Control-Allow-Headers' : 'Authorization, Accept, Docker-Distribution-Api-Version',
|
|
49
|
+
'Access-Control-Max-Age' : '86400',
|
|
50
|
+
});
|
|
51
|
+
res.end();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Only support GET and HEAD — this is a pull-only registry.
|
|
56
|
+
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
57
|
+
res.writeHead(405, {
|
|
58
|
+
'Content-Type' : 'application/json',
|
|
59
|
+
'Docker-Distribution-Api-Version' : 'registry/2.0',
|
|
60
|
+
});
|
|
61
|
+
res.end(JSON.stringify({
|
|
62
|
+
errors: [{ code: 'UNSUPPORTED', message: 'This is a read-only registry shim.', detail: null }],
|
|
63
|
+
}));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
const url = new URL(req.url ?? '/', `http://localhost:${port}`);
|
|
69
|
+
const result: OciResponse = await handleOciRequest(ctx, url, req.method);
|
|
70
|
+
|
|
71
|
+
res.writeHead(result.status, result.headers);
|
|
72
|
+
res.end(result.body);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
console.error(`[oci-shim] Error: ${(err as Error).message}`);
|
|
75
|
+
res.writeHead(500, {
|
|
76
|
+
'Content-Type' : 'application/json',
|
|
77
|
+
'Docker-Distribution-Api-Version' : 'registry/2.0',
|
|
78
|
+
});
|
|
79
|
+
res.end(JSON.stringify({
|
|
80
|
+
errors: [{ code: 'UNKNOWN', message: 'Internal server error', detail: null }],
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
server.listen(port, () => {
|
|
86
|
+
console.log(`[oci-shim] OCI registry shim running at http://localhost:${port}`);
|
|
87
|
+
console.log('[oci-shim] Usage:');
|
|
88
|
+
console.log(` docker pull localhost:${port}/did:dht:<id>/<image>:<tag>`);
|
|
89
|
+
console.log(` podman pull localhost:${port}/did:dht:<id>/<image>:<tag>`);
|
|
90
|
+
console.log('');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
return server;
|
|
94
|
+
}
|
package/src/social.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge Social Protocol — stars, follows, and activity feeds.
|
|
3
|
+
*
|
|
4
|
+
* Stars and follows live on the actor's DWN, not the target's. This preserves
|
|
5
|
+
* data sovereignty: your social graph is yours. Aggregate counts (e.g., "how
|
|
6
|
+
* many stars does this repo have?") are computed by indexers.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ProtocolDefinition } from '@enbox/dwn-sdk-js';
|
|
12
|
+
|
|
13
|
+
import { defineProtocol } from '@enbox/api';
|
|
14
|
+
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Data types
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
/** Data shape for a star record (lives on the starrer's DWN). */
|
|
20
|
+
export type StarData = {
|
|
21
|
+
repoDid : string;
|
|
22
|
+
repoRecordId : string;
|
|
23
|
+
repoName? : string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** Data shape for a follow record (lives on the follower's DWN). */
|
|
27
|
+
export type FollowData = {
|
|
28
|
+
targetDid : string;
|
|
29
|
+
alias? : string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** Data shape for an activity feed entry. */
|
|
33
|
+
export type ActivityData = {
|
|
34
|
+
type : string;
|
|
35
|
+
repoDid? : string;
|
|
36
|
+
repoRecordId? : string;
|
|
37
|
+
recordId? : string;
|
|
38
|
+
summary? : string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Schema map
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
/** Maps protocol type names to their TypeScript data shapes. */
|
|
46
|
+
export type ForgeSocialSchemaMap = {
|
|
47
|
+
star : StarData;
|
|
48
|
+
follow : FollowData;
|
|
49
|
+
activity : ActivityData;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Protocol definition
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
export const ForgeSocialDefinition = {
|
|
57
|
+
protocol : 'https://enbox.org/protocols/forge/social',
|
|
58
|
+
published : true,
|
|
59
|
+
types : {
|
|
60
|
+
star: {
|
|
61
|
+
schema : 'https://enbox.org/schemas/forge/star',
|
|
62
|
+
dataFormats : ['application/json'],
|
|
63
|
+
},
|
|
64
|
+
follow: {
|
|
65
|
+
schema : 'https://enbox.org/schemas/forge/follow',
|
|
66
|
+
dataFormats : ['application/json'],
|
|
67
|
+
},
|
|
68
|
+
activity: {
|
|
69
|
+
schema : 'https://enbox.org/schemas/forge/activity',
|
|
70
|
+
dataFormats : ['application/json'],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
structure: {
|
|
74
|
+
star: {
|
|
75
|
+
// Stars live on the STARRER's DWN — owner-only write, public read
|
|
76
|
+
$actions : [{ who: 'anyone', can: ['read'] }],
|
|
77
|
+
$tags : {
|
|
78
|
+
$requiredTags : ['repoDid', 'repoRecordId'],
|
|
79
|
+
$allowUndefinedTags : false,
|
|
80
|
+
repoDid : { type: 'string' },
|
|
81
|
+
repoRecordId : { type: 'string' },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
follow: {
|
|
85
|
+
// Follows live on the FOLLOWER's DWN — owner-only write, public read
|
|
86
|
+
$actions : [{ who: 'anyone', can: ['read'] }],
|
|
87
|
+
$tags : {
|
|
88
|
+
$requiredTags : ['targetDid'],
|
|
89
|
+
$allowUndefinedTags : false,
|
|
90
|
+
targetDid : { type: 'string' },
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
activity: {
|
|
94
|
+
// Activity feed on the actor's DWN — public read
|
|
95
|
+
$actions : [{ who: 'anyone', can: ['read'] }],
|
|
96
|
+
$tags : {
|
|
97
|
+
$requiredTags : ['type'],
|
|
98
|
+
$allowUndefinedTags : true,
|
|
99
|
+
type : {
|
|
100
|
+
type : 'string',
|
|
101
|
+
enum : ['push', 'issue_open', 'issue_close', 'patch_open', 'patch_merge', 'release', 'star', 'fork'],
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
} as const satisfies ProtocolDefinition;
|
|
107
|
+
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Typed protocol export
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
/** Typed Forge Social protocol for use with `dwn.using()`. */
|
|
113
|
+
export const ForgeSocialProtocol = defineProtocol(
|
|
114
|
+
ForgeSocialDefinition,
|
|
115
|
+
{} as ForgeSocialSchemaMap,
|
|
116
|
+
);
|
package/src/web/html.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML template helpers for the read-only web UI.
|
|
3
|
+
*
|
|
4
|
+
* Server-rendered HTML with minimal inline CSS — no frontend framework,
|
|
5
|
+
* no build step, no client-side JavaScript.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Layout
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Wrap page content in a full HTML document with navigation.
|
|
16
|
+
*
|
|
17
|
+
* @param basePath - URL prefix for all nav links, e.g. `/did:dht:abc123`
|
|
18
|
+
*/
|
|
19
|
+
export function layout(title: string, repoName: string, body: string, basePath: string = ''): string {
|
|
20
|
+
const base = basePath || '';
|
|
21
|
+
return `<!DOCTYPE html>
|
|
22
|
+
<html lang="en">
|
|
23
|
+
<head>
|
|
24
|
+
<meta charset="utf-8">
|
|
25
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
26
|
+
<title>${esc(title)} — ${esc(repoName)} — gitd</title>
|
|
27
|
+
<style>
|
|
28
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
29
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
30
|
+
line-height: 1.6; color: #24292f; margin: 0; padding: 0; background: #f6f8fa; }
|
|
31
|
+
a { color: #0969da; text-decoration: none; }
|
|
32
|
+
a:hover { text-decoration: underline; }
|
|
33
|
+
.container { max-width: 960px; margin: 0 auto; padding: 0 16px; }
|
|
34
|
+
header { background: #24292f; color: #fff; padding: 12px 0; }
|
|
35
|
+
header a { color: #fff; font-weight: 600; }
|
|
36
|
+
header .repo-name { font-size: 1.2em; }
|
|
37
|
+
nav { background: #fff; border-bottom: 1px solid #d0d7de; padding: 8px 0; }
|
|
38
|
+
nav a { margin-right: 16px; padding: 4px 8px; border-radius: 6px; color: #24292f; }
|
|
39
|
+
nav a:hover { background: #f3f4f6; text-decoration: none; }
|
|
40
|
+
nav a.active { font-weight: 600; border-bottom: 2px solid #fd8c73; }
|
|
41
|
+
main { padding: 24px 0; }
|
|
42
|
+
.card { background: #fff; border: 1px solid #d0d7de; border-radius: 6px; padding: 16px; margin-bottom: 16px; }
|
|
43
|
+
.card h2 { margin-top: 0; }
|
|
44
|
+
.badge { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 0.85em; font-weight: 600; }
|
|
45
|
+
.badge-open { background: #dafbe1; color: #116329; }
|
|
46
|
+
.badge-closed { background: #ffd8d3; color: #82071e; }
|
|
47
|
+
.badge-merged { background: #ddf4ff; color: #0550ae; }
|
|
48
|
+
.badge-draft { background: #f6f8fa; color: #57606a; }
|
|
49
|
+
.meta { color: #57606a; font-size: 0.9em; }
|
|
50
|
+
.comment { border-left: 3px solid #d0d7de; padding-left: 12px; margin: 12px 0; }
|
|
51
|
+
.empty { color: #57606a; font-style: italic; }
|
|
52
|
+
table { width: 100%; border-collapse: collapse; }
|
|
53
|
+
td, th { padding: 8px 12px; text-align: left; border-bottom: 1px solid #d0d7de; }
|
|
54
|
+
th { font-weight: 600; background: #f6f8fa; }
|
|
55
|
+
pre { background: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; white-space: pre-wrap; }
|
|
56
|
+
.wiki-body { line-height: 1.8; }
|
|
57
|
+
.did-input { width: 100%; padding: 10px 14px; font-size: 1em; border: 1px solid #d0d7de;
|
|
58
|
+
border-radius: 6px; font-family: monospace; }
|
|
59
|
+
</style>
|
|
60
|
+
</head>
|
|
61
|
+
<body>
|
|
62
|
+
<header>
|
|
63
|
+
<div class="container">
|
|
64
|
+
<a href="${base || '/'}" class="repo-name">${esc(repoName)}</a>
|
|
65
|
+
<span style="color:#8b949e;margin-left:8px">gitd</span>
|
|
66
|
+
</div>
|
|
67
|
+
</header>
|
|
68
|
+
<nav>
|
|
69
|
+
<div class="container">
|
|
70
|
+
<a href="${base}/">Overview</a>
|
|
71
|
+
<a href="${base}/issues">Issues</a>
|
|
72
|
+
<a href="${base}/patches">Patches</a>
|
|
73
|
+
<a href="${base}/releases">Releases</a>
|
|
74
|
+
<a href="${base}/wiki">Wiki</a>
|
|
75
|
+
</div>
|
|
76
|
+
</nav>
|
|
77
|
+
<main>
|
|
78
|
+
<div class="container">
|
|
79
|
+
${body}
|
|
80
|
+
</div>
|
|
81
|
+
</main>
|
|
82
|
+
</body>
|
|
83
|
+
</html>`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Helpers
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
/** Escape HTML special characters. */
|
|
91
|
+
export function esc(text: string): string {
|
|
92
|
+
return text
|
|
93
|
+
.replace(/&/g, '&')
|
|
94
|
+
.replace(/</g, '<')
|
|
95
|
+
.replace(/>/g, '>')
|
|
96
|
+
.replace(/"/g, '"');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Format a status string as a colored badge. */
|
|
100
|
+
export function statusBadge(status: string): string {
|
|
101
|
+
const lower = status.toLowerCase();
|
|
102
|
+
let cls = 'badge';
|
|
103
|
+
if (lower === 'open') { cls += ' badge-open'; }
|
|
104
|
+
else if (lower === 'closed') { cls += ' badge-closed'; }
|
|
105
|
+
else if (lower === 'merged') { cls += ' badge-merged'; }
|
|
106
|
+
else if (lower === 'draft') { cls += ' badge-draft'; }
|
|
107
|
+
return `<span class="${cls}">${esc(status.toUpperCase())}</span>`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Format an ISO date string to a short date. */
|
|
111
|
+
export function shortDate(iso: string | undefined): string {
|
|
112
|
+
return iso?.slice(0, 10) ?? '';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Simple markdown-like rendering: newlines to <br>, backticks to <code>. */
|
|
116
|
+
export function renderBody(text: string): string {
|
|
117
|
+
return esc(text)
|
|
118
|
+
.replace(/`([^`]+)`/g, '<code>$1</code>')
|
|
119
|
+
.replace(/\n/g, '<br>');
|
|
120
|
+
}
|