From 68b5b9e03ef33c1edb2b229dc3fe2998e7ca39dd Mon Sep 17 00:00:00 2001 From: 0xSage Date: Wed, 3 Jan 2024 16:20:58 +0800 Subject: [PATCH 1/2] docs: update pm handbook --- docs/docs/handbook/product.md | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/docs/docs/handbook/product.md b/docs/docs/handbook/product.md index 7731f4bf5..c198bfe80 100644 --- a/docs/docs/handbook/product.md +++ b/docs/docs/handbook/product.md @@ -6,41 +6,49 @@ We use the [Jan Monorepo Project](https://github.com/orgs/janhq/projects/5) in G As much as possible, everyone owns their respective `epics` and `tasks`. -> We aim for a `loosely coupled, but tightly aligned` autonomous culture. +:::tip +We aim for a `loosely coupled, but tightly aligned` autonomous culture. +::: + +## Quicklinks + +- [High-level roadmap](https://github.com/orgs/janhq/projects/5/views/16): view used at at strategic level, for team wide alignment. Start & end dates reflect engineering implementation cycles. Typically product & design work preceeds these timelines. +- [Standup Kanban](https://github.com/orgs/janhq/projects/5/views/25): view used during daily standup. Sprints should be up to date. ## Organization -[`Project Labels`](https://github.com/janhq/jan/issues/labels) +[`Roadmap Labels`](https://github.com/janhq/jan/labels?q=roadmap) -- `Project Labels` tag large, long-term, & strategic projects that can span multiple teams and multiple sprints -- Example label: `project: Jan has Mobile` -- `Projects` contain `epics` +- `Roadmap Labels` tag large, long-term, & strategic projects that can span multiple teams and multiple sprints +- Example label: `roadmap: Jan has Mobile` +- `Roadmaps` contain `epics` [`Epics`](https://github.com/janhq/jan/issues?q=is%3Aissue+is%3Aopen+label%3A%22type%3A+epic%22) - `Epics` track large stories that span 1-2 weeks, and it outlines specs, architecture decisions, designs -- Each `epic` corresponds with a `milestone` - `Epics` contain `tasks` - `Epics` should always have 1 owner [`Milestones`](https://github.com/janhq/jan/milestones) -- `Milestones` correspond 1:1 to `epics` and are used to filter [Roadmap Views](https://github.com/orgs/janhq/projects/5/views/16) -- `Milestones` span 1-2 weeks and have deadlines +- `Milestones` track release versions. We use [semantic versioning](https://semver.org/) +- `Milestones` span ~2 weeks and have deadlines +- `Milestones` usually fit within 2 week sprint cycles [`Tasks`](https://github.com/janhq/jan/issues) - Tasks are individual issues (feats, bugs, chores) that can be completed within a few days -- Tasks under `In-progress` and `Todo` should always belong to a `milestone` +- Tasks, except for critical bugs, should always belong to an `epic` (and thus fit into our roadmap) - Tasks are usually named per [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) - Tasks should always have 1 owner -We aim to always work on `tasks` that belong to a `milestones`. +We aim to always sprint on `tasks` that are a part of the [current roadmap](https://github.com/orgs/janhq/projects/5/views/16). -## Task Status +## Kanban -- `triaged`: issues that have been assigned -- `todo`: issues you plan to tackle within this week +- `no status`: issues that need to be triaged (needs an owner, ETA) +- `icebox`: issues you don't plan to tackle yet +- `planned`: issues you plan to tackle this week - `in-progress`: in progress - `in-review`: pending PR or blocked by something - `done`: done From c16da281866173b678041f3926425e8ad1cf0e34 Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Wed, 3 Jan 2024 16:01:50 +0700 Subject: [PATCH 2/2] correct type utf-8 (#1311) Co-authored-by: Hien To --- core/src/node/extension/manager.ts | 2 +- core/src/node/extension/store.ts | 2 +- extensions/inference-nitro-extension/src/module.ts | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/node/extension/manager.ts b/core/src/node/extension/manager.ts index 9173504a7..618a5ed9f 100644 --- a/core/src/node/extension/manager.ts +++ b/core/src/node/extension/manager.ts @@ -47,7 +47,7 @@ export class ExtensionManager { const extensionsJson = join(extDir, "extensions.json"); if (!existsSync(extensionsJson)) - writeFileSync(extensionsJson, "{}", "utf8"); + writeFileSync(extensionsJson, "{}", "utf-8"); this.extensionsPath = extDir; } catch (error) { diff --git a/core/src/node/extension/store.ts b/core/src/node/extension/store.ts index 8e11c2bb2..2225479ca 100644 --- a/core/src/node/extension/store.ts +++ b/core/src/node/extension/store.ts @@ -84,7 +84,7 @@ export function persistExtensions() { writeFileSync( ExtensionManager.instance.getExtensionsFile(), JSON.stringify(persistData), - "utf8" + "utf-8" ); } diff --git a/extensions/inference-nitro-extension/src/module.ts b/extensions/inference-nitro-extension/src/module.ts index 671d67f9c..7678bae19 100644 --- a/extensions/inference-nitro-extension/src/module.ts +++ b/extensions/inference-nitro-extension/src/module.ts @@ -61,7 +61,7 @@ async function updateNvidiaDriverInfo(): Promise { (error, stdout) => { let data; try { - data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf8")); + data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf-8")); } catch (error) { data = DEFALT_SETTINGS; } @@ -109,7 +109,7 @@ function updateCudaExistence() { let data; try { - data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf8")); + data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf-8")); } catch (error) { data = DEFALT_SETTINGS; } @@ -127,7 +127,7 @@ async function updateGpuInfo(): Promise { (error, stdout) => { let data; try { - data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf8")); + data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf-8")); } catch (error) { data = DEFALT_SETTINGS; } @@ -376,7 +376,7 @@ function spawnNitroProcess(nitroResourceProbe: any): Promise { let cudaVisibleDevices = ""; let binaryName; if (process.platform === "win32") { - let nvida_info = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf8")); + let nvida_info = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf-8")); if (nvida_info["run_mode"] === "cpu") { binaryFolder = path.join(binaryFolder, "win-cpu"); } else { @@ -392,7 +392,7 @@ function spawnNitroProcess(nitroResourceProbe: any): Promise { } binaryName = "nitro"; } else { - let nvida_info = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf8")); + let nvida_info = JSON.parse(readFileSync(NVIDIA_INFO_FILE, "utf-8")); if (nvida_info["run_mode"] === "cpu") { binaryFolder = path.join(binaryFolder, "linux-cpu"); } else {