Skip to content

Commit 49b7de0

Browse files
authored
Merge pull request #4 from continuedev/nate/cleanup
THX: Eliminate free trial, migrate docs site, document secrets
2 parents 791f63a + bf5906f commit 49b7de0

49 files changed

Lines changed: 9234 additions & 15 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
name: Deploy Docs to GitHub Pages
2+
3+
on:
4+
push:
5+
branches: [main]
6+
paths:
7+
- "docs/**"
8+
- "docs-site/**"
9+
10+
workflow_dispatch:
11+
12+
permissions:
13+
contents: read
14+
pages: write
15+
id-token: write
16+
17+
concurrency:
18+
group: "pages"
19+
cancel-in-progress: true
20+
21+
jobs:
22+
build:
23+
runs-on: ubuntu-latest
24+
steps:
25+
- uses: actions/checkout@v4
26+
27+
- uses: actions/setup-node@v4
28+
with:
29+
node-version: 20
30+
cache: npm
31+
cache-dependency-path: docs-site/package-lock.json
32+
33+
- name: Install dependencies
34+
working-directory: docs-site
35+
run: npm ci
36+
37+
- name: Build
38+
working-directory: docs-site
39+
run: npm run build
40+
41+
- name: Upload artifact
42+
uses: actions/upload-pages-artifact@v3
43+
with:
44+
path: docs-site/out
45+
46+
deploy:
47+
environment:
48+
name: github-pages
49+
url: ${{ steps.deployment.outputs.page_url }}
50+
runs-on: ubuntu-latest
51+
needs: build
52+
steps:
53+
- name: Deploy to GitHub Pages
54+
id: deployment
55+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ downloads/
1515
eggs/
1616
.eggs/
1717
lib/
18+
!docs-site/lib/
1819
lib64/
1920
parts/
2021
sdist/

