@baravak/risloo-profile-cli 4.46.3 → 4.70.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 (92) hide show
  1. package/.agents/skills/create-profile/SKILL.md +14 -0
  2. package/.claude/settings.local.json +1 -3
  3. package/.claude/skills/create-profile/SKILL.md +80 -0
  4. package/AGENTS.md +239 -0
  5. package/CLAUDE.md +2 -185
  6. package/package.json +1 -1
  7. package/src/cli-commands/Executor.js +8 -2
  8. package/src/cli-commands/ExtractExecutor.js +55 -21
  9. package/src/cli-commands/GiftExecutor.js +1 -0
  10. package/src/handlebars/importPartials.js +10 -44
  11. package/src/handlebars/init.js +17 -11
  12. package/src/publish/json/profiles/BSSI93.json +392 -0
  13. package/src/publish/json/profiles/FRHPT93.json +2 -2
  14. package/src/publish/json/profiles/ISKS93.json +288 -0
  15. package/src/publish/json/profiles/MCMI9A.json +1540 -0
  16. package/src/publish/json/profiles/NEO93.json +3858 -0
  17. package/src/publish/json/profiles/NEO9A.json +1159 -1
  18. package/src/publish/json/profiles/NEO9Q.json +3856 -0
  19. package/src/publish/json/profiles/NEO9V.json +1157 -0
  20. package/src/publish/json/profiles/RIASEC9A.json +2775 -0
  21. package/src/publish/json/profiles/RSI93.json +359 -0
  22. package/src/samples/AEQ93.js +1 -1
  23. package/src/samples/AMS93.js +1 -1
  24. package/src/samples/AMS9A.js +3 -1
  25. package/src/samples/BAOMEIS93.js +1 -1
  26. package/src/samples/BEQI93.js +1 -1
  27. package/src/samples/BSCT93.js +5 -0
  28. package/src/samples/BSSI93.js +93 -0
  29. package/src/samples/CAATS93.js +1 -1
  30. package/src/samples/CERQ93.js +1 -1
  31. package/src/samples/CRAAS93.js +1 -1
  32. package/src/samples/DSWLS93.js +1 -1
  33. package/src/samples/EMSS93.js +1 -1
  34. package/src/samples/EPQ9A.js +6 -1
  35. package/src/samples/FACES93.js +6 -0
  36. package/src/samples/FRHPT93.js +41 -13
  37. package/src/samples/GMIT93.js +1 -1
  38. package/src/samples/HPL93.js +1 -1
  39. package/src/samples/ISKS93.js +62 -0
  40. package/src/samples/IUS93.js +1 -1
  41. package/src/samples/JCSI93.js +1 -1
  42. package/src/samples/JPFQ93.js +5 -0
  43. package/src/samples/KJGI93.js +1 -1
  44. package/src/samples/LMIQ93.js +1 -1
  45. package/src/samples/MMFAD93.js +1 -1
  46. package/src/samples/MOCI93.js +1 -1
  47. package/src/samples/NEO93.js +277 -0
  48. package/src/samples/NEO9A.js +91 -60
  49. package/src/samples/NEO9Q.js +279 -0
  50. package/src/samples/NEO9V.js +215 -0
  51. package/src/samples/OBQ4493.js +1 -1
  52. package/src/samples/PIES93.js +1 -1
  53. package/src/samples/PIES9A.js +4 -0
  54. package/src/samples/PMCIEF93.js +7 -1
  55. package/src/samples/PSWQ93.js +1 -1
  56. package/src/samples/RIASEC93.js +1 -1
  57. package/src/samples/RIASEC9A.js +256 -0
  58. package/src/samples/RSI93.js +89 -0
  59. package/src/samples/SASQ93.js +1 -1
  60. package/src/samples/SDCAQ93.js +1 -1
  61. package/src/samples/STAIY93.js +1 -1
  62. package/src/samples/WAQ93.js +1 -1
  63. package/src/samples/YBOCS93.js +1 -1
  64. package/src/samples/YPI93.js +5 -1
  65. package/views/profiles/NEO_long_facets.hbs +125 -0
  66. package/views/profiles/NEO_main.hbs +150 -0
  67. package/views/profiles/NEO_short_facets.hbs +82 -0
  68. package/views/profiles/samples/BSCT93.hbs +17 -17
  69. package/views/profiles/samples/BSSI93.hbs +102 -0
  70. package/views/profiles/samples/FRHPT93_1.hbs +568 -87
  71. package/views/profiles/samples/FRHPT93_2.hbs +90 -76
  72. package/views/profiles/samples/FRHPT93_3.hbs +2 -2
  73. package/views/profiles/samples/FRHPT93_4.hbs +2 -2
  74. package/views/profiles/samples/FRHPT93_5.hbs +103 -0
  75. package/views/profiles/samples/FRHPT9A.hbs +7 -7
  76. package/views/profiles/samples/ISKS93.hbs +38 -0
  77. package/views/profiles/samples/NEO93_1.hbs +14 -0
  78. package/views/profiles/samples/NEO93_2.hbs +15 -0
  79. package/views/profiles/samples/NEO93_3.hbs +15 -0
  80. package/views/profiles/samples/NEO9A.hbs +14 -29
  81. package/views/profiles/samples/NEO9Q_1.hbs +13 -0
  82. package/views/profiles/samples/NEO9Q_2.hbs +14 -0
  83. package/views/profiles/samples/NEO9Q_3.hbs +14 -0
  84. package/views/profiles/samples/NEO9V_1.hbs +13 -0
  85. package/views/profiles/samples/NEO9V_2.hbs +3 -0
  86. package/views/profiles/samples/RIASEC9A_1.hbs +38 -0
  87. package/views/profiles/samples/RIASEC9A_2.hbs +67 -0
  88. package/views/profiles/samples/RIASEC9A_3.hbs +93 -0
  89. package/views/profiles/samples/RSI93.hbs +101 -0
  90. package/a.json +0 -4805
  91. package/src/publish/json/profiles/BSCT93_t1.json +0 -512
  92. package/src/publish/json/profiles/BSCT93_t2.json +0 -512
@@ -7,7 +7,8 @@ const { FileNotFoundError } = require("./utilities/CustomErrors");
7
7
 
8
8
  class ExtractExecutor extends Executor {
9
9
  samplesJSDir = path.join(__dirname, "..", "samples");
10
- profilesTemplatesDir = path.join(__dirname, "..", "..", "views", "profiles", "samples");
10
+ profilesDir = path.join(__dirname, "..", "..", "views", "profiles");
11
+ profilesTemplatesDir = path.join(this.profilesDir, "samples");
11
12
 
12
13
  constructor(options) {
13
14
  super(options);
@@ -39,6 +40,18 @@ class ExtractExecutor extends Executor {
39
40
  });
40
41
  }
41
42
 
43
+ _addProfileHandlebarsPromise() {
44
+ const { promises, response } = this;
45
+ const partials = promises["js"].then((Profile) => Profile.partials || {});
46
+ const handlebarsPromise = this._addHandlebarsPromise(partials);
47
+
48
+ promises["handlebars"] = handlebarsPromise.catch((err) =>
49
+ response.setStatus(EXTRACT_STATUS["TEMPLATE_NOT_FOUND"], err)
50
+ );
51
+
52
+ return promises["handlebars"];
53
+ }
54
+
42
55
  _addProfilesTemplatePromises() {
43
56
  const { sample, dirs, profilesTemplatesDir, promises, response } = this;
44
57
 
@@ -77,6 +90,7 @@ class ExtractExecutor extends Executor {
77
90
  name: options.name,
78
91
  };
79
92
 
93
+ this._addProfileHandlebarsPromise();
80
94
  this._addProfilesTemplatePromises();
81
95
  }
82
96
 
@@ -124,7 +138,7 @@ class ExtractExecutor extends Executor {
124
138
  }
125
139
 
126
140
  _watch() {
127
- const { command, dirs, input, response, benchmarker, promises } = this;
141
+ const { dirs, input, promises } = this;
128
142
 
129
143
  const opts = {
130
144
  awaitWriteFinish: {
@@ -137,38 +151,58 @@ class ExtractExecutor extends Executor {
137
151
  dirs.templates.map((templateFileDir, index) => {
138
152
  chokidar.watch(templateFileDir, opts).on("change", () => {
139
153
  promises["templates"][index] = checkAndLoad(templateFileDir);
140
- benchmarker?.restart(command);
141
- this._createProfile("with-sidebar", ["svg"]).then(() => {
142
- benchmarker?.end();
143
- response.setTime(benchmarker?.totalTime);
144
- response.showOutput();
145
- });
154
+ this._renderWatchedProfile();
146
155
  });
147
156
  });
148
157
  });
149
158
 
159
+ this._resetPartialWatcher(opts).catch(() => {});
160
+
150
161
  chokidar.watch(dirs.sampleJS, opts).on("change", () => {
151
162
  promises["js"] = checkAndImport(dirs.sampleJS);
152
- benchmarker?.restart(command);
153
- this._createProfile("with-sidebar", ["svg"]).then(() => {
154
- benchmarker?.end();
155
- response.setTime(benchmarker?.totalTime);
156
- response.showOutput();
157
- });
163
+ this._addProfileHandlebarsPromise();
164
+ this._resetPartialWatcher(opts).catch(() => {});
165
+ this._renderWatchedProfile();
158
166
  });
159
167
 
160
168
  if(input.type === 'local') chokidar.watch(input.data, opts).on('change', () => {
161
169
  promises["input"] = checkAndLoad(input.data).then((json) => Promise.resolve(JSON.parse(json)));
162
- benchmarker?.restart(command);
163
- this._createProfile("with-sidebar", ["svg"]).then(() => {
164
- benchmarker?.end();
165
- response.setTime(benchmarker?.totalTime);
166
- response.showOutput();
167
- });
168
-
170
+ this._renderWatchedProfile();
169
171
  })
170
172
  }
171
173
 
174
+ async _resetPartialWatcher(opts) {
175
+ const { dirs, profilesDir, promises } = this;
176
+ const Profile = await promises["js"];
177
+ const partialDirs = Object.values(Profile.partials || {}).map((partialFile) =>
178
+ path.join(profilesDir, partialFile)
179
+ );
180
+
181
+ dirs["partials"] = partialDirs;
182
+
183
+ if (this.partialWatcher) await this.partialWatcher.close();
184
+ if (!partialDirs.length) {
185
+ this.partialWatcher = null;
186
+ return;
187
+ }
188
+
189
+ this.partialWatcher = chokidar.watch(partialDirs, opts).on("change", () => {
190
+ this._addProfileHandlebarsPromise();
191
+ this._renderWatchedProfile();
192
+ });
193
+ }
194
+
195
+ _renderWatchedProfile() {
196
+ const { command, response, benchmarker } = this;
197
+
198
+ benchmarker?.restart(command);
199
+ return this._createProfile("with-sidebar", ["svg"]).then(() => {
200
+ benchmarker?.end();
201
+ response.setTime(benchmarker?.totalTime);
202
+ response.showOutput();
203
+ });
204
+ }
205
+
172
206
  _createProfileOutputName(variant) {
173
207
  const {
174
208
  settings: {
@@ -11,6 +11,7 @@ class GiftExecutor extends Executor {
11
11
  constructor(options) {
12
12
  super(options);
13
13
 
14
+ this._addHandlebarsPromise();
14
15
  this._addTemplatePromise();
15
16
  this._addAvatarPromise();
16
17
 
@@ -1,51 +1,17 @@
1
- const fs = require("fs");
2
- const { readdir } = require("fs/promises");
1
+ const fs = require("fs/promises");
3
2
  const path = require("path");
4
3
 
5
- // These are the profiles that might be used completely in other profiles
6
- const baseProfiles = [
7
- "AMS93",
8
- "MMFAD93",
9
- "PIES93",
10
- "JPFQ93_partial",
11
- "JPFQ93_partial2",
12
- "FACES93_1_partial",
13
- "FACES93_2_1_partial",
14
- "FACES93_2_2_partial",
15
- "EPQ93",
16
- 'YPI93_factors'
17
- ];
4
+ const partialsDir = path.join(__dirname, "..", "..", "views", "profiles");
18
5
 
19
- async function importPartials(hbs) {
20
- const partialsDir = path.join(__dirname, "..", "..", "views", "profiles");
6
+ async function importPartials(hbs, partials) {
7
+ await Promise.all(
8
+ Object.entries(partials).map(async ([name, relativePath]) => {
9
+ const template = await fs.readFile(path.join(partialsDir, relativePath), "utf-8");
10
+ hbs.registerPartial(name, template);
11
+ })
12
+ );
21
13
 
22
- let baseProfilePromises = baseProfiles.map((profileName) => {
23
- new Promise(function (resolve, reject) {
24
- fs.readFile(path.join(partialsDir, "samples", `${profileName}.hbs`), "utf-8", (err, template) => {
25
- if (err) reject(err);
26
- hbs.registerPartial(profileName, template);
27
- resolve(true);
28
- });
29
- });
30
- });
31
-
32
- return readdir(partialsDir).then((partialFiles) => {
33
- let generalPartialsPromises = partialFiles.map(
34
- (partialFile) =>
35
- new Promise(function (resolve, reject) {
36
- const matches = /^([^.]+).(hbs|css|js)$/.exec(partialFile);
37
- if (!matches) return resolve(true);
38
- const name = matches[1];
39
- fs.readFile(path.join(partialsDir, partialFile), "utf-8", (err, template) => {
40
- if (err) reject(err);
41
- hbs.registerPartial(name, template);
42
- resolve(true);
43
- });
44
- })
45
- );
46
-
47
- return Promise.all(generalPartialsPromises, baseProfilePromises);
48
- });
14
+ return hbs;
49
15
  }
50
16
 
51
17
  module.exports = importPartials;
@@ -2,14 +2,20 @@ const Handlebars = require("handlebars");
2
2
  const helpers = require("./helpers");
3
3
  const importPartials = require("./importPartials");
4
4
 
5
- // Add Custom Helpers to Handlebars
6
- for (let helper in helpers) Handlebars.registerHelper(helper, helpers[helper]);
7
-
8
- module.exports = new Promise(function (resolve, reject) {
9
- // Add Partials to Handlebars
10
- importPartials(Handlebars)
11
- .then(() => resolve(Handlebars))
12
- .catch((err) => {
13
- reject(err);
14
- });
15
- });
5
+ const sharedPartials = {
6
+ fonts: "fonts.css",
7
+ layout: "layout.hbs",
8
+ sidebar: "sidebar.hbs",
9
+ };
10
+
11
+ async function createHandlebars(partials = {}) {
12
+ const hbs = Handlebars.create();
13
+
14
+ for (const [name, helper] of Object.entries(helpers)) {
15
+ hbs.registerHelper(name, helper);
16
+ }
17
+
18
+ return importPartials(hbs, { ...partials, ...sharedPartials });
19
+ }
20
+
21
+ module.exports = createHandlebars;
@@ -0,0 +1,392 @@
1
+ {
2
+ "id": "$X1HXXXXX",
3
+ "scale": {
4
+ "id": "$BSSI-93",
5
+ "title": "پرسشنامه افکار خودکشی بک"
6
+ },
7
+ "chain": null,
8
+ "version": "2",
9
+ "edition": "",
10
+ "edition_version": null,
11
+ "client": {
12
+ "id": "GH966XXXX",
13
+ "name": "مراجع"
14
+ },
15
+ "room": {
16
+ "id": "RS96XXXX",
17
+ "manager": {
18
+ "id": "GH9XXXXX",
19
+ "name": "درمانگر",
20
+ "user_id": "IR9XXXX"
21
+ },
22
+ "center": {
23
+ "id": "RS966XXXX",
24
+ "acceptation": null,
25
+ "status": "active",
26
+ "type": "personal_clinic",
27
+ "detail": {
28
+ "title": "درمانگر"
29
+ }
30
+ },
31
+ "acceptation": null,
32
+ "status": "active",
33
+ "type": "personal_clinic"
34
+ },
35
+ "case": null,
36
+ "code": null,
37
+ "created_at": 1694157079,
38
+ "started_at": 1694157198,
39
+ "scored_at": 1694242467,
40
+ "closed_at": 1694160574,
41
+ "total_amount": 100000,
42
+ "prepayment": true,
43
+ "purchased": true,
44
+ "amount": 100000,
45
+ "description": "## دستور اجرای آزمون\n\nﻟﻄﻔﺎً ﻋﺒﺎرات زﯾﺮ را ﺑﻪ ﻃﻮر دﻗﯿﻖ ﻣﻄﺎﻟﻌﻪ ﮐﻨﯿﺪ، ﺳﭙﺲ ﻫﺮﺟﻤﻠﻪای ﮐﻪ ﺗﻮﺻﯿﻒ ﮐﻨﻨﺪه وﺿﻌﯿﺖ ﺷﻤﺎ در ﻫﻔﺘﻪ ﮔﺬﺷﺘﻪ و اﻣﺮوز ﻣﯽﺑﺎﺷﺪ را ﻣﺸﺨﺺ ﻧﻤﺎﯾﯿﺪ.",
46
+ "psychologist_description": null,
47
+ "items": [
48
+ {
49
+ "type": "text",
50
+ "text": null,
51
+ "answer": {
52
+ "type": "optional",
53
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
54
+ "options": [
55
+ "ﺑﻪ زﻧﺪﮔﯽ ﺧﻮد ﺑﺴﯿﺎر ﻋﻼﻗﻤﻨﺪ ﻫﺴﺘﻢ.",
56
+ "ﻋﻼﻗﻪ ﻣﻦ ﺑﻪ زﻧﺪﮔﯽ کم اﺳﺖ.",
57
+ "ﻋﻼﻗﻪای ﺑﻪ زﻧﺪﮔﯽ ﻧﺪارم."
58
+ ]
59
+ },
60
+ "user_answered": "2"
61
+ },
62
+ {
63
+ "type": "text",
64
+ "text": null,
65
+ "answer": {
66
+ "type": "optional",
67
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
68
+ "options": [
69
+ "دوﺳﺖ دارم زﻧﺪه ﺑﺎﺷﻢ.",
70
+ "ﮐﻤﯽ ﻣﯿﻞ ﺑﻪ ﻣﺮدن در ﻣﻦ وﺟﻮد دارد.",
71
+ "دوﺳﺖ دارم ﺑﻤﯿﺮم."
72
+ ]
73
+ },
74
+ "user_answered": "3"
75
+ },
76
+ {
77
+ "type": "text",
78
+ "text": null,
79
+ "answer": {
80
+ "type": "optional",
81
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
82
+ "options": [
83
+ "اﺻﺮار ﻣﻦ ﺑﺮای زﻧﺪﮔﯽ ﮐﺮدن ﺑﯿﺸﺘﺮ از ﻣﺮدن اﺳﺖ.",
84
+ "ﺑﺮای ﻣﻦ زﻧﺪﮔﯽ ﮐﺮدن و ﻣﺮدن ﺗﻘﺮﯾﺒﺎً ﯾﮑﺴﺎن اﺳﺖ.",
85
+ "اﺻﺮار ﻣﻦ ﺑﺮای ﻣﺮدن ﺑﯿﺸﺘﺮ از زﻧﺪﮔﯽ اﺳﺖ."
86
+ ]
87
+ },
88
+ "user_answered": "2"
89
+ },
90
+ {
91
+ "type": "text",
92
+ "text": null,
93
+ "answer": {
94
+ "type": "optional",
95
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
96
+ "options": [
97
+ "ﻫﻨﮕﺎﻣﯽ ﮐﻪ در ﺷﺮاﯾﻂ دﺷﻮار و ﺧﻄﺮﻧﺎک ﻗﺮار ﻣﯽﮔﯿﺮم ﺳﻌﯽ ﻣﯽﮐﻨﻢ ﺟﺎن ﺧﻮد را ﺣﻔﻆ ﮐﻨﻢ.",
98
+ "ﻫﻨﮕﺎﻣﯽ ﮐﻪ در ﺷﺮاﯾﻂ دﺷﻮار ﺑﺎﺷﻢ ﺑﺮاﯾﻢ ﻣﻬﻢ ﻧﯿﺴﺖ ﮐﻪ زﻧﺪه ﺑﻤﺎﻧﻢ ﯾﺎ ﺑﻤﯿﺮم.",
99
+ "ﻫﻨﮕﺎﻣﯽ ﮐﻪ در ﺷﺮاﯾﻂ دﺷﻮار ﺑﺎﺷﻢ ﺑﺮای ﺣﻔﻆ ﺟﺎﻧﻢ ﻫﯿﭻ ﮐﻮﺷﺸﯽ ﻧﻤﯽﮐﻨﻢ."
100
+ ]
101
+ },
102
+ "user_answered": "3"
103
+ },
104
+ {
105
+ "type": "text",
106
+ "text": null,
107
+ "answer": {
108
+ "type": "optional",
109
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
110
+ "options": [
111
+ "ﻫﯿﭻ ﻣﯿﻠﯽ ﺑﻪ ﺧﻮدﮐﺸﯽ ﻧﺪارم.",
112
+ "ﮐﻤﯽ ﻣﯿﻞ ﺑﻪ ﺧﻮدﮐﺸﯽ دارم.",
113
+ "ﻣﯿﻞ ﺷﺪﯾﺪی ﺑﻪ ﺧﻮدﮐﺸﯽ دارم."
114
+ ]
115
+ },
116
+ "user_answered": "1"
117
+ },
118
+ {
119
+ "type": "text",
120
+ "text": null,
121
+ "answer": {
122
+ "type": "optional",
123
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
124
+ "options": [
125
+ "زﻣﺎن ﮐﻮﺗﺎﻫﯽ ﺑﻪ ﻓﮑﺮ ﺧﻮدﮐﺸﯽ ﻣﯽاﻓﺘﻢ ﮐﻪ ﺑﻪ ﺳﺮﻋﺖ از ذﻫﻨﻢ ﻣﯽﮔﺬرد.",
126
+ "ﮔﺎﻫﯽ ﮐﻢ و ﺑﯿﺶ ﺑﻪ ﻓﮑﺮ ﺧﻮدﮐﺸﯽ ﻣﯽاﻓﺘﻢ.",
127
+ "از ﻣﺪتﻫﺎی ﻃﻮﻻﻧﯽ ﻓﮑﺮ ﺧﻮدﮐﺸﯽ را در ذﻫﻨﻢ دارم."
128
+ ]
129
+ },
130
+ "user_answered": "3"
131
+ },
132
+ {
133
+ "type": "text",
134
+ "text": null,
135
+ "answer": {
136
+ "type": "optional",
137
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
138
+ "options": [
139
+ "ﺑﻪ ﻧﺪرت درﺑﺎره ﺧﻮدﮐﺸﯽ ﻓﮑﺮ ﻣﯽﮐﻨﻢ.",
140
+ "ﮔﻬﮕﺎﻫﯽ درﺑﺎره ﺧﻮدﮐﺸﯽ ﻓﮑﺮ ﻣﯽﮐﻨﻢ.",
141
+ "ﺗﻘﺮﯾﺒﺎً ﻫﻤﯿﺸﻪ درﺑﺎره ﺧﻮدﮐﺸﯽ ﻓﮑﺮ ﻣﯽﮐﻨﻢ."
142
+ ]
143
+ },
144
+ "user_answered": "2"
145
+ },
146
+ {
147
+ "type": "text",
148
+ "text": null,
149
+ "answer": {
150
+ "type": "optional",
151
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
152
+ "options": [
153
+ "ﻓﮑﺮ درﺑﺎره ﺧﻮدﮐﺸﯽ را ﻗﺒﻮل ﻧﺪارم.",
154
+ "ﻓﮑﺮ درﺑﺎره ﺧﻮدﮐﺸﯽ را ﻧﻪ ﻗﺒﻮل دارم ﻧﻪ رد ﻣﯽﮐﻨﻢ.",
155
+ "ﻓﮑﺮ درﺑﺎره ﺧﻮدﮐﺸﯽ را ﻗﺒﻮل دارم."
156
+ ]
157
+ },
158
+ "user_answered": "3"
159
+ },
160
+ {
161
+ "type": "text",
162
+ "text": null,
163
+ "answer": {
164
+ "type": "optional",
165
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
166
+ "options": [
167
+ "اﮔﺮ ﻗﺼﺪ ﺧﻮدﮐﺸﯽ داﺷﺘﻪ ﺑﺎﺷﻢ ﻗﺎدر ﺑﻪ ﮐﻨﺘﺮل ﺧﻮدم ﻫﺴﺘﻢ.",
168
+ "ﻣﻄﻤﺌﻦ ﻧﯿﺴﺘﻢ ﮐﻪ ﺑﺘﻮاﻧﻢ ﺧﻮدم را از ارﺗﮑﺎب ﺑﻪ ﺧﻮدﮐﺸﯽ ﮐﻨﺘﺮل ﮐﻨﻢ.",
169
+ "اﮔﺮ ﻗﺼﺪ ﺧﻮدﮐﺸﯽ داﺷﺘﻪ ﺑﺎﺷﻢ ﻗﺎدر ﺑﻪ ﮐﻨﺘﺮل ﺧﻮدم ﻧﯿﺴﺘﻢ."
170
+ ]
171
+ },
172
+ "user_answered": "3"
173
+ },
174
+ {
175
+ "type": "text",
176
+ "text": null,
177
+ "answer": {
178
+ "type": "optional",
179
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
180
+ "options": [
181
+ "ﺑﻪ ﺧﺎﻃﺮ ﺧﺎﻧﻮاده، دوﺳﺘﺎن، ﻣﺬﻫﺐ و ﻣﺠﺮوﺣﯿﺖ ﻧﺎﺷﯽ از ﺧﻮدﮐﺸﯽ ﻧﺎﻣﻮﻓﻖ ﻗﺼﺪ ﺧﻮدﮐﺸﯽ ﻧﺪارم.",
182
+ "ﺑﻪ ﺧﺎﻃﺮ ﺧﺎﻧﻮاده، دوﺳﺘﺎن، ﻣﺬﻫﺐ، و ﻣﺠﺮوﺣﯿﺖ ﻧﺎﺷﯽ از ﺧﻮدﮐﺸﯽ ﻧﺎﻣﻮﻓﻖ، ﻧﺴﺒﺖ ﺑﻪ اﻗﺪام ﺧﻮدﮐﺸﯽ ﺗﺎ اﻧﺪازهای ﻧﮕﺮان ﻫﺴﺘﻢ.",
183
+ "ﻧﺴﺒﺖ ﺑﻪ اﻗﺪام ﺧﻮدﮐﺸﯽ ﻧﮕﺮان ﺧﺎﻧﻮاده، دوﺳﺘﺎن، ﻣﺬﻫﺐ و ﻣﺠﺮوﺣﯿﺖ ﻧﺎﺷﯽ از ﺧﻮدﮐﺸﯽ ﻧﺎﻣﻮﻓﻖ ﻧﯿﺴﺘﻢ."
184
+ ]
185
+ },
186
+ "user_answered": "3"
187
+ },
188
+ {
189
+ "type": "text",
190
+ "text": null,
191
+ "answer": {
192
+ "type": "optional",
193
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
194
+ "options": [
195
+ "دﻟﯿﻞ اﺻﻠﯽ ﻣﻦ از اﻗﺪام ﺑﻪ ﺧﻮدﮐﺸﯽ ﺗأﺛﯿﺮ ﮔﺬاﺷﺘﻦ ﺑﺮ دﯾﮕﺮان اﺳﺖ ﺑﻪ ﻃﻮری ﮐﻪ ﺑﻪ ﻣﻦ ﺗﻮﺟﻪ ﺷﻮد.",
196
+ "ﻣﻨﻈﻮر ﻣﻦ از اﻗﺪام ﺑﻪ ﺧﻮدﮐﺸﯽ ﻓﻘﻂ تأﺛﯿﺮ ﮔﺬاﺷﺘﻦ ﺑﺮ اﻓﺮاد ﻧﯿﺴﺖ، ﺑﻠﮑﻪ راهﺣﻠﯽ ﺑﺮای ﺣﻞ ﻣﺸﮑﻼﺗﻢ ﻣﯽﺑﺎﺷﺪ.",
197
+ "ﻣﻨﻈﻮر اﺻﻠﯽ ﻣﻦ از اﻗﺪام ﺑﻪ ﺧﻮدﮐﺸﯽ ﻓﺮار ﮐﺮدن از ﻣﺸﮑﻼت اﺳﺖ."
198
+ ]
199
+ },
200
+ "user_answered": "2"
201
+ },
202
+ {
203
+ "type": "text",
204
+ "text": null,
205
+ "answer": {
206
+ "type": "optional",
207
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
208
+ "options": [
209
+ "ﻃﺮح و ﺑﺮﻧﺎﻣﻪ ﺧﺎﺻﯽ ﺑﺮای اﯾﻦﮐﻪ ﭼﻄﻮر ﺧﻮدﮐﺸﯽ ﮐﻨﻢ ﻧﺪارم.",
210
+ "راهﻫﺎی ﺧﻮدﮐﺸﯽ را ﺑﺮرﺳﯽ ﮐﺮده‌ام، اﻣﺎ روی ﺟﺰﺋﯿﺎت آن ﻓﮑﺮ ﻧﮑﺮده‌ام.",
211
+ "ﻃﺮح و ﺑﺮﻧﺎﻣﻪ ﺧﺎﺻﯽ ﺑﺮای اﯾﻦﮐﻪ ﭼﻄﻮر ﺧﻮدﮐﺸﯽ ﮐﻨﻢ در ذﻫﻨﻢ دارم."
212
+ ]
213
+ },
214
+ "user_answered": "2"
215
+ },
216
+ {
217
+ "type": "text",
218
+ "text": null,
219
+ "answer": {
220
+ "type": "optional",
221
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
222
+ "options": [
223
+ "ﺑﻪ ﯾﮏ روش و ﯾﺎ ﻓﺮﺻﺖ ﻣﻨﺎﺳﺒﯽ ﮐﻪ ﺧﻮدﮐﺸﯽ ﮐﻨﻢ دﺳﺘﺮﺳﯽ ﻧﺪارم.",
224
+ "روﺷﯽ ﮐﻪ ﻗﺼﺪ دارم ﺑﺮای ﺧﻮدﮐﺸﯽ ﺑﻪ ﮐﺎر ﺑﺒﺮم وﻗﺖ زﯾﺎدی ﻣﯽﺧﻮاﻫﺪ و ﻣﻦ ﻓﺮﺻﺖ ﺑﻪﮐﺎرﮔﯿﺮی اﯾﻦ روش را ﻧﺪارم.",
225
+ "روﺷﯽ را ﺑﺮای ﺧﻮدﮐﺸﯽ اﻧﺘﺨﺎب ﮐﺮده‌ام و ﺑﺮای ﻋﻤﻠﯽ ﮐﺮدن آن ﻣﻨﺘﻈﺮ ﻓﺮﺻﺖ ﻣﻨﺎﺳﺐ ﻫﺴﺘﻢ."
226
+ ]
227
+ },
228
+ "user_answered": "3"
229
+ },
230
+ {
231
+ "type": "text",
232
+ "text": null,
233
+ "answer": {
234
+ "type": "optional",
235
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
236
+ "options": [
237
+ "ﺟﺮأت ﯾﺎ ﺗﻮاﻧﺎﯾﯽ اﻗﺪام ﺑﻪ ﺧﻮدﮐﺸﯽ را ﻧﺪارم.",
238
+ "ﻣﻄﻤﺌﻦ ﻧﯿﺴﺘﻢ ﮐﻪ ﺟﺮأت و ﺗﻮاﻧﺎﯾﯽ ارﺗﮑﺎب ﺑﻪ ﺧﻮدﮐﺸﯽ را داﺷﺘﻪ ﺑﺎﺷﻢ.",
239
+ "ﺟﺮأت ﯾﺎ ﺗﻮاﻧﺎﯾﯽ اﻗﺪام ﺑﻪ ﺧﻮدﮐﺸﯽ را دارم."
240
+ ]
241
+ },
242
+ "user_answered": "2"
243
+ },
244
+ {
245
+ "type": "text",
246
+ "text": null,
247
+ "answer": {
248
+ "type": "optional",
249
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
250
+ "options": [
251
+ "ﮔﻤﺎن ﻧﻤﯽﮐﻨﻢ ﮐﻪ ﻗﺼﺪ ﺧﻮدﮐﺸﯽ داﺷﺘﻪ ﺑﺎﺷﻢ.",
252
+ "ﻣﻄﻤﺌﻦ ﻧﯿﺴﺘﻢ ﮐﻪ ﺑﺨﻮاﻫﻢ ﺧﻮدﮐﺸﯽ ﮐﻨﻢ.",
253
+ "ﻣﻄﻤﺌﻨﻢ ﮐﻪ ﺧﻮدﮐﺸﯽ ﺧﻮاﻫﻢ ﮐﺮد."
254
+ ]
255
+ },
256
+ "user_answered": "3"
257
+ },
258
+ {
259
+ "type": "text",
260
+ "text": null,
261
+ "answer": {
262
+ "type": "optional",
263
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
264
+ "options": [
265
+ "ﻫﯿﭻ وﺳﯿﻠﻪ‌ای ﺑﺮای اﻗﺪام ﺧﻮدﮐﺸﯽ آﻣﺎده ﻧﮑﺮده‌ام.",
266
+ "اﻧﺪﮐﯽ وﺳﺎﯾﻞ ﺑﺮای اﻗﺪام ﺑﻪ ﺧﻮدﮐﺸﯽ آﻣﺎده ﮐﺮده‌ام.",
267
+ "ﺗﻘﺮﯾﺒﺎً ﺑﺮای اﻗﺪام ﺑﻪ ﺧﻮﮐﺸﯽ وﺳﺎﯾﻞ ﻻزم را آﻣﺎده ﮐﺮده‌ام."
268
+ ]
269
+ },
270
+ "user_answered": "1"
271
+ },
272
+ {
273
+ "type": "text",
274
+ "text": null,
275
+ "answer": {
276
+ "type": "optional",
277
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
278
+ "options": [
279
+ "درﺑﺎره ﺧﻮدﮐﺸﯽ‌ام ﺗﺎ ﮐﻨﻮن ﻣﻄﻠﺒﯽ ﻧﻨﻮﺷﺘﻪام.",
280
+ "درﺑﺎره ﯾﺎدداﺷﺖ ﺧﻮدﮐﺸﯽام ﻓﮑﺮ ﮐﺮده و ﯾﺎ ﺷﺮوع ﺑﻪ ﻧﻮﺷﺘﻦ آن ﮐﺮده‌ام، اﻣﺎ ﮐﺎﻣﻞ ﻧﯿﺴﺖ.",
281
+ "ﯾﺎدداﺷﺖ ﺧﻮدﮐﺸﯽام را ﮐﺎﻣﻞ ﮐﺮده‌ام."
282
+ ]
283
+ },
284
+ "user_answered": "2"
285
+ },
286
+ {
287
+ "type": "text",
288
+ "text": null,
289
+ "answer": {
290
+ "type": "optional",
291
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
292
+ "options": [
293
+ "در ﻣﻮرد ﺣﻮادث و ﻣﺴﺎﺋﻞ ﭘﺲ از ﺧﻮدﮐﺸﯽ ﻫﯿﭻ ﺑﺮﻧﺎﻣﻪ ﻣﺸﺨﺼﯽ ﻧﺪارم.",
294
+ "در ﻣﻮرد ﺣﻮادث و ﻣﺴﺎﺋﻞ ﭘﺲ از ﺧﻮدﮐﺸﯽ ﺗﺎ ﺣﺪودی ﺑﺮﻧﺎﻣﻪﻫﺎ را ﻣﺸﺨﺺ ﮐﺮده‌ام.",
295
+ "در ﻣﻮرد ﺣﻮادث و ﻣﺴﺎﺋﻞ ﭘﺲ از ﺧﻮدﮐﺸﯽ ﺑﻪﻃﻮر دﻗﯿﻖ ﺑﺮﻧﺎﻣﻪرﯾﺰی ﮐﺮده‌ام."
296
+ ]
297
+ },
298
+ "user_answered": "2"
299
+ },
300
+ {
301
+ "type": "text",
302
+ "text": null,
303
+ "answer": {
304
+ "type": "optional",
305
+ "nullable": { "text": "غیر فعال‌سازی بخش دوم" },
306
+ "options": [
307
+ "دﯾﮕﺮان از ﻗﺼﺪ ﺧﻮدﮐﺸﯽ ﻣﻦ آﮔﺎه ﻫﺴﺘﻨﺪ.",
308
+ "در ﻣﻮرد ﻗﺼﺪ ﺧﻮدﮐﺸﯽ ﺧﻮد ﺑﻪ دﯾﮕﺮان ﭼﯿﺰی ﻧﮕﻔﺘﻪام.",
309
+ "دﯾﮕﺮان از ﻗﺼﺪ ﺧﻮدﮐﺸﯽ ﻣﻦ آﮔﺎه ﻧﯿﺴﺘﻨﺪ."
310
+ ]
311
+ },
312
+ "user_answered": "2"
313
+ }
314
+ ],
315
+ "prerequisites": [
316
+ {
317
+ "type": "text",
318
+ "label": "gender",
319
+ "text": "جنسیت",
320
+ "answer": { "type": "select", "options": ["زن", "مرد"] },
321
+ "alias": "gender",
322
+ "force": true,
323
+ "user_answered": "1"
324
+ },
325
+ {
326
+ "type": "text",
327
+ "label": "age",
328
+ "text": "سن",
329
+ "answer": { "type": "number" },
330
+ "alias": "age",
331
+ "force": true,
332
+ "user_answered": "42"
333
+ },
334
+ {
335
+ "type": "text",
336
+ "label": "education",
337
+ "text": "تحصیلات",
338
+ "answer": {
339
+ "type": "select",
340
+ "options": [
341
+ "ابتدایی اول",
342
+ "ابتدایی دوم",
343
+ "متوسطه اول",
344
+ "متوسطه دوم",
345
+ "دیپلم",
346
+ "کارشناسی",
347
+ "کارشناسی ارشد",
348
+ "پزشکی عمومی",
349
+ "متخصص",
350
+ "دکتری تخصصی",
351
+ "حوزوی مقدمات",
352
+ "حوزوی سطح۱",
353
+ "حوزوی سطح۲",
354
+ "حوزوی سطح۳",
355
+ "حوزوی سطح۴"
356
+ ]
357
+ },
358
+ "alias": "education",
359
+ "force": true,
360
+ "user_answered": "7"
361
+ },
362
+ {
363
+ "type": "text",
364
+ "label": "marital_status",
365
+ "text": "وضعیت تأهل",
366
+ "answer": { "type": "select", "options": ["مجرد", "متأهل"] },
367
+ "alias": "marital_status",
368
+ "force": true,
369
+ "user_answered": "2"
370
+ }
371
+ ],
372
+ "entities": [
373
+ {
374
+ "offset": 5,
375
+ "title": "بخش دوم",
376
+ "description": "در ﺻﻮرﺗﯽ ﮐﻪ در ﻣﻮرد ﭘﺮﺳﺶ ﺷﻤﺎره ۵ گزینه اول را علامت زده‌اید ﻻزم ﻧﯿﺴﺖ ﮐﻪ ﭘﺮﺳﺶﻫﺎی ﺑﻌﺪی را ﭘﺎﺳﺦ دﻫﯿﺪ؛ به انتهای پرسشنامه بروید و گزینه اتمام را بزنید.\n\nدر ﺻﻮرﺗﯽ ﮐﻪ گزینه دوم یا سوم را ﻋﻼﻣﺖ زده‌اﯾﺪ، ﺣﺘﻤﺎً در پرسش‌های بعدی تیک دکمه «غیر فعال‌سازی بخش دوم‌» برداشته تا گزینه‌ها فعال شود و سپس پاسخ بدهید."
377
+ }
378
+ ],
379
+ "cornometer": 0,
380
+ "score": {
381
+ "total_raw": 25,
382
+ "total_percentage": 0.66,
383
+ "desire_raw": 6,
384
+ "desire_percentage": 0.6,
385
+ "intent_raw": 11,
386
+ "intent_percentage": 0.79,
387
+ "preparation_raw": 6,
388
+ "preparation_percentage": 0.6
389
+ },
390
+ "score_current_version": "1.0.0",
391
+ "score_last_version": "1.0.0"
392
+ }
@@ -4505,9 +4505,9 @@
4505
4505
  "factors_mo4_percentage": 0.472,
4506
4506
  "factors_mo4_level": "low",
4507
4507
  "indicators_validity_identical_value": 55,
4508
- "indicators_validity_identical_error": null,
4508
+ "indicators_validity_identical_error": "exceeded median response threshold",
4509
4509
  "indicators_validity_consecutive_value": 3,
4510
- "indicators_validity_consecutive_error": null,
4510
+ "indicators_validity_consecutive_error": "exceeded median response threshold",
4511
4511
  "indicators_validity_median_value": 98,
4512
4512
  "indicators_validity_median_error": "exceeded median response threshold",
4513
4513
  "indicators_vrin_value": 6,