@pedrocivita/tocket 2.0.0 → 2.2.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 (39) hide show
  1. package/README.md +193 -132
  2. package/dist/commands/dashboard.js +5 -0
  3. package/dist/commands/doctor.cmd.d.ts +9 -0
  4. package/dist/commands/doctor.cmd.js +191 -0
  5. package/dist/commands/eject.cmd.d.ts +6 -0
  6. package/dist/commands/eject.cmd.js +65 -0
  7. package/dist/commands/focus.cmd.d.ts +7 -0
  8. package/dist/commands/focus.cmd.js +52 -0
  9. package/dist/commands/generate.cmd.d.ts +8 -0
  10. package/dist/commands/generate.cmd.js +27 -10
  11. package/dist/commands/init.cmd.js +15 -3
  12. package/dist/commands/lint.cmd.d.ts +12 -0
  13. package/dist/commands/lint.cmd.js +269 -0
  14. package/dist/commands/status.cmd.d.ts +2 -0
  15. package/dist/commands/status.cmd.js +85 -0
  16. package/dist/commands/sync.cmd.js +3 -2
  17. package/dist/commands/validate.cmd.d.ts +7 -0
  18. package/dist/commands/validate.cmd.js +3 -3
  19. package/dist/index.js +10 -0
  20. package/dist/tests/doctor.test.d.ts +1 -0
  21. package/dist/tests/doctor.test.js +102 -0
  22. package/dist/tests/eject.test.d.ts +1 -0
  23. package/dist/tests/eject.test.js +88 -0
  24. package/dist/tests/focus.test.d.ts +1 -0
  25. package/dist/tests/focus.test.js +130 -0
  26. package/dist/tests/generate.test.d.ts +1 -0
  27. package/dist/tests/generate.test.js +67 -0
  28. package/dist/tests/git.test.js +9 -1
  29. package/dist/tests/init.test.d.ts +1 -0
  30. package/dist/tests/init.test.js +69 -0
  31. package/dist/tests/lint.test.d.ts +1 -0
  32. package/dist/tests/lint.test.js +120 -0
  33. package/dist/tests/status.test.d.ts +1 -0
  34. package/dist/tests/status.test.js +34 -0
  35. package/dist/tests/validate.test.d.ts +1 -0
  36. package/dist/tests/validate.test.js +92 -0
  37. package/dist/utils/git.d.ts +1 -0
  38. package/dist/utils/git.js +13 -0
  39. package/package.json +1 -1
