251148c3ff
## Summary - add repository-wide quality tooling and verification scaffolding, including CI workflows, pnpm workspace setup, ESLint/Prettier/markdown checks, and generated-output verification helpers - reorganize skill sources and generation flow by introducing canonical `_source` variants, generator/manifests, reusable helper abstractions, and shared web-automation/browser utilities - clean up and expand documentation so the root README flows into docs and skill docs, with clearer development, reviewer, installer, and workflow guidance ## Notable changes - docs flow and consistency cleanup across `README.md`, `docs/README.md`, and related docs - new scripts for `check`, docs verification, generated-file verification, shell portability, and safe directory replacement - refactors in Atlassian and web-automation skill runtimes to reduce duplication and centralize reusable code - changelog, development documentation, and CI surface updates ## Test Plan - [ ] `pnpm run check` - [ ] review generated/manifests and skill sync outputs - [ ] smoke-check docs flow from `README.md` to `docs/README.md` to skill docs ## Notes - this branch currently includes tracked `skills/web-automation/shared/node_modules` content that should be reviewed carefully as potentially noisy/accidental committed artifacts Co-authored-by: Stefano Fiorini <stefano.fiorini@firsthorizon.com> Reviewed-on: #1
71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
// ⚠️ GENERATED FILE – do not edit directly. Edit the canonical source in skills/atlassian/shared/scripts/ and run `pnpm run sync:pi`.
|
||
import { createJsonHeaders, createStatusError } from "./http.js";
|
||
import type { AtlassianConfig, CommandOutput, FetchLike } from "./types.js";
|
||
|
||
type ProductHealth = {
|
||
ok: boolean;
|
||
status?: number;
|
||
message?: string;
|
||
};
|
||
|
||
function buildUrl(baseUrl: string, path: string) {
|
||
return new URL(path, `${baseUrl}/`).toString();
|
||
}
|
||
|
||
export async function runHealthCheck(
|
||
config: AtlassianConfig,
|
||
fetchImpl: FetchLike | undefined,
|
||
): Promise<CommandOutput<unknown>> {
|
||
const client = fetchImpl ?? globalThis.fetch;
|
||
|
||
if (!client) {
|
||
throw new Error("Fetch API is not available in this runtime");
|
||
}
|
||
|
||
async function probe(product: "Jira" | "Confluence", url: string): Promise<ProductHealth> {
|
||
try {
|
||
const response = await client(url, {
|
||
method: "GET",
|
||
headers: createJsonHeaders(config, false),
|
||
});
|
||
|
||
if (!response.ok) {
|
||
const error = createStatusError(`${product} health check failed`, response);
|
||
return {
|
||
ok: false,
|
||
status: response.status,
|
||
message: error.message,
|
||
};
|
||
}
|
||
|
||
return {
|
||
ok: true,
|
||
status: response.status,
|
||
};
|
||
} catch (error: unknown) {
|
||
return {
|
||
ok: false,
|
||
message: error instanceof Error ? error.message : String(error),
|
||
};
|
||
}
|
||
}
|
||
|
||
const jira = await probe("Jira", buildUrl(config.jiraBaseUrl, "/rest/api/3/myself"));
|
||
const confluence = await probe("Confluence", buildUrl(config.confluenceBaseUrl, "/wiki/api/v2/spaces?limit=1"));
|
||
|
||
return {
|
||
ok: jira.ok && confluence.ok,
|
||
data: {
|
||
baseUrl: config.baseUrl,
|
||
jiraBaseUrl: config.jiraBaseUrl,
|
||
confluenceBaseUrl: config.confluenceBaseUrl,
|
||
defaultProject: config.defaultProject,
|
||
defaultSpace: config.defaultSpace,
|
||
products: {
|
||
jira,
|
||
confluence,
|
||
},
|
||
},
|
||
};
|
||
}
|