codex-genesis-harness 0.1.4 → 0.1.6

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 (153) hide show
  1. package/.codebase/ARCHITECTURE_REVIEW_COMPLETE.md +216 -216
  2. package/.codebase/CURRENT_STATE.md +9 -7
  3. package/.codebase/FILE_NAMING_CLARIFICATION.md +161 -161
  4. package/.codebase/HARNESS_COMPLETENESS_AUDIT.md +613 -613
  5. package/.codebase/IMPLEMENTATION_COMPLETE.md +429 -429
  6. package/.codebase/IMPLEMENTATION_HANDOFF.md +351 -351
  7. package/.codebase/IMPROVEMENTS_SUMMARY.md +419 -419
  8. package/.codebase/PHASE3_SKILLS_NAMING_COMPLETE.md +292 -292
  9. package/.codebase/PHASE_DEPENDENCY_MAP.md +486 -486
  10. package/.codebase/QUICK_START_SPEC_IMPACT.md +456 -456
  11. package/.codebase/README.md +139 -139
  12. package/.codebase/RECOVERY_POINTS.md +438 -438
  13. package/.codebase/state.json +37 -0
  14. package/.codex/skills/genesis-api-sync/SKILL.md +354 -354
  15. package/.codex/skills/genesis-api-sync/checklists/api-sync-checklist.md +101 -101
  16. package/.codex/skills/genesis-api-sync/templates/api-change-template.md +257 -257
  17. package/.codex/skills/genesis-debug-guide/SKILL.md +479 -479
  18. package/.codex/skills/genesis-debug-guide/checklists/flaky-test-investigation.md +339 -339
  19. package/.codex/skills/genesis-debug-guide/checklists/production-bug-debug.md +210 -210
  20. package/.codex/skills/genesis-debug-guide/checklists/test-failure-debug.md +158 -158
  21. package/.codex/skills/genesis-debug-guide/observability/debug-commands.md +365 -365
  22. package/.codex/skills/genesis-debug-guide/playbooks/unit-test-failures.md +289 -289
  23. package/.codex/skills/genesis-debug-guide/templates/debug-investigation-log.md +288 -288
  24. package/.codex/skills/genesis-docs-automation/SKILL.md +1003 -1003
  25. package/.codex/skills/genesis-docs-automation/checklists/docs-validation.md +359 -359
  26. package/.codex/skills/genesis-docs-automation/checklists/spec-alignment.md +312 -312
  27. package/.codex/skills/genesis-docs-automation/observability/docs-tracking.md +382 -382
  28. package/.codex/skills/genesis-docs-automation/playbooks/auto-update-flow.md +851 -851
  29. package/.codex/skills/genesis-docs-automation/playbooks/changelog-generation.md +491 -491
  30. package/.codex/skills/genesis-docs-automation/templates/changelog-entry-template.md +187 -187
  31. package/.codex/skills/genesis-docs-automation/templates/handoff-template.md +297 -297
  32. package/.codex/skills/genesis-harness/SKILL.md +1427 -1418
  33. package/.codex/skills/genesis-harness/agents/openai.yaml +7 -7
  34. package/.codex/skills/genesis-harness/checklists/bug-fix-qa.md +169 -169
  35. package/.codex/skills/genesis-harness/checklists/new-feature-qa.md +157 -157
  36. package/.codex/skills/genesis-harness/checklists/refactor-qa.md +216 -216
  37. package/.codex/skills/genesis-harness/checklists/requirements-validation.md +211 -211
  38. package/.codex/skills/genesis-harness/references/planning-schema.md +35 -35
  39. package/.codex/skills/genesis-harness/references/quality-rubric.md +21 -21
  40. package/.codex/skills/genesis-harness/references/research-rubric.md +41 -41
  41. package/.codex/skills/genesis-harness/references/workflows.md +33 -33
  42. package/.codex/skills/genesis-harness/resources/agents-template.md +27 -27
  43. package/.codex/skills/genesis-harness/resources/api-docs-template.md +32 -32
  44. package/.codex/skills/genesis-harness/resources/architecture-template.md +30 -30
  45. package/.codex/skills/genesis-harness/resources/audit-template.md +26 -26
  46. package/.codex/skills/genesis-harness/resources/bug-template.md +34 -34
  47. package/.codex/skills/genesis-harness/resources/change-impact-matrix-template.md +204 -204
  48. package/.codex/skills/genesis-harness/resources/check-template.md +21 -21
  49. package/.codex/skills/genesis-harness/resources/conventions-template.md +42 -42
  50. package/.codex/skills/genesis-harness/resources/decision-template.md +33 -33
  51. package/.codex/skills/genesis-harness/resources/design-template.md +26 -26
  52. package/.codex/skills/genesis-harness/resources/escalation-template.md +21 -21
  53. package/.codex/skills/genesis-harness/resources/feature-template.md +49 -49
  54. package/.codex/skills/genesis-harness/resources/foundation-phase-template.md +131 -131
  55. package/.codex/skills/genesis-harness/resources/integrations-template.md +32 -32
  56. package/.codex/skills/genesis-harness/resources/journeys-template.md +13 -13
  57. package/.codex/skills/genesis-harness/resources/lessons-learned-template.md +12 -12
  58. package/.codex/skills/genesis-harness/resources/observability-template.md +34 -34
  59. package/.codex/skills/genesis-harness/resources/phase-00-foundation-template.md +76 -76
  60. package/.codex/skills/genesis-harness/resources/phase-template.md +34 -34
  61. package/.codex/skills/genesis-harness/resources/pitfalls-template.md +22 -22
  62. package/.codex/skills/genesis-harness/resources/planning-tree-template.md +39 -39
  63. package/.codex/skills/genesis-harness/resources/post-implementation-guide.md +347 -347
  64. package/.codex/skills/genesis-harness/resources/project-template.md +38 -38
  65. package/.codex/skills/genesis-harness/resources/quality-score-template.md +11 -11
  66. package/.codex/skills/genesis-harness/resources/requirements-template.md +26 -26
  67. package/.codex/skills/genesis-harness/resources/research-template.md +26 -26
  68. package/.codex/skills/genesis-harness/resources/review-template.md +22 -22
  69. package/.codex/skills/genesis-harness/resources/spec-changelog-template.md +6 -6
  70. package/.codex/skills/genesis-harness/resources/stack-template.md +33 -33
  71. package/.codex/skills/genesis-harness/resources/verification-template.md +26 -26
  72. package/.codex/skills/genesis-harness/scripts/check-architecture-boundaries.sh +0 -0
  73. package/.codex/skills/genesis-harness/scripts/check-docs-sync.sh +0 -0
  74. package/.codex/skills/genesis-harness/scripts/check-no-debug-logs.sh +0 -0
  75. package/.codex/skills/genesis-harness/scripts/check-required-planning-files.sh +0 -0
  76. package/.codex/skills/genesis-harness/scripts/check-spec-changelog.sh +0 -0
  77. package/.codex/skills/genesis-harness/scripts/check-task-tracking.sh +0 -0
  78. package/.codex/skills/genesis-harness/scripts/compact-context.sh +0 -0
  79. package/.codex/skills/genesis-harness/scripts/create-adr.sh +0 -0
  80. package/.codex/skills/genesis-harness/scripts/create-bug.sh +0 -0
  81. package/.codex/skills/genesis-harness/scripts/create-feature.sh +0 -0
  82. package/.codex/skills/genesis-harness/scripts/detect-stack.sh +0 -0
  83. package/.codex/skills/genesis-harness/scripts/init-planning.sh +0 -0
  84. package/.codex/skills/genesis-harness/scripts/list-changed-files.sh +0 -0
  85. package/.codex/skills/genesis-harness/scripts/offload-log.sh +0 -0
  86. package/.codex/skills/genesis-harness/scripts/run-verification.sh +0 -0
  87. package/.codex/skills/genesis-harness/scripts/run-verify-loop.sh +0 -0
  88. package/.codex/skills/genesis-harness/scripts/update-state.sh +0 -0
  89. package/.codex/skills/genesis-mvp-planning/SKILL.md +114 -0
  90. package/.codex/skills/genesis-mvp-planning/agents/openai.yaml +6 -0
  91. package/.codex/skills/genesis-mvp-planning/checklists/mvp-readiness.md +18 -0
  92. package/.codex/skills/genesis-mvp-planning/examples/5-phase-roadmap-example.md +43 -0
  93. package/.codex/skills/genesis-mvp-planning/templates/phase-1-core.md +17 -0
  94. package/.codex/skills/genesis-mvp-planning/templates/phase-2-auth.md +17 -0
  95. package/.codex/skills/genesis-mvp-planning/templates/phase-3-features.md +17 -0
  96. package/.codex/skills/genesis-mvp-planning/templates/phase-4-integrations.md +17 -0
  97. package/.codex/skills/genesis-mvp-planning/templates/phase-5-readiness.md +17 -0
  98. package/.codex/skills/genesis-new-design/agents/openai.yaml +3 -3
  99. package/.codex/skills/genesis-observability-automation/checklists/.gitkeep +0 -0
  100. package/.codex/skills/genesis-observability-automation/observability/.gitkeep +0 -0
  101. package/.codex/skills/genesis-observability-automation/playbooks/.gitkeep +0 -0
  102. package/.codex/skills/genesis-observability-automation/templates/.gitkeep +0 -0
  103. package/.codex/skills/genesis-release-orchestration/SKILL.md +653 -653
  104. package/.codex/skills/genesis-release-orchestration/checklists/post-deployment-verification.md +274 -274
  105. package/.codex/skills/genesis-release-orchestration/checklists/pre-release-validation.md +220 -220
  106. package/.codex/skills/genesis-release-orchestration/observability/release-tracking.md +253 -253
  107. package/.codex/skills/genesis-release-orchestration/playbooks/canary-deployment-orchestration.md +472 -472
  108. package/.codex/skills/genesis-release-orchestration/playbooks/semantic-versioning-automation.md +494 -494
  109. package/.codex/skills/genesis-release-orchestration/templates/deployment-strategy-template.md +303 -303
  110. package/.codex/skills/genesis-release-orchestration/templates/release-runbook-template.md +420 -420
  111. package/.codex/skills/genesis-research-first/SKILL.md +237 -237
  112. package/.codex/skills/genesis-research-first/templates/.gitkeep +0 -0
  113. package/.codex/skills/genesis-spec-propagation/SKILL.md +534 -534
  114. package/.codex/skills/genesis-spec-propagation/checklists/phase-update-verification.md +384 -384
  115. package/.codex/skills/genesis-spec-propagation/checklists/spec-change-detection.md +257 -257
  116. package/.codex/skills/genesis-spec-propagation/observability/propagation-tracking.md +373 -373
  117. package/.codex/skills/genesis-spec-propagation/playbooks/breaking-change-propagation.md +692 -692
  118. package/.codex/skills/genesis-spec-propagation/playbooks/feature-change-propagation.md +434 -434
  119. package/.codex/skills/genesis-spec-propagation/templates/migration-guide-template.md +407 -407
  120. package/.codex/skills/genesis-state-machine/SKILL.md +34 -0
  121. package/.codex/skills/genesis-upgrade-design/agents/openai.yaml +3 -3
  122. package/.codex/skills/spec-impact-engine/SKILL.md +504 -504
  123. package/.codex/skills/spec-impact-engine/detect-spec-changes.sh +0 -0
  124. package/.codex-plugin/plugin.json +24 -24
  125. package/CHANGELOG.md +42 -0
  126. package/LICENSE +22 -22
  127. package/README.EN.md +784 -719
  128. package/README.VI.md +776 -712
  129. package/README.md +113 -253
  130. package/VERSION +2 -2
  131. package/bin/genesis-harness.js +90 -87
  132. package/package.json +68 -43
  133. package/scripts/README.md +342 -342
  134. package/scripts/compact-context.sh +0 -0
  135. package/scripts/contract_integrity_gate.js +83 -0
  136. package/scripts/detect-changes.sh +0 -0
  137. package/scripts/healing_telemetry.js +118 -0
  138. package/scripts/install.sh +4 -1
  139. package/scripts/offload-log.sh +0 -0
  140. package/scripts/prompt_sentinel.js +84 -0
  141. package/scripts/run-evals.sh +1 -0
  142. package/scripts/run-verify-loop.sh +11 -0
  143. package/scripts/spec_visual_sync.js +157 -0
  144. package/scripts/test_generator.js +142 -0
  145. package/scripts/transition_state.sh +67 -0
  146. package/scripts/uninstall.sh +1 -0
  147. package/scripts/validation_gates.sh +85 -0
  148. package/scripts/verify.sh +5 -0
  149. package/tests/unit/contract_integrity_gate.test.js +74 -0
  150. package/tests/unit/healing_telemetry.test.js +58 -0
  151. package/tests/unit/prompt_sentinel.test.js +50 -0
  152. package/tests/unit/spec_visual_sync.test.js +77 -0
  153. package/tests/unit/test_generator.test.js +62 -0
@@ -1,8 +1,8 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
-
4
- const fs = require("fs");
5
- const path = require("path");
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const fs = require("fs");
5
+ const path = require("path");
6
6
  const { spawnSync } = require("child_process");
7
7
 
8
8
  const packageRoot = path.resolve(__dirname, "..");
@@ -12,6 +12,7 @@ const skillNames = [
12
12
  "genesis-upgrade-design",
13
13
  "genesis-architecture",
14
14
  "genesis-planning",
15
+ "genesis-mvp-planning",
15
16
  "genesis-codebase-map",
16
17
  "genesis-design-spec",
17
18
  "genesis-api-contract",
@@ -38,31 +39,31 @@ const codexHome = process.env.CODEX_HOME || path.join(process.env.HOME || "", ".
38
39
  const agentsHome = process.env.GENESIS_HARNESS_HOME || path.join(process.env.HOME || "", ".agents");
39
40
  const legacySkillsRoot = path.join(codexHome, "skills");
40
41
  const agentsSkillsRoot = path.join(agentsHome, "skills");
41
-
42
- function usage(exitCode = 0) {
43
- const text = `
44
- Project Genesis Harness
45
-
46
- Usage:
47
- genesis-harness install [--target agents|legacy|both]
48
- genesis-harness verify [--target agents|legacy|both]
49
- genesis-harness uninstall [--target agents|legacy|both]
50
- genesis-harness path
51
-
52
- Environment:
53
- CODEX_HOME=/custom/.codex Override Codex home
54
- GENESIS_HARNESS_HOME=/custom/.agents Override modern skills home
55
- GENESIS_HARNESS_SKIP_POSTINSTALL=1 Skip npm postinstall auto-install
56
- `;
57
- console.log(text.trim());
58
- process.exit(exitCode);
59
- }
60
-
61
- function fail(message) {
62
- console.error(`genesis-harness: ${message}`);
63
- process.exit(1);
64
- }
65
-
42
+
43
+ function usage(exitCode = 0) {
44
+ const text = `
45
+ Project Genesis Harness
46
+
47
+ Usage:
48
+ genesis-harness install [--target agents|legacy|both]
49
+ genesis-harness verify [--target agents|legacy|both]
50
+ genesis-harness uninstall [--target agents|legacy|both]
51
+ genesis-harness path
52
+
53
+ Environment:
54
+ CODEX_HOME=/custom/.codex Override Codex home
55
+ GENESIS_HARNESS_HOME=/custom/.agents Override modern skills home
56
+ GENESIS_HARNESS_SKIP_POSTINSTALL=1 Skip npm postinstall auto-install
57
+ `;
58
+ console.log(text.trim());
59
+ process.exit(exitCode);
60
+ }
61
+
62
+ function fail(message) {
63
+ console.error(`genesis-harness: ${message}`);
64
+ process.exit(1);
65
+ }
66
+
66
67
  function ensureSource() {
67
68
  for (const skillName of skillNames) {
68
69
  const skillFile = path.join(sourceRoot, skillName, "SKILL.md");
@@ -71,21 +72,21 @@ function ensureSource() {
71
72
  }
72
73
  }
73
74
  }
74
-
75
- function parseTarget(args, fallback = "both") {
76
- let target = fallback;
77
- for (let i = 0; i < args.length; i++) {
78
- if (args[i] === "--target") {
79
- target = args[i + 1];
80
- i++;
81
- continue;
82
- }
83
- usage(2);
84
- }
85
- if (!["agents", "legacy", "both"].includes(target)) usage(2);
86
- return target;
87
- }
88
-
75
+
76
+ function parseTarget(args, fallback = "both") {
77
+ let target = fallback;
78
+ for (let i = 0; i < args.length; i++) {
79
+ if (args[i] === "--target") {
80
+ target = args[i + 1];
81
+ i++;
82
+ continue;
83
+ }
84
+ usage(2);
85
+ }
86
+ if (!["agents", "legacy", "both"].includes(target)) usage(2);
87
+ return target;
88
+ }
89
+
89
90
  function targetRoots(target) {
90
91
  if (target === "agents") return [agentsSkillsRoot];
91
92
  if (target === "legacy") return [legacySkillsRoot];
@@ -101,7 +102,9 @@ function copySkills({ quiet = false, target = "both" } = {}) {
101
102
  const dir = path.join(root, skillName);
102
103
 
103
104
  if (fs.existsSync(dir)) {
104
- const backupDir = `${dir}.backup.${timestamp()}`;
105
+ const backupParent = path.join(root, "..", "backups");
106
+ fs.mkdirSync(backupParent, { recursive: true });
107
+ const backupDir = path.join(backupParent, `${skillName}.backup.${timestamp()}`);
105
108
  fs.renameSync(dir, backupDir);
106
109
  if (!quiet) console.log(`Existing skill backed up to: ${backupDir}`);
107
110
  }
@@ -129,7 +132,7 @@ function uninstallSkills(target = "both") {
129
132
  }
130
133
  }
131
134
  }
132
-
135
+
133
136
  function verifySkill(target = "both") {
134
137
  const verifyScript = path.join(packageRoot, "scripts", "verify.sh");
135
138
  if (!fs.existsSync(verifyScript)) fail(`missing verify script at ${verifyScript}`);
@@ -158,41 +161,41 @@ function resolveBash() {
158
161
  }
159
162
  return "bash";
160
163
  }
161
-
162
- function chmodScripts(dir) {
163
- if (!fs.existsSync(dir)) return;
164
- for (const entry of fs.readdirSync(dir)) {
165
- const file = path.join(dir, entry);
166
- if (entry.endsWith(".sh") && fs.statSync(file).isFile()) {
167
- fs.chmodSync(file, 0o755);
168
- }
169
- }
170
- }
171
-
172
- function timestamp() {
173
- const date = new Date();
174
- const pad = (value) => String(value).padStart(2, "0");
175
- return [
176
- date.getFullYear(),
177
- pad(date.getMonth() + 1),
178
- pad(date.getDate()),
179
- pad(date.getHours()),
180
- pad(date.getMinutes()),
181
- pad(date.getSeconds())
182
- ].join("");
183
- }
184
-
185
- const command = process.argv[2] || "help";
186
- const args = process.argv.slice(3);
187
-
188
- switch (command) {
164
+
165
+ function chmodScripts(dir) {
166
+ if (!fs.existsSync(dir)) return;
167
+ for (const entry of fs.readdirSync(dir)) {
168
+ const file = path.join(dir, entry);
169
+ if (entry.endsWith(".sh") && fs.statSync(file).isFile()) {
170
+ fs.chmodSync(file, 0o755);
171
+ }
172
+ }
173
+ }
174
+
175
+ function timestamp() {
176
+ const date = new Date();
177
+ const pad = (value) => String(value).padStart(2, "0");
178
+ return [
179
+ date.getFullYear(),
180
+ pad(date.getMonth() + 1),
181
+ pad(date.getDate()),
182
+ pad(date.getHours()),
183
+ pad(date.getMinutes()),
184
+ pad(date.getSeconds())
185
+ ].join("");
186
+ }
187
+
188
+ const command = process.argv[2] || "help";
189
+ const args = process.argv.slice(3);
190
+
191
+ switch (command) {
189
192
  case "install":
190
193
  copySkills({ target: parseTarget(args, "both") });
191
194
  break;
192
- case "postinstall":
193
- if (process.env.GENESIS_HARNESS_SKIP_POSTINSTALL === "1") {
194
- process.exit(0);
195
- }
195
+ case "postinstall":
196
+ if (process.env.GENESIS_HARNESS_SKIP_POSTINSTALL === "1") {
197
+ process.exit(0);
198
+ }
196
199
  copySkills({ quiet: true, target: "both" });
197
200
  break;
198
201
  case "verify":
@@ -208,11 +211,11 @@ switch (command) {
208
211
  }
209
212
  }
210
213
  break;
211
- case "help":
212
- case "--help":
213
- case "-h":
214
- usage(0);
215
- break;
216
- default:
217
- usage(2);
218
- }
214
+ case "help":
215
+ case "--help":
216
+ case "-h":
217
+ usage(0);
218
+ break;
219
+ default:
220
+ usage(2);
221
+ }
package/package.json CHANGED
@@ -1,43 +1,68 @@
1
- {
2
- "name": "codex-genesis-harness",
3
- "version": "0.1.4",
4
- "description": "Install and manage the Project Genesis Harness Codex skill.",
5
- "license": "MIT",
6
- "bin": {
7
- "genesis-harness": "bin/genesis-harness.js"
8
- },
9
- "scripts": {
10
- "postinstall": "node bin/genesis-harness.js postinstall",
11
- "verify": "bash scripts/verify.sh",
12
- "eval": "bash scripts/run-evals.sh",
13
- "pack:check": "npm pack --dry-run"
14
- },
15
- "files": [
16
- ".codex-plugin",
17
- ".codex/skills",
18
- ".codebase",
19
- "contracts",
20
- "fixtures",
21
- "tests",
22
- "playwright",
23
- "observability",
24
- "bin",
25
- "scripts",
26
- "README.md",
27
- "LICENSE",
28
- "VERSION"
29
- ],
30
- "keywords": [
31
- "codex",
32
- "codex-skill",
33
- "planning",
34
- "project-management",
35
- "engineering-harness"
36
- ],
37
- "engines": {
38
- "node": ">=18"
39
- },
40
- "publishConfig": {
41
- "access": "public"
42
- }
43
- }
1
+ {
2
+ "name": "codex-genesis-harness",
3
+ "version": "0.1.6",
4
+ "description": "Hệ thống quản trị (Harness) dành cho AI Agent (Codex) với cơ chế FSM State Persistence, Validation Gates và Test-First Workflow. Đảm bảo agent không bị trôi context.",
5
+ "license": "MIT",
6
+ "bin": {
7
+ "genesis-harness": "bin/genesis-harness.js"
8
+ },
9
+ "scripts": {
10
+ "postinstall": "node bin/genesis-harness.js postinstall",
11
+ "verify": "bash scripts/verify.sh",
12
+ "eval": "bash scripts/run-evals.sh",
13
+ "pack:check": "npm pack --dry-run",
14
+ "spec:sync": "node scripts/spec_visual_sync.js",
15
+ "test:gen": "node scripts/test_generator.js",
16
+ "sentinel": "node scripts/prompt_sentinel.js",
17
+ "integrity": "node scripts/contract_integrity_gate.js",
18
+ "telemetry": "node scripts/healing_telemetry.js"
19
+ },
20
+ "files": [
21
+ ".codex-plugin",
22
+ ".codex/skills",
23
+ ".codebase",
24
+ "contracts",
25
+ "fixtures",
26
+ "tests",
27
+ "playwright",
28
+ "observability",
29
+ "bin",
30
+ "scripts",
31
+ "README.md",
32
+ "LICENSE",
33
+ "VERSION",
34
+ "CHANGELOG.md"
35
+ ],
36
+ "keywords": [
37
+ "codex",
38
+ "ai-agent",
39
+ "autonomous-agent",
40
+ "harness-engineering",
41
+ "llm-workflow",
42
+ "project-management",
43
+ "state-machine",
44
+ "fsm",
45
+ "codex-plugin",
46
+ "developer-tools",
47
+ "validation-gates"
48
+ ],
49
+ "engines": {
50
+ "node": ">=18"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "author": "Genesis Codex Team",
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/tuanpham09/codex-genesis-harness.git"
59
+ },
60
+ "bugs": {
61
+ "url": "https://github.com/tuanpham09/codex-genesis-harness/issues"
62
+ },
63
+ "homepage": "https://github.com/tuanpham09/codex-genesis-harness#readme",
64
+ "funding": {
65
+ "type": "momo",
66
+ "url": "tel:0865814259"
67
+ }
68
+ }