BUILD_DEPENDENCIES.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Build Dependencies & Secrets
2+
3+
This document catalogs all build dependencies, secrets, and environment variables required by the continue-fork repository.
4+
5+
---
6+
7+
## VS Code Extension
8+
9+
| Secret | Purpose | Referenced In |
10+
| -------------------- | ----------------------------------------------------------------------------------- | --------------------------- |
11+
| `VSCE_TOKEN` | Personal access token for publishing to the VS Code Marketplace (set as `VSCE_PAT`) | `main.yaml`, `preview.yaml` |
12+
| `VSX_REGISTRY_TOKEN` | Token for publishing to the Open VSX Registry | `main.yaml`, `preview.yaml` |
13+
14+
---
15+
16+
## JetBrains Extension
17+
18+
| Secret | Purpose | Referenced In |
19+
| -------------------------------- | --------------------------------------------------------------------- | ------------------------ |
20+
| `APPLE_CERT_DATA` | Base64-encoded Apple signing certificate (p12) for macOS code signing | `jetbrains-release.yaml` |
21+
| `APPLE_CERT_PASSWORD` | Password for the Apple signing certificate | `jetbrains-release.yaml` |
22+
| `APPLE_NOTARY_USER` | Apple notarization username (currently commented out) | `jetbrains-release.yaml` |
23+
| `APPLE_NOTARY_PASSWORD` | Apple notarization password (currently commented out) | `jetbrains-release.yaml` |
24+
| `JETBRAINS_PUBLISH_TOKEN` | Token for publishing to JetBrains Marketplace | `jetbrains-release.yaml` |
25+
| `JETBRAINS_CERTIFICATE_CHAIN` | Certificate chain for signing the JetBrains plugin | `jetbrains-release.yaml` |
26+
| `JETBRAINS_PRIVATE_KEY` | Private key for signing the JetBrains plugin | `jetbrains-release.yaml` |
27+
| `JETBRAINS_PRIVATE_KEY_PASSWORD` | Password for the JetBrains signing private key | `jetbrains-release.yaml` |
28+
29+
---
30+
31+
## CLI
32+
33+
| Variable | Purpose | Referenced In |
34+
| ------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
35+
| `CONTINUE_API_BASE` | Base URL for the Continue API (defaults to `https://api.continue.dev/`) | `extensions/cli/.env.example` |
36+
| `CONTINUE_API_KEY` | API key for Continue authentication | `extensions/cli/.env.example`, `packages/continue-sdk/typescript/.env.example`, multiple workflows |
37+
38+
---
39+
40+
## NPM Package Releases
41+
42+
| Secret | Purpose | Referenced In |
43+
| ------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
44+
| `SEMANTIC_RELEASE_GITHUB_TOKEN` | GitHub token used by semantic-release for creating releases | `release-openai-adapters.yml`, `release-config-yaml.yml`, `release-fetch.yml`, `release-llm-info.yml`, `reusable-release.yml` |
45+
| `SEMANTIC_RELEASE_NPM_TOKEN` | npm token used by semantic-release for publishing packages | `release-openai-adapters.yml`, `release-config-yaml.yml`, `release-fetch.yml`, `release-llm-info.yml`, `reusable-release.yml` |
46+
| `SEMANTIC_RELEASE_TOKEN` | GitHub token for stable release workflow | `stable-release.yml` |
47+
48+
---
49+
50+
## AI Provider API Keys (Testing & Releases)
51+
52+
Used for integration tests in PR checks and package releases.
53+
54+
| Secret | Purpose | Referenced In |
55+
| ------------------------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------- |
56+
| `OPENAI_API_KEY` | OpenAI API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
57+
| `ANTHROPIC_API_KEY` | Anthropic API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml`, `cli-pr-checks.yml`, `continue-agents.yml` |
58+
| `GEMINI_API_KEY` | Google Gemini API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
59+
| `MISTRAL_API_KEY` | Mistral API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
60+
| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
61+
| `AZURE_FOUNDRY_CODESTRAL_API_KEY` | Azure AI Foundry Codestral API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
62+
| `AZURE_FOUNDRY_MISTRAL_SMALL_API_KEY` | Azure AI Foundry Mistral Small API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
63+
| `AZURE_OPENAI_GPT41_API_KEY` | Azure OpenAI GPT-4.1 API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
64+
| `VOYAGE_API_KEY` | Voyage AI embeddings API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
65+
| `RELACE_API_KEY` | Relace API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
66+
| `INCEPTION_API_KEY` | Inception API key | `pr-checks.yaml`, `reusable-release.yml`, `release-*.yml` |
67+
68+
---
69+
70+
## CI/CD & GitHub
71+
72+
| Secret | Purpose | Referenced In |
73+
| ------------------ | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
74+
| `GITHUB_TOKEN` | Default GitHub Actions token (automatic) | Many workflows |
75+
| `CI_GITHUB_TOKEN` | Elevated GitHub PAT for cross-repo operations and PR management | `jetbrains-release.yaml`, `preview.yaml`, `main.yaml`, `pr-checks.yaml`, `auto-assign-issue.yaml` |
76+
| `CONTINUE_API_KEY` | Continue platform API key for agent workflows | `run-continue-agent.yml`, `tidy-up-codebase.yml`, `snyk-agent.yaml`, `auto-fix-failed-tests.yml`, `cli-pr-checks.yml` |
77+
| `RUNLOOP_API_KEY` | Runloop API key for uploading sandbox blueprints | `stable-release.yml`, `upload-runloop-blueprint.yml` |
78+
| `SNYK_TOKEN` | Snyk security scanning token | `snyk-agent.yaml` |
79+
80+
---
81+
82+
## Issue/PR Tooling
83+
84+
| Secret | Purpose | Referenced In |
85+
| ------------------------------------ | ---------------------------------------------------- | -------------------- |
86+
| `CHROMA_CLOUD_API_KEY` | Chroma vector DB API key for similar issue detection | `similar-issues.yml` |
87+
| `CHROMA_TENANT` | Chroma tenant identifier | `similar-issues.yml` |
88+
| `CHROMA_DATABASE` | Chroma database name | `similar-issues.yml` |
89+
| `ISSUE_PR_METRICS_SLACK_WEBHOOK_URL` | Slack webhook for PR/issue metrics notifications | `metrics.yaml` |
90+
91+
---
92+
93+
## SSH Testing
94+
95+
| Secret | Purpose | Referenced In |
96+
| ------------------------------ | ------------------------------------------- | ---------------- |
97+
| `GH_ACTIONS_SSH_TEST_KEY_PEM` | SSH private key for remote connection tests | `pr-checks.yaml` |
98+
| `GH_ACTIONS_SSH_TEST_DNS_NAME` | DNS name of the SSH test host | `pr-checks.yaml` |
99+
100+
---
101+
102+
All workflow files are located under `.github/workflows/`. Environment example files are at:
103+
104+
- `extensions/cli/.env.example`
105+
- `packages/continue-sdk/typescript/.env.example`

core/config/profile/LocalProfileLoader.vitest.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,9 @@ describe("LocalProfileLoader", () => {
6262
configName: "My Custom Config",
6363
});
6464

65-
const loader = new LocalProfileLoader(
66-
testIde,
67-
controlPlaneClient,
68-
llmLogger,
69-
);
65+
const loader = new LocalProfileLoader(testIde, llmLogger);
7066

71-
expect(loader.description.title).toBe("Local Config");
67+
expect(loader.description.title).toBe("Main Config");
7268

7369
await loader.doLoadConfig();
7470

@@ -82,14 +78,10 @@ describe("LocalProfileLoader", () => {
8278
configLoadInterrupted: false,
8379
});
8480

85-
const loader = new LocalProfileLoader(
86-
testIde,
87-
controlPlaneClient,
88-
llmLogger,
89-
);
81+
const loader = new LocalProfileLoader(testIde, llmLogger);
9082

9183
await loader.doLoadConfig();
9284

93-
expect(loader.description.title).toBe("Local Config");
85+
expect(loader.description.title).toBe("Main Config");
9486
});
9587
});

docs-site/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.next/
2+
out/
3+
node_modules/
4+
public/search-index.json
5+
public/images/docs/

docs-site/app/[[...slug]]/page.tsx

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import { compileMDX } from "next-mdx-remote/rsc";
2+
import NotFoundPage from "@/app/components/NotFoundPage";
3+
import { ClientRedirect } from "@/app/components/ClientRedirect";
4+
import { Metadata } from "next/types";
5+
import remarkGfm from "remark-gfm";
6+
import rehypeSlug from "rehype-slug";
7+
import rehypeAutolinkHeadings from "rehype-autolink-headings";
8+
import rehypePrismPlus from "rehype-prism-plus";
9+
import {
10+
loadMdxFile,
11+
getHeadings,
12+
getAllDocTitles,
13+
getAllDocSlugs,
14+
docsNav,
15+
resolveDocsRedirect,
16+
docsRedirects,
17+
} from "@/lib/docs";
18+
import { getPageNavigation } from "@/config/docsNav";
19+
import { mdxComponents } from "@/components/docs/mdx";
20+
import { DocsShell } from "@/components/docs/DocsShell";
21+
import { PageNav } from "@/components/docs/PageNav";
22+
import { CopyPageButton } from "@/components/docs/CopyPageButton";
23+
import "../docs.css";
24+
25+
interface Props {
26+
params: Promise<{ slug?: string[] }>;
27+
}
28+
29+
export async function generateStaticParams() {
30+
const docSlugs = getAllDocSlugs();
31+
const params: { slug: string[] }[] = [];
32+
33+
// Root page (index)
34+
params.push({ slug: [] });
35+
36+
// All doc pages from navigation
37+
for (const slug of docSlugs) {
38+
params.push({ slug: slug.split("/") });
39+
}
40+
41+
// All redirect source pages
42+
for (const source of docsRedirects.keys()) {
43+
params.push({ slug: source.split("/") });
44+
}
45+
46+
return params;
47+
}
48+
49+
export async function generateMetadata({ params }: Props): Promise<Metadata> {
50+
const { slug } = await params;
51+
const doc = await loadMdxFile(slug || ["index"]);
52+
if (!doc) return {};
53+
54+
return {
55+
title: doc.frontmatter.title
56+
? `${doc.frontmatter.title} | Continue Docs`
57+
: "Continue Docs",
58+
description: doc.frontmatter.description || "",
59+
};
60+
}
61+
62+
export default async function DocsPage({ params }: Props) {
63+
const { slug } = await params;
64+
const slugPath = slug || ["index"];
65+
66+
// Check redirect first
67+
const redirectTo = resolveDocsRedirect(slugPath);
68+
if (redirectTo) {
69+
const target = redirectTo.startsWith("http")
70+
? redirectTo
71+
: `/docs${redirectTo}`;
72+
return <ClientRedirect to={target} />;
73+
}
74+
75+
const doc = await loadMdxFile(slugPath);
76+
if (!doc) {
77+
return <NotFoundPage />;
78+
}
79+
80+
const headings = getHeadings(doc.content);
81+
const titleMap = getAllDocTitles();
82+
83+
const { content } = await compileMDX({
84+
source: doc.content,
85+
options: {
86+
mdxOptions: {
87+
remarkPlugins: [remarkGfm],
88+
rehypePlugins: [
89+
rehypeSlug,
90+
[
91+
rehypeAutolinkHeadings,
92+
{
93+
behavior: "wrap",
94+
properties: { className: ["heading-anchor"] },
95+
},
96+
],
97+
[rehypePrismPlus, { ignoreMissing: true }],
98+
],
99+
},
100+
},
101+
components: mdxComponents,
102+
});
103+
104+
const currentSlug = (slug || ["index"]).join("/");
105+
const { prev, next } = getPageNavigation(docsNav, currentSlug, titleMap);
106+
107+
return (
108+
<DocsShell
109+
currentSlug={currentSlug}
110+
headings={headings}
111+
titleMap={titleMap}
112+
docsNav={docsNav}
113+
>
114+
{doc.frontmatter.title && (
115+
<div className="mb-2 flex items-start justify-between gap-4">
116+
<h1 className="text-3xl font-light tracking-tight text-black/90 dark:text-white/90">
117+
{doc.frontmatter.title}
118+
</h1>
119+
<CopyPageButton slug={currentSlug} />
120+
</div>
121+
)}
122+
{doc.frontmatter.description && (
123+
<p className="mb-8 text-lg text-black/50 dark:text-white/50">
124+
{doc.frontmatter.description.replace(/\*\*/g, "")}
125+
</p>
126+
)}
127+
<div className="docs-content max-w-3xl">{content}</div>
128+
<div className="max-w-3xl">
129+
<PageNav prev={prev} next={next} />
130+
</div>
131+
</DocsShell>
132+
);
133+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use client";
2+
3+
import { useEffect } from "react";
4+
5+
export function ClientRedirect({ to }: { to: string }) {
6+
useEffect(() => {
7+
window.location.replace(to);
8+
}, [to]);
9+
10+
return (
11+
<div className="flex min-h-[60vh] items-center justify-center">
12+
<p className="text-sm text-black/40 dark:text-white/40">Redirecting...</p>
13+
</div>
14+
);
15+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Link from "next/link";
2+
3+
export default function NotFoundPage() {
4+
return (
5+
<div className="flex min-h-[60vh] flex-col items-center justify-center gap-4">
6+
<h1 className="text-2xl font-light text-black/80 dark:text-white/80">
7+
Page not found
8+
</h1>
9+
<Link
10+
href="/"
11+
className="text-sm text-black/40 hover:text-black/70 dark:text-white/40 dark:hover:text-white/70"
12+
>
13+
Back to docs
14+
</Link>
15+
</div>
16+
);
17+
}

0 commit comments

Comments
 (0)