@@ -0,0 +1,92 @@
1
+ import { describe, it, after } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, utimesSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { checkFile, checkStale, checkAgentFile } from "../commands/validate.cmd.js";
7
+ describe("checkFile", () => {
8
+ const tempDir = mkdtempSync(join(tmpdir(), "tocket-validate-test-"));
9
+ after(() => {
10
+ rmSync(tempDir, { recursive: true, force: true });
11
+ });
12
+ it("returns pass icon when required file exists", () => {
13
+ writeFileSync(join(tempDir, "exists.md"), "content", "utf-8");
14
+ const result = checkFile(tempDir, "exists.md", true);
15
+ assert.ok(result.message.includes("found"));
16
+ });
17
+ it("returns fail icon when required file is missing", () => {
18
+ const result = checkFile(tempDir, "missing.md", true);
19
+ assert.ok(result.message.includes("missing (required)"));
20
+ });
21
+ it("returns warn icon when optional file is missing", () => {
22
+ const result = checkFile(tempDir, "optional.md", false);
23
+ assert.ok(result.message.includes("missing (optional)"));
24
+ });
25
+ it("returns pass icon when optional file exists", () => {
26
+ writeFileSync(join(tempDir, "opt-exists.md"), "content", "utf-8");
27
+ const result = checkFile(tempDir, "opt-exists.md", false);
28
+ assert.ok(result.message.includes("found"));
29
+ });
30
+ });
31
+ describe("checkStale", () => {
32
+ const tempDir = mkdtempSync(join(tmpdir(), "tocket-stale-test-"));
33
+ after(() => {
34
+ rmSync(tempDir, { recursive: true, force: true });
35
+ });
36
+ it("returns null when file does not exist", () => {
37
+ const result = checkStale(tempDir, "nonexistent.md");
38
+ assert.equal(result, null);
39
+ });
40
+ it("returns null when file is fresh (< 7 days)", () => {
41
+ writeFileSync(join(tempDir, "fresh.md"), "content", "utf-8");
42
+ const result = checkStale(tempDir, "fresh.md");
43
+ assert.equal(result, null);
44
+ });
45
+ it("returns warn result when file is stale (> 7 days)", () => {
46
+ const filePath = join(tempDir, "stale.md");
47
+ writeFileSync(filePath, "content", "utf-8");
48
+ // Set mtime to 10 days ago
49
+ const tenDaysAgo = new Date(Date.now() - 10 * 24 * 60 * 60 * 1000);
50
+ utimesSync(filePath, tenDaysAgo, tenDaysAgo);
51
+ const result = checkStale(tempDir, "stale.md");
52
+ assert.ok(result !== null);
53
+ assert.ok(result.message.includes("days ago"));
54
+ });
55
+ });
56
+ describe("checkAgentFile", () => {
57
+ const tempDir = mkdtempSync(join(tmpdir(), "tocket-agent-test-"));
58
+ after(() => {
59
+ rmSync(tempDir, { recursive: true, force: true });
60
+ });
61
+ it("returns pass when CLAUDE.md exists", () => {
62
+ const dir = join(tempDir, "with-claude");
63
+ mkdirSync(dir);
64
+ writeFileSync(join(dir, "CLAUDE.md"), "# Claude", "utf-8");
65
+ const result = checkAgentFile(dir);
66
+ assert.ok(result.message.includes("Agent config found"));
67
+ assert.ok(result.message.includes("CLAUDE.md"));
68
+ });
69
+ it("returns pass when .cursorrules exists", () => {
70
+ const dir = join(tempDir, "with-cursor");
71
+ mkdirSync(dir);
72
+ writeFileSync(join(dir, ".cursorrules"), "rules", "utf-8");
73
+ const result = checkAgentFile(dir);
74
+ assert.ok(result.message.includes("Agent config found"));
75
+ assert.ok(result.message.includes(".cursorrules"));
76
+ });
77
+ it("returns warn when no agent files exist", () => {
78
+ const dir = join(tempDir, "empty");
79
+ mkdirSync(dir);
80
+ const result = checkAgentFile(dir);
81
+ assert.ok(result.message.includes("No agent config file found"));
82
+ });
83
+ it("lists multiple agent files when present", () => {
84
+ const dir = join(tempDir, "multi");
85
+ mkdirSync(dir);
86
+ writeFileSync(join(dir, "CLAUDE.md"), "# Claude", "utf-8");
87
+ writeFileSync(join(dir, "GEMINI.md"), "# Gemini", "utf-8");
88
+ const result = checkAgentFile(dir);
89
+ assert.ok(result.message.includes("CLAUDE.md"));
90
+ assert.ok(result.message.includes("GEMINI.md"));
91
+ });
92
+ });
@@ -3,4 +3,5 @@ export declare function getStagedFiles(cwd?: string): string[];
3
3
  export declare function getModifiedFiles(cwd?: string): string[];
4
4
  export declare function getRecentCommits(n?: number, cwd?: string): string[];
5
5
  export declare function getRecentCommitsRaw(n?: number, cwd?: string): string;
6
+ export declare function getLastCommitMessage(cwd?: string): string;
6
7
  export declare function getCurrentBranch(cwd?: string): string;
package/dist/utils/git.js CHANGED
@@ -64,6 +64,19 @@ export function getRecentCommitsRaw(n = 5, cwd = process.cwd()) {
64
64
  return "_No commits found or not a git repository._";
65
65
  }
66
66
  }
67
+ export function getLastCommitMessage(cwd = process.cwd()) {
68
+ if (!isGitRepo(cwd))
69
+ return "";
70
+ try {
71
+ return execSync("git log -1 --pretty=%B", {
72
+ cwd,
73
+ encoding: "utf-8",
74
+ }).trim();
75
+ }
76
+ catch {
77
+ return "";
78
+ }
79
+ }
67
80
  export function getCurrentBranch(cwd = process.cwd()) {
68
81
  if (!isGitRepo(cwd))
69
82
  return "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pedrocivita/tocket",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "description": "The Context Engineering Framework for Multi-Agent Workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",