fli_video 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{scripts/03-get-technical-design-and-features.rb → .builders/generators/back/scripts/01-get-technical-design-and-feature-list.rb} +5 -0
- data/{scripts/02-get-features-and-components.rb → .builders/generators/back/scripts/02-get-feature-list-and-components.rb} +4 -0
- data/{scripts/01-get-structure.rb → .builders/generators/back/scripts/03-get-structure.rb} +23 -3
- data/.builders/generators/back/scripts/generated/application-structure.json +231 -0
- data/.builders/generators/back/scripts/generated/features-and-components.md +988 -0
- data/.builders/generators/back/scripts/generated/technical-design-and-features.md +424 -0
- data/.builders/klues/add_episode.klue +1 -1
- data/.builders/klues/create_project.klue +1 -1
- data/.builders/klues/move_to_trash.klue +8 -2
- data/CHANGELOG.md +8 -0
- data/README.md +1 -1
- data/docs/feature-list.md +1 -0
- data/docs/generated/application-structure.json +2 -6
- data/docs/generated/features-and-components.md +36 -30
- data/docs/generated/technical-design-and-features.md +25 -8
- data/docs/technical-specifications.md +14 -1
- data/lib/fli_video/version.rb +1 -1
- data/package-lock.json +2 -2
- data/package.json +1 -1
- data/scripts/01-get-technical-design-and-feature-list.md +5 -0
- data/scripts/01-get-technical-design-and-feature-list.rb +39 -0
- data/scripts/02-get-feature-list-and-components.md +26 -0
- data/scripts/02-get-feature-list-and-components.rb +56 -0
- data/scripts/03-get-code-structure.md +33 -0
- data/scripts/03-get-code-structure.rb +73 -0
- metadata +14 -5
@@ -3,13 +3,16 @@
|
|
3
3
|
### Feature <-> DSL GPTs
|
4
4
|
https://chat.openai.com/g/g-AyFi0UOXn-code-simplifier
|
5
5
|
|
6
|
-
**
|
6
|
+
**Global Configuration**
|
7
7
|
Access and apply global configuration settings for video asset management and state consistency.
|
8
8
|
|
9
9
|
**Project Configuration**
|
10
|
-
Access and apply video or episode settings and state.
|
10
|
+
Access and apply video or episode settings and state. Infers project settings from existing project folders and files.
|
11
11
|
|
12
|
-
**
|
12
|
+
**CLI Project Commands**
|
13
|
+
Efficiently execute and manage video project commands using a command-line interface, enhancing control and flexibility in project handling.
|
14
|
+
|
15
|
+
**FileWatch Processor**
|
13
16
|
Utilize a FileWatch processor to automate file event responses, directing new recordings to designated folders for efficient content management.
|
14
17
|
|
15
18
|
**Create Project**
|
@@ -64,9 +67,6 @@ Build a JSON datastore of files for an entire project based on existing project,
|
|
64
67
|
|
65
68
|
## Future Ideas
|
66
69
|
|
67
|
-
**CLI Project Management Interface**
|
68
|
-
Efficiently execute and manage video project commands using a command-line interface, enhancing control and flexibility in project handling.
|
69
|
-
|
70
70
|
**Web Command Interface for Video Project Management**
|
71
71
|
Introduce a streamlined, web-based interface for managing video project commands, enabling efficient control and organization of project components through simple browser interactions.
|
72
72
|
|
@@ -75,15 +75,15 @@ Generate a detailed report for a specific video project, including the episodes,
|
|
75
75
|
This should be extracted to an AstroJS Website or HTML template servered by a local webserver and provide viewing and navigation for all my video projects.
|
76
76
|
|
77
77
|
|
78
|
-
## Klue Components
|
79
78
|
|
79
|
+
## Klue Components
|
80
80
|
Klue Component: `add_episode.klue`
|
81
81
|
|
82
82
|
```ruby
|
83
83
|
component :add_episode do
|
84
84
|
desc "Add a new episode to an existing podcast project."
|
85
85
|
|
86
|
-
pattern "
|
86
|
+
pattern "Command"
|
87
87
|
|
88
88
|
comments <<~TEXT
|
89
89
|
- Facilitates the addition of a new episode to a specific podcast project.
|
@@ -105,8 +105,8 @@ component :add_episode do
|
|
105
105
|
# ~/video-projects/a21-ac-some-podcast/01-episode-about-something/.trash
|
106
106
|
RUBY
|
107
107
|
end
|
108
|
-
```
|
109
108
|
|
109
|
+
```
|
110
110
|
Klue Component: `change_chapter_name.klue`
|
111
111
|
|
112
112
|
```ruby
|
@@ -142,8 +142,8 @@ component :change_chapter_name do
|
|
142
142
|
# 01-d-intro-CTA.mov
|
143
143
|
RUBY
|
144
144
|
end
|
145
|
-
```
|
146
145
|
|
146
|
+
```
|
147
147
|
Klue Component: `create_chapter_video.klue`
|
148
148
|
|
149
149
|
```ruby
|
@@ -181,15 +181,15 @@ component :create_chapter_video do
|
|
181
181
|
# Output: '~/video-projects/a27-ac-some-podcast/chapters/01-intro-custom.mov'
|
182
182
|
RUBY
|
183
183
|
end
|
184
|
-
```
|
185
184
|
|
185
|
+
```
|
186
186
|
Klue Component: `create_project.klue`
|
187
187
|
|
188
188
|
```ruby
|
189
189
|
component :create_project do
|
190
190
|
desc "Setup a new video project for standalone YouTube video or Podcast."
|
191
191
|
|
192
|
-
pattern "
|
192
|
+
pattern "Command"
|
193
193
|
|
194
194
|
comments <<~TEXT
|
195
195
|
- Allows the creation of a new project, specifying if it's for a YouTube video or a Podcast.
|
@@ -223,8 +223,8 @@ component :create_project do
|
|
223
223
|
# ~/video-projects/a21-ac-some-podcast/.fv.json
|
224
224
|
RUBY
|
225
225
|
end
|
226
|
-
```
|
227
226
|
|
227
|
+
```
|
228
228
|
Klue Component: `empty_trash.klue`
|
229
229
|
|
230
230
|
```ruby
|
@@ -252,8 +252,8 @@ component :empty_trash do
|
|
252
252
|
# Empties the entire .trash folder in "~/video-projects/a27-ac-categorize-mp4-CI/.trash/
|
253
253
|
RUBY
|
254
254
|
end
|
255
|
-
```
|
256
255
|
|
256
|
+
```
|
257
257
|
Klue Component: `episode_path.klue`
|
258
258
|
|
259
259
|
```ruby
|
@@ -334,8 +334,8 @@ component :episode_path do
|
|
334
334
|
episode_path.keywords # => ["TODO"]
|
335
335
|
RUBY
|
336
336
|
end
|
337
|
-
```
|
338
337
|
|
338
|
+
```
|
339
339
|
Klue Component: `global_config.klue`
|
340
340
|
|
341
341
|
```ruby
|
@@ -370,8 +370,8 @@ component :global_configuation do
|
|
370
370
|
method :load
|
371
371
|
method :save
|
372
372
|
end
|
373
|
-
```
|
374
373
|
|
374
|
+
```
|
375
375
|
Klue Component: `move_ecamm_file.klue`
|
376
376
|
|
377
377
|
```ruby
|
@@ -396,8 +396,8 @@ component :move_ecamm_file do
|
|
396
396
|
# ~/video-projects/a20-ad-some-video/recordings/Ecamm Live Recording on 2023-08-25 at 14.51.58.mov
|
397
397
|
RUBY
|
398
398
|
end
|
399
|
-
```
|
400
399
|
|
400
|
+
```
|
401
401
|
Klue Component: `move_to_trash.klue`
|
402
402
|
|
403
403
|
```ruby
|
@@ -414,9 +414,9 @@ component :move_to_trash do
|
|
414
414
|
|
415
415
|
constructure(:parent_project)
|
416
416
|
|
417
|
-
method :run(:file_name)
|
417
|
+
method :run(:file_name = nil)
|
418
418
|
|
419
|
-
sample :
|
419
|
+
sample :move_named_video_to_trash, <<~RUBY
|
420
420
|
project_path = ProjectPath.new('a27')
|
421
421
|
|
422
422
|
command = move_to_trash.new(project_path)
|
@@ -424,14 +424,20 @@ component :move_to_trash do
|
|
424
424
|
# Example of moving a specific suboptimal video take to the trash folder
|
425
425
|
command.run('01-a-introduction.mov')
|
426
426
|
# => "~/video-projects/a27-ac-categorize-mp4-CI/.trash/01-a-introduction.mov"
|
427
|
+
RUBY
|
428
|
+
|
429
|
+
sample :move_last_ecamm__video_to_trash, <<~RUBY
|
430
|
+
project_path = ProjectPath.new('a27')
|
427
431
|
|
432
|
+
command = move_to_trash.new(project_path)
|
433
|
+
|
428
434
|
# Example of moving the last suboptimal video take to the trash folder
|
429
435
|
command.run
|
430
436
|
# => "~/video-projects/a27-ac-categorize-mp4-CI/.trash/Ecamm Live Recording on 2023-08-25 at 14.51.58.mov
|
431
437
|
RUBY
|
432
438
|
end
|
433
|
-
```
|
434
439
|
|
440
|
+
```
|
435
441
|
Klue Component: `open_in_finder.klue`
|
436
442
|
|
437
443
|
```ruby
|
@@ -460,8 +466,8 @@ component :open_in_finder do
|
|
460
466
|
# Opens the folder for episode '01' of project 'a27' in Finder
|
461
467
|
RUBY
|
462
468
|
end
|
463
|
-
```
|
464
469
|
|
470
|
+
```
|
465
471
|
Klue Component: `project_config.klue`
|
466
472
|
|
467
473
|
```ruby
|
@@ -588,8 +594,8 @@ component :project_configuration do
|
|
588
594
|
}
|
589
595
|
JSON
|
590
596
|
end
|
591
|
-
```
|
592
597
|
|
598
|
+
```
|
593
599
|
Klue Component: `project_meta_data_store.klue`
|
594
600
|
|
595
601
|
```ruby
|
@@ -621,8 +627,8 @@ component :project_meta_data_store do
|
|
621
627
|
# Output: '~/video-projects/a27-ac-categorize-mp4-CI/project_metadata.json'
|
622
628
|
RUBY
|
623
629
|
end
|
624
|
-
```
|
625
630
|
|
631
|
+
```
|
626
632
|
Klue Component: `project_path.klue`
|
627
633
|
|
628
634
|
```ruby
|
@@ -703,8 +709,8 @@ component :project_path do
|
|
703
709
|
project_path.keywords # => "CI"
|
704
710
|
RUBY
|
705
711
|
end
|
706
|
-
```
|
707
712
|
|
713
|
+
```
|
708
714
|
Klue Component: `recording_file_watcher.klue`
|
709
715
|
|
710
716
|
```ruby
|
@@ -736,8 +742,8 @@ component :filewatch_processor do
|
|
736
742
|
filewatch_processor.move_file
|
737
743
|
RUBY
|
738
744
|
end
|
739
|
-
```
|
740
745
|
|
746
|
+
```
|
741
747
|
Klue Component: `recording_filename.klue`
|
742
748
|
|
743
749
|
```ruby
|
@@ -853,8 +859,8 @@ component :recording_filename do
|
|
853
859
|
filename.filename # => "01-a-introduction-NEW_TAG.mov"
|
854
860
|
RUBY
|
855
861
|
end
|
856
|
-
```
|
857
862
|
|
863
|
+
```
|
858
864
|
Klue Component: `restore_from_trash.klue`
|
859
865
|
|
860
866
|
```ruby
|
@@ -887,8 +893,8 @@ component :restore_from_trash do
|
|
887
893
|
# => "~/video-projects/a27-ac-categorize-mp4-CI/Ecamm Live Recording on 2023-08-25 at 14.51.58.mov"
|
888
894
|
RUBY
|
889
895
|
end
|
890
|
-
```
|
891
896
|
|
897
|
+
```
|
892
898
|
Klue Component: `switch_focus.klue`
|
893
899
|
|
894
900
|
```ruby
|
@@ -916,8 +922,8 @@ component :change_focus do
|
|
916
922
|
change_focus.run('a21', '02')
|
917
923
|
RUBY
|
918
924
|
end
|
919
|
-
```
|
920
925
|
|
926
|
+
```
|
921
927
|
Klue Component: `text_to_speech.klue`
|
922
928
|
|
923
929
|
```ruby
|
@@ -950,8 +956,8 @@ component :text_to_speech do
|
|
950
956
|
# Output: Transcriptions saved in '~/video-projects/a27-ac-categorize-mp4-CI/recordings/transcript/01-introduction.txt|srt|vtt|json|tsv'
|
951
957
|
RUBY
|
952
958
|
end
|
953
|
-
```
|
954
959
|
|
960
|
+
```
|
955
961
|
Klue Component: `transcript_data_store.klue`
|
956
962
|
|
957
963
|
```ruby
|
@@ -983,5 +989,5 @@ component :transcript_data_store do
|
|
983
989
|
# Output: '~/video-projects/a27-ac-categorize-mp4-CI/project_transcripts.json'
|
984
990
|
RUBY
|
985
991
|
end
|
986
|
-
```
|
987
992
|
|
993
|
+
```
|
@@ -1,6 +1,20 @@
|
|
1
|
+
# FliVideo
|
2
|
+
|
1
3
|
## Application Overview
|
2
4
|
|
3
|
-
|
5
|
+
FliVideo is a Video Asset Managment tool created by a YouTuber `@AppyDave` for YouTubers.
|
6
|
+
|
7
|
+
It provides a set of image, video and workflow management tools to help its creator 'AppyDave' to automate and systemetize the video production process.
|
8
|
+
|
9
|
+
The intiial idea behind FliVideo was Zappier for YouTubers, but it is evolving with a range of capabilities around script, b-roll and presenation canvas automation.
|
10
|
+
|
11
|
+
### Video Recording Managment
|
12
|
+
|
13
|
+
FliVideo initially targeted video content creators using Ecamm Live on the Mac, and adaptable for OBS users.
|
14
|
+
|
15
|
+
Tailored for projects ranging from individual YouTube videos to episodes in a podcast series, the application fits seamlessly into the workflow between video recording and editing.
|
16
|
+
|
17
|
+
It streamlines the post-recording process, encompassing file organization, renaming, and assembly of video recordings, thereby enhancing the efficiency and structure of content creation.
|
4
18
|
|
5
19
|
### Core Functionality
|
6
20
|
|
@@ -74,8 +88,8 @@ a29-ac-gpts-analyze-pdf-transations
|
|
74
88
|
|
75
89
|
### Sample project codes
|
76
90
|
|
77
|
-
- `ac` - AppyCast
|
78
91
|
- `ad` - AppyDave
|
92
|
+
- `ac` - AppyDaveCoding
|
79
93
|
- `fv` - FliVideo
|
80
94
|
- `wp` - WinningPrompts
|
81
95
|
- `c9` - Carnivore90
|
@@ -343,18 +357,23 @@ project-name/recordings/03-a-outro.mov
|
|
343
357
|
project-name/recordings/03-b-outro-cta.mov
|
344
358
|
project-name/recordings/03-c-outro.mov
|
345
359
|
```
|
360
|
+
|
361
|
+
|
346
362
|
## Features
|
347
363
|
|
348
364
|
### Feature <-> DSL GPTs
|
349
365
|
https://chat.openai.com/g/g-AyFi0UOXn-code-simplifier
|
350
366
|
|
351
|
-
**
|
367
|
+
**Global Configuration**
|
352
368
|
Access and apply global configuration settings for video asset management and state consistency.
|
353
369
|
|
354
370
|
**Project Configuration**
|
355
|
-
Access and apply video or episode settings and state.
|
371
|
+
Access and apply video or episode settings and state. Infers project settings from existing project folders and files.
|
372
|
+
|
373
|
+
**CLI Project Commands**
|
374
|
+
Efficiently execute and manage video project commands using a command-line interface, enhancing control and flexibility in project handling.
|
356
375
|
|
357
|
-
**FileWatch Processor
|
376
|
+
**FileWatch Processor**
|
358
377
|
Utilize a FileWatch processor to automate file event responses, directing new recordings to designated folders for efficient content management.
|
359
378
|
|
360
379
|
**Create Project**
|
@@ -409,12 +428,10 @@ Build a JSON datastore of files for an entire project based on existing project,
|
|
409
428
|
|
410
429
|
## Future Ideas
|
411
430
|
|
412
|
-
**CLI Project Management Interface**
|
413
|
-
Efficiently execute and manage video project commands using a command-line interface, enhancing control and flexibility in project handling.
|
414
|
-
|
415
431
|
**Web Command Interface for Video Project Management**
|
416
432
|
Introduce a streamlined, web-based interface for managing video project commands, enabling efficient control and organization of project components through simple browser interactions.
|
417
433
|
|
418
434
|
**Project Meta Report**
|
419
435
|
Generate a detailed report for a specific video project, including the episodes, chapters, recordings, a list of recording IDs (chapter sequence + part sequence), and the name for the next video recording, file sizes.
|
420
436
|
This should be extracted to an AstroJS Website or HTML template servered by a local webserver and provide viewing and navigation for all my video projects.
|
437
|
+
|
@@ -2,7 +2,19 @@
|
|
2
2
|
|
3
3
|
## Application Overview
|
4
4
|
|
5
|
-
|
5
|
+
FliVideo is a Video Asset Managment tool created by a YouTuber `@AppyDave` for YouTubers.
|
6
|
+
|
7
|
+
It provides a set of image, video and workflow management tools to help its creator 'AppyDave' to automate and systemetize the video production process.
|
8
|
+
|
9
|
+
The intiial idea behind FliVideo was Zappier for YouTubers, but it is evolving with a range of capabilities around script, b-roll and presenation canvas automation.
|
10
|
+
|
11
|
+
### Video Recording Managment
|
12
|
+
|
13
|
+
FliVideo initially targeted video content creators using Ecamm Live on the Mac, and adaptable for OBS users.
|
14
|
+
|
15
|
+
Tailored for projects ranging from individual YouTube videos to episodes in a podcast series, the application fits seamlessly into the workflow between video recording and editing.
|
16
|
+
|
17
|
+
It streamlines the post-recording process, encompassing file organization, renaming, and assembly of video recordings, thereby enhancing the efficiency and structure of content creation.
|
6
18
|
|
7
19
|
### Core Functionality
|
8
20
|
|
@@ -345,3 +357,4 @@ project-name/recordings/03-a-outro.mov
|
|
345
357
|
project-name/recordings/03-b-outro-cta.mov
|
346
358
|
project-name/recordings/03-c-outro.mov
|
347
359
|
```
|
360
|
+
|
data/lib/fli_video/version.rb
CHANGED
data/package-lock.json
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
{
|
2
2
|
"name": "fli_video",
|
3
|
-
"version": "0.1.
|
3
|
+
"version": "0.1.1",
|
4
4
|
"lockfileVersion": 3,
|
5
5
|
"requires": true,
|
6
6
|
"packages": {
|
7
7
|
"": {
|
8
8
|
"name": "fli_video",
|
9
|
-
"version": "0.1.
|
9
|
+
"version": "0.1.1",
|
10
10
|
"devDependencies": {
|
11
11
|
"@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
|
12
12
|
"@semantic-release/changelog": "^6.0.3",
|
data/package.json
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Method to read file contents
|
4
|
+
def read_file(file_path)
|
5
|
+
begin
|
6
|
+
File.read(file_path)
|
7
|
+
rescue => e
|
8
|
+
puts "Error reading file #{file_path}: #{e}"
|
9
|
+
""
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Method to write content to a file
|
14
|
+
def write_file(file_path, *contents)
|
15
|
+
merged_content = contents.join("\n")
|
16
|
+
begin
|
17
|
+
# Ensure the directory exists
|
18
|
+
Dir.mkdir(File.dirname(file_path)) unless Dir.exist?(File.dirname(file_path))
|
19
|
+
File.write(file_path, merged_content)
|
20
|
+
rescue => e
|
21
|
+
puts "Error writing to file #{file_path}: #{e}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Method to copy content to clipboard
|
26
|
+
def copy_to_clipboard(content)
|
27
|
+
IO.popen('pbcopy', 'w') { |clip| clip.puts content }
|
28
|
+
end
|
29
|
+
|
30
|
+
# Main execution
|
31
|
+
technical_design = read_file('docs/technical-specifications.md')
|
32
|
+
feature_list = read_file('docs/feature-list.md')
|
33
|
+
output_file = 'docs/generated/technical-design-and-features.md'
|
34
|
+
|
35
|
+
# Merge and write the content to the output file
|
36
|
+
write_file(output_file, technical_design, feature_list)
|
37
|
+
|
38
|
+
# Copy content to clipboard
|
39
|
+
copy_to_clipboard("#{technical_design}\n#{feature_list}")
|
@@ -0,0 +1,26 @@
|
|
1
|
+
## Prompt:
|
2
|
+
|
3
|
+
Write a Ruby script to read `docs/feature-list.md` and merge it with content from `.builders/klues/*.klue` files.
|
4
|
+
Write the result to `docs/generated/features-and-components.md` and copy it to the clipboard.
|
5
|
+
|
6
|
+
The Klue files should need a heading: "Klue Components"
|
7
|
+
|
8
|
+
The content from each Klue file have a simple heading and be wraped with in a code block with the language set to ruby.
|
9
|
+
|
10
|
+
Example:
|
11
|
+
|
12
|
+
|
13
|
+
## Klue Components
|
14
|
+
|
15
|
+
Klue Component: `add_episode.klue`
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
# content of add_episode.klue goes here
|
19
|
+
```
|
20
|
+
|
21
|
+
Klue Component: `change_chapter_name.klue`
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
# content of change_chapter_name.klue goes here
|
25
|
+
```
|
26
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'find'
|
3
|
+
|
4
|
+
# Method to read file contents
|
5
|
+
def read_file(file_path)
|
6
|
+
begin
|
7
|
+
File.read(file_path)
|
8
|
+
rescue => e
|
9
|
+
puts "Error reading file #{file_path}: #{e}"
|
10
|
+
""
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Method to write content to a file
|
15
|
+
def write_file(file_path, content)
|
16
|
+
begin
|
17
|
+
# Ensure the directory exists
|
18
|
+
Dir.mkdir(File.dirname(file_path)) unless Dir.exist?(File.dirname(file_path))
|
19
|
+
File.write(file_path, content)
|
20
|
+
rescue => e
|
21
|
+
puts "Error writing to file #{file_path}: #{e}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Method to combine Klue files
|
26
|
+
def combine_klue_files(klue_dir)
|
27
|
+
klue_components = "## Klue Components\n"
|
28
|
+
Find.find(klue_dir) do |path|
|
29
|
+
if path =~ /.*\.klue$/
|
30
|
+
klue_file_content = read_file(path)
|
31
|
+
klue_components += "Klue Component: `#{File.basename(path)}`\n\n```ruby\n#{klue_file_content}\n```\n"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
klue_components
|
35
|
+
end
|
36
|
+
|
37
|
+
# Method to copy content to clipboard
|
38
|
+
def copy_to_clipboard(content)
|
39
|
+
IO.popen('pbcopy', 'w') { |clip| clip.puts content }
|
40
|
+
end
|
41
|
+
|
42
|
+
# Read the feature list
|
43
|
+
feature_list = read_file('docs/feature-list.md')
|
44
|
+
|
45
|
+
# Combine Klue files
|
46
|
+
klue_components = combine_klue_files('.builders/klues')
|
47
|
+
|
48
|
+
# Merge contents
|
49
|
+
merged_content = "#{feature_list}\n\n#{klue_components}"
|
50
|
+
|
51
|
+
# Output file path
|
52
|
+
output_file = 'docs/generated/features-and-components.md'
|
53
|
+
|
54
|
+
# Write the merged content to the output file and copy to clipboard
|
55
|
+
write_file(output_file, merged_content)
|
56
|
+
copy_to_clipboard(merged_content)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
## Prompt:
|
2
|
+
|
3
|
+
Create a Ruby script to scan a project's directory, ignoring specific folders and files. For the remaining files generate a JSON file with their structure and content and write to `docs/generated/application-structure.json`
|
4
|
+
|
5
|
+
Store a copy of the data in the clipboard
|
6
|
+
|
7
|
+
For some files, eg. ` *.rb` I would like you to read the content and put it in the JSON
|
8
|
+
|
9
|
+
### Sample Structure
|
10
|
+
```json
|
11
|
+
[
|
12
|
+
{
|
13
|
+
"name": ".rspec_status",
|
14
|
+
"type": "file"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"name": "spec",
|
18
|
+
"type": "directory",
|
19
|
+
"children": [
|
20
|
+
{
|
21
|
+
"name": "spec_helper.rb",
|
22
|
+
"type": "file",
|
23
|
+
"content": "# frozen_string_literal: true\n\nrequire 'pry'\nrequire 'bundler/setup'\nrequire 'simplecov'\n\nSimpleCov.start\n\nrequire 'fli_video'\n\nRSpec.configure do |config|\n # Enable flags like --only-failures and --next-failure\n config.example_status_persistence_file_path = '.rspec_status'\n config.filter_run_when_matching :focus\n\n # Disable RSpec exposing methods globally on `Module` and `main`\n config.disable_monkey_patching!\n\n config.expect_with :rspec do |c|\n c.syntax = :expect\n end\nend\n"
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"name": "fli_video_spec.rb",
|
27
|
+
"type": "file",
|
28
|
+
"content": "# frozen_string_literal: true\n\nRSpec.describe FliVideo do\n it 'has a version number' do\n expect(FliVideo::VERSION).not_to be_nil\n end\nend\n"
|
29
|
+
}
|
30
|
+
]
|
31
|
+
},
|
32
|
+
]
|
33
|
+
```
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'json'
|
3
|
+
require 'find'
|
4
|
+
|
5
|
+
# Method to read file contents based on inclusion patterns
|
6
|
+
def read_file_contents(file_path, include_content_for)
|
7
|
+
return nil unless include_content_for.any? { |pattern| File.fnmatch(pattern[:pattern], File.basename(file_path)) }
|
8
|
+
File.read(file_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Method to write JSON content to a file
|
12
|
+
def write_structure_to_file(file_path, content)
|
13
|
+
File.write(file_path, JSON.pretty_generate(content))
|
14
|
+
end
|
15
|
+
|
16
|
+
# Method to copy content to clipboard
|
17
|
+
def copy_to_clipboard(content)
|
18
|
+
IO.popen('pbcopy', 'w') { |clip| clip.puts content }
|
19
|
+
end
|
20
|
+
|
21
|
+
# Method to scan and structure directory contents
|
22
|
+
def scan_directory(dir, ignore_folders, ignore_files, include_content_for)
|
23
|
+
Dir.children(dir).map do |entry|
|
24
|
+
path = "#{dir}/#{entry}"
|
25
|
+
next if ignore_folders.include?(File.basename(path)) || ignore_files.include?(File.basename(path))
|
26
|
+
|
27
|
+
if File.directory?(path)
|
28
|
+
{ 'name' => entry, 'type' => 'directory', 'children' => scan_directory(path, ignore_folders, ignore_files, include_content_for) }
|
29
|
+
else
|
30
|
+
file_data = { 'name' => entry, 'type' => 'file' }
|
31
|
+
file_data['content'] = read_file_contents(path, include_content_for) if include_content_for.any? { |pattern| File.fnmatch(pattern[:pattern], entry) }
|
32
|
+
file_data
|
33
|
+
end
|
34
|
+
end.compact
|
35
|
+
end
|
36
|
+
|
37
|
+
# Method to build content for GPT clipboard
|
38
|
+
def build_gpt_content(structure)
|
39
|
+
JSON.pretty_generate(structure)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Usage example:
|
43
|
+
ignore_folders = ['coverage', 'tmp', 'log', '.git', '.githooks', '.github', 'bin', 'sig', 'node_modules', '.builders', 'docs', 'scripts']
|
44
|
+
|
45
|
+
ignore_files = [
|
46
|
+
'fli.rb',
|
47
|
+
'application-structure.json',
|
48
|
+
'.rspec_status',
|
49
|
+
'.releaserc.json',
|
50
|
+
'CODE_OF_CONDUCT.md',
|
51
|
+
'Guardfile',
|
52
|
+
'.rspec',
|
53
|
+
'CHANGELOG.md',
|
54
|
+
'.tool-versions',
|
55
|
+
'Rakefile',
|
56
|
+
'Gemfile.lock',
|
57
|
+
'.gitignore',
|
58
|
+
'package-lock.json',
|
59
|
+
'package.json',
|
60
|
+
'.rubocop.yml',
|
61
|
+
'LICENSE.txt',
|
62
|
+
'fli_video.gemspec',
|
63
|
+
'01-get-structure.rb'
|
64
|
+
]
|
65
|
+
include_content_for = [
|
66
|
+
{ pattern: '*.rb' },
|
67
|
+
]
|
68
|
+
|
69
|
+
structure = scan_directory('.', ignore_folders, ignore_files, include_content_for)
|
70
|
+
write_structure_to_file('docs/generated/application-structure.json', structure)
|
71
|
+
gpt_content = build_gpt_content(structure)
|
72
|
+
copy_to_clipboard(gpt_content)
|
73
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fli_video
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Cruwys
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: k_log
|
@@ -34,6 +34,12 @@ files:
|
|
34
34
|
- ".builders/_.rb"
|
35
35
|
- ".builders/boot.rb"
|
36
36
|
- ".builders/generators/01-bootstrap.rb"
|
37
|
+
- ".builders/generators/back/scripts/01-get-technical-design-and-feature-list.rb"
|
38
|
+
- ".builders/generators/back/scripts/02-get-feature-list-and-components.rb"
|
39
|
+
- ".builders/generators/back/scripts/03-get-structure.rb"
|
40
|
+
- ".builders/generators/back/scripts/generated/application-structure.json"
|
41
|
+
- ".builders/generators/back/scripts/generated/features-and-components.md"
|
42
|
+
- ".builders/generators/back/scripts/generated/technical-design-and-features.md"
|
37
43
|
- ".builders/klues/add_episode.klue"
|
38
44
|
- ".builders/klues/change_chapter_name.klue"
|
39
45
|
- ".builders/klues/create_chapter_video.klue"
|
@@ -78,9 +84,12 @@ files:
|
|
78
84
|
- lib/fli_video/version.rb
|
79
85
|
- package-lock.json
|
80
86
|
- package.json
|
81
|
-
- scripts/01-get-
|
82
|
-
- scripts/
|
83
|
-
- scripts/
|
87
|
+
- scripts/01-get-technical-design-and-feature-list.md
|
88
|
+
- scripts/01-get-technical-design-and-feature-list.rb
|
89
|
+
- scripts/02-get-feature-list-and-components.md
|
90
|
+
- scripts/02-get-feature-list-and-components.rb
|
91
|
+
- scripts/03-get-code-structure.md
|
92
|
+
- scripts/03-get-code-structure.rb
|
84
93
|
- sig/fli_video.rbs
|
85
94
|
homepage: http://appydave.com/gems/fli_video
|
86
95
|
licenses:
|