trackops 1.0.1 → 1.1.0

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.
Files changed (57) hide show
  1. package/README.md +326 -270
  2. package/bin/trackops.js +102 -70
  3. package/lib/config.js +260 -35
  4. package/lib/control.js +517 -475
  5. package/lib/env.js +227 -0
  6. package/lib/i18n.js +61 -53
  7. package/lib/init.js +135 -46
  8. package/lib/locale.js +63 -0
  9. package/lib/opera-bootstrap.js +523 -0
  10. package/lib/opera.js +319 -170
  11. package/lib/registry.js +27 -13
  12. package/lib/release.js +56 -0
  13. package/lib/resources.js +42 -0
  14. package/lib/server.js +907 -554
  15. package/lib/skills.js +148 -124
  16. package/lib/workspace.js +260 -0
  17. package/locales/en.json +331 -139
  18. package/locales/es.json +331 -139
  19. package/package.json +7 -9
  20. package/scripts/skills-marketplace-smoke.js +124 -0
  21. package/scripts/smoke-tests.js +445 -0
  22. package/scripts/sync-skill-version.js +21 -0
  23. package/scripts/validate-skill.js +88 -0
  24. package/skills/trackops/SKILL.md +64 -0
  25. package/skills/trackops/agents/openai.yaml +3 -0
  26. package/skills/trackops/references/activation.md +39 -0
  27. package/skills/trackops/references/troubleshooting.md +34 -0
  28. package/skills/trackops/references/workflow.md +20 -0
  29. package/skills/trackops/scripts/bootstrap-trackops.js +201 -0
  30. package/skills/trackops/skill.json +29 -0
  31. package/templates/opera/en/agent.md +26 -0
  32. package/templates/opera/en/genesis.md +79 -0
  33. package/templates/opera/en/references/autonomy-and-recovery.md +23 -0
  34. package/templates/opera/en/references/opera-cycle.md +62 -0
  35. package/templates/opera/en/registry.md +28 -0
  36. package/templates/opera/en/router.md +39 -0
  37. package/templates/opera/genesis.md +79 -94
  38. package/templates/skills/changelog-updater/locales/en/SKILL.md +11 -0
  39. package/templates/skills/commiter/locales/en/SKILL.md +11 -0
  40. package/templates/skills/project-starter-skill/locales/en/SKILL.md +24 -0
  41. package/ui/css/panels.css +956 -953
  42. package/ui/index.html +1 -1
  43. package/ui/js/api.js +211 -194
  44. package/ui/js/app.js +200 -199
  45. package/ui/js/i18n.js +14 -0
  46. package/ui/js/onboarding.js +439 -437
  47. package/ui/js/state.js +130 -129
  48. package/ui/js/utils.js +175 -172
  49. package/ui/js/views/board.js +255 -254
  50. package/ui/js/views/execution.js +256 -256
  51. package/ui/js/views/insights.js +340 -339
  52. package/ui/js/views/overview.js +365 -364
  53. package/ui/js/views/settings.js +340 -202
  54. package/ui/js/views/sidebar.js +131 -132
  55. package/ui/js/views/skills.js +163 -162
  56. package/ui/js/views/tasks.js +406 -405
  57. package/ui/js/views/topbar.js +239 -183
@@ -0,0 +1,34 @@
1
+ # Troubleshooting
2
+
3
+ ## Missing prerequisites
4
+
5
+ - If Node is missing or older than 18, install Node 18+ first.
6
+ - If npm is missing, install a Node distribution that includes npm.
7
+
8
+ ## skills cannot find the TrackOps skill
9
+
10
+ - Install from the repository root:
11
+ `npx skills add Baxahaun/trackops --skill trackops --full-depth --global --agent codex -y`
12
+ - Confirm the remote repository already contains the latest committed skill changes.
13
+ - Remember that skills installs from committed Git state, not from uncommitted local changes.
14
+
15
+ ## Global npm install failed
16
+
17
+ - Re-run `node scripts/bootstrap-trackops.js` and inspect stderr.
18
+ - If npm global permissions are blocked, configure a user-writable npm prefix instead of relying on `sudo`.
19
+
20
+ ## Runtime cannot be verified
21
+
22
+ If installation succeeds but `trackops` is still not executable:
23
+
24
+ - Check whether the npm global bin directory is on `PATH`.
25
+ - Re-open the terminal after updating shell profile settings.
26
+ - Re-run `node scripts/bootstrap-trackops.js` once `trackops --version` works.
27
+
28
+ ## Workspace environment looks inconsistent
29
+
30
+ If a split workspace is active and tools do not see the expected environment file:
31
+
32
+ - Run `trackops env status` to inspect required, present, and missing keys without exposing values.
33
+ - Run `trackops env sync` to recreate `/.env`, `/.env.example`, and the `app/.env` bridge.
34
+ - If bridge mode is `copy`, do not edit `app/.env` directly; TrackOps regenerates it from the root `.env`.
@@ -0,0 +1,20 @@
1
+ # Workflow
2
+
3
+ Once TrackOps is active in a repository, operate in this order:
4
+
5
+ 1. Run `trackops status` to inspect focus, phase, blockers, and repo state.
6
+ 2. Run `trackops next` to identify the next ready task.
7
+ 3. Update task state with `trackops task ...` as work progresses.
8
+ 4. Run `trackops sync` after meaningful changes so generated docs stay aligned.
9
+ 5. Run `trackops env status` when the project depends on credentials or external services.
10
+
11
+ Operational rules:
12
+
13
+ - In split workspaces, use `ops/project_control.json` as the source of truth.
14
+ - In legacy repos, use `project_control.json` at repo root.
15
+ - In split workspaces, generated operational docs live under `ops/`.
16
+ - Product code lives under `app/`.
17
+ - Use `/.env` for real secrets and `/.env.example` for the public environment contract.
18
+ - `app/.env` is only a compatibility bridge.
19
+ - If OPERA is installed, use `ops/genesis.md`, `ops/.agent/hub/`, and `ops/.agents/skills/_registry.md` as managed framework artifacts.
20
+ - Keep the global skill layer separate from the local project layer.
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const os = require("os");
5
+ const path = require("path");
6
+ const { spawnSync } = require("child_process");
7
+
8
+ const EXIT_CODES = {
9
+ READY: 0,
10
+ PREREQ: 1,
11
+ INSTALL: 2,
12
+ UNVERIFIABLE: 3,
13
+ };
14
+
15
+ function getNpmCommand() {
16
+ return process.platform === "win32" ? "npm.cmd" : "npm";
17
+ }
18
+
19
+ function readSkillConfig() {
20
+ const skillFile = path.join(__dirname, "..", "skill.json");
21
+ return JSON.parse(fs.readFileSync(skillFile, "utf8"));
22
+ }
23
+
24
+ function getHomeDir() {
25
+ return process.env.TRACKOPS_BOOTSTRAP_HOME || os.homedir();
26
+ }
27
+
28
+ function getPrefixOverride() {
29
+ return process.env.TRACKOPS_BOOTSTRAP_PREFIX || null;
30
+ }
31
+
32
+ function getInstallSource(config) {
33
+ return process.env.TRACKOPS_BOOTSTRAP_INSTALL_SOURCE || `${config.npmPackage}@${config.trackopsVersion}`;
34
+ }
35
+
36
+ function parseMajor(version) {
37
+ const major = Number(String(version || "").split(".")[0]);
38
+ return Number.isFinite(major) ? major : null;
39
+ }
40
+
41
+ function hasSupportedNode() {
42
+ const major = parseMajor(process.versions.node);
43
+ return major != null && major >= 18;
44
+ }
45
+
46
+ function spawnChecked(command, args, extra = {}) {
47
+ const shell = process.platform === "win32" && /\.(cmd|bat)$/i.test(command);
48
+ return spawnSync(command, args, {
49
+ encoding: "utf8",
50
+ stdio: ["ignore", "pipe", "pipe"],
51
+ shell,
52
+ ...extra,
53
+ });
54
+ }
55
+
56
+ function spawnNpm(args, extra = {}) {
57
+ return spawnSync(getNpmCommand(), args, {
58
+ encoding: "utf8",
59
+ stdio: ["ignore", "pipe", "pipe"],
60
+ shell: process.platform === "win32",
61
+ ...extra,
62
+ });
63
+ }
64
+
65
+ function resolvePrefixExecutables(prefix) {
66
+ if (!prefix) return [];
67
+ if (process.platform === "win32") {
68
+ return [
69
+ path.join(prefix, "trackops.cmd"),
70
+ path.join(prefix, "trackops.exe"),
71
+ path.join(prefix, "trackops"),
72
+ ];
73
+ }
74
+ return [path.join(prefix, "bin", "trackops")];
75
+ }
76
+
77
+ function buildVerificationTargets(prefix) {
78
+ const targets = [{ command: "trackops", via: "path" }];
79
+ for (const candidate of resolvePrefixExecutables(prefix)) {
80
+ targets.push({ command: candidate, via: "prefix" });
81
+ }
82
+ return targets;
83
+ }
84
+
85
+ function readInstalledVersion(prefix) {
86
+ for (const target of buildVerificationTargets(prefix)) {
87
+ const result = spawnChecked(target.command, ["--version"]);
88
+ if (result.error || result.status !== 0) continue;
89
+ const version = String(result.stdout || "").trim();
90
+ if (version) {
91
+ return { version, command: target.command, via: target.via };
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+
97
+ function verifyRuntime(expectedVersion, prefix) {
98
+ const installed = readInstalledVersion(prefix);
99
+ if (!installed) {
100
+ return { ok: false, reason: "missing-command" };
101
+ }
102
+ if (installed.version !== expectedVersion) {
103
+ return { ok: false, reason: "version-drift", installed };
104
+ }
105
+
106
+ const help = spawnChecked(installed.command, ["help"]);
107
+ if (help.error || help.status !== 0) {
108
+ return { ok: false, reason: "help-failed", installed };
109
+ }
110
+
111
+ return { ok: true, installed };
112
+ }
113
+
114
+ function ensureNpmAvailable() {
115
+ const result = spawnNpm(["--version"]);
116
+ return !result.error && result.status === 0;
117
+ }
118
+
119
+ function runInstall(config, prefix) {
120
+ const installSource = getInstallSource(config);
121
+ const args = ["install", "-g"];
122
+ if (prefix) {
123
+ args.push("--prefix", prefix);
124
+ }
125
+ args.push(installSource);
126
+
127
+ const result = spawnNpm(args);
128
+ return { ...result, installSource };
129
+ }
130
+
131
+ function writeRuntimeStamp(config, verification) {
132
+ const runtimeDir = path.join(getHomeDir(), ".trackops");
133
+ const runtimeFile = path.join(runtimeDir, "runtime.json");
134
+ fs.mkdirSync(runtimeDir, { recursive: true });
135
+ const payload = {
136
+ skill: config.name,
137
+ skillVersion: config.skillVersion,
138
+ runtimePackage: config.npmPackage,
139
+ runtimeVersion: config.trackopsVersion,
140
+ bootstrapPolicy: config.bootstrapPolicy,
141
+ supportedAgentsV1: config.supportedAgentsV1,
142
+ verifiedAt: new Date().toISOString(),
143
+ verifiedWith: verification.installed.via,
144
+ executable: verification.installed.command,
145
+ };
146
+ fs.writeFileSync(runtimeFile, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
147
+ }
148
+
149
+ function printInstallGuidance(prefix) {
150
+ if (prefix) {
151
+ console.error(`TrackOps was installed under the custom prefix '${prefix}'.`);
152
+ console.error("Use that prefix's executable or add it to PATH before trying again.");
153
+ return;
154
+ }
155
+
156
+ console.error("TrackOps was installed but could not be executed from PATH.");
157
+ console.error("Add your npm global bin directory to PATH, reopen the terminal, and retry.");
158
+ }
159
+
160
+ function main() {
161
+ const config = readSkillConfig();
162
+ const prefix = getPrefixOverride();
163
+
164
+ if (!hasSupportedNode()) {
165
+ console.error("TrackOps requires Node.js 18 or newer.");
166
+ process.exit(EXIT_CODES.PREREQ);
167
+ }
168
+
169
+ if (!ensureNpmAvailable()) {
170
+ console.error("npm is required to bootstrap the TrackOps runtime.");
171
+ process.exit(EXIT_CODES.PREREQ);
172
+ }
173
+
174
+ const current = verifyRuntime(config.trackopsVersion, prefix);
175
+ if (current.ok) {
176
+ writeRuntimeStamp(config, current);
177
+ console.log(`TrackOps runtime ${config.trackopsVersion} is already ready.`);
178
+ process.exit(EXIT_CODES.READY);
179
+ }
180
+
181
+ const install = runInstall(config, prefix);
182
+ if (install.error || install.status !== 0) {
183
+ console.error(`Failed to install ${install.installSource}.`);
184
+ if (install.stderr) {
185
+ console.error(install.stderr.trim());
186
+ }
187
+ process.exit(EXIT_CODES.INSTALL);
188
+ }
189
+
190
+ const verification = verifyRuntime(config.trackopsVersion, prefix);
191
+ if (!verification.ok) {
192
+ printInstallGuidance(prefix);
193
+ process.exit(EXIT_CODES.UNVERIFIABLE);
194
+ }
195
+
196
+ writeRuntimeStamp(config, verification);
197
+ console.log(`TrackOps runtime ${config.trackopsVersion} is ready.`);
198
+ process.exit(EXIT_CODES.READY);
199
+ }
200
+
201
+ main();
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "trackops",
3
+ "shortDescription": "Global TrackOps skill for local project orchestration and operational automation with AI agents.",
4
+ "description": "Installs TrackOps as a global skill, prepares your agent for local project orchestration, ensures the runtime on first use, and guides per-project activation with optional OPERA.",
5
+ "skillVersion": "1.1.0",
6
+ "trackopsVersion": "1.1.0",
7
+ "npmPackage": "trackops",
8
+ "bootstrapPolicy": "first_use",
9
+ "supportedAgentsV1": [
10
+ "antigravity",
11
+ "claude-code",
12
+ "codex",
13
+ "cursor",
14
+ "gemini-cli",
15
+ "github-copilot",
16
+ "kiro-cli"
17
+ ],
18
+ "distribution": {
19
+ "source": "Baxahaun/trackops",
20
+ "skill": "trackops",
21
+ "fullDepth": true
22
+ },
23
+ "repository": {
24
+ "provider": "github",
25
+ "owner": "Baxahaun",
26
+ "repo": "trackops",
27
+ "skillPath": "skills/trackops"
28
+ }
29
+ }
@@ -0,0 +1,26 @@
1
+ # Project Agent: {{PROJECT_NAME}}
2
+
3
+ ## Identity
4
+ You are the primary agent for **{{PROJECT_NAME}}**. You operate under the O.P.E.R.A. v3.0 protocol.
5
+
6
+ ## Source of Truth
7
+ Your source of truth is `genesis.md`. Before making any architectural or implementation decision, read it first.
8
+ For operational tracking and backlog state, use `project_control.json`.
9
+
10
+ ## Behavior
11
+ - Follow the behavior rules defined in `genesis.md`.
12
+ - Respect the autonomy matrix to determine which actions are allowed.
13
+ - Manage tasks and states from `project_control.json`.
14
+ - Do not edit `task_plan.md`, `progress.md`, or `findings.md` manually; regenerate them with `trackops sync`.
15
+
16
+ ## Available Skills
17
+ Check `.agents/skills/_registry.md` to see installed skills.
18
+ You can also discover new skills with `trackops skill catalog`.
19
+
20
+ ## Work Cycle
21
+ 1. Run `trackops status` at the beginning of each work block.
22
+ 2. Read `genesis.md` to understand the data and rules.
23
+ 3. Use `trackops next` to inspect the prioritized queue.
24
+ 4. Before implementing, mark the task with `trackops task start <task-id>`.
25
+ 5. Use the router in `.agent/hub/router.md` to choose the right skill.
26
+ 6. When you finish, move the task to `review`, `complete`, or `block`, then run `trackops sync`.
@@ -0,0 +1,79 @@
1
+ # {{PROJECT_NAME}} — Genesis
2
+
3
+ > **The Constitution of the project.** This document is the source of truth. Before making any architectural or implementation decision, consult this file. If a script contradicts what is defined here, the script is wrong.
4
+
5
+ ---
6
+
7
+ ## 1. Desired Outcome
8
+
9
+ _What is the single desired outcome of this project?_
10
+
11
+ > {{DESIRED_OUTCOME}}
12
+
13
+ ---
14
+
15
+ ## 2. External Integrations
16
+
17
+ _Which external services do we need? Are credentials ready?_
18
+
19
+ | Service | Status | Key / Config |
20
+ |---------|--------|--------------|
21
+ {{SERVICES_TABLE}}
22
+
23
+ ---
24
+
25
+ ## 3. Source of Truth
26
+
27
+ _Where does the primary data live?_
28
+
29
+ > {{SOURCE_OF_TRUTH}}
30
+
31
+ ---
32
+
33
+ ## 4. Payload
34
+
35
+ _How and where should the final result be delivered?_
36
+
37
+ > {{PAYLOAD}}
38
+
39
+ ---
40
+
41
+ ## 5. Behavior Rules
42
+
43
+ _Domain constraints, tone, and specific rules._
44
+
45
+ {{BEHAVIOR_RULES}}
46
+
47
+ ---
48
+
49
+ ## Data Schema
50
+
51
+ > **Data-first rule**: this schema must exist before any code is written.
52
+
53
+ ```json
54
+ {{DATA_SCHEMA}}
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Architectural Invariants
60
+
61
+ _Non-negotiable technical decisions. Changing them requires explicit approval._
62
+
63
+ {{ARCHITECTURAL_INVARIANTS}}
64
+
65
+ ---
66
+
67
+ ## Pipeline
68
+
69
+ _Document the dependency graph between tools._
70
+
71
+ {{PIPELINE_ITEMS}}
72
+
73
+ ---
74
+
75
+ ## Templates
76
+
77
+ _References to output templates defined under `templates/`._
78
+
79
+ {{TEMPLATE_ITEMS}}
@@ -0,0 +1,23 @@
1
+ # Autonomy and Recovery
2
+
3
+ Use this reference to decide when the agent can continue autonomously and when it must stop for confirmation.
4
+
5
+ ## Red level
6
+
7
+ Ask for confirmation before:
8
+ - Changing `genesis.md` in a way that alters the contract.
9
+ - Deleting persistent data.
10
+ - Creating repositories or external resources.
11
+ - Deploying to production.
12
+
13
+ ## Green level
14
+
15
+ Proceed autonomously for:
16
+ - Reading and editing local source files.
17
+ - Running tests and checks.
18
+ - Updating operational docs.
19
+ - Repairing deterministic errors after a bounded number of attempts.
20
+
21
+ ## Recovery rule
22
+
23
+ If a later phase invalidates an earlier decision, document the proposed change first, request approval, and only then update `genesis.md` and the operational record.
@@ -0,0 +1,62 @@
1
+ # The O.P.E.R.A. Cycle — Complete Reference
2
+
3
+ This document describes each phase, its rules, its procedures, and its Definition of Done.
4
+
5
+ ---
6
+
7
+ ## O — Orchestrate
8
+
9
+ Answer the five discovery questions, define the input/output schema in `genesis.md`, document behavior rules, and make sure the plan is approved before moving forward.
10
+
11
+ ### Definition of Done
12
+ - [ ] Discovery questions answered.
13
+ - [ ] Input/output schema defined in `genesis.md`.
14
+ - [ ] Behavior rules documented in `genesis.md`.
15
+ - [ ] `task_plan.md` reviewed and accepted.
16
+
17
+ ---
18
+
19
+ ## P — Prove
20
+
21
+ Validate credentials, run minimal connectivity checks, and confirm that external systems return data that matches the schema in `genesis.md`.
22
+
23
+ ### Definition of Done
24
+ - [ ] Required credentials verified.
25
+ - [ ] Connectivity tests executed and passing.
26
+ - [ ] Response shapes validated against `genesis.md`.
27
+ - [ ] Findings documented.
28
+
29
+ ---
30
+
31
+ ## E — Establish
32
+
33
+ Build the three-layer structure: SOPs in `architecture/`, atomic tools in `tools/`, and explicit dependency flow in `genesis.md`.
34
+
35
+ ### Definition of Done
36
+ - [ ] SOPs written.
37
+ - [ ] Tools implemented.
38
+ - [ ] Dependency graph documented.
39
+ - [ ] Integration tests passing.
40
+
41
+ ---
42
+
43
+ ## R — Refine
44
+
45
+ Validate outputs against templates and ensure delivery formats match the expected payload.
46
+
47
+ ### Definition of Done
48
+ - [ ] Outputs validated against templates.
49
+ - [ ] Delivery formats reviewed.
50
+ - [ ] UI review completed when applicable.
51
+
52
+ ---
53
+
54
+ ## A — Automate
55
+
56
+ Clean temporary artifacts, configure triggers, deploy the final logic, and run a smoke test in the target environment.
57
+
58
+ ### Definition of Done
59
+ - [ ] `.tmp/` cleaned.
60
+ - [ ] Deployment completed.
61
+ - [ ] Triggers configured.
62
+ - [ ] Smoke test passing.
@@ -0,0 +1,28 @@
1
+ # Skills Registry — {{PROJECT_NAME}}
2
+
3
+ > Index of installed skills in this project. Managed automatically by `trackops skill`.
4
+
5
+ ---
6
+
7
+ ## Installed Skills
8
+
9
+ _No skills installed yet. Use `trackops skill install <name>` to add one._
10
+
11
+ ---
12
+
13
+ ## How to Use a Skill
14
+
15
+ 1. Identify the context in `.agent/hub/router.md`.
16
+ 2. Open the corresponding `SKILL.md`.
17
+ 3. Follow the workflow defined in that skill.
18
+
19
+ ---
20
+
21
+ ## Management
22
+
23
+ ```bash
24
+ trackops skill list
25
+ trackops skill catalog
26
+ trackops skill install <name>
27
+ trackops skill remove <name>
28
+ ```
@@ -0,0 +1,39 @@
1
+ # Skills Router
2
+
3
+ ## Purpose
4
+ This file defines the routing rules between the main agent and the available skills. When the agent detects a specific context, it should consult these rules and choose the right skill.
5
+
6
+ ## Routing Rules
7
+
8
+ ### Context: Code commit
9
+ - **Trigger**: The user asks for a commit or a code change has just been completed.
10
+ - **Skill**: `commiter`
11
+ - **Action**: Use the skill to format the commit message.
12
+
13
+ ### Context: Post-commit
14
+ - **Trigger**: A successful commit has just happened.
15
+ - **Skill**: `changelog-updater`
16
+ - **Action**: Run the changelog update flow.
17
+
18
+ ### Context: Project initialization
19
+ - **Trigger**: The user wants to create a new project.
20
+ - **Skill**: `project-starter-skill` (global)
21
+ - **Action**: Run the full initialization protocol.
22
+
23
+ ### Context: Operational tracking
24
+ - **Trigger**: A work block is about to start, resume, or close.
25
+ - **Skill**: No external skill.
26
+ - **Action**: Run `trackops status`, take the next task with `trackops next`, and keep `project_control.json` as the operational source of truth.
27
+
28
+ ## Adding New Rules
29
+
30
+ Use this format for each new rule:
31
+
32
+ ```markdown
33
+ ### Context: [description]
34
+ - **Trigger**: [what activates the rule]
35
+ - **Skill**: [skill name]
36
+ - **Action**: [what the agent should do]
37
+ ```
38
+
39
+ When a new skill is installed with `trackops skill install <name>`, add its routing rule